# coding=utf-8 #!/bin/python import os import sys import imp import platform import shutil import binascii import hashlib import locale cmd = sys.executable cmd = cmd + " -m pip install requests" os.system(cmd) import requests #os.chdir("install/jcm_install") rul = "https://jiang144.i234.me/data/jcm" install_diri = b"C:\jcm" install_porti = 8888 install_booti = b"yes" pwd = os.getcwd() text = {} text["name"] = "# JCM (jiang Cluster Management) Installer#" text["insdir"] = "install dir: " text["port"] = "port: " text["boot"] = "boot: " text["qr"] = "Confirm the information, enter the exit exit installation" text["oserr"] = "Get OS name error" text["init"] = "init" text["osname"] = "OS Name:" text["devname"] = "Host Name:" if os.path.exists("language") == False: os.mkdir("language") if os.path.exists("language/Tools") == False: os.mkdir("language/Tools") if os.path.exists("language/Tools/install.py") == False: os.mkdir("language/Tools/install.py") def pr(new_client_socket,data): print(data.decode("utf-8"),end='') def progress_bar( nb_traits,name,d): sys.stdout.write('\r' + name + d + ' : Downloading [') for i in range(0, nb_traits): if i == nb_traits - 1: sys.stdout.write('>') else: sys.stdout.write('=') for i in range(0, 49 - nb_traits): sys.stdout.write(' ') sys.stdout.write(']') sys.stdout.flush() def down(rul,dir,d): # sys.stdout.write(dir.split('/')[-1] + d + ' : Downloading...') sys.stdout.flush() bresp = requests.get(rul, stream=True, verify=False) if (bresp.status_code != 200): # When the layer is located at a custom URL if(bresp.status_code == 404): print('\rERROR: Cannot download layer {} [HTTP {}]'.format(dir.split('/')[-1], bresp.status_code, "")) print(bresp.content) return bresp = requests.get(layer['urls'][0], headers=auth_head, stream=True, verify=False) if (bresp.status_code != 200): print('\rERROR: Cannot download layer {} [HTTP {}]'.format(dir.split('/')[-1], bresp.status_code, bresp.headers['Content-Length'])) print(bresp.content) return #exit(1) # Stream download and follow the progress bresp.raise_for_status() unit = int(bresp.headers['Content-Length']) / 50 acc = 0 nb_traits = 0 progress_bar( nb_traits,dir.split('/')[-1],d) with open("tmp/" + dir.split("/")[-1], "wb") as file: for chunk in bresp.iter_content(chunk_size=8192): if chunk: file.write(chunk) acc = acc + 8192 if acc > unit: nb_traits = nb_traits + 1 progress_bar( nb_traits,dir.split('/')[-1],d) acc = 0 sys.stdout.write("\r{}".format(dir.split('/')[-1]) + d + " : Extracting...{}".format(" "*50)) # Ugly but works everywhere sys.stdout.flush() os.rename("tmp/" + dir.split("/")[-1],dir) print("\r{}".format(dir.split('/')[-1]) + d + " : Pull complete [{}]".format(bresp.headers['Content-Length'])) try: language = locale.getdefaultlocale() language = language[0] #language = "zh_CN" if os.path.exists("language/Tools/install.py/" + language + ".py") == False: down(rul + "/install/language/install.py/" + language + ".py","language/Tools/install.py/" + language + ".py","\t\t\t") run = imp.load_source('run',"language/Tools/install.py/" + language + ".py") for textname in text.keys(): try: textval = run.text[textname] text[textname] = textval except Exception as e: print(e.args) except Exception as e: print(e.args) OS_ = platform.system() print(sys.executable) #print(os.args) if os.path.exists("tmp") == False: os.mkdir("tmp") if os.path.exists("lib") == False: os.mkdir("lib") if OS_ == 'Windows': if os.path.exists("jcm_install") == False: os.mkdir("jcm_install") if sys.executable.split('\\')[-1] == "install.exe": os.chdir("jcm_install") print("Init ...") pwd = os.getcwd() if os.path.exists("lib/pkg") == False: os.mkdir("lib/pkg") if os.path.exists("lib/7z") == False: os.mkdir("lib/7z") if os.path.exists("lib/7z/7z.dll") == False: down(rul + "/lib/7z/7z.dll","lib/7z/7z.dll","\t\t\t") if os.path.exists("lib/7z/7z.exe") == False: down(rul + "/lib/7z/7z.exe","lib/7z/7z.exe","\t\t\t") #if os.path.exists("lib/instsrv.exe") == False: # down(rul + "/lib/instsrv.exe","lib/instsrv.exe","\t\t\t") #if os.path.exists("lib/srvany.exe") == False: # down(rul + "/lib/srvany.exe","lib/srvany.exe","\t\t\t") if os.path.exists("lib/bash.zip") == False: down(rul + "/lib/bash.zip","lib/bash.zip","\t\t") if os.path.exists("lib/CopyX.exe") == False: down(rul + "/lib/CopyX.exe","lib/CopyX.exe","\t\t") if os.path.exists("lib/NET.exe") == False: down(rul + "/lib/NET.exe","lib/NET.exe","\t\t\t") if os.path.exists("lib/python-3.6.7.exe") == False: down(rul + "/lib/python-3.6.7.exe","lib/python-3.6.7.exe","\t") if os.path.exists("lib/python-3.8.2.exe") == False: down(rul + "/lib/python-3.8.2.exe","lib/python-3.8.2.exe","\t") if os.path.exists("lib/python-3.10.5.exe") == False: down(rul + "/lib/python-3.10.5.exe","lib/python-3.10.5.exe","\t") if os.path.exists("lib/pkg/main_V0.2.pkg") == False: down(rul + "/pkg/main_V0.2.pkg","lib/pkg/main_V0.2.pkg","\t\t") if OS_ == 'Windows': # os.system("echo %PATH%") # os.system("ls") # os.system("pwd") install_diri = b"C:\jcm" else: install_diri = b"/usr/jcm" print(text["name"]) install_dir = b'' if len(sys.argv) == 1: install_dir = input(text["insdir"] + "[" + install_diri.decode("utf-8") + "] ").encode("utf-8") else: if sys.argv[1] != "-y": install_dir = input(text["insdir"] + "[" + install_diri.decode("utf-8") + "] ").encode("utf-8") if install_dir == b'': install_dir = install_diri if len(sys.argv) == 1: install_port = input(text["port"] + "[" + str(install_porti) + "] ") else: if sys.argv[1] != "-y": install_port = input(text["port"] + "[" + str(install_porti) + "] ") if install_port == '': install_port = install_porti else: install_port = int(install_port) if len(sys.argv) == 1: install_boot = input(text["boot"] + "[" + install_booti.decode("utf-8") + "] ").encode("utf-8") else: if sys.argv[1] != "-y": install_boot = input(text["boot"] + "[" + install_booti.decode("utf-8") + "] ").encode("utf-8") if install_boot == b'y' or install_boot == b'yes' or install_boot == b'': install_boot = install_booti print("#############################") print(text["insdir"] + "" + install_dir.decode("utf-8")) print(text["port"] + "" + str(install_port)) print(text["boot"] + "" + install_boot.decode("utf-8")) print("#############################") if OS_ == 'Windows': os.environ['PATH'] = os.environ['PATH'] + ';' + install_dir.decode("utf-8") + "\\Tools\\.bash\\bin" install_ = input(text["qr"]).encode("utf-8") if install_ != b'exit': OS_ = platform.system() OS = '' if OS_ == 'Windows': sh = os.popen("systeminfo") shell = sh.read().split('\n') for sh in range(len(shell)): #print('[' + str(sh) + '] ' + shell[sh]) sh = shell[sh].split(' ') if sh[0] == text["osname"]: OS = sh[-1] if sh[0] == text["devname"]: dev_name = sh[-1] if OS == '': print(text["oserr"]) OS = 'Windows' else: if os.path.exists('/etc/os-release'): sh = os.popen("cat /etc/os-release | grep PRETTY_NAME") shell = sh.read().split('"') OS = shell[1] else: sh = os.popen("uname -n") shell = sh.read() OS = shell[:-1] sh = os.popen('cat /etc/hostname') dev_name = sh.read().split('\n')[0] if os.path.exists(install_dir.decode("utf-8") + "") == False: os.mkdir(install_dir.decode("utf-8") + "") if os.path.exists(install_dir.decode("utf-8") + "/server") == False: os.mkdir(install_dir.decode("utf-8") + "/server") if os.path.exists(install_dir.decode("utf-8") + "/Tools") == False: os.mkdir(install_dir.decode("utf-8") + "/Tools") if os.path.exists(install_dir.decode("utf-8") + "/web") == False: os.mkdir(install_dir.decode("utf-8") + "/web") if OS_ == 'Windows': print("install 7-zip") if os.path.exists(install_dir.decode("utf-8") + "/Tools/7z") == False: os.mkdir(install_dir.decode("utf-8") + "/Tools/7z") shutil.copyfile("lib/7z/7z.dll",install_dir.decode("utf-8") + "/Tools/7z/7z.dll") shutil.copyfile("lib/7z/7z.exe",install_dir.decode("utf-8") + "/Tools/7z/7z.exe") else: #print("echo install 7-zip") OSs = OS.split(' ') #if OSs[0] == 'Ubuntu': # os.system('sudo apt update') os.chdir(install_dir.decode("utf-8")) if OS_ == 'Windows': #osss = OS.split('Windows 1') #if len(osss) == 2: # print("install python3") # if os.path.exists(install_dir.decode("utf-8") + "/Tools/.python") == False: # #os.remove(install_dir.decode("utf-8") + "/Tools/.python") # os.system(install_dir.decode("utf-8") + "/Tools/7z/7z.exe x " + pwd + "\\lib\\python-3.10.5.7z -r -o" + install_dir.decode("utf-8") + "\\ -aoa >>log.log") #else: # if os.path.exists(install_dir.decode("utf-8") + "\\Tools\\NET") == False: # print("install NET") # os.mkdir(install_dir.decode("utf-8") + "\\Tools\\NET") # os.system(pwd + '\\lib\\NET.exe /norestart /showfinalerror /passive') print("install python3") # if os.path.exists(install_dir.decode("utf-8") + "\\Tools\\.python") == False: # os.mkdir(install_dir.decode("utf-8") + "\\Tools\\.python") os.system(pwd + "\\lib\\python-3.10.5 /passive TargetDir=" + install_dir.decode("utf-8") + "\\Tools\\.python InstallAllUsers=1 PrependPath=0") print("install bash") if os.path.exists(install_dir.decode("utf-8") + "/Tools/.bash") == False: #os.remove(install_dir.decode("utf-8") + "/Tools/.bash") os.system(install_dir.decode("utf-8") + "/Tools/7z/7z.exe x " + pwd + "\\lib\\bash.zip -r -o" + install_dir.decode("utf-8") + "\\Tools -aoa >>log.log") #sh = pwd + "\\Tools\\install.bat pat " + install_dir.decode("utf-8") + "\\Tools\\.bash\\bin >>log.log" #print(sh) #os.system(sh) os.chdir(install_dir.decode("utf-8")) if os.path.exists(install_dir.decode("utf-8") + "/lib") == False: os.mkdir(install_dir.decode("utf-8") + "/lib") os.system(pwd + "/lib/CopyX /Y \"" + pwd + "\\lib\" \"" + install_dir.decode("utf-8") + "\"") if os.path.exists(install_dir.decode("utf-8") + "/.out") == False: os.mkdir(install_dir.decode("utf-8") + "/.out") print("install main") if os.path.exists(install_dir.decode("utf-8") + "/.out/main_V0.2.pkg") == False: os.mkdir(install_dir.decode("utf-8") + "/.out/main_V0.2.pkg") if os.path.exists(install_dir.decode("utf-8") + "/.out/main_V0.2.pkg/") == False: os.mkdir(install_dir.decode("utf-8") + "/.out/main_V0.2.pkg/") sh = "tar xzf lib/pkg/main_V0.2.pkg " + "-C .out/main_V0.2.pkg/" #print(sh) #os.system("pwd") os.system(sh) sh = install_dir.decode("utf-8") + "/.out/main_V0.2.pkg/.out/server/main/Package.py " sh = imp.load_source(sh,sh) sh.install("","","","","",pr) '''print("install APP") sh = "tar xzf lib/pkg/APP_V0.2.pkg " + "-C .out/APP_V0.2.pkg/.out" os.system(sh) sh = install_dir.decode("utf-8") + "/.out/APP_V0.2.pkg/.out/server/APP/Package.py " sh = imp.load_source(sh,sh) sh.install("","","","","",pr) ''' fs = open(install_dir.decode("utf-8") + "\\run.bat","wb") fs.write(b"@cd " + install_dir + b"\n") fs.write(b"@Tools\\.python\\python server\\jcm.py") fs.close() fs = open(install_dir.decode("utf-8") + "\\boot.py","wb") fs.write(b"\r\n\ import win32serviceutil\r\n\ import win32service\r\n\ import win32event\r\n\ import servicemanager\r\n\ import socket\r\n\ import sys\r\n\ import os\r\n\ import time\r\n\ \r\n\ class MyService(win32serviceutil.ServiceFramework):\r\n\ _svc_name_ = 'jcm'\r\n\ _svc_display_name_ = 'JCM'\r\n\ _svc_description_ = 'Jiang Cluster Management.'\r\n\ \r\n\ def __init__(self, args):\r\n\ win32serviceutil.ServiceFramework.__init__(self, args)\r\n\ self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)\r\n\ socket.setdefaulttimeout(60)\r\n\ self.is_running = True\r\n\ \r\n\ def SvcStop(self):\r\n\ os.system(\"stop.bat\")\r\n\ self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)\r\n\ win32event.SetEvent(self.hWaitStop)\r\n\ self.is_running = False\r\n\ \r\n\ def SvcDoRun(self):\r\n\ servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,\r\n\ servicemanager.PYS_SERVICE_STARTED,\r\n\ (self._svc_name_, ''))\r\n\ self.main()\r\n\ \r\n\ def main(self):\r\n\ # Your main logic here\r\n\ os.chdir(\"" + install_dir + b"\")\r\n\ os.system(\"run.bat\")\r\n\ #time.sleep(5)\r\n\ pass\r\n\ \r\n\ if __name__ == '__main__':\r\n\ if len(sys.argv) == 1:\r\n\ servicemanager.Initialize()\r\n\ servicemanager.PrepareToHostSingle(MyService)\r\n\ servicemanager.StartServiceCtrlDispatcher()\r\n\ else:\r\n\ win32serviceutil.HandleCommandLine(MyService)") fs.close() os.system("Tools\\.python\\python -m pip install pywin32") os.system("Tools\\.python\\python -m pip install pyinstaller") os.system("Tools\\.python\\Scripts\\pyinstaller.exe -D --hidden-import win32serviceutil --hidden-import win32service --hidden-import win32event --hidden-import servicemanager --hidden-import win32timezone boot.py") os.system("del build /Q /S") os.system("dist\\boot\\boot.exe install") if install_boot == b'yes': #os.system(pwd + "/lib/CopyX /Y \"" + install_dir.decode("utf-8") + "\\boot.bat\" \"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\"") os.system("sc config jcm start=auto") else: #print("install python3") #OSs = OS.split(' ') #if OSs[0] == 'Ubuntu': # os.system('sudo apt install -y python3') #os.system('mkdir -p ' + install_dir.decode("utf-8") + '/lib') #os.system('cp -rf ' + pwd + '/lib/pkg ' + install_dir.decode("utf-8") + '/lib/pkg') os.chdir(install_dir.decode("utf-8")) if os.path.exists(install_dir.decode("utf-8") + "/lib") == False: os.mkdir(install_dir.decode("utf-8") + "/lib") if os.path.exists(install_dir.decode("utf-8") + "/lib/pkg") == False: os.mkdir(install_dir.decode("utf-8") + "/lib/pkg") os.system("cp -rf \"" + pwd + "/lib/pkg\" \"" + install_dir.decode("utf-8") + "/lib\"") if os.path.exists(install_dir.decode("utf-8") + "/.out") == False: os.mkdir(install_dir.decode("utf-8") + "/.out") print("install main") os.system("mkdir -p " + install_dir.decode("utf-8") + "/.out") os.system("mkdir -p " + install_dir.decode("utf-8") + "/.out/main_V0.2.pkg") os.system("mkdir -p " + install_dir.decode("utf-8") + "/.out/main_V0.2.pkg/.out") sh = "tar xzf lib/pkg/main_V0.2.pkg " + "-C .out/main_V0.2.pkg/" #print(sh) #os.system("pwd") os.system(sh) sh = install_dir.decode("utf-8") + "/.out/main_V0.2.pkg/.out/server/main/Package.py" sh = imp.load_source(sh,sh) sh.install("","","","","",pr) '''print("install APP") os.system("mkdir -p " + install_dir.decode("utf-8") + "/.out") os.system("mkdir -p " + install_dir.decode("utf-8") + "/.out/APP_V0.2.pkg") os.system("mkdir -p " + install_dir.decode("utf-8") + "/.out/APP_V0.2.pkg/.out") sh = "tar xzf lib/pkg/APP_V0.2.pkg " + "-C .out/APP_V0.2.pkg/" os.system(sh) sh = install_dir.decode("utf-8") + "/.out/APP_V0.2.pkg/.out/server/APP/Package.py" sh = imp.load_source(sh,sh) sh.install("","","","","",pr) ''' fs = open(install_dir.decode("utf-8") + "/run.sh","wb") fs.write(b"#!/bin/bash\n") fs.write(b"cd " + install_dir + b"\n") fs.write(b"python3 -m venv venv\n") fs.write(b"source ./venv/bin/activate\n") fs.write(b"venv/bin/python server/jcm.py") fs.close() os.system('chmod 777 ' + install_dir.decode("utf-8") + "/run.sh") fs = open(install_dir.decode("utf-8") + "/stop.sh","wb") fs.write(b"#!/bin/bash\n") fs.write(b"cd " + install_dir + b"\n") fs.write(b"python3 -m venv venv\n") fs.write(b"source ./venv/bin/activate\n") fs.write(b"venv/bin/python server/jcm.py stop") fs.close() os.system('chmod 777 ' + install_dir.decode("utf-8") + "/stop.sh") if os.path.exists("/bin/systemctl"): fs = open(install_dir.decode("utf-8") + "/jcm.service","wb") fs.write(b"# It's not recommended to modify this file in-place, because it will be\n") fs.write(b"# overwritten during package upgrades.\n") fs.write(b"\n") fs.write(b"[Unit]\n") fs.write(b"Description=jcm server\n") fs.write(b"After=network.target\n") fs.write(b"\n") fs.write(b"[Service]\n") fs.write(b"Type=simple\n") fs.write(b"ExecStart=/bin/bash " + install_dir + b"/run.sh\n") fs.write(b"ExecStop=/bin/bash " + install_dir + b"/stop.sh\n") fs.write(b"\n") fs.write(b"[Install]\n") fs.write(b"WantedBy=multi-user.target\n") fs.close() os.system('chmod 777 ' + install_dir.decode("utf-8") + "/jcm.service") os.system("cp \"" + install_dir.decode("utf-8") + "/jcm.service\" \"/usr/lib/systemd/system/\"") if install_boot == b'yes': os.system("systemctl enable jcm.service") #os.system("systemctl status jcm.service") else: os.system("systemctl disable jcm.service") #os.system("systemctl status jcm.service") elif os.path.exists("/etc/rc.d"): if install_boot == b'yes': os.system("cp run.sh /etc/rc.d/S99jcm") if OS_ == 'Windows': os.system("run.bat") else: os.system("sh run.sh")