Example #1
0
    async def post(self,userid):
        try:
            envs = {}
            for k, _  in self.request.body_arguments.items():
                envs[k] = self.get_body_argument(k)
            req = pusher()
            log = ''
            now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            tmp = await gen.convert_yielded(req.cus_pusher_send(envs ,u'推送测试', now))
            if ('True' == tmp):
                if (envs['btn'] == 'regbtn'):
                    self.db.user.mod(userid, diypusher=json.dumps(envs))
            else:
                raise Exception(tmp)
            
            log = u'运行成功,请检查是否收到推送'
        except Exception as e:
            if (str(e).find('get user need id or email') > -1):
                e = u'请输入用户名/密码'
            traceback.print_exc()
            self.render('utils_run_result.html', log=str(e), title=u'设置失败', flg='danger')
            return

        self.render('utils_run_result.html', log=log, title=u'设置成功', flg='success')
        return
Example #2
0
 async def push_batch(self):
     try:
         userlist = await asyncio.wait_for(asyncio.get_event_loop().run_in_executor(None, functools.partial(self.db.user.list,fields=('id', 'email', 'status', 'push_batch'))),timeout=3.0)
         pushtool = pusher()
         logging.debug('scaned push_batch task, waiting...')
         if userlist:
             for user in userlist:
                 userid = user['id']
                 push_batch = json.loads(user['push_batch'])
                 if user['status'] == "Enable" and push_batch["sw"] and isinstance(push_batch['time'],(float,int)) and time.time() >= push_batch['time']:
                     title = u"定期签到日志推送"
                     delta = push_batch.get("delta", 86400)
                     logtemp = "{}".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(push_batch['time'])))
                     tmpdict = {}
                     tmp = ""
                     numlog = 0
                     task_list = await asyncio.wait_for(asyncio.get_event_loop().run_in_executor(None, functools.partial(self.db.task.list,userid=userid, fields=('id', 'tplid', 'note', 'disabled', 'last_success', 'last_failed', 'pushsw'))),timeout=3.0)
                     for task in task_list:
                         pushsw = json.loads(task['pushsw'])
                         if pushsw["pushen"] and (task["disabled"] == 0 or (task.get("last_success", 0) and task.get("last_success", 0) >= push_batch['time']-delta) or (task.get("last_failed", 0) and task.get("last_failed", 0) >= push_batch['time']-delta)):
                             tmp0 = ""
                             tasklog_list = await asyncio.wait_for(asyncio.get_event_loop().run_in_executor(None, functools.partial(self.db.tasklog.list,taskid=task["id"], fields=('success', 'ctime', 'msg'))),timeout=3.0)
                             for log in tasklog_list:
                                 if (push_batch['time'] - delta) < log['ctime'] <= push_batch['time']:
                                     tmp0 += "\\r\\n时间: {}\\r\\n日志: {}".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(log['ctime'])), log['msg'])
                                     numlog += 1
                             tmplist = tmpdict.get(task['tplid'],[])
                             if tmp0:
                                 tmplist.append("\\r\\n-----任务{0}-{1}-----{2}\\r\\n".format(len(tmplist)+1, task['note'], tmp0))
                             else:
                                 tmplist.append("\\r\\n-----任务{0}-{1}-----\\r\\n记录期间未执行签到,请检查任务! \\r\\n".format(len(tmplist)+1, task['note']))
                             tmpdict[task['tplid']] = tmplist
                             
                     for tmpkey in tmpdict:
                         tmp = "\\r\\n\\r\\n=====签到: {0}=====".format(self.db.tpl.get(tmpkey, fields=('sitename'))['sitename'])
                         tmp += ''.join(tmpdict[tmpkey])
                         logtemp += tmp
                     push_batch["time"] = push_batch['time'] + delta
                     self.db.user.mod(userid, push_batch=json.dumps(push_batch))
                     if tmp and numlog:
                         user_email = user.get('email','Unkown')
                         logger.debug("Start push batch log for {}".format(user_email))
                         await pushtool.pusher(userid, {"pushen": bool(push_batch.get("sw",False))}, 4080, title, logtemp)
                         logger.info("Success push batch log for {}".format(user_email))
     except Exception as e:
         traceback.print_exc()
         logger.error('push batch task failed: {}'.format(str(e)))
