from sys import * import platform import os import subprocess import shutil import fileinput class Colors: if (platform.system() == "Windows"): ERROR = '' END = '' LOG_BLUE = '' else: ERROR = '\033[91m' END = '\033[0m' LOG_BLUE = '\033[94m' def replacePatternInFile(pattern, replace, file_path): try: with fileinput.FileInput(file_path, inplace=True, backup='.bak') as file: for line in file: print(line.replace(pattern, replace), end='') except: stderr.write(Colors.ERROR + "ERROR !: replacement in file failed !" + Colors.END + "\r\n") return 1 return 0 def install_dependency_ubuntu(command, mode): # ##install dependency then check the return code # old = command if (mode == 'i'): command = 'apt-get install ' + command elif (mode == 'u'): command = 'apt-get update' elif (mode == 'a'): command = 'add-apt-repository ' + command process = subprocess.Popen(command, shell=True) process.wait() if process.returncode != 0: stderr.write(Colors.ERROR + "ERROR !: installation of " + old + " failed !" + Colors.END + "\r\n") def install_required_ubuntu(): install_dependency_ubuntu("update", 'u') install_dependency_ubuntu("python-lxml", 'i') install_dependency_ubuntu("libxml2-dev", 'i') install_dependency_ubuntu("libxslt-dev", 'i') install_dependency_ubuntu("zlib1g-dev", 'i') install_dependency_ubuntu("update", 'u') install_dependency_ubuntu("rabbitmq-server", 'i') #install_dependency_ubuntu("libmysqlclient-dev", 'i') def install_dependency_centos(command, mode): # ##install dependency then check the return code # old = command if (mode == 'i'): command = 'yum -y install ' + command elif (mode == 'u'): command = 'yum update ' + command process = subprocess.Popen(command, shell=True) process.wait() if process.returncode != 0: stderr.write(Colors.ERROR + "ERROR !: installation of " + old + " failed !" + Colors.END + "\r\n") def install_required_centos(): install_dependency_centos("yum", 'u') install_dependency_centos("kernel", 'u') install_dependency_centos("", 'u') install_dependency_centos("libxml2", 'i') install_dependency_centos("libxslt libxslt-2", 'i') install_dependency_centos("libxslt-devel libxml2-devel", 'i') install_dependency_centos("rabbitmq-server", 'i') install_dependency_centos("mariadb-server", 'i') install_dependency_centos("mariadb", 'i') install_dependency_centos("mariadb-devel", 'i') process = subprocess.Popen("systemctl start mariadb.service", shell=True) process.wait() if process.returncode != 0: stderr.write(Colors.ERROR + "ERROR !" + Colors.END + "\r\n") process = subprocess.Popen("systemctl enable mariadb.service", shell=True) process.wait() if process.returncode != 0: stderr.write(Colors.ERROR + "ERROR !" + Colors.END + "\r\n") process = subprocess.Popen("mysql_secure_installation", shell=True) process.wait() if process.returncode != 0: stderr.write(Colors.ERROR + "ERROR !" + Colors.END + "\r\n") def install_required(): # checking if user is sudo then install the needed dependencies # find the linux distribution and call the related function distribution = platform.dist() if not 'SUDO_UID' in os.environ.keys(): stderr.write("Super user rights are needed to install prerequisites\r\n") exit(1) if distribution[0] == "Ubuntu" or distribution[0] == "Debian": install_required_ubuntu() elif distribution[0] == "centos": install_required_centos() else: print("Requirements are made for Ubuntu, Debian and CentOS only") exit(1) def install_python_modules(venv): if 'SUDO_UID' in os.environ.keys(): answer = input( "You are about to install your virtualenv only for root, this is discouraged, are you sure ? (Y/N) If you are not sure relaunch the script without super user privileges\n") while (answer != 'Y' and answer != 'y' and answer != 'n' and answer != 'N'): answer = input( "You are about to install your virtualenv only for root, this is discouraged, are you sure ? (Y/N) \n") if (answer not in ['y', 'Y']): exit(1) if (os.path.basename(os.getcwd())!= "private"): if not(os.path.isdir("../private")): print(Colors.LOG_BLUE + "-----------------------------Creating \'private\' directory-----------------------------" + Colors.END) os.mkdir("../private") print(Colors.LOG_BLUE + "-----------------------------cd private-----------------------------" + Colors.END) os.chdir("../private") # ## deleting if already exist then creating the venv # while (True): try: if (os.path.isdir(venv)): print(Colors.LOG_BLUE + "-----------------------------Deleting existing venv-----------------------------" + Colors.END) shutil.rmtree(venv) break except: continue # ## update of tools and installation of dependencies in REQUIREMENTS.txt or REQUIREMENTS_WINDOWS.txt # end_of_line = '\n\n' python = 'python3' pip = '/bin/pip' REQUIREMENTS = 'REQUIREMENTS.txt' sql_user = "pyros" sql_pswd = "DjangoPyros" req = "CREATE DATABASE IF NOT EXISTS pyros; CREATE DATABASE IF NOT EXISTS pyros_test; CREATE USER IF NOT EXISTS pyros; GRANT USAGE ON *.* TO 'pyros'; DROP USER 'pyros'; GRANT ALL ON pyros.* TO 'pyros'@'localhost' IDENTIFIED BY 'DjangoPyros'; GRANT ALL ON test_pyros.* TO 'pyros'@'localhost'; GRANT ALL PRIVILEGES ON test_pyros_test.* TO 'pyros'@'localhost'; GRANT ALL ON pyros_test.* TO 'pyros'@'localhost' IDENTIFIED BY 'DjangoPyros'" req_centos = "CREATE DATABASE IF NOT EXISTS pyros; CREATE DATABASE IF NOT EXISTS pyros_test; GRANT USAGE ON *.* TO 'pyros'@'localhost' IDENTIFIED BY 'DjangoPyros' WITH GRANT OPTION; DROP USER 'pyros'@'localhost'; GRANT ALL ON pyros.* TO 'pyros'@'localhost' IDENTIFIED BY 'DjangoPyros'; GRANT ALL PRIVILEGES ON pyros.* TO 'pyros'@'localhost' IDENTIFIED BY 'DjangoPyros' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON pyros_test.* TO pyros@localhost IDENTIFIED BY 'DjangoPyros' WITH GRANT OPTION;" if platform.dist()[0] == "centos": req = req_centos sql_request="\"" + req + "\"" + " | mysql -u root -p" if (platform.system() == "Windows"): end_of_line = "\r\n\r\n" python = 'py' pip = '\Scripts\pip' REQUIREMENTS = 'REQUIREMENTS_WINDOWS.txt' sql_request=req + " |\"C:\Program Files\MySQL\MySQL Server 5.7\\bin\mysql\" -u root -p" print(Colors.LOG_BLUE + "-----------------------------Creating venv " + venv + "-----------------------------"+end_of_line + Colors.END) os.system(python+" -m venv " + venv) print(Colors.LOG_BLUE + "-----------------------------Installing python packages via pip-----------------------------" + Colors.END) os.system(venv + '\Scripts\python -m pip install --upgrade pip') os.system(venv + pip+' install --upgrade wheel') os.system(venv + pip+' install --upgrade setuptools') if (platform.system() == "Windows"): if (platform.machine() == "x86"): os.system(venv + '\Scripts\pip install ../install\windows\lxml-4.1.1-cp36-cp36m-win32.whl') else: os.system(venv + '\Scripts\pip install ../install\windows\lxml-4.1.1-cp36-cp36m-win_amd64.whl') os.system(venv + pip+' install -r ../install' + os.sep + REQUIREMENTS) print(Colors.LOG_BLUE + "-----------------------------cd ../install-----------------------------" + Colors.END) os.chdir("../install") # ## creating database and creating and granting user pyros # print(Colors.LOG_BLUE + end_of_line+"-----------------------------Launching mysql to create database and create and grant user pyros-----------------------------" + Colors.END) print(Colors.LOG_BLUE +"-----------------------------Please enter your MYSQL root password-----------------------------" + Colors.END) process = subprocess.Popen("echo " + sql_request, shell=True) process.wait() if (process.returncode != 0): stderr.write(Colors.ERROR + "ERROR !: db configuration failed !" + Colors.END + "\r\n") return -1 print(Colors.LOG_BLUE + end_of_line+"-----------------------------Database created and user pyros successfully created and granted-----------------------------" + Colors.END) # ## replacing pattern in settings.py to use mysql # print(Colors.LOG_BLUE + "-----------------------------setting MYSQL = True in settings-----------------------------" + Colors.END) replacePatternInFile("MYSQL = False", "MYSQL = True", os.path.normpath("../src/pyros/settings.py")) if (platform.system() == "Windows"): # ## moving voeventparse in site-packages directory # try: site_packages = "..\private\\venv_py3_pyros\Lib\site-packages\\" if (not os.path.isdir(site_packages + "voevent_parse-0.9.5.dist-info") and not os.path.isdir(site_packages + "voeventparse")): print(Colors.LOG_BLUE + "\r\n\r\n-----------------------------Copying the voevent library in Lib/site-packages-----------------------------" + Colors.END) process = subprocess.Popen("xcopy /i /y windows\\voeventparse " + site_packages + "voeventparse") process.wait() if (process.returncode != 0):raise Exception process = subprocess.Popen("xcopy /i /y windows\\voevent_parse-0.9.5.dist-info " + site_packages + "voevent_parse-0.9.5.dist-info") process.wait() if (process.returncode != 0): raise Exception print(Colors.LOG_BLUE + "\r\n-----------------------------library successfully copied-----------------------------" + Colors.END) except Exception as e: print(Colors.ERROR + "ERROR while Copying the voevent library in Lib/site-packages" + Colors.END, file=stderr) return False print(Colors.LOG_BLUE + "\r\n-----------------------------cd ..-----------------------------" + Colors.END) os.chdir("..") # ## Executing migrations # print(Colors.LOG_BLUE + "\r\n\r\n-----------------------------Migrate : executing pyros.py init_database-----------------------------" + Colors.END) try: process = subprocess.Popen(python + " pyros.py init_database" , shell=True) process.wait() except Exception as e: print(Colors.ERROR + "Error while initialising database :" + Colors.END) return -1 print(Colors.LOG_BLUE + "\r\n\r\n-----------------------------Install successfull !-----------------------------" + Colors.END) return 0 def _help(): print( "Welcome in the installation script of the pyros venv.\t\nPlease launch it from the install directory of pyros.\n\tIf you're on Ubuntu Debian or CentOS:\n\tlaunch it with sudo and <--prerequisites> or <-p> to install the prerequisites.\n\t-->sudo ./test_install.py -p\n\n\tFor the python packages launch it from the install directory of pyros without sudo and without parameter\n\t-->./test_install.py") if __name__ == '__main__': if (len(argv) > 1): if argv[1] == "--prerequisites" or argv[1] == "-p": install_required() else: _help() elif len(argv) == 1: install_python_modules("venv_py3_pyros") else: _help()