def cron_add_log(): """ 上传执行记录 """ datas = request.values.to_dict() api_access_token = get_config_value('api_access_token') access_token = datas.get('access_token') xiaoniu_cron_log_id = datas.get('xiaoniu_cron_log_id') if api_access_token: if not access_token: return api_err_return(msg='access_token不能为空') if api_access_token != access_token: return api_err_return(msg='access_token错误') if not xiaoniu_cron_log_id: return api_err_return(msg='xiaoniu_cron_log_id 必传哦!') content = datas.get('content') if not content: return api_err_return(msg='日志内容不能为空') jl = JobLog.query.filter(JobLog.log_id == xiaoniu_cron_log_id).first() if not jl: return api_err_return(msg='xiaoniu_cron_log_id 不存在') jli = JobLogItems(log_id=xiaoniu_cron_log_id, content=content) db.session.add(jli) db.session.commit() return 'ok'
def cron_del_job_log(): with scheduler.app.app_context(): try: job_log_counts = get_config_value('job_log_counts') or 0 if int(job_log_counts) != 0: crons = CronInfos.query.all() for item in crons: counts = JobLog.query.filter( JobLog.cron_info_id == item.id).count() if counts > int(job_log_counts): sql = "delete from job_log where cron_info_id = '%s' limit %s" % ( item.id, (counts - int(job_log_counts))) db.session.execute(sql) db.session.commit() except Exception as e: trace_info = traceback.format_exc() current_app.logger.error("==============") current_app.logger.error(str(e)) current_app.logger.error(trace_info) current_app.logger.error("==============") return "ok"
def cron_do(cron_id): with scheduler.app.app_context(): try: nows = get_now_time() cif = CronInfos.query.get(cron_id) if not cif: jl = JobLog(cron_info_id=cron_id, content="定时任务不存在", create_time=nows, take_time=0) db.session.add(jl) db.session.commit() else: req_url = cif.req_url if not req_url: jl = JobLog(cron_info_id=cron_id, content="请求链接不存在", create_time=nows, take_time=0) db.session.add(jl) db.session.commit() else: if req_url.find('http') == -1: jl = JobLog(cron_info_id=cron_id, content="请求链接有误,请检查一下", create_time=nows, take_time=0) db.session.add(jl) db.session.commit() else: try: xiaoniu_cron_log_id = str(uuid.uuid1()) t = time.time() req = requests.get( req_url, params={ 'xiaoniu_cron_log_id': xiaoniu_cron_log_id }, timeout=2 * 60, headers={'user-agent': 'xiaoniu_cron'}) ret = req.text try: ret = req.json() except: pass if type(ret) == dict: ret = json.dumps(ret, ensure_ascii=False) error_keyword = get_config_value('error_keyword') if error_keyword: error_keyword = error_keyword.replace( ',', ',').split(',') for item in error_keyword: if item.strip().lower() in ret.lower(): wechat_info_err( '定时任务【%s】发生错误' % cif.task_name, '返回信息:%s' % ret) break jl = JobLog(cron_info_id=cron_id, content=ret, create_time=nows, take_time=time.time() - t, log_id=xiaoniu_cron_log_id) db.session.add(jl) db.session.commit() except Exception as e: jl = JobLog(cron_info_id=cron_id, content="发生严重错误:%s" % str(e), create_time=nows, take_time=time.time() - t) db.session.add(jl) db.session.commit() wechat_info_err('定时任务【%s】发生严重错误' % cif.task_name, '返回信息:%s' % str(e)) except Exception as e: trace_info = traceback.format_exc() current_app.logger.error("==============") current_app.logger.error(str(e)) current_app.logger.error(trace_info) current_app.logger.error("==============") wechat_info_err('定时任务发生严重错误', '返回信息:%s' % str(e)) return "ok"
def cron_status(): """ 更新状态 task_name 任务名称 access_token status """ datas = request.values.to_dict() api_access_token = get_config_value('api_access_token') task_name = datas.get('task_name') access_token = datas.get('access_token') status = datas.get('status') if status: try: if int(status) not in [0, 1]: return api_err_return(msg='status只能0或者1') except Exception as e: return api_err_return(msg='status只能0或者1') if api_access_token: if not access_token: return api_err_return(msg='access_token不能为空') if api_access_token != access_token: return api_err_return(msg='access_token错误') if not task_name: return api_err_return(msg='任务名称不能为空') ci = CronInfos.query.filter(CronInfos.task_name == task_name).first() if not ci: return api_err_return(msg='任务不存在') if ci.status == -1: return api_err_return(msg='任务已结束,不能再操作,只能重新更新') if not status: # 0停止1运行中 if ci.status == 0: # 开启 ci.status = 1 scheduler.resume_job('cron_%s' % ci.id) else: ci.status = 0 # 关闭 scheduler.pause_job('cron_%s' % ci.id) else: if int(status) == 0 and ci.status != 0: ci.status = 0 # 关闭 scheduler.pause_job('cron_%s' % ci.id) if int(status) == 1 and ci.status != 1: ci.status = 1 scheduler.resume_job('cron_%s' % ci.id) db.session.add(ci) db.session.commit() return 'ok'
def crons(): """ 添加(更新)定时 access_token task_name 任务名称唯一 task_keyword 备注 run_date 执行时间 day day_of_week hour minute second req_url """ api_access_token = get_config_value('api_access_token') datas = request.values.to_dict() task_name = datas.get('task_name') task_keyword = datas.get('task_keyword') or '' access_token = datas.get('access_token') if api_access_token: if not access_token: return api_err_return(msg='access_token不能为空') if api_access_token != access_token: return api_err_return(msg='access_token错误') if not task_name: return api_err_return(msg='任务名称不能为空') cif = CronInfos.query.filter(CronInfos.task_name == task_name).first() run_date = datas.get('run_date') or '' day = datas.get('day') or '' if day: if day.isdigit() and int(day) not in range(1, 32): return api_err_return(msg='日(号)不在范围(0~31)内,请检查!') else: pass day_of_week = datas.get('day_of_week') or '' if day_of_week: if day_of_week.isdigit(): if int(day_of_week) not in range(0, 7): return api_err_return(msg='星期 不在范围(0~6)内,请检查!') else: if day_of_week not in [ 'mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun' ]: return api_err_return( msg='星期 不在范围(mon,tue,wed,thu,fri,sat,sun)内,请检查!') hour = datas.get('hour') or '' if hour and hour.isdigit(): if int(hour) not in range(0, 24): return api_err_return(msg='小时 不在范围(0~23)内,请检查!') minute = datas.get('minute') or '' if minute and minute.isdigit(): if int(minute) not in range(0, 60): return api_err_return(msg='分钟 不在范围(0~59)内,请检查!') second = datas.get('second') or '' if second and second.isdigit(): if int(second) not in range(0, 60): return api_err_return(msg='秒 不在范围(0~59)内,请检查!') """ 判断一下 run_date 必须有个不能为空 """ if not run_date: if not day_of_week and not day and not hour and not minute and not second: return api_err_return(msg='信息请完整填写!') req_url = datas.get('req_url') if not req_url: return api_err_return(msg='回调URL(req_url)必填!') if 'http://' not in req_url and 'https://' not in req_url: return api_err_return(msg='回调URL格式有错') if not cif: cif = CronInfos(task_name=task_name, task_keyword=task_keyword, run_date=run_date, day_of_week=day_of_week, day=day, hour=hour, minute=minute, second=second, req_url=req_url, status=1) else: cif.task_name = task_name cif.task_keyword = task_keyword cif.run_date = run_date cif.day_of_week = day_of_week cif.day = day cif.hour = hour cif.minute = minute cif.second = second cif.req_url = req_url cif.status = 1 db.session.add(cif) db.session.commit() cron_id = cif.id cron_datas = {} if run_date: cron_datas['trigger'] = 'date' cron_datas['run_date'] = run_date else: # 定时的 cron_datas['trigger'] = 'cron' if day_of_week: cron_datas['day_of_week'] = day_of_week if hour: cron_datas['hour'] = hour if minute: cron_datas['minute'] = minute if day: cron_datas['day'] = day if second and second != '*': cron_datas['second'] = second scheduler.add_job("cron_%s" % cron_id, func=cron_do, args=[cron_id], replace_existing=True, **cron_datas) return 'ok'
def _dbs(self): url = get_config_value('cron_job_log_db_url') db = records.Database(url) db = db.get_connection() return db