Example #3
0
    async def do(self, task):
        task['note'] = self.db.task.get(task['id'], fields=('note'))['note']
        user = self.db.user.get(task['userid'], fields=('id', 'email', 'email_verified', 'nickname', 'logtime'))
        tpl = self.db.tpl.get(task['tplid'], fields=('id', 'userid', 'sitename', 'siteurl', 'tpl', 'interval', 'last_success'))
        ontime = self.db.task.get(task['id'], fields=('ontime', 'ontimeflg', 'pushsw', 'newontime', 'next'))
        newontime = json.loads(ontime["newontime"])
        pushtool = pusher()
        caltool = cal()
        logtime = json.loads(user['logtime'])
        pushsw = json.loads(ontime['pushsw'])

        if 'ErrTolerateCnt' not in logtime:logtime['ErrTolerateCnt'] = 0 

        if task['disabled']:
            self.db.tasklog.add(task['id'], False, msg='task disabled.')
            self.db.task.mod(task['id'], next=None, disabled=1)
            return False

        if not user:
            self.db.tasklog.add(task['id'], False, msg='no such user, disabled.')
            self.db.task.mod(task['id'], next=None, disabled=1)
            return False

        if not tpl:
            self.db.tasklog.add(task['id'], False, msg='tpl missing, task disabled.')
            self.db.task.mod(task['id'], next=None, disabled=1)
            return False

        if tpl['userid'] and tpl['userid'] != user['id']:
            self.db.tasklog.add(task['id'], False, msg='no permission error, task disabled.')
            self.db.task.mod(task['id'], next=None, disabled=1)
            return False

        start = time.time()
        try:
            fetch_tpl = self.db.user.decrypt(0 if not tpl['userid'] else task['userid'], tpl['tpl'])
            env = dict(
                    variables = self.db.user.decrypt(task['userid'], task['init_env']),
                    session = [],
                    )

            url = utils.parse_url(env['variables'].get('_proxy'))
            if not url:
                new_env = await gen.convert_yielded(self.fetcher.do_fetch(fetch_tpl, env))
            else:
                proxy = {
                    'scheme': url['scheme'],
                    'host': url['host'],
                    'port': url['port'],
                    'username': url['username'],
                    'password': url['password']
                }
                new_env = await gen.convert_yielded(self.fetcher.do_fetch(fetch_tpl, env, [proxy]))

            variables = self.db.user.encrypt(task['userid'], new_env['variables'])
            session = self.db.user.encrypt(task['userid'],
                    new_env['session'].to_json() if hasattr(new_env['session'], 'to_json') else new_env['session'])

            # todo next not mid night
            if (newontime['sw']):
                if ('mode' not in newontime):
                    newontime['mode'] = 'ontime'
                if (newontime['mode'] == 'ontime'):
                    newontime['date'] = (datetime.datetime.now()+datetime.timedelta(days=1)).strftime("%Y-%m-%d")
                next = caltool.calNextTs(newontime)['ts']
            else:
                next = time.time() + max((tpl['interval'] if tpl['interval'] else 24 * 60 * 60), 1*60)
                if tpl['interval'] is None:
                    next = self.fix_next_time(next)

            # success feedback
            self.db.tasklog.add(task['id'], success=True, msg=new_env['variables'].get('__log__'))
            self.db.task.mod(task['id'],
                    last_success=time.time(),
                    last_failed_count=0,
                    success_count=task['success_count']+1,
                    env=variables,
                    session=session,
                    mtime=time.time(),
                    next=next)
            self.db.tpl.incr_success(tpl['id'])

            t = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            title = u"签到任务 {0}-{1} 成功".format(tpl['sitename'], task['note'])
            logtemp = new_env['variables'].get('__log__')
            logtemp = u"{0} \\r\\n日志:{1}".format(t, logtemp)
            await pushtool.pusher(user['id'], pushsw, 0x2, title, logtemp)

            logger.info('taskid:%d tplid:%d successed! %.5fs', task['id'], task['tplid'], time.time()-start)
            # delete log
            self.ClearLog(task['id'])
        except Exception as e:
            # failed feedback
            traceback.print_exc()
            next_time_delta = self.failed_count_to_time(task['last_failed_count'], task['retry_count'], task['retry_interval'], tpl['interval'])
                        
            t = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            title = u"签到任务 {0}-{1} 失败".format(tpl['sitename'], task['note'])
            content = u"{0} \\r\\n日志:{1}".format(t, str(e))
            disabled = False
            if next_time_delta:
                next = time.time() + next_time_delta
                content = content + u" \\r\\n下次运行时间:{0}".format(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(next)))
                if (logtime['ErrTolerateCnt'] <= task['last_failed_count']):
                    await pushtool.pusher(user['id'], pushsw, 0x1, title, content)
            else:
                disabled = True
                next = None
                content = u" \\r\\n任务已禁用"
                await pushtool.pusher(user['id'], pushsw, 0x1, title, content)

            self.db.tasklog.add(task['id'], success=False, msg=str(e))
            self.db.task.mod(task['id'],
                    last_failed=time.time(),
                    failed_count=task['failed_count']+1,
                    last_failed_count=task['last_failed_count']+1,
                    disabled = disabled,
                    mtime = time.time(),
                    next=next)
            self.db.tpl.incr_failed(tpl['id'])

            logger.error('taskid:%d tplid:%d failed! %r %.4fs', task['id'], task['tplid'], str(e), time.time()-start)
            return False
        return True
