easyservice

Xstream Install

Jan 11th, 2020
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.31 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import subprocess, os, random, string, sys, shutil, socket
  4. from itertools import cycle, izip
  5.  
  6. rDownloadURL = "https://xtreamcodes.org/install/download.php?type=%s"
  7. rPackages = ["libcurl3", "libgeoip-dev", "libxslt1-dev", "e2fsprogs", "wget", "mcrypt", "nscd", "htop", "mysql-server"]
  8. rInstall = {"MAIN": "main", "LB": "sub", "ADMIN": "admin"}
  9. rMySQLCnf = "IyBYdHJlYW0gQ29kZXMKCltjbGllbnRdCnBvcnQgICAgICAgICAgICA9IDMzMDYKCltteXNxbGRfc2FmZV0KbmljZSAgICAgICAgICAgID0gMAoKW215c3FsZF0KdXNlciAgICAgICAgICAgID0gbXlzcWwKcG9ydCAgICAgICAgICAgID0gNzk5OQpiYXNlZGlyICAgICAgICAgPSAvdXNyCmRhdGFkaXIgICAgICAgICA9IC92YXIvbGliL215c3FsCnRtcGRpciAgICAgICAgICA9IC90bXAKbGMtbWVzc2FnZXMtZGlyID0gL3Vzci9zaGFyZS9teXNxbApza2lwLWV4dGVybmFsLWxvY2tpbmcKc2tpcC1uYW1lLXJlc29sdmU9MQoKYmluZC1hZGRyZXNzICAgICAgICAgICAgPSAqCmtleV9idWZmZXJfc2l6ZSA9IDEyOE0KCm15aXNhbV9zb3J0X2J1ZmZlcl9zaXplID0gNE0KbWF4X2FsbG93ZWRfcGFja2V0ICAgICAgPSA2NE0KbXlpc2FtLXJlY292ZXItb3B0aW9ucyA9IEJBQ0tVUAptYXhfbGVuZ3RoX2Zvcl9zb3J0X2RhdGEgPSA4MTkyCnF1ZXJ5X2NhY2hlX2xpbWl0ICAgICAgID0gNE0KcXVlcnlfY2FjaGVfc2l6ZSAgICAgICAgPSAyNTZNCgoKZXhwaXJlX2xvZ3NfZGF5cyAgICAgICAgPSAxMAptYXhfYmlubG9nX3NpemUgICAgICAgICA9IDEwME0KCm1heF9jb25uZWN0aW9ucyAgPSAyMDAwMApiYWNrX2xvZyA9IDQwOTYKb3Blbl9maWxlc19saW1pdCA9IDIwMjQwCmlubm9kYl9vcGVuX2ZpbGVzID0gMjAyNDAKbWF4X2Nvbm5lY3RfZXJyb3JzID0gMzA3Mgp0YWJsZV9vcGVuX2NhY2hlID0gNDA5Ngp0YWJsZV9kZWZpbml0aW9uX2NhY2hlID0gNDA5NgoKCnRtcF90YWJsZV9zaXplID0gMUcKbWF4X2hlYXBfdGFibGVfc2l6ZSA9IDFHCgppbm5vZGJfYnVmZmVyX3Bvb2xfc2l6ZSA9IDEwRwppbm5vZGJfYnVmZmVyX3Bvb2xfaW5zdGFuY2VzID0gMTAKaW5ub2RiX3JlYWRfaW9fdGhyZWFkcyA9IDY0Cmlubm9kYl93cml0ZV9pb190aHJlYWRzID0gNjQKaW5ub2RiX3RocmVhZF9jb25jdXJyZW5jeSA9IDAKaW5ub2RiX2ZsdXNoX2xvZ19hdF90cnhfY29tbWl0ID0gMAppbm5vZGJfZmx1c2hfbWV0aG9kID0gT19ESVJFQ1QKcGVyZm9ybWFuY2Vfc2NoZW1hID0gMAppbm5vZGItZmlsZS1wZXItdGFibGUgPSAxCmlubm9kYl9pb19jYXBhY2l0eT0yMDAwMAppbm5vZGJfdGFibGVfbG9ja3MgPSAwCmlubm9kYl9sb2NrX3dhaXRfdGltZW91dCA9IDAKaW5ub2RiX2RlYWRsb2NrX2RldGVjdCA9IDAKCgpzcWwtbW9kZT0iTk9fRU5HSU5FX1NVQlNUSVRVVElPTiIKCltteXNxbGR1bXBdCnF1aWNrCnF1b3RlLW5hbWVzCm1heF9hbGxvd2VkX3BhY2tldCAgICAgID0gMTZNCgpbbXlzcWxdCgpbaXNhbWNoa10Ka2V5X2J1ZmZlcl9zaXplICAgICAgICAgICAgICA9IDE2TQo=".decode("base64")
  10.  
  11. class col:
  12. HEADER = '\033[95m'
  13. OKBLUE = '\033[94m'
  14. OKGREEN = '\033[92m'
  15. WARNING = '\033[93m'
  16. FAIL = '\033[91m'
  17. ENDC = '\033[0m'
  18. BOLD = '\033[1m'
  19. UNDERLINE = '\033[4m'
  20.  
  21. def generate(length=16): return ''.join(random.choice(string.ascii_letters + string.digits) for i in range(length))
  22.  
  23. def getIP():
  24. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  25. s.connect(("8.8.8.8", 80))
  26. return s.getsockname()[0]
  27.  
  28. def getVersion():
  29. try: return subprocess.check_output("lsb_release -d".split()).split(":")[-1].strip()
  30. except: return ""
  31.  
  32. def printc(rText, rColour=col.OKBLUE, rPadding=0):
  33. print "%s ┌──────────────────────────────────────────┐ %s" % (rColour, col.ENDC)
  34. for i in range(rPadding): print "%s │ │ %s" % (rColour, col.ENDC)
  35. print "%s │ %s%s%s │ %s" % (rColour, " "*(20-(len(rText)/2)), rText, " "*(40-(20-(len(rText)/2))-len(rText)), col.ENDC)
  36. for i in range(rPadding): print "%s │ │ %s" % (rColour, col.ENDC)
  37. print "%s └──────────────────────────────────────────┘ %s" % (rColour, col.ENDC)
  38. print " "
  39.  
  40. def prepare(rType="MAIN"):
  41. global rPackages
  42. if rType <> "MAIN": rPackages = rPackages[:-1]
  43. printc("Preparing Installation")
  44. for rFile in ["/var/lib/dpkg/lock-frontend", "/var/cache/apt/archives/lock", "/var/lib/dpkg/lock"]:
  45. try: os.remove(rFile)
  46. except: pass
  47. os.system("apt-get update > /dev/null")
  48. printc("Removing libcurl4 if installed")
  49. os.system("apt-get remove --auto-remove libcurl4 -y > /dev/null")
  50. for rPackage in rPackages:
  51. printc("Installing %s" % rPackage)
  52. os.system("apt-get install %s -y > /dev/null" % rPackage)
  53. printc("Installing libpng")
  54. os.system("wget -q -O /tmp/libpng12.deb http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb")
  55. os.system("dpkg -i /tmp/libpng12.deb > /dev/null")
  56. os.system("apt-get install -y > /dev/null") # Clean up above
  57. try: os.remove("/tmp/libpng12.deb")
  58. except: pass
  59. try:
  60. subprocess.check_output("getent passwd xtreamcodes > /dev/null".split())
  61. except:
  62. # Create User
  63. printc("Creating user xtreamcodes")
  64. os.system("adduser --system --shell /bin/false --group --disabled-login xtreamcodes > /dev/null")
  65. if not os.path.exists("/home/xtreamcodes"): os.mkdir("/home/xtreamcodes")
  66. return True
  67.  
  68. def install(rType="MAIN"):
  69. global rInstall, rDownloadURL
  70. printc("Downloading Software")
  71. try: rURL = rDownloadURL % rInstall[rType]
  72. except:
  73. printc("Invalid download URL!", col.FAIL)
  74. return False
  75. os.system('wget -q -O "/tmp/xtreamcodes.tar.gz" "%s"' % rURL)
  76. if os.path.exists("/tmp/xtreamcodes.tar.gz"):
  77. printc("Installing Software")
  78. os.system('tar -zxvf "/tmp/xtreamcodes.tar.gz" -C "/home/xtreamcodes/" > /dev/null')
  79. try: os.remove("/tmp/xtreamcodes.tar.gz")
  80. except: pass
  81. return True
  82. printc("Failed to download installation file!", col.FAIL)
  83. return False
  84.  
  85. def mysql(rUsername, rPassword):
  86. global rMySQLCnf
  87. printc("Configuring MySQL")
  88. rCreate = True
  89. if os.path.exists("/etc/mysql/my.cnf"):
  90. if open("/etc/mysql/my.cnf", "r").read(14) == "# Xtream Codes": rCreate = False
  91. if rCreate:
  92. shutil.copy("/etc/mysql/my.cnf", "/etc/mysql/my.cnf.xc")
  93. rFile = open("/etc/mysql/my.cnf", "w")
  94. rFile.write(rMySQLCnf)
  95. rFile.close()
  96. os.system("service mysql restart > /dev/null")
  97. printc("Enter MySQL Root Password:", col.WARNING)
  98. for i in range(5):
  99. rMySQLRoot = raw_input(" ")
  100. print " "
  101. if len(rMySQLRoot) > 0: rExtra = " -p%s" % rMySQLRoot
  102. else: rExtra = ""
  103. printc("Drop existing & create database? Y/N", col.WARNING)
  104. if raw_input(" ").upper() == "Y": rDrop = True
  105. else: rDrop = False
  106. try:
  107. if rDrop:
  108. os.system('mysql -u root%s -e "DROP DATABASE IF EXISTS xtream_iptvpro; CREATE DATABASE IF NOT EXISTS xtream_iptvpro;" > /dev/null' % rExtra)
  109. os.system("mysql -u root%s xtream_iptvpro < /home/xtreamcodes/iptv_xtream_codes/database.sql > /dev/null" % rExtra)
  110. os.system('mysql -u root%s -e "USE xtream_iptvpro; UPDATE settings SET live_streaming_pass = \'%s\', unique_id = \'%s\', crypt_load_balancing = \'%s\';" > /dev/null' % (rExtra, generate(20), generate(10), generate(20)))
  111. os.system('mysql -u root%s -e "USE xtream_iptvpro; REPLACE INTO streaming_servers (id, server_name, domain_name, server_ip, vpn_ip, ssh_password, ssh_port, diff_time_main, http_broadcast_port, total_clients, system_os, network_interface, latency, status, enable_geoip, geoip_countries, last_check_ago, can_delete, server_hardware, total_services, persistent_connections, rtmp_port, geoip_type, isp_names, isp_type, enable_isp, boost_fpm, http_ports_add, network_guaranteed_speed, https_broadcast_port, https_ports_add, whitelist_ips, watchdog_data, timeshift_only) VALUES (1, \'Main Server\', \'\', \'%s\', \'\', NULL, NULL, 0, 25461, 1000, \'%s\', \'eth0\', 0, 1, 0, \'\', 0, 0, \'{}\', 3, 0, 25462, \'low_priority\', \'\', \'low_priority\', 0, 1, \'\', 1000, 25463, \'\', \'[\"127.0.0.1\",\"\"]\', \'{}\', 0);" > /dev/null' % (rExtra, getIP(), getVersion()))
  112. os.system('mysql -u root%s -e "USE xtream_iptvpro; REPLACE INTO reg_users (id, username, password, email, member_group_id, verified, status) VALUES (1, \'admin\', \'\$6\$rounds=20000\$xtreamcodes\$XThC5OwfuS0YwS4ahiifzF14vkGbGsFF1w7ETL4sRRC5sOrAWCjWvQJDromZUQoQuwbAXAFdX3h3Cp3vqulpS0\', \'admin@website.com\', 1, 1, 1);" > /dev/null' % rExtra)
  113. os.system('mysql -u root%s -e "GRANT ALL PRIVILEGES ON *.* TO \'%s\'@\'%%\' IDENTIFIED BY \'%s\' WITH GRANT OPTION; FLUSH PRIVILEGES;" > /dev/null' % (rExtra, rUsername, rPassword))
  114. try: os.remove("/home/xtreamcodes/iptv_xtream_codes/database.sql")
  115. except: pass
  116. return True
  117. except: printc("Invalid password! Try again", col.FAIL)
  118. return False
  119.  
  120. def encrypt(rHost="127.0.0.1", rUsername="user_iptvpro", rPassword="", rDatabase="xtream_iptvpro", rServerID=1, rPort=7999):
  121. printc("Encrypting...")
  122. try: os.remove("/home/xtreamcodes/iptv_xtream_codes/config")
  123. except: pass
  124. rf = open('/home/xtreamcodes/iptv_xtream_codes/config', 'wb')
  125. rf.write(''.join(chr(ord(c)^ord(k)) for c,k in izip('{\"host\":\"%s\",\"db_user\":\"%s\",\"db_pass\":\"%s\",\"db_name\":\"%s\",\"server_id\":\"%d\", \"db_port\":\"%d\"}' % (rHost, rUsername, rPassword, rDatabase, rServerID, rPort), cycle('5709650b0d7806074842c6de575025b1'))).encode('base64').replace('\n', ''))
  126. rf.close()
  127.  
  128. def configure():
  129. printc("Configuring System")
  130. if not "/home/xtreamcodes/iptv_xtream_codes/" in open("/etc/fstab").read():
  131. rFile = open("/etc/fstab", "a")
  132. rFile.write("tmpfs /home/xtreamcodes/iptv_xtream_codes/streams tmpfs defaults,noatime,nosuid,nodev,noexec,mode=1777,size=90% 0 0\ntmpfs /home/xtreamcodes/iptv_xtream_codes/tmp tmpfs defaults,noatime,nosuid,nodev,noexec,mode=1777,size=2G 0 0")
  133. rFile.close()
  134. if not "xtreamcodes" in open("/etc/sudoers").read():
  135. os.system('echo "xtreamcodes ALL = (root) NOPASSWD: /sbin/iptables" >> /etc/sudoers')
  136. if not os.path.exists("/etc/init.d/xtreamcodes"):
  137. rFile = open("/etc/init.d/xtreamcodes", "w")
  138. rFile.write("#! /bin/bash\n/home/xtreamcodes/iptv_xtream_codes/start_services.sh")
  139. rFile.close()
  140. os.system("chmod +x /etc/init.d/xtreamcodes > /dev/null")
  141. try: os.remove("/usr/bin/ffmpeg")
  142. except: pass
  143. if not os.path.exists("/home/xtreamcodes/iptv_xtream_codes/tv_archive"): os.mkdir("/home/xtreamcodes/iptv_xtream_codes/tv_archive/")
  144. os.system("ln -s /home/xtreamcodes/iptv_xtream_codes/bin/ffmpeg /usr/bin/")
  145. os.system("chown xtreamcodes:xtreamcodes -R /home/xtreamcodes > /dev/null")
  146. os.system("chmod -R 0777 /home/xtreamcodes > /dev/null")
  147. os.system("chmod +x /home/xtreamcodes/iptv_xtream_codes/start_services.sh > /dev/null")
  148. os.system("chattr -i /home/xtreamcodes/iptv_xtream_codes/GeoLite2.mmdb > /dev/null")
  149. os.system("mount -a")
  150. if not "api.xtream-codes.com" in open("/etc/hosts").read(): os.system('echo "127.0.0.1 api.xtream-codes.com" >> /etc/hosts')
  151. if not "downloads.xtream-codes.com" in open("/etc/hosts").read(): os.system('echo "127.0.0.1 downloads.xtream-codes.com" >> /etc/hosts')
  152. if not " xtream-codes.com" in open("/etc/hosts").read(): os.system('echo "127.0.0.1 xtream-codes.com" >> /etc/hosts')
  153.  
  154. def start(first=True):
  155. if first: printc("Starting Xtream Codes")
  156. else: printc("Restarting Xtream Codes")
  157. os.system("/home/xtreamcodes/iptv_xtream_codes/start_services.sh > /dev/null")
  158.  
  159. def modifyNginx():
  160. printc("Modifying Nginx")
  161. rPath = "/home/xtreamcodes/iptv_xtream_codes/nginx/conf/nginx.conf"
  162. rPrevData = open(rPath, "r").read()
  163. if not "listen 25500;" in rPrevData:
  164. shutil.copy(rPath, "%s.xc" % rPath)
  165. rData = "}".join(rPrevData.split("}")[:-1]) + " server {\n listen 25500;\n index index.php index.html index.htm;\n root /home/xtreamcodes/iptv_xtream_codes/admin/;\n\n location ~ \.php$ {\n limit_req zone=one burst=8;\n try_files $uri =404;\n fastcgi_index index.php;\n fastcgi_pass php;\n include fastcgi_params;\n fastcgi_buffering on;\n fastcgi_buffers 96 32k;\n fastcgi_buffer_size 32k;\n fastcgi_max_temp_file_size 0;\n fastcgi_keep_conn on;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param SCRIPT_NAME $fastcgi_script_name;\n }\n }\n}"
  166. rFile = open(rPath, "w")
  167. rFile.write(rData)
  168. rFile.close()
  169.  
  170. if __name__ == "__main__":
  171. printc("Xtream Codes Reborn BETA - Installer", col.OKGREEN, 2)
  172. rType = raw_input(" Installation Type [MAIN, LB]: ")
  173. print " "
  174. if rType.upper() in ["MAIN", "LB"]:
  175. if rType.upper() == "LB":
  176. rHost = raw_input(" Main Server IP Address: ")
  177. rPassword = raw_input(" MySQL Password: ")
  178. try: rServerID = int(raw_input(" Load Balancer Server ID: "))
  179. except: rServerID = -1
  180. print " "
  181. else:
  182. rHost = "127.0.0.1"
  183. rPassword = generate()
  184. rServerID = 1
  185. rUsername = "user_iptvpro"
  186. rDatabase = "xtream_iptvpro"
  187. rPort = 7999
  188. if len(rHost) > 0 and len(rPassword) > 0 and rServerID > -1:
  189. printc("Start installation? Y/N", col.WARNING)
  190. if raw_input(" ").upper() == "Y":
  191. print " "
  192. rRet = prepare(rType.upper())
  193. if not install(rType.upper()): sys.exit(1)
  194. if rType.upper() == "MAIN":
  195. if not mysql(rUsername, rPassword): sys.exit(1)
  196. encrypt(rHost, rUsername, rPassword, rDatabase, rServerID, rPort)
  197. configure()
  198. modifyNginx()
  199. start()
  200. printc("Installation completed!", col.OKGREEN, 2)
  201. printc("Admin UI: http://%s:25500" % getIP())
  202. if rType.upper() == "MAIN":
  203. printc("Please store your MySQL password!")
  204. printc(rPassword)
  205. else: printc("Installation cancelled", col.FAIL)
  206. else: printc("Invalid entries", col.FAIL)
  207. else: printc("Invalid installation type", col.FAIL)
Add Comment
Please, Sign In to add comment