Пример #1
0
 def stop_task(cls, name):
     task = Backend('task').find(name)
     if not task.is_running():
         task.status = Task.STOP
         Backend('task').save(task)
         return True
     return False
Пример #2
0
    def add_user(self, username, email, real_name, password, status='', role='user'):
        username, real_name = username.strip(), real_name.strip()
        if not re.match(r'^[A-Za-z0-9_]{4,16}$', username):
            return {'status' : 'error', 'msg' : 'user name: %s must be the ^[A-Za-z0-9_]{4,16}$ pattern' %(username)}

        if not re.match(r'^[A-Za-z0-9_ ]{4,16}$', real_name):
            return {'status' : 'error', 'msg' : 'real name: %s must be the [A-Za-z0-9_]{4,16} pattern' %(real_name)}

        if not re.match(r'^[A-Za-z0-9@#$%^&+=]{4,16}$', password):
            return {'status' : 'error', 'msg' : 'password: %s must be the ^[A-Za-z0-9@#$%^&+=]{4,16}$ pattern' %(password)}

        if status not in USER_STATUSES:
            status = 'actived'

        if role not in ROLES:
            role = 'user'

        if len(email) > 7 and re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email):
            if Backend('user').find_by_email(email):
                return {'status' : 'error', 'msg' : 'email:%s is used' %(email)}

        if Backend('user').find_by_username(username):
            return {'status' : 'error', 'msg' : 'user name:%s is used' %(username)}

        user = User(username, email, real_name, password, status, role)
        Backend('user').save(user)
        return  {'status' : 'info', 'msg' : 'saved'}
Пример #3
0
 def run(self):
     self.ready = True
     LOGGER.debug('Starting thread %d', get_ident())
     while self.ready:
         self.suspend()
         if self.current_task == _SHUTDOWNTASK:
             # shutdown the worker thread
             self.ready = False
             break
         try:
             if self.current_task:
                 self.scheduler.app(self.current_task)
                 self.current_task.fresh()
                 Backend('task').save(self.current_task)
         except Exception as e:
             cls, e, tb = sys.exc_info()
             LOGGER.exception('Unhandled Error in thread:%s %s',
                              get_ident(), e)
             if not isinstance(e, DBError):
                 self.current_task.retry(str(e))
                 Backend('task').save(self.current_task)
         finally:
             self.current_task = None
             self.pool.push(self)
     self.event.clear()
Пример #4
0
    def execute(self, task, retry=False):
        try:
            done = False
            thread = self.threadpool.pop()
            if thread:
                LOGGER.debug('Execute in thread: %s', thread)
                thread.current_task = task
                thread.resume()
                done = True
            elif not retry:
                LOGGER.info(
                    'Thread Pool is Full, put the the task:%s to idel_queue',
                    task.name)
                self.put(task)
                time.sleep(1)
            else:
                task.retry('Current scheduler is busy')
                LOGGER.info("save task:%s to db, retry...", task.name)
                Backend('task').save(task)

        except (KeyboardInterrupt, SystemExit):
            self.ready = False
            if not done and thread:
                thread.current_task = _SHUTDOWNTASK
                thread.resume()
        except Exception as e:
            LOGGER.error('Execute error : %s', e)
            task.retry(str(e))
            Backend('task').save(task)
Пример #5
0
 def login(self, username='', password=''):
     username = username.strip()
     password = password.strip()
     user = Backend('user').find_by_username(username)
     if user and user.check(password):
         set_secure_cookie('auth', str(user.uid))
         raise cherrypy.HTTPRedirect('/task')
     return render_template('login.html')
Пример #6
0
 def test_save_after_retry(self):
     task = Backend('task').find('job_test')
     task.retry('msg')
     Backend('task').save(task)
     task = Backend('task').find('job_test')
     assert task.name == self.task.name
     assert task.event == self.task.event
     assert task.run_times == 1
     assert task.attempts == self.task.attempts + 1
     assert task.status == Task.RETRY
Пример #7
0
    def delete_task(self, name):
        task = Backend('task').find(name)
        if not task:
            return {'status': 'error', 'msg': 'Doesn\'t exist  the task'}

        if not task.is_running():
            Backend('task').delete(task)
            return {'status': 'redirect', 'msg': 'deleted, wait to redirect to /task', 'url': '/task'}
        else:
            return {'status': 'error', 'msg': 'The task is runnig'}
Пример #8
0
    def test_find(self):
        user = Backend('user').find(self.uid)
        assert user.username == self.user.username
        assert user.status == self.user.status
        assert user.uid == self.uid

        user = Backend('user').find_by_email(self.user.email)
        assert user.username == self.user.username
        assert user.status == self.user.status
        assert user.uid == self.uid
Пример #9
0
    def edit_task_page(self, name):
        task = Backend('task').find(name)
        if not task:
            raise cherrypy.HTTPError(404, 'nof found')

        if not task.data:
            task.data = ''
        else:
            task.data = json_encode(task.data)
        return render_template('task.edit.html', task=task, statuses=TASK_STATUSES)