Example #4
0
    async def post(self, userid):
        envs = {}
        for key in self.request.body_arguments:
            envs[key] = self.get_body_arguments(key)
        env = json.loads(envs['env'][0])
        wxpusher_token = env["wxpusher_token"]
        skey = env["skey"]
        barkurl = env["barkurl"]
        qywx_token = env["qywx_token"]
        tg_token = env["tg_token"]
        dingding_token = env["dingding_token"]
        log = ""
        if  ("reg" == self.get_body_argument('func')):
            try:
                if  (wxpusher_token != ""):
                    self.db.user.mod(userid, wxpusher = wxpusher_token)
                    if (self.db.user.get(userid, fields=("wxpusher"))["wxpusher"] == wxpusher_token):
                        log = u"注册 WxPusher 成功\r\n"
                    else:
                        log = u"注册 WxPusher 失败\r\n"
                else:
                    log = u"WxPusher 未填写完整\r\n"

                if (skey != ""):
                    self.db.user.mod(userid, skey = skey)
                    if (self.db.user.get(userid, fields=("skey"))["skey"] == skey):
                        log = log+u"注册 S酱 成功\r\n"
                    else:
                        log = log+u"注册 S酱 失败\r\n"
                else:
                    log = log+u"Sendkey 未填写完整\r\n"
                    
                if (barkurl != ""):
                    if (barkurl[-1] != '/'): 
                        barkurl=barkurl+'/'
                    self.db.user.mod(userid, barkurl = barkurl)
                    if (self.db.user.get(userid, fields=("barkurl"))["barkurl"] == barkurl):
                        log = log+u"注册 Bark 成功\r\n"
                    else:
                        log = log+u"注册 Bark 失败\r\n"
                else:
                    log = log+u"BarkUrl 未填写完整\r\n"

                if (qywx_token != ""):
                    self.db.user.mod(userid, qywx_token = qywx_token)
                    if (self.db.user.get(userid, fields=("qywx_token"))["qywx_token"] == qywx_token):
                        log = log+u"注册 企业微信 成功\r\n"
                    else:
                        log = log+u"注册 企业微信 失败\r\n"
                else:
                    log = log+u"企业微信 未填写完整\r\n"

                if (tg_token != ""):
                    self.db.user.mod(userid, tg_token = tg_token)
                    if (self.db.user.get(userid, fields=("tg_token"))["tg_token"] == tg_token):
                        log = log+u"注册 Tg Bot 成功\r\n"
                    else:
                        log = log+u"注册 Tg Bot 失败\r\n"
                else:
                    log = log+u"Tg Bot 未填写完整\r\n"

                if (dingding_token != ""):
                    self.db.user.mod(userid, dingding_token = dingding_token)
                    if (self.db.user.get(userid, fields=("dingding_token"))["dingding_token"] == dingding_token):
                        log = log+u"注册 DingDing Bot 成功\r\n"
                    else:
                        log = log+u"注册 DingDing Bot 失败\r\n"
                else:
                    log = log+u"DingDing Bot 未填写完整\r\n"

            except Exception as e:
                traceback.print_exc()
                self.render('tpl_run_failed.html', log=str(e))
                return
            
            self.render('utils_run_result.html', log=log, title=u'设置成功', flg='success')
            return

        else:
            try:
                f = pusher()
                t = datetime.datetime.now().strftime('%y-%m-%d %H:%M:%S')

                if (wxpusher_token != ""):
                    await f.send2wxpusher("{0}".format(wxpusher_token),u"{t} 发送测试".format(t=t))
                    log = u"WxPusher 已推送,请检查是否收到\r\n"
                else:
                    log = u"WxPusher 未填写完整\r\n"

                if (skey != ""):
                    await f.send2s(skey, u"正在测试S酱", u"{t} 发送测试".format(t=t))
                    log = log+u"S酱 已推送,请检查是否收到\r\n"
                else:
                    log = log+u"Sendkey 未填写完整\r\n"

                if  (barkurl != ""):
                    await f.send2bark(barkurl, u"正在测试Bark", u"{t} 发送测试".format(t=t))
                    log = log+u"Bark 已推送,请检查是否收到\r\n"
                else:
                    log = log+u"BarkUrl 未填写完整\r\n"
                
                if (qywx_token != ""):
                    await f.qywx_pusher_send(qywx_token, "正在测试企业微信", u"{t} 发送测试".format(t=t))
                    log = log+u"企业微信 已推送,请检查是否收到\r\n"
                else:
                    log = log+u"企业微信 未填写完整\r\n"

                if (tg_token != ""):
                    await f.send2tg(tg_token, "正在测试Tg Bot", u"{t} 发送测试".format(t=t))
                    log = log+u"Tg Bot 已推送,请检查是否收到\r\n"
                else:
                    log = log+u"Tg Bot 未填写完整\r\n"

                if (dingding_token != ""):
                    await f.send2dingding(dingding_token, "正在测试DingDing Bot", u"{t} 发送测试".format(t=t))
                    log = log+u"DingDing Bot 已推送,请检查是否收到\r\n"
                else:
                    log = log+u"DingDing Bot 未填写完整\r\n"

            except Exception as e:
                traceback.print_exc()
                self.render('tpl_run_failed.html', log=str(e))
                return

            self.render('utils_run_result.html', log=log, title=u'设置成功', flg='success')
            return
