import glob from cement.core import handler, hook from cement.core.controller import CementBaseController, expose from wo.cli.plugins.sitedb import getAllsites, updateSiteInfo from wo.core.fileutils import WOFileUtils from wo.core.logging import Log from wo.core.mysql import StatementExcecutionError, WOMysql def wo_sync_hook(app): pass class WOSyncController(CementBaseController): class Meta: label = 'sync' stacked_on = 'base' stacked_type = 'nested' description = 'synchronize the WordOps database' @expose(hide=True) def default(self): self.sync() @expose(hide=True) def sync(self): """ 1. reads database information from wp/wo-config.php 2. updates records into wo database accordingly. """ Log.info(self, "Synchronizing wo database, please wait...") sites = getAllsites(self) if not sites: pass for site in sites: if site.site_type in ['mysql', 'wp', 'wpsubdir', 'wpsubdomain']: wo_site_webroot = site.site_path # Read config files configfiles = glob.glob(wo_site_webroot + '/*-config.php') # search for wp-config.php inside htdocs/ if not configfiles: Log.debug(self, "Config files not found in {0}/ " .format(wo_site_webroot)) if site.site_type != 'mysql': Log.debug(self, "Searching wp-config.php in {0}/htdocs/" .format(wo_site_webroot)) configfiles = glob.glob( wo_site_webroot + '/htdocs/wp-config.php') if configfiles: if WOFileUtils.isexist(self, configfiles[0]): wo_db_name = (WOFileUtils.grep(self, configfiles[0], 'DB_NAME').split(',')[1] .split(')')[0].strip().replace('\'', '')) wo_db_user = (WOFileUtils.grep(self, configfiles[0], 'DB_USER').split(',')[1] .split(')')[0].strip().replace('\'', '')) wo_db_pass = (WOFileUtils.grep(self, configfiles[0], 'DB_PASSWORD').split(',')[1] .split(')')[0].strip().replace('\'', '')) wo_db_host = (WOFileUtils.grep(self, configfiles[0], 'DB_HOST').split(',')[1] .split(')')[0].strip().replace('\'', '')) # Check if database really exist try: if not WOMysql.check_db_exists(self, wo_db_name): # Mark it as deleted if not exist wo_db_name = 'deleted' wo_db_user = 'deleted' wo_db_pass = 'deleted' except StatementExcecutionError as e: Log.debug(self, str(e)) except Exception as e: Log.debug(self, str(e)) if site.db_name != wo_db_name: # update records if any mismatch found Log.debug(self, "Updating wo db record for {0}" .format(site.sitename)) updateSiteInfo(self, site.sitename, db_name=wo_db_name, db_user=wo_db_user, db_password=wo_db_pass, db_host=wo_db_host) else: Log.debug(self, "Config files not found for {0} " .format(site.sitename)) def load(app): # register the plugin class.. this only happens if the plugin is enabled app.handler.register(WOSyncController) # register a hook (function) to run after arguments are parsed. app.hook.register('post_argument_parsing', wo_sync_hook)