Пример #10
0
 def add_task(self, name, action, data, event, status='new'):
     name, action, data, event = name.strip(), action.strip(), data.strip(), event.strip()
     if name and Backend('task').find(name):
         return {'status': 'error', 'msg': 'Exist the task'}
     try:
         action, data, status = self.process_task_args(action, data, status)
         task = Task(None, None, name, action, data, event)
         if Backend('task').save(task):
             return {'status': 'success', 'msg': 'created'}
     except TypeError as e:
         return {'status': 'error', 'msg': str(e)}
Пример #11
0
    def test_save(self):
        # on dup
        user = Backend('user').find(self.uid)
        user.status = 'banned'
        Backend('user').save(user)
        user = Backend('user').find(self.uid)
        assert user.status == 'banned'

        # new case
        user = User('username', 'email2', 'real_name', 'password', 'active')
        Backend('user').save(user)
        user = Backend('user').find_by_email(self.user.email)
        assert user is not None
Пример #12
0
 def test_save(self):
     task = Backend('task').find('job_test')
     task.fresh()
     task.attempts += 1
     task.status = Task.COMPLETED
     Backend('task').save(task)
     task = Backend('task').find('job_test')
     assert task.name == self.task.name
     assert task.event == self.task.event
     assert task.run_times == 1
     assert task.attempts == self.task.attempts + 1
     assert task.status == Task.COMPLETED
     assert task.last_five_logs[0]['status'] == Task.SCHEDULED
Пример #13
0
    def test_save(self):
        # on dup
        user = Backend('user').find(self.uid)
        user.status = 'banned'
        Backend('user').save(user)
        user = Backend('user').find(self.uid)
        assert user.status == 'banned'

        # new case
        user = User('username', 'email2', 'real_name', 'password', 'active')
        Backend('user').save(user)
        user = Backend('user').find_by_email(self.user.email)
        assert user is not None
Пример #14
0
 def setUp(self):
     setattr(db, '__connections', {})
     db.setup('localhost',
              'test',
              'test',
              'eden',
              pool_opt={
                  'minconn': 3,
                  'maxconn': 10
              })
     self.task = Task(None, 'task_id', 'job_test', 'job.test', {
         'args': (),
         'kw': {}
     }, 'every 5')
     Backend('task').delete_by_name('job_test')
     Backend('task').save(self.task)
Пример #15
0
    def user_index(self, page=1):
        user = cherrypy.request.user
        if user.role != 'root':
            raise cherrypy.HTTPRedirect('/user/%d/edit' % (user.uid))

        page = int(page)
        users = Backend('user').paginate(page, 10)
        return render_template('user.index.html', users=users)
Пример #16
0
    def task_page(self, status='all', name='', page=1):

        # process page , keep it within range(1, 2000)
        try:
            page = int(page)
        except TypeError:
            page = 1
        if page > 2000:
            page = 2000

        _status = TASK_STATUSES.get(status, 0)
        name = name.strip()
        tasks = Backend('task').take(name, _status, page)
        count = Backend('task').count(name, _status)
        glue = '?page=' if not name else '?name=%s&page=' % (name)
        tasks = Paginator(tasks, count, page, 20, '/task/status/%s' % (status), glue)
        return render_template('task.index.html', name=name, status=status, 
            statuses=TASK_STATUS_LIST, key_statuses=TASK_KEY_STATUSES, tasks=tasks)
Пример #17
0
    def test_find(self):
        task = Backend('task').find('job_test')
        assert task.name == self.task.name
        assert task.status == self.task.status
        assert task.event == self.task.event
        assert task.attempts == self.task.attempts

        task = Backend('task').find_by_task_id('task_id')[0]
        assert task.name == self.task.name
        assert task.status == self.task.status
        assert task.event == self.task.event
        assert task.attempts == self.task.attempts

        task = Backend('task').find_by_cron_id(task.cron_id)
        assert task.name == self.task.name
        assert task.status == self.task.status
        assert task.event == self.task.event
        assert task.attempts == self.task.attempts
Пример #18
0
    def stop(self):
        self.heartbeat.stop()
        idel_queue_size = self._idel_tasks.qsize()
        for _ in range(idel_queue_size):
            task = self.get()
            task.retry('Current schedule was stoped')
            Backend('task').save(task)

        self.threadpool.stop(self.SHOTDOWN_TIMEOUT)
Пример #19
0
 def test_save(self):
     task = Backend('task').find('job_test')
     task.fresh()
     task.attempts += 1
     task.status = Task.COMPLETED
     Backend('task').save(task)
     task = Backend('task').find('job_test')
     assert task.name == self.task.name
     assert task.event == self.task.event
     assert task.run_times == 1
     assert task.attempts == self.task.attempts + 1
     assert task.status == Task.COMPLETED
     assert task.last_five_logs[0]['status'] == Task.SCHEDULED
Пример #20
0
def init_user():
    """Load user if the auth session validates."""
    uid = get_secure_cookie('auth')
    try:
        uid = int(uid)
        user = Backend('user').find(uid)
        if not user:
            user = _guest
    except TypeError:
        user = _guest
    request.user = user