Example #5
0
    async def post(self, taskid):
        self.evil(+2)
        start_ts = int(time.time())
        user = self.current_user
        task = self.check_permission(self.db.task.get(taskid, fields=('id', 'tplid', 'userid', 'init_env',
            'env', 'session', 'retry_count', 'retry_interval', 'last_success', 'last_failed', 'success_count', 'note',
            'failed_count', 'last_failed_count', 'next', 'disabled', 'ontime', 'ontimeflg', 'pushsw','newontime')), 'w')

        tpl = self.check_permission(self.db.tpl.get(task['tplid'], fields=('id', 'userid', 'sitename',
            'siteurl', 'tpl', 'interval', 'last_success')))

        fetch_tpl = self.db.user.decrypt(
                0 if not tpl['userid'] else task['userid'], tpl['tpl'])
        env = dict(
                variables = self.db.user.decrypt(task['userid'], task['init_env']),
                session = [],
                )
        
        pushsw = json.loads(task['pushsw'])
        newontime = json.loads(task['newontime'])
        pushertool = pusher()
        caltool = cal()

        try:
            url = utils.parse_url(env['variables'].get('_proxy'))
            if not url:
                new_env = await gen.convert_yielded(self.fetcher.do_fetch(fetch_tpl, env))
            else:
                proxy = {
                    'scheme': url['scheme'],
                    'host': url['host'],
                    'port': url['port'],
                    'username': url['username'],
                    'password': url['password']
                }
                new_env = await gen.convert_yielded(self.fetcher.do_fetch(fetch_tpl, env, [proxy]))
        except Exception as e:
            t = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            title = u"签到任务 {0}-{1} 失败".format(tpl['sitename'], task['note'])
            logtmp = u"{0} \\r\\n日志:{1}".format(t, e)

            self.db.tasklog.add(task['id'], success=False, msg=str(e))
            self.finish('<h1 class="alert alert-danger text-center">签到失败</h1><div class="showbut well autowrap" id="errmsg">%s<button class="btn hljs-button" data-clipboard-target="#errmsg" >复制</button></div>' % logtmp.replace('\\r\\n', '<br>'))

            await pushertool.pusher(user['id'], pushsw, 0x4, title, logtmp)
            return

        self.db.tasklog.add(task['id'], success=True, msg=new_env['variables'].get('__log__'))
        if (newontime["sw"]):
            if ('mode' not in newontime):
                newontime['mode'] = 'ontime'

            if (newontime['mode'] == 'ontime'):
                newontime['date'] = (datetime.datetime.now()+datetime.timedelta(days=1)).strftime("%Y-%m-%d")
            nextTime = caltool.calNextTs(newontime)['ts']
        else:
            nextTime = time.time() + (tpl['interval'] if tpl['interval'] else 24 * 60 * 60)
            
        self.db.task.mod(task['id'],
                disabled = False,
                last_success = time.time(),
                last_failed_count = 0,
                success_count = task['success_count'] + 1,
                mtime = time.time(),
                next = nextTime)
        
        t = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        title = u"签到任务 {0}-{1} 成功".format(tpl['sitename'], task['note'])
        logtmp = new_env['variables'].get('__log__')
        logtmp = u"{0} \\r\\n日志:{1}".format(t, logtmp)

        self.db.tpl.incr_success(tpl['id'])
        self.finish('<h1 class="alert alert-success text-center">签到成功</h1><div class="showbut well autowrap" id="errmsg"><pre>%s</pre><button class="btn hljs-button" data-clipboard-target="#errmsg" >复制</button></div>' % logtmp.replace('\\r\\n', '<br>'))
        
        await pushertool.pusher(user['id'], pushsw, 0x8, title, logtmp)
        logDay = int(self.db.site.get(1, fields=('logDay'))['logDay'])
        for log in self.db.tasklog.list(taskid = taskid, fields=('id', 'ctime')):
            if (time.time() - log['ctime']) > (logDay * 24 * 60 * 60):
                self.db.tasklog.delete(log['id'])
        return