def put(self, period_id): user = g.user_info["username"] args = parser.parse_args() args["id"] = period_id period_task = args db = DB() # 判断是否存在 select_status, select_result = db.select_by_id("period_task", period_id) if select_status is not True: db.close_mysql() logger.error("Modify period_task error: %s" % select_result) return {"status": False, "message": select_result}, 500 if not select_result: db.close_mysql() return { "status": False, "message": "%s does not exist" % period_id }, 404 # 判断名字否已经存在 status, result = db.select( "period_task", "where data -> '$.name'='%s' and data -> '$.product_id'='%s'" % (args["name"], args["product_id"])) if status is True and result: if period_id != result[0].get("id"): db.close_mysql() return { "status": False, "message": "The period_task name already exists" }, 200 period_task["result"] = select_result["result"] period_task["timestamp"] = select_result["timestamp"] period_task["status"] = select_result["status"] period_task["action"] = select_result["action"] period_task["executed_minion"] = select_result["executed_minion"] period_task["count"] = select_result["count"] period_task["step"] = select_result["step"] period_task["audit"] = select_result["audit"] if args["once"]["date"]: args["once"]["date"] = utc_to_local(args["once"]["date"]) status, result = db.update_by_id( "period_task", json.dumps(period_task, ensure_ascii=False), period_id) db.close_mysql() # 修改调度任务 if args["scheduler"] == "once" and args["once"]["type"] == "timing": run_date = args["once"]["date"].split( " ")[0] + " " + args["once"]["time"] scheduler_timing_modify(args["id"], args["product_id"], user, run_date) if args["scheduler"] == "period": scheduler_interval_modify(args["id"], args["product_id"], user, args["period"]["interval"], args["period"]["type"]) if status is not True: logger.error("Modify period_task error: %s" % result) return {"status": False, "message": result}, 500 audit_log(user, period_id, "", "period_task", "edit") return {"status": True, "message": ""}, 200
def sse_worker(product): # job_pattern = re.compile('salt/job/\d+/ret/') mine_pattern = re.compile(r'"fun": "mine.update"') saltutil_pattern = re.compile(r'"fun": "saltutil.find_job"') running_pattern = re.compile(r'"fun": "saltutil.running"') lookup_pattern = re.compile(r'"fun": "runner.jobs.lookup_jid"') event_pattern = re.compile(r'"tag": "salt/event/new_client"') salt_api = salt_api_for_product(product) event_response = salt_api.events() client = sseclient.SSEClient(event_response) for event in client.events(): if mine_pattern.search(event.data): pass elif saltutil_pattern.search(event.data): pass elif running_pattern.search(event.data): pass elif lookup_pattern.search(event.data): pass elif event_pattern.search(event.data): pass else: print(event.data) event_dict = ast.literal_eval(event.data.replace('true', 'True').replace('false', 'False'). replace('null', '""')) event_dict['data']['_stamp'] = utc_to_local(event_dict['data']['_stamp'] + "Z") event_dict['data']['product_id'] = product db = DB() db.insert("event", json.dumps(event_dict, ensure_ascii=False)) db.close_mysql()
def post(self): args = parser.parse_args() args["id"] = uuid_prefix("t") user = g.user_info["username"] period_task = args period_task["timestamp"] = int(time.time()) period_task["result"] = [] period_task["audit"] = [] period_task["status"] = {"id": 1, "name": period_status.get(1)} period_task["count"] = 0 period_task["step"] = 0 audit = { "timestamp": int(time.time()), "user": user, "option": period_audit.get(0) } insert_period_audit(args["id"], audit) if args["once"]["date"]: args["once"]["date"] = utc_to_local(args["once"]["date"]) db = DB() status, result = db.select( "period_task", "where data -> '$.name'='%s' and data -> '$.product_id'='%s'" % (args["name"], args["product_id"])) if status is True: if len(result) == 0: audit_log(user, args["id"], "", "period_task", "add") # 一次立即执行的直接扔给celery if args["scheduler"] == "once" and args["once"][ "type"] == "now": period_task["action"] = "concurrent_play" job.delay(args["id"], args["product_id"], user) # 一次定时执行的扔给APScheduler,进行定时处理 if args["scheduler"] == "once" and args["once"][ "type"] == "timing": period_task["action"] = "scheduler_resume" run_date = args["once"]["date"].split( " ")[0] + " " + args["once"]["time"] scheduler_result = scheduler_timing_add( args["id"], args["product_id"], user, run_date) if scheduler_result.get("status") is not True: return { "status": False, "message": scheduler_result.get("message") }, 500 # 周期性的扔给APScheduler,进行定时处理 if args["scheduler"] == "period": period_task["action"] = "scheduler_resume" scheduler_result = scheduler_interval_add( args["id"], args["product_id"], user, args["period"]["interval"], args["period"]["type"]) if scheduler_result.get("status") is not True: return { "status": False, "message": scheduler_result.get("message") }, 500 insert_status, insert_result = db.insert( "period_task", json.dumps(period_task, ensure_ascii=False)) db.close_mysql() if insert_status is not True: logger.error("Add period_task error: %s" % insert_result) return {"status": False, "message": insert_result}, 500 return {"status": True, "message": ""}, 201 else: db.close_mysql() return { "status": False, "message": "The period_task name already exists" }, 200 else: db.close_mysql() logger.error("Select period_task name error: %s" % result) return {"status": False, "message": result}, 500