コード例 #1
0
ファイル: task.py プロジェクト: veip007/qiandao
    def post(self, taskid):
        log = u'设置成功'
        try:
            envs = {}
            for key in self.request.body_arguments:
                envs[key] = self.get_body_arguments(key)
            for env in envs.keys():
                if (envs[env][0] == u'true' or envs[env][0] == u'false'):
                    envs[env] = True if envs[env][0] == u'true' else False
                else:
                    envs[env] = u'{0}'.format(envs[env][0])

            if (envs['sw']):
                c = cal()
                if ('time' in envs):
                    if (len(envs['time'].split(':')) < 3):
                        envs['time'] = envs['time'] + ':00'
                tmp = c.calNextTs(envs)
                if (tmp['r'] == 'True'):
                    self.db.task.mod(taskid,
                                     disabled=False,
                                     newontime=json.dumps(envs),
                                     next=tmp['ts'])

                    log = u'设置成功,下次执行时间:{0}'.format(
                        time.strftime("%Y-%m-%d %H:%M:%S",
                                      time.localtime(tmp['ts'])))
                else:
                    raise Exception(tmp)
            else:
                tmp = json.loads(
                    self.db.task.get(taskid,
                                     fields=('newontime'))['newontime'])
                tmp['sw'] = False
                self.db.task.mod(taskid, newontime=json.dumps(tmp))

        except Exception as e:
            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
コード例 #2
0
ファイル: worker.py プロジェクト: fakegit/qiandao-2
    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)
            raise gen.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)
            raise gen.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)
            raise gen.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)
            raise gen.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 = yield self.fetcher.do_fetch(fetch_tpl, env)
            else:
                proxy = {
                    'host': url['host'],
                    'port': url['port'],
                }
                new_env = yield 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('%m-%d %H:%M:%S')
            title = u"签到任务 {0}-{1} 成功".format(tpl['sitename'], task['note'])
            logtemp = new_env['variables'].get('__log__')
            logtemp = u"{0}  日志:{1}".format(t, logtemp)
            pushtool.pusher(user['id'], pushsw, 0x2, title, logtemp)

            logger.info('taskid:%d tplid:%d successed! %.4fs', task['id'],
                        task['tplid'],
                        time.time() - start)
            # delete log
            self.ClearLog(task['id'])
        except Exception as e:
            # failed feedback
            next_time_delta = self.failed_count_to_time(
                task['last_failed_count'], tpl['interval'])

            t = datetime.datetime.now().strftime('%m-%d %H:%M:%S')
            title = u"签到任务 {0}-{1} 失败".format(tpl['sitename'], task['note'])
            content = u"日志:{log}".format(log=e)
            disabled = False
            if next_time_delta:
                next = time.time() + next_time_delta
                content = content + u"下次运行时间:{0}".format(
                    time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(next)))
                if (logtime['ErrTolerateCnt'] <= task['last_failed_count']):
                    pushtool.pusher(user['id'], pushsw, 0x1, title, content)
            else:
                disabled = True
                next = None
                content = u"任务已禁用"
                pushtool.pusher(user['id'], pushsw, 0x1, title, content)

            self.db.tasklog.add(task['id'], success=False, msg=unicode(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'], e,
                         time.time() - start)
            raise gen.Return(False)
        raise gen.Return(True)
コード例 #3
0
ファイル: task.py プロジェクト: zx294217284/qiandao
    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', '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')))
        t = 0 if not tpl['userid'] else task['userid'], tpl['tpl']
        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:
            new_env = yield self.fetcher.do_fetch(fetch_tpl, env)
        except Exception as e:
            t = datetime.datetime.now().strftime('%m-%d %H:%M:%S')
            title = u"签到任务 {0}-{1} 失败".format(tpl['sitename'], task['note'])
            logtmp = u"{0} 日志:{1}".format(t, e)
            pushertool.pusher(user['id'], pushsw, 0x4, title, logtmp)

            self.db.tasklog.add(task['id'], success=False, msg=unicode(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>'
                % e)
            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('%m-%d %H:%M:%S')
        title = u"签到任务 {0}-{1} 成功".format(tpl['sitename'], task['note'])
        logtmp = new_env['variables'].get('__log__')
        logtmp = u"{0}  日志:{1}".format(title, logtmp)
        pushertool.pusher(user['id'], pushsw, 0x8, title, 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)
        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
コード例 #4
0
ファイル: task_multi.py プロジェクト: veip007/qiandao
    def post(self, userid):
        user = self.current_user
        try:
            envs = {}
            for key in self.request.body_arguments:
                envs[key] = self.get_body_arguments(key)
            env = {}
            op = self.get_argument('op', '')
            if (op != ''):
                tasktype = op
                if isinstance(tasktype, bytes):
                    tasktype = tasktype.decode()
            else:
                raise Exception('错误参数')
            pass
            for k, v in envs.items():
                env[k] = json.loads(v[0])
            for taskid, selected in env['selectedtasks'].items():
                if (selected):
                    task = self.db.task.get(taskid,
                                            fields=('id', 'note', 'tplid',
                                                    'userid'))
                    if (task):
                        if (task['userid']) == int(userid):
                            if (tasktype == 'disable'):
                                self.db.task.mod(taskid, disabled=True)
                            if (tasktype == 'enable'):
                                self.db.task.mod(taskid, disabled=False)
                            if (tasktype == 'delete'):
                                logs = self.db.tasklog.list(taskid=taskid,
                                                            fields=('id'))
                                for log in logs:
                                    self.db.tasklog.delete(log['id'])
                                self.db.task.delete(taskid)
                            if (tasktype == 'setgroup'):
                                group_env = env['setgroup']
                                New_group = group_env['newgroup'].strip()
                                if New_group != "":
                                    target_group = New_group
                                else:
                                    target_group = group_env[
                                        'checkgroupname'] or 'None'

                                self.db.task.mod(taskid, _groups=target_group)

                            if (tasktype == 'settime'):
                                time_env = env['settime']
                                c = cal()
                                settime_env = {
                                    'sw': True,
                                    'time': time_env['ontime_val'],
                                    'mode': time_env['ontime_method'],
                                    'date': time_env['ontime_run_date'],
                                    'tz1': time_env['randtimezone1'],
                                    'tz2': time_env['randtimezone2'],
                                    'cron_val': time_env['cron_val'],
                                }

                                if (time_env['randtimezone1'] != '') and (
                                        time_env['randtimezone1'] != ''):
                                    settime_env['randsw'] = True
                                if (time_env['cron_sec'] != ''):
                                    settime_env['cron_sec'] = time_env[
                                        'cron_sec']

                                if (len(settime_env['time'].split(':')) == 2):
                                    settime_env[
                                        'time'] = settime_env['time'] + ':00'

                                tmp = c.calNextTs(settime_env)
                                if (tmp['r'] == 'True'):
                                    self.db.task.mod(
                                        taskid,
                                        disabled=False,
                                        newontime=json.dumps(settime_env),
                                        next=tmp['ts'])
                                else:
                                    raise Exception(u'参数错误')
                        else:
                            raise Exception('用户id与任务的用户id不一致')
        except Exception as e:
            traceback.print_exc()
            self.render('utils_run_result.html',
                        log=str(e),
                        title=u'设置失败',
                        flg='danger')
            return

        self.render('utils_run_result.html',
                    log=u'设置成功,请手动刷新页面查看',
                    title=u'设置成功',
                    flg='success')
        return