View file File name : metrics.py Content :import json from cement import App, Controller, ex from cement import shell from dhwp.core.wordpress import Wordpress from yaml import safe_load from multiprocessing import Pipe class Metrics(Controller): class Meta: label = 'metrics' @ex( help='Gather metrics', arguments=[ (['-o', '--output'], {'help': 'where to put metric output', 'action': 'store', 'dest': 'output', }), (['-b', '--batch'], {'help': 'config file for handling metrics from multiple sites', 'action': 'store', 'dest': 'batch_file', }), ] ) def metrics(self): if self.app.pargs.batch_file: with open(self.app.pargs.batch_file) as f: cnf = safe_load(f) print(cnf) i = 0 processes = [] pipe_list = [] while i < len(cnf['Installs']): if len(processes) < 2: print(cnf['Installs'][i]) install = cnf['Installs'][i] recv_end, send_end = Pipe(False) new_process = shell.spawn(self.generate_metrics, args=(install['Path'], install['User'], install['Install Id'], send_end)) processes.append(new_process) pipe_list.append(recv_end) i += 1 for num, process in enumerate(processes): if process.is_alive() is False: print(processes[num]) del processes[num] data = [] for x in pipe_list: try: data.append(x.recv()) except EOFError as e: pass json_out = json.dumps(data, ensure_ascii=False) self.app.log.debug("metric output : %s" % json_out) if (cnf['Output']): print(cnf['Output']) self.app.log.debug("writing output to : %s" % cnf['Output']) f = open(cnf['Output'], "w") f.write(json_out) f.close() else: data = self.generate_metrics(self.app.pargs.path) json_out = json.dumps(data, ensure_ascii=False) self.app.log.debug("metric output : %s" % json_out) if (self.app.pargs.output): self.app.log.debug("writing output to : %s" % self.app.pargs.output) f = open(self.app.pargs.output, "w") f.write(json_out) f.close() def generate_metrics(self, path, user=None, install_id=None, send_end=None): try: data = { 'counts': { }, 'raw': { } } wp = Wordpress(path, user) metric_raw = { 'plugins': 'plugin list', 'themes': 'theme list', } metric_counts = { 'users': 'user list', 'posts_published': 'post list --post_type=post,page --post_status=publish', 'media_uploaded': 'post list --post_type=attachment', } for key in metric_raw: out = wp.cli(metric_raw[key] + ' --skip-plugins --skip-themes --skip-packages --format=json') json_dict = json.loads(out) if json_dict: data['raw'][key] = json_dict for key in metric_counts: out = wp.cli(metric_counts[key] + ' --skip-plugins --skip-themes --skip-packages --format=count') data['counts'][key] = out except Exception: data['error'] = True pass finally: if send_end: send_end.send({install_id: data}) send_end.close() return data