Пример #21
0
 def test_save_after_retry(self):
     task = Backend('task').find('job_test')
     task.retry('msg')
     Backend('task').save(task)
     task = Backend('task').find('job_test')
     assert task.name == self.task.name
     assert task.event == self.task.event
     assert task.run_times == 1
     assert task.attempts == self.task.attempts + 1
     assert task.status == Task.RETRY
Пример #22
0
    def _periodic_action(self):
        try:
            if (time.time() - self.clear_time) > 300:
                when = datetime.now() - timedelta(minutes=5)
                Backend('task').clear_timeout_task(when)
                self.clear_time = time.time()
        except:
            # Todo: handle db error
            pass

        # clear idle tasks
        idel_queue_size = self._idel_tasks.qsize()
        for _ in range(idel_queue_size):
            task = self.get()
            self.execute(task, True)
Пример #23
0
 def setUp(self):
     setattr(db, '__connections', {})
     db.setup('localhost',
              'test',
              'test',
              'eden',
              pool_opt={
                  'minconn': 3,
                  'maxconn': 10
              })
     self.user = User('username', 'email', 'real_name', 'password',
                      'active')
     db.execute('DELETE FROM users WHERE email=%s or email=%s',
                (self.user.email, 'email2'))
     Backend('user').save(self.user)
     self.uid = db.query_one('SELECT uid FROM users WHERE email=%s',
                             (self.user.email, ))[0]
Пример #24
0
    def edit_user(self, uid, email, real_name, password, newpass1, newpass2, status, role='user'):
        real_name, newpass1, newpass2 = real_name.strip(), newpass1.strip(), newpass2.strip()

        uid = int(uid)
        user = Backend('user').find(uid)
        if not user:
            raise cherrypy.HTTPError(404, 'user not found')

        me = cherrypy.request.user
        if me.uid == user.uid:
            if re.match(r'[A-Za-z0-9@#$%^&+=]{4,16}', newpass1):
                if password and newpass1 and newpass1 == newpass2:
                    user.password = newpass1
            elif newpass1:
                return {'status' : 'error', 'msg' : 'password: %s must be the [A-Za-z0-9_]{4,16} pattern' %(newpass1)}

            if len(email) > 7 and re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email):
                user_ = Backend('user').find_by_email(email)
                if user_ and user_.uid != user.uid:
                    return {'status' : 'error', 'msg' : 'email:%s is used' %(email)}
                else:
                    user.email = email


        if me.uid == 1 and user.uid != 1:
            if role in (ADMIN, USER):
                user.role = role
            if user.status != status and status in USER_STATUSES:
                user.status = status

        if re.match(r'^[A-Za-z0-9_ ]{4,16}$', real_name):
            if user.real_name != real_name:
                user.real_name = real_name

        Backend('user').save(user)
        return  {'status' : 'info', 'msg' : 'updated'}
Пример #25
0
    def edit_task(self,  name, action, data, event, status):
        try:
            action, data, status = self.process_task_args(action, data, status)
        except TypeError as e:
            return {'msg': str(e), 'status': 'error'}

        task = Backend('task').find(name)
        if not task:
            raise cherrypy.HTTPError(404, 'nof found')

        if not task.is_running():
            task.action = action
            task.status = status
            try:
                task.event = event
            except:
                return {'msg': 'event invalid', 'status': 'error'}
            Backend('task').save(task)
            return {'status': 'info', 'msg': 'saved', }
        else:
            return {'status': 'error', 'msg': 'The task is runnig'}
Пример #26
0
 def test_delete(self):
     self.user.uid = self.uid
     ret = Backend('user').delete(self.user)
     user = Backend('user').find(self.uid)
     self.assertEqual(user, None)
Пример #27
0
 def test_delete_by_name(self):
     task = Backend('task').find('job_test')
     ret = Backend('task').delete_by_name(task.name)
     task = Backend('task').find('job_test')
     self.assertEqual(task, None)
Пример #28
0
 def delete_task(cls, name):
     task = Backend('task').find(name)
     if not task.is_running():
         Backend('task').delete(task)
         return True
     return False
Пример #29
0
 def test_delete_by_task_id(self):
     task = Backend('task').find('job_test')
     ret = Backend('task').delete_by_task_id(task.task_id)
     task = Backend('task').find('job_test')
     self.assertEqual(task, None)
Пример #30
0
 def add_task(cls, name, event, action, next_run=None, *args, **kw):
     data = {'args': args, 'kw': kw}
     task = Task(None, None, name, action, data, event, next_run=next_run)
     return Backend('task').save(task)
Пример #31
0
 def claim(self):
     return Backend('task').claim(self.task_size)
Пример #32
0
 def edit_user_page(self, uid):
     uid = int(uid)
     user = Backend('user').find(uid)
     if not user:
         raise cherrypy.HTTPError(404, 'user not found')
     return render_template('user.edit.html', statuses=USER_STATUSES, roles=ROLES, user=user)