From 7713f844ac9ec89cd1e910055d3343f3de607d7e Mon Sep 17 00:00:00 2001 From: harshadyeola Date: Tue, 13 Jan 2015 16:30:35 +0530 Subject: [PATCH] ee site info, enable, disable, log completed --- ee/cli/plugins/site.py | 105 ++++++++++++++++++++++++----- ee/cli/plugins/site_functions.py | 31 +++++---- ee/cli/templates/siteinfo.mustache | 10 +++ ee/core/git.py | 10 +++ ee/core/services.py | 19 +++++- ee/core/shellexec.py | 13 ++++ 6 files changed, 156 insertions(+), 32 deletions(-) create mode 100644 ee/cli/templates/siteinfo.mustache diff --git a/ee/cli/plugins/site.py b/ee/cli/plugins/site.py index 401062ca..b871ac76 100644 --- a/ee/cli/plugins/site.py +++ b/ee/cli/plugins/site.py @@ -10,6 +10,7 @@ from ee.cli.plugins.sitedb import * from ee.core.git import EEGit import sys import os +import glob def ee_site_hook(app): @@ -41,33 +42,108 @@ class EESiteController(CementBaseController): @expose(help="enable site example.com") def enable(self): - # TODO Write code for ee site enable command here - print("Inside EESiteController.enable().") + (ee_domain, ee_www_domain) = ValidateDomain(self.app.pargs.site_name) + if os.path.isfile('/etc/nginx/sites-available/{0}' + .format(ee_domain)): + EEFileUtils.create_symlink(self, + ['/etc/nginx/sites-available/{0}.conf' + .format(ee_domain_name), + '/etc/nginx/sites-enabled/{0}.conf' + .format(ee_domain_name)]) + else: + Log.error(self, "site {0} does not exists".format(ee_domain)) + sys.exit(1) @expose(help="disable site example.com") def disable(self): - # TODO Write code for ee site disable command here - print("Inside EESiteController.disable().") + (ee_domain, ee_www_domain) = ValidateDomain(self.app.pargs.site_name) + if os.path.isfile('/etc/nginx/sites-available/{0}' + .format(ee_domain)): + EEFileUtils.remove_symlink(self, + ['/etc/nginx/sites-available/{0}.conf' + .format(ee_domain_name), + '/etc/nginx/sites-enabled/{0}.conf' + .format(ee_domain_name)]) + else: + Log.error(self, "site {0} does not exists".format(ee_domain)) + sys.exit(1) @expose(help="get example.com information") def info(self): - # TODO Write code for ee site info command here - print("Inside EESiteController.info().") + (ee_domain, ee_www_domain) = ValidateDomain(self.app.pargs.site_name) + ee_db_name = '' + ee_db_user = '' + ee_db_pass = '' + if os.path.isfile('/etc/nginx/sites-available/{0}' + .format(ee_domain)): + ee_site_webroot = EEVariables.ee_webroot + ee_domain + access_log = (ee_site_webroot + '/logs/access.log') + error_log = (ee_site_webroot + '/logs/error.log') + configfiles = glob.glob(ee_site_webroot + '/*-config.php') + if configfiles: + if EEFileUtils.isexist(self, configfiles[0]): + ee_db_name = (EEFileUtils.grep(self, configfiles[0], + 'DB_NAME').split(',')[1] + .split(')')[0].strip().replace('\'', '')) + ee_db_user = (EEFileUtils.grep(self, configfiles[0], + 'DB_USER').split(',')[1] + .split(')')[0].strip().replace('\'', '')) + ee_db_pass = (EEFileUtils.grep(self, configfiles[0], + 'DB_PASSWORD').split(',')[1] + .split(')')[0].strip().replace('\'', '')) + + data = dict(domain=ee_domain, webroot=ee_site_webroot, + accesslog=access_log, errorlog=error_log, + dbname=ee_db_name, dbuser=ee_db_user, + dbpass=ee_db_pass) + self.app.render((data), 'siteinfo.mustache') + else: + Log.error(self, "site {0} does not exists".format(ee_domain)) + sys.exit(1) @expose(help="Monitor example.com logs") def log(self): - # TODO Write code for ee site log command here - print("Inside EESiteController.log().") + (ee_domain, ee_www_domain) = ValidateDomain(self.app.pargs.site_name) + if os.path.isfile('/etc/nginx/sites-available/{0}' + .format(ee_domain)): + EEShellExec.cmd_exec(self, 'tail -f /var/log/nginx/{0}.*.log' + .format(ee_domain)) + else: + Log.error(self, "site {0} does not exists".format(ee_domain)) + sys.exit(1) @expose(help="Edit example.com's nginx configuration") def edit(self): - # TODO Write code for ee site edit command here - print("Inside EESiteController.edit().") + (ee_domain, ee_www_domain) = ValidateDomain(self.app.pargs.site_name) + if os.path.isfile('/etc/nginx/sites-available/{0}' + .format(ee_domain)): + EEShellExec.invoke_editor(self, '/etc/nginx/sites-available/{0}' + .format(ee_domain)) + if (EEGit.checkfilestatus(self, "/etc/nginx", + '/etc/nginx/sites-available/{0}'.format(ee_domain))): + EEGit.add(self, ["/etc/nginx"], msg="Edit website: {0}" + .format(ee_domain)) + # Reload NGINX + EEService.reload_service(self, 'nginx') + else: + Log.error(self, "site {0} does not exists".format(ee_domain)) + sys.exit(1) @expose(help="Display example.com's nginx configuration") def show(self): # TODO Write code for ee site edit command here - print("Inside EESiteController.show().") + (ee_domain, ee_www_domain) = ValidateDomain(self.app.pargs.site_name) + if os.path.isfile('/etc/nginx/sites-available/{0}' + .format(ee_domain)): + Log.info(self, "Display NGINX configuration for {0}" + .format(ee_domain)) + f = open('/etc/nginx/sites-available/{0}'.format(ee_domain), "r") + text = f.read() + print(text) + f.close() + else: + Log.error(self, "site {0} does not exists".format(ee_domain)) + sys.exit(1) @expose(help="list sites currently available") def list(self): @@ -116,14 +192,13 @@ class EESiteCreateController(CementBaseController): # data = dict(foo='EESiteCreateController.default().') # self.app.render((data), 'default.mustache') # Check domain name validation - (ee_domain, - ee_www_domain, ) = ValidateDomain(self.app.pargs.site_name) + (ee_domain, ee_www_domain) = ValidateDomain(self.app.pargs.site_name) ee_site_webroot = EEVariables.ee_webroot + ee_domain # Check if doain previously exists or not - if os.path.isfile('/etc/nginx/sites-available/{0}.conf' + if os.path.isfile('/etc/nginx/sites-available/{0}' .format(ee_domain)): - self.app.log.error("site {0} already exists" + self.app.log.error(self, "site {0} already exists" .format(ee_domain)) sys.exit(1) diff --git a/ee/cli/plugins/site_functions.py b/ee/cli/plugins/site_functions.py index 3c5f3b12..ef18ae4c 100644 --- a/ee/cli/plugins/site_functions.py +++ b/ee/cli/plugins/site_functions.py @@ -18,7 +18,7 @@ def SetupDomain(self, data): self.app.log.info("Creating {0} ...".format(ee_domain_name)) # write nginx config for file try: - ee_site_nginx_conf = open('/etc/nginx/sites-available/{0}.conf' + ee_site_nginx_conf = open('/etc/nginx/sites-available/{0}' .format(ee_domain_name), 'w') self.app.render((data), 'virtualconf.mustache', @@ -33,9 +33,9 @@ def SetupDomain(self, data): sys.exit(1) # create symbolic link for - EEFileUtils.create_symlink(self, ['/etc/nginx/sites-available/{0}.conf' + EEFileUtils.create_symlink(self, ['/etc/nginx/sites-available/{0}' .format(ee_domain_name), - '/etc/nginx/sites-enabled/{0}.conf' + '/etc/nginx/sites-enabled/{0}' .format(ee_domain_name)]) # Creating htdocs & logs directory @@ -283,22 +283,21 @@ def siteBackup(self, data): if not EEFileUtils.isexist(self, backup_path): EEFileUtils.mkdir(self, backup_path) Log.info(self, "Backup Location : {0}".format(backup_path)) - EEFileUtils.copyfile(self, '/etc/nginx/sites-available/{0}.conf' + EEFileUtils.copyfile(self, '/etc/nginx/sites-available/{0}' .format(data['ee_domain']), backup_path) if data['currsitetype'] in ['html', 'php', 'mysql']: Log.info(self, "Backup Webroot ...") EEFileUtils.mvfile(self, ee_site_webroot + '/htdocs', backup_path) - configfiles = glob(ee_site_webroot + '/htdocs/*-config.php') - - for file in configfiles: - if EEFileUtils.isexist(self, file): - ee_db_name = (EEFileUtils.grep(self, file, 'DB_NAME').split(',')[1] - .split(')')[0].strip()) - Log.info(self, 'Backup Database, please wait') - EEShellExec.cmd_exec(self, "mysqldump {0} > {1}/{0}.sql" - .format(ee_db_name, backup_path), - "Failed: Backup Database") - # move wp-config.php/ee-config.php to backup - EEFileUtils.mvfile(self, file, backup_path) + configfiles = glob(ee_site_webroot + '/*-config.php') + + if EEFileUtils.isexist(self, configfiles[0]): + ee_db_name = (EEFileUtils.grep(self, file, 'DB_NAME').split(',')[1] + .split(')')[0].strip().replace('\'', '')) + Log.info(self, 'Backup Database, please wait') + EEShellExec.cmd_exec(self, "mysqldump {0} > {1}/{0}.sql" + .format(ee_db_name, backup_path), + "Failed: Backup Database") + # move wp-config.php/ee-config.php to backup + EEFileUtils.mvfile(self, file, backup_path) diff --git a/ee/cli/templates/siteinfo.mustache b/ee/cli/templates/siteinfo.mustache new file mode 100644 index 00000000..dfe7d917 --- /dev/null +++ b/ee/cli/templates/siteinfo.mustache @@ -0,0 +1,10 @@ +Information about {{domain}}: + +Nginx configuration {{type}} {{enable}} +access_log {{accesslog}} +error_log {{errorlog}} +Webroot {{webroot}} +{{#dbname}}DB_NAME {{dbname}}{{/dbname}} +{{#dbname}}DB_USER {{dbuser}}{{/dbname}} +{{#dbname}}DB_PASS {{dbpass}}{{/dbname}} +{{#tablepref}}table_prefix {{tableprefix}}{{/tablepref}} diff --git a/ee/core/git.py b/ee/core/git.py index 6ed576ae..19553a04 100644 --- a/ee/core/git.py +++ b/ee/core/git.py @@ -34,3 +34,13 @@ class EEGit: sys.exit(1) else: self.app.log.debug("EEGit: Path {0} not present".format(path)) + + def checkfilestatus(self, repo, filepath): + global git + git = git.bake("--git-dir={0}/.git".format(repo), + "--work-tree={0}".format(repo)) + status = git.status("-s", "{0}".format(filepath)) + if len(status.splitlines()) > 0: + return True + else: + return False diff --git a/ee/core/services.py b/ee/core/services.py index 9a52b4f6..315fa326 100644 --- a/ee/core/services.py +++ b/ee/core/services.py @@ -48,6 +48,22 @@ class EEService(): def reload_service(self, service_name): try: + if service_name in ['nginx', 'php5-fpm']: + retcode = subprocess.getstatusoutput('{0} -t' + .format(service_name)) + if retcode[0] == 0: + subprocess.getstatusoutput('service {0} reload' + .format(service_name)) + self.app.log.info("reload : {0} [OK]" + .format(service_name)) + return True + else: + self.app.log.error("reload : {0} [FAIL]" + .format(service_name)) + self.app.log.debug("{0}" + .format(retcode[1])) + return False + retcode = subprocess.getstatusoutput('service {0} reload' .format(service_name)) if retcode[0] == 0: @@ -56,7 +72,8 @@ class EEService(): else: return False except OSError as e: - self.app.log.error("Failed to reload NGINX:", e) + self.app.log.error("Failed to reload {0} {1}" + .format(service_name, e)) return False def get_service_status(self, service_name): diff --git a/ee/core/shellexec.py b/ee/core/shellexec.py index 27d7cca9..93b45f93 100644 --- a/ee/core/shellexec.py +++ b/ee/core/shellexec.py @@ -29,3 +29,16 @@ class EEShellExec(): Log.debug(self, "Unable to execute command \ {0}{1}" .format(e.errno, e.strerror)) sys.exit(1) + + def invoke_editor(self, filepath, errormsg=''): + try: + subprocess.call(['sensible-editor', filepath]) + except OSError as e: + if errormsg: + Log.error(self, errormsg) + else: + Log.error(self, "Unable to edit file \ {0}{1}" + .format(e.errno, e.strerror)) + Log.debug(self, "Unable to edit file \ {0}{1}" + .format(e.errno, e.strerror)) + sys.exit(1)