class AgentManager: def __init__(self): self.inspector_manager = setup_inspector() self.pipe_manager = setup_pipe() self.publisher_manager = setup_publisher() self.sched = BlockingScheduler() def setup_tasks(self): """ tasks:{ TYPE: { INTERVAL: [ (item,inspector), ...] }...} """ tasks = {"poll": {}, "cron": {}} for pipe_k in self.pipe_manager: inspector = self.inspector_manager.get(pipe_k) for item in self.pipe_manager[pipe_k]: type = item["task"]["type"] # v -->interval、timepoint if type == "poll": v = item["task"]["interval"] else: v = item["task"]["timepoint"] if not tasks[type].has_key(v): tasks[type][v] = [] task = (item, inspector) tasks[type][v].append(task) return tasks def start(self): for type, ctasks in six.iteritems(self.setup_tasks()): # v -->interval、timepoint if type == 'poll': for v, tasks in six.iteritems(ctasks): for task in tasks: self.sched.add_job(self.run_task, trigger='interval', seconds=int(v), args=[task]) LOG.info("Add a task. (%s)" % str(task)) elif type == 'cron': for v, tasks in six.iteritems(ctasks): hour, minutes, seconds = v.split(':') for task in tasks: self.sched.add_cron_job(self.run_task, days='*', hours=int(hour), minutes=int(minutes), seconds=int(seconds), args=[task]) LOG.info("Add a task. (%s)" % str(task)) else: LOG.warning("The type is error! (%s)" % type) self.sched.start() def run_task(self, task): args, inspector = task publisher = args["publisher"] publishers = publisher["publishers"] receivers = publisher["users"] alarm, content = inspector.get_module(args).run() if alarm: LOG.info("The task alarm. (%s:%s)" % (inspector, str(args))) for publisher in publishers: self.publisher_manager[publisher]. \ get_module(receivers, content).send() else: LOG.info("The task does not alarm. (%s:%s)" % (inspector, str(args))) return