From e0692db36470b0c632924de4b594ba1fbb497fb4 Mon Sep 17 00:00:00 2001 From: harshadyeola Date: Wed, 10 Jun 2015 16:21:06 +0530 Subject: [PATCH] adding adminstack --- ee/cli/plugins/adminstack.py | 371 +++++++++++++++++++++++++++++++++++ 1 file changed, 371 insertions(+) create mode 100644 ee/cli/plugins/adminstack.py diff --git a/ee/cli/plugins/adminstack.py b/ee/cli/plugins/adminstack.py new file mode 100644 index 00000000..c9f10eb8 --- /dev/null +++ b/ee/cli/plugins/adminstack.py @@ -0,0 +1,371 @@ +import os +import sys +import random +import shutil +import string +from ee.core.variables import EEVariables +from ee.core.aptget import EEAptGet +from ee.cli.plugins.eestack import EEStack +from ee.core.shellexec import EEShellExec +from ee.core.shellexec import CommandExecutionError +from ee.core.fileutils import EEFileUtils +from ee.core.git import EEGit +from ee.core.services import EEService +from ee.core.extract import EEExtract +from ee.cli.plugins.mysqlstack import EEMysqlStack +from ee.cli.plugins.nginxstack import EENginxStack +from ee.cli.plugins.phpstack import EEPhpStack +from ee.core.download import EEDownload +from ee.core.mysql import EEMysql +from ee.cli.main import app + + +class EEAdminStack(EEStack): + """ + EasyEngine Admin Tools stack + """ + packages_name = EEVariables.ee_admin + app = app + log = app.log + + def __init__(self, package_dict=None, apt_packages=None): + """ + Initialize packages list in stack + pkgs_name : list of packages to be intialized for operations + in stack + package_url : list of urls from where packages to be fetched + """ + self.apt_packages = apt_packages + self.manual_packages = package_dict + self.packages_name = self._get_stack() + super(EEAdminStack, self).__init__(self.apt_packages) + + def _get_stack(self): + """ + """ + if self.apt_packages or self.manual_packages: + if not self.apt_packages: + return (self.manual_packages) + elif not self.manual_packages: + return (self.apt_packages) + else: + return (self.apt_packages, self.manual_packages) + + return EEAdminStack.packages_name + + def _set_stack(self): + """ + """ + + if type(self.packages_name) is tuple: + for packages in self.packages_name: + if type(packages) is list: + self.apt_packages = packages + if type(packages) is dict: + self.manual_packages = packages + elif type(self.packages_name) is dict: + self.manual_packages = self.packages_name + + def _requirement_check(self): + """ + Check if requirements for this EEAdminStack stack are fullfilled. + """ + # Install NGINX stack if not installed + if not EENginxStack(self).is_installed(): + self.log.info("Installing nginxstack") + EENginxStack(self).install_stack() + + # Install PHP stack if not installed + if not EEPhpStack(self).is_installed(): + self.log.info("Installing phpstack") + EEPhpStack(self).install_stack() + + # Install MySQL stack if not installed + if not EEMysqlStack(self).is_installed(): + self.log.info("Installing mysqlstack") + EEMysqlStack(self).install_stack() + + def _install_phpmyadmin(self, file_path): + """ + """ + print("Installing phpmyadmin, please wait...") + # Extract phpmyadmin compressed file + EEExtract.extract(self, file_path, EEVariables.ee_downloads) + if not os.path.exists('{0}22222/htdocs/db' + .format(EEVariables.ee_webroot)): + self.log.debug("Creating new directory " + "{0}22222/htdocs/db" + .format(EEVariables.ee_webroot)) + os.makedirs('{0}22222/htdocs/db' + .format(EEVariables.ee_webroot)) + shutil.move('{0}phpmyadmin-STABLE/'.format(EEVariables.ee_downloads), + '{0}22222/htdocs/db/pma/'.format(EEVariables.ee_webroot)) + self.log.debug('Setting Privileges of webroot permission to ' + '{0}22222/htdocs/db/pma file '.format(EEVariables.ee_webroot)) + EEFileUtils.chown(self, '{0}22222' + .format(EEVariables.ee_webroot), + EEVariables.ee_php_user, + EEVariables.ee_php_user, + recursive=True) + + def _install_adminer(self, file_path): + print("Installing adminer, please wait...") + shutil.move(file_path, + '{0}22222/htdocs/db/'.format(EEVariables.ee_webroot)) + pass + + def _install_wpcli(self, file_path): + print("Installing wpcli, please wait...") + shutil.move(file_path, '/usr/bin/wp') + + def _install_phpmemcacheadmin(self, file_path): + print("Installing phpmemcacheadmin, please wait...") + if not os.path.exists('{0}22222/htdocs/cache/' + .format(EEVariables.ee_webroot)): + os.makedirs('{0}22222/htdocs/cache/' + .format(EEVariables.ee_webroot)) + EEExtract.extract(self, file_path, + '{0}22222/htdocs/cache/memcache' + .format(EEVariables.ee_webroot)) + self.log.debug("Setting Privileges to {0}22222/htdocs/cache/memcache file" + .format(EEVariables.ee_webroot)) + EEFileUtils.chown(self, '{0}22222' + .format(EEVariables.ee_webroot), + EEVariables.ee_php_user, + EEVariables.ee_php_user, + recursive=True) + + def _install_cleancache(self, file_path): + """ + """ + print("Installing clean php, please wait...") + shutil.move(file_path, "{0}22222/htdocs/cache/nginx/clean.php" + .format(EEVariables.ee_webroot)) + + + def _install_opcache(self, file_path): + """ + """ + print("Installing opcache, please wait...") + pass + + def _install_webgrind(self, file_path): + print("Installing webgring, please wait...") + self.log.debug("Extracting file webgrind.tar.gz to " + "location /tmp/ ") + EEExtract.extract(self, file_path, EEVariables.ee_downloads) + if not os.path.exists('{0}22222/htdocs/php' + .format(EEVariables.ee_webroot)): + self.log.debug("Creating directroy{0}22222/htdocs/php" + .format(EEVariables.ee_webroot)) + os.makedirs('{0}22222/htdocs/php' + .format(EEVariables.ee_webroot)) + shutil.move('{0}webgrind-master/'.format(EEVariables.ee_downloads), + '{0}22222/htdocs/php/webgrind' + .format(EEVariables.ee_webroot)) + + EEFileUtils.searchreplace(self, "{0}22222/htdocs/php/webgrind/" + "config.php" + .format(EEVariables.ee_webroot), + "/usr/local/bin/dot", "/usr/bin/dot") + EEFileUtils.searchreplace(self, "{0}22222/htdocs/php/webgrind/" + "config.php" + .format(EEVariables.ee_webroot), + "Europe/Copenhagen", + EEVariables.ee_timezone) + + EEFileUtils.searchreplace(self, "{0}22222/htdocs/php/webgrind/" + "config.php" + .format(EEVariables.ee_webroot), + "90", "100") + + self.log.debug("Setting Privileges of webroot permission to " + "{0}22222/htdocs/php/webgrind/ file " + .format(EEVariables.ee_webroot)) + EEFileUtils.chown(self, '{0}22222' + .format(EEVariables.ee_webroot), + EEVariables.ee_php_user, + EEVariables.ee_php_user, + recursive=True) + + def _install_ptqueryadvisor(self, file_path): + print("Installing ptqueryadvisor, please wait...") + shutil.move(file_path, '/usr/bin/pt-query-advisor') + EEFileUtils.chmod(self, "/usr/bin/pt-query-advisor", 0o775) + + + def _install_anemometer(self, file_path): + print("Installing anemometer, please wait...") + self.log.debug("Extracting file anemometer.tar.gz to " + "location /tmp/ ") + EEExtract.extract(self, file_path, EEVariables.ee_downloads) + if not os.path.exists('{0}22222/htdocs/db/' + .format(EEVariables.ee_webroot)): + self.log.debug("Creating directory") + os.makedirs('{0}22222/htdocs/db/' + .format(EEVariables.ee_webroot)) + shutil.move('{0}Anemometer-master'.format(EEVariables.ee_downloads), + '{0}22222/htdocs/db/anemometer' + .format(EEVariables.ee_webroot)) + chars = ''.join(random.sample(string.ascii_letters, 8)) + try: + EEShellExec.cmd_exec(self, 'mysql < {0}22222/htdocs/db' + '/anemometer/install.sql' + .format(EEVariables.ee_webroot)) + except CommandExecutionError as e: + raise SiteError("Unable to import Anemometer database") + + EEMysql.execute(self, 'grant select on *.* to \'anemometer\'' + '@\'{0}\''.format(self.app.config.get('mysql', + 'grant-host'))) + self.log.debug("grant all on slow-query-log.*" + " to anemometer@root_user IDENTIFIED BY password ") + EEMysql.execute(self, 'grant all on slow_query_log.* to' + '\'anemometer\'@\'{0}\' IDENTIFIED' + ' BY \'{1}\''.format(self.app.config.get( + 'mysql', 'grant-host'), + chars), + errormsg="cannot grant privillages", log=False) + + # Custom Anemometer configuration + self.log.debug("configration Anemometer") + data = dict(host=EEVariables.ee_mysql_host, port='3306', + user='anemometer', password=chars) + ee_anemometer = open('{0}22222/htdocs/db/anemometer' + '/conf/config.inc.php' + .format(EEVariables.ee_webroot), + encoding='utf-8', mode='w') + self.app.render((data), 'anemometer.mustache', + out=ee_anemometer) + ee_anemometer.close() + pass + + def _remove_phpmyadmin(self): + """ + """ + EEFileUtils.remove(self, + ['{0}22222/htdocs/db/pma/' + .format(EEVariables.ee_webroot)]) + pass + + def _remove_adminer(self): + """ + """ + EEFileUtils.remove(self, + ['{0}22222/htdocs/db/adminer' + .format(EEVariables.ee_webroot)]) + pass + + def _remove_wpcli(self): + """ + """ + EEFileUtils.remove(self, ['/usr/bin/wp']) + pass + + def _remove_phpmemcacheadmin(self): + """ + """ + EEFileUtils.remove(self, + ['{0}22222/htdocs/cache/memcache' + .format(EEVariables.ee_webroot)]) + pass + + def _remove_cleancache(self): + """ + """ + EEFileUtils.remove(self, + ["{0}22222/htdocs/cache/nginx/clean.php" + .format(EEVariables.ee_webroot)]) + pass + + def _remove_opcache(self): + """ + """ + + pass + + def _remove_webgrind(self): + """ + """ + EEFileUtils.remove(self, + ['{0}22222/htdocs/php/webgrind/' + .format(EEVariables.ee_webroot)]) + pass + + def _remove_ptqueryadvisor(self): + """ + """ + EEFileUtils.remove(self, ['/usr/bin/pt-query-advisor']) + pass + + def _remove_anemometer(self): + """ + """ + EEFileUtils.remove(self, + ['{0}22222/htdocs/db/anemometer' + .format(EEVariables.ee_webroot)]) + pass + + + def install_stack(self): + """ + """ + self._set_stack() + self._requirement_check() + self.log.info("Inside Admin Stack") + #print("Printing final packages %s " %self.packages_name) + print(".....................Manusl Packages.......................") + print(self.manual_packages) + + print() + print("------------------APT Packages-----------------------") + print(self.apt_packages) + print("--------------------------------------------------------") + + if self.apt_packages: + super(EEAdminStack, self).install_stack() + if self.manual_packages: + for key in self.manual_packages.keys(): + path = EEDownload(('%s' %key), self.manual_packages[key]).download() + print("Evaluating function %s..." %key) + print("self._install_{0}(self, '{1}')".format(key, path)) + eval("self._install_{0}('{1}')".format(key, path)) + + def remove_stack(self): + """ + """ + self._set_stack() + print("Inside Admin Stack") + print("Printing final packages %s " %self.packages_name) + print() + + + print(self.manual_packages) + + if self.apt_packages: + super(EEAdminStack, self).remove_stack() + if self.manual_packages: + for key in self.manual_packages.keys(): + print("Evaluating function %s..." %key) + print("self._remove_{0}(self)".format(key)) + eval("self._remove_{0}()".format(key)) + + + def purge_stack(self): + """ + """ + self._set_stack() + print("Inside Admin Stack") + # print("Printing final packages %s " %self.packages_name) + #print() + + + #print(self.manual_packages) + + if self.apt_packages: + super(EEAdminStack, self).purge_stack() + if self.manual_packages: + for key in self.manual_packages.keys(): + print("Evaluating function %s..." %key) + print("self._remove_{0}(self)".format(key)) + eval("self._remove_{0}()".format(key))