Esempio n. 1
0
 def POST(self):
     data = web.input()
     UID = data.get('UID').encode('utf-8')
     # 首先检查UID是否合法
     if not UID.isalnum():
         return Notice(u'注册失败', u'用户ID必须由字母和数字构成!', '/register')
     # 其次检查UID是否重复
     result = db.QueryFirst("SELECT * FROM Users WHERE UID='%s'" % UID)
     if result:
         return Notice(u'注册失败', u'重复的学号/工号!', '/register')
     try:
         UserName = data.get('UserName').encode('utf-8')
         PassWord = data.get('PassWord').encode('utf-8')
         Tel = data.get('Tel').encode('utf-8')
         E_mail = data.get('E-mail').encode('utf-8')
         MaxSize = int(data.get('MaxSize'))
         MaxFiles = int(data.get('MaxFiles'))
         # TODO: 更改数据库格式,去除无用设置
         sql = "INSERT INTO `Users`(`UID`,`SessionID`,`UserStatus`," \
               "`UserName`,`PassWord`,`Tel`,`E-mail`,`MaxSize`,`MaxFiles`,`Downloader`) " \
               "VALUES ('%s',NULL,1,'%s','%s','%s','%s',%d,%d,'%s');" \
               % (UID, UserName, PassWord, Tel, E_mail, MaxSize, MaxFiles, cfg.read('downloader'))
         # 尝试为用户创建家目录
         user_path = os.path.join(cfg.read('global_pos'), UID)
         if not os.path.exists(user_path):
             os.mkdir(user_path)
         # 如果家目录创建成功,才更新数据库
         db.Execute(sql)
         return Notice(u'注册成功', u'请使用你新注册的帐号登录系统。', '/login')
     except Exception, err:
         return Notice(u'注册失败', u'错误: %s 请检查你的注册信息是否合法有效!' % err,
                       '/register')
Esempio n. 2
0
 def POST(self):
     data = web.input()
     UID = data.get('UID').encode('utf-8')
     # 首先检查UID是否合法
     if not UID.isalnum():
         return Notice(u'注册失败', u'用户ID必须由字母和数字构成!', '/register')
     # 其次检查UID是否重复
     result = db.QueryFirst("SELECT * FROM Users WHERE UID='%s'" % UID)
     if result:
         return Notice(u'注册失败', u'重复的学号/工号!', '/register')
     try:
         UserName = data.get('UserName').encode('utf-8')
         PassWord = data.get('PassWord').encode('utf-8')
         Tel = data.get('Tel').encode('utf-8')
         E_mail = data.get('E-mail').encode('utf-8')
         MaxSize = int(data.get('MaxSize'))
         MaxFiles = int(data.get('MaxFiles'))
         # TODO: 更改数据库格式,去除无用设置
         sql = "INSERT INTO `Users`(`UID`,`SessionID`,`UserStatus`," \
               "`UserName`,`PassWord`,`Tel`,`E-mail`,`MaxSize`,`MaxFiles`,`Downloader`) " \
               "VALUES ('%s',NULL,1,'%s','%s','%s','%s',%d,%d,'%s');" \
               % (UID, UserName, PassWord, Tel, E_mail, MaxSize, MaxFiles, cfg.read('downloader'))
         # 尝试为用户创建家目录
         user_path = os.path.join(cfg.read('global_pos'), UID)
         if not os.path.exists(user_path):
             os.mkdir(user_path)
         # 如果家目录创建成功,才更新数据库
         db.Execute(sql)
         return Notice(u'注册成功', u'请使用你新注册的帐号登录系统。', '/login')
     except Exception, err:
         return Notice(u'注册失败', u'错误: %s 请检查你的注册信息是否合法有效!' % err, '/register')
Esempio n. 3
0
def start_web_server():
    app = web.application(urls, globals())
    sys.stderr.write('Web server started at %d port!\n' %
                     int(cfg.read('port_name')))
    # 启动http服务监听指定端口
    web.httpserver.runsimple(app.wsgifunc(),
                             ("0.0.0.0", int(cfg.read('port_name'))))
Esempio n. 4
0
 def __init__(self, is_debug=False):
     self.prev_day = {}
     self.thread_pool = ThreadPool(
         is_debug,
         int(cfg.read('max_threads')),
         int(cfg.read('max_buf')),
     )
     # 注意先清空先前留下的下载任务
     # TODO: 改为继续执行先前未完成的任务
     db.Execute("DELETE FROM `CurrentTask`")
Esempio n. 5
0
 def GET(self):
     stat, UserInfo = CheckLogin()
     if stat:
         MyTemplate = CreateMyTemplate('Index.html')
         return MyTemplate.render(SiteName=cfg.read('site_name'), **UserInfo)
     else:
         web.seeother('/login')
Esempio n. 6
0
 def GET(self):
     stat, UserInfo = CheckLogin()
     if stat:
         MyTemplate = CreateMyTemplate('Index.html')
         return MyTemplate.render(SiteName=cfg.read('site_name'),
                                  **UserInfo)
     else:
         web.seeother('/login')
Esempio n. 7
0
 def GET(self):
     stat, UserInfo = CheckLogin()
     if stat:
         sql = "SELECT UserName, Tel, `E-mail`, MaxFiles, MaxSize, NameRule, Downloader " \
               "FROM Users WHERE UID='%s'" % UserInfo['UID']
         result = db.QueryFirst(sql)
         MyTemplate = CreateMyTemplate('Settings.html')
         return MyTemplate.render(SiteName=cfg.read('site_name'), UserInfo=result, **UserInfo)
     else:
         web.seeother('/login')
Esempio n. 8
0
 def POST(self):
     stat, UserInfo = CheckLogin()
     if stat:
         if UserInfo['UserStatus'] == USER_STATUS_FORBIDDEN:
             return json.dumps({
                 'status': 401,
                 'msg': u'被封禁用户无权操作!'
             })
         UID = UserInfo['UID'].encode('utf-8')
         data = web.input(month=[], day=[], hour=[], minute=[])
         action = data.get('action', '')
         URL_Rule = data.get('URL_Rule', '').encode('utf-8')
         # 检查URL是否合法
         if match('^\w+://', URL_Rule) is None:
             URL_Rule = 'http://%s' % URL_Rule
         Rule_Name = data.get('Rule_Name', '').encode('utf-8')
         Status = int(data.get('Status', '0'))
         TaskID = int(data.get('TaskID', '0'))
         if action == 'modify':
             try:
                 sql = "UPDATE UserTask SET URL_Rule='%s', Status=%d, Rule_Name='%s' "\
                       "WHERE TaskID=%d" % (URL_Rule, Status, Rule_Name, TaskID)
                 db.Execute(sql)
                 return json.dumps({
                     'status': 200,
                     'msg': u'操作成功!'
                 })
             except Exception, e:
                 return json.dumps({
                     'status': 400,
                     'msg': u'意外错误:%s。请检查你的输入数据。' % e
                 })
         elif action == 'delete':
             try:
                 # 注意要删除任务对应文件夹:
                 sql = "SELECT `UID`, `SubDirectory` FROM `UserTask` WHERE `TaskID` = %d" % TaskID
                 Dirs = db.QueryFirst(sql)
                 del_path = os.path.join(cfg.read('global_pos'),
                                         Dirs[0].decode('utf-8'),
                                         Dirs[1].decode('utf-8'))
                 if Dirs[1] and os.path.exists(del_path):
                     rmtree(del_path)
                 sql = "DELETE FROM `UserTask` WHERE `TaskID`=%d" % TaskID
                 db.Execute(sql)
                 sql = "DELETE FROM `CurrentTask` WHERE `TaskID`=%d" % TaskID
                 db.Execute(sql)
                 return json.dumps({
                     'status': 200,
                     'msg': u'操作成功!'
                 })
             except Exception, e:
                 return json.dumps({
                     'status': 400,
                     'msg': u'意外错误:%s。删除失败!' % e
                 })
Esempio n. 9
0
 def GET(self):
     stat, UserInfo = CheckLogin()
     if stat:
         sql = "SELECT UserName, Tel, `E-mail`, MaxFiles, MaxSize, NameRule, Downloader " \
               "FROM Users WHERE UID='%s'" % UserInfo['UID']
         result = db.QueryFirst(sql)
         MyTemplate = CreateMyTemplate('Settings.html')
         return MyTemplate.render(SiteName=cfg.read('site_name'),
                                  UserInfo=result,
                                  **UserInfo)
     else:
         web.seeother('/login')
Esempio n. 10
0
 def GET(self):
     stat, UserInfo = CheckLogin()
     if stat:
         if UserInfo['UserStatus'] != USER_STATUS_ADMIN:
             return Notice(u'无效访问', u'普通用户无权操作!', '/login')
         filename = cfg.read('log_filename')
         if type(filename) == unicode:
             filename = filename.encode('gb18030')
         data = open(filename, 'r').readlines()
         data = map(lambda x: x.decode('gb18030'), data)
         MyTemplate = CreateMyTemplate('Log.html')
         return MyTemplate.render(msgs=data)
     else:
         return Notice(u'无效访问', u'请先登录!', '/login')
Esempio n. 11
0
 def GET(self):
     stat, UserInfo = CheckLogin()
     if stat:
         if UserInfo['UserStatus'] != USER_STATUS_ADMIN:
             return Notice(u'无效访问',  u'普通用户无权操作!', '/login')
         filename = cfg.read('log_filename')
         if type(filename) == unicode:
             filename = filename.encode('gb18030')
         data = open(filename, 'r').readlines()
         data = map(lambda x: x.decode('gb18030'), data)
         MyTemplate = CreateMyTemplate('Log.html')
         return MyTemplate.render(msgs=data)
     else:
         return Notice(u'无效访问',  u'请先登录!', '/login')
Esempio n. 12
0
 def POST(self):
     stat, UserInfo = CheckLogin()
     if stat:
         if UserInfo['UserStatus'] == USER_STATUS_FORBIDDEN:
             return json.dumps({'status': 401, 'msg': u'被封禁用户无权操作!'})
         UID = UserInfo['UID'].encode('utf-8')
         data = web.input(month=[], day=[], hour=[], minute=[])
         action = data.get('action', '')
         URL_Rule = data.get('URL_Rule', '').encode('utf-8')
         # 检查URL是否合法
         if match('^\w+://', URL_Rule) is None:
             URL_Rule = 'http://%s' % URL_Rule
         Rule_Name = data.get('Rule_Name', '').encode('utf-8')
         Status = int(data.get('Status', '0'))
         TaskID = int(data.get('TaskID', '0'))
         if action == 'modify':
             try:
                 sql = "UPDATE UserTask SET URL_Rule='%s', Status=%d, Rule_Name='%s' "\
                       "WHERE TaskID=%d" % (URL_Rule, Status, Rule_Name, TaskID)
                 db.Execute(sql)
                 return json.dumps({'status': 200, 'msg': u'操作成功!'})
             except Exception, e:
                 return json.dumps({
                     'status': 400,
                     'msg': u'意外错误:%s。请检查你的输入数据。' % e
                 })
         elif action == 'delete':
             try:
                 # 注意要删除任务对应文件夹:
                 sql = "SELECT `UID`, `SubDirectory` FROM `UserTask` WHERE `TaskID` = %d" % TaskID
                 Dirs = db.QueryFirst(sql)
                 del_path = os.path.join(cfg.read('global_pos'),
                                         Dirs[0].decode('utf-8'),
                                         Dirs[1].decode('utf-8'))
                 if Dirs[1] and os.path.exists(del_path):
                     rmtree(del_path)
                 sql = "DELETE FROM `UserTask` WHERE `TaskID`=%d" % TaskID
                 db.Execute(sql)
                 sql = "DELETE FROM `CurrentTask` WHERE `TaskID`=%d" % TaskID
                 db.Execute(sql)
                 return json.dumps({'status': 200, 'msg': u'操作成功!'})
             except Exception, e:
                 return json.dumps({
                     'status': 400,
                     'msg': u'意外错误:%s。删除失败!' % e
                 })
Esempio n. 13
0
    def GET(self):
        stat, UserInfo = CheckLogin()
        if stat and UserInfo['UserStatus'] == USER_STATUS_ADMIN:
            MyTemplate = CreateMyTemplate('Admin.html')

            sql = "SELECT UID, UserName, PassWord, MaxFiles, MaxSize FROM Users"
            AllUserData = db.Query(sql)
            return MyTemplate.render(
                AllUserData=AllUserData,
                SiteName=cfg.read('site_name'),
                GlobalPos=cfg.read('global_pos'),
                DateCheckingInterval=cfg.read('date_checking_interval'),
                WorkerCheckingInterval=cfg.read('worker_checking_interval'),
                CleanerCheckingInterval=cfg.read('cleaner_checking_interval'),
                PortName=cfg.read('port_name'),
                MaxThreads=cfg.read('max_threads'),
                MaxBuf=cfg.read('max_buf'),
                **UserInfo)
        else:
            return Notice(u'禁止访问', u'非管理员无权操作!', '/index')
Esempio n. 14
0
 def clean_worker(self):
     sql = "SELECT `UID`, `MaxSize`, `MaxFiles` FROM `Users`"
     all_users = db.Query(sql)
     base_dir = cfg.read('global_pos')
     for user in all_users:
         UID = user[0]
         MaxSize = user[1]
         MaxFiles = user[2]
         user_home_dir = os.path.join(base_dir, UID)
         TotalSize, TotalFiles = get_dir_size(user_home_dir)
         TotalSize /= (1024 * 1024)
         # 如果超出了文件数量配额或者文件大小配额
         if TotalSize > MaxSize or TotalFiles > MaxFiles:
             # 首先暂停该用户所有任务
             sql = "UPDATE `UserTask` SET `Status` = 0 WHERE `UID` = '%s'" % UID
             db.Execute(sql)
             # 其次删除所有正在进行的任务
             sql = "DELETE FROM `CurrentTask` WHERE `UID` = '%s'" % UID
             db.Execute(sql)
Esempio n. 15
0
    def GET(self):
        stat, UserInfo = CheckLogin()
        if stat and UserInfo['UserStatus'] == USER_STATUS_ADMIN:
            MyTemplate = CreateMyTemplate('Admin.html')

            sql = "SELECT UID, UserName, PassWord, MaxFiles, MaxSize FROM Users"
            AllUserData = db.Query(sql)
            return MyTemplate.render(
                AllUserData=AllUserData,
                SiteName=cfg.read('site_name'),
                GlobalPos=cfg.read('global_pos'),
                DateCheckingInterval=cfg.read('date_checking_interval'),
                WorkerCheckingInterval=cfg.read('worker_checking_interval'),
                CleanerCheckingInterval=cfg.read('cleaner_checking_interval'),
                PortName=cfg.read('port_name'),
                MaxThreads=cfg.read('max_threads'),
                MaxBuf=cfg.read('max_buf'),
                **UserInfo
            )
        else:
            return Notice(u'禁止访问',  u'非管理员无权操作!', '/index')
Esempio n. 16
0
 def POST(self):
     stat, UserInfo = CheckLogin()
     if stat and UserInfo['UserStatus'] == USER_STATUS_ADMIN:
         data = web.input()
         action = data.get('action')
         # TODO: 增加一个停止/启动所有线程的功能
         if action == 'modify':
             try:
                 UID = data.get('UID').encode('utf-8')
                 UserName = data.get('UserName').encode('utf-8')
                 PassWord = data.get('PassWord').encode('utf-8')
                 MaxFiles = int(data.get('MaxFiles'))
                 MaxSize = int(data.get('MaxSize'))
                 sql = "UPDATE Users SET UserName='******', PassWord='******', MaxFiles=%d, MaxSize=%d " \
                       "WHERE UID='%s'" % (UserName, PassWord, MaxFiles, MaxSize, UID)
                 db.Execute(sql)
                 return json.dumps({'status': 200, 'msg': u'操作成功!'})
             except:
                 return json.dumps({
                     'status': 400,
                     'msg': u'未知错误!请检查数据是否合法!'
                 })
         elif action == 'delete':
             try:
                 UID = data.get('UID').encode('utf-8')
                 if UID == 'root':
                     raise Exception(u'不允许删除管理员!')
                 sql = "DELETE FROM `Users` WHERE `UID`='%s'" % UID
                 db.Execute(sql)
                 sql = "DELETE FROM `UserTask` WHERE `UID`='%s'" % UID
                 db.Execute(sql)
                 sql = "DELETE FROM `CurrentTask` WHERE `UID`='%s'" % UID
                 db.Execute(sql)
                 # 最后注意删除用户的目录
                 del_path = os.path.join(cfg.read('global_pos'), UID)
                 if os.path.exists(del_path):
                     rmtree(del_path)
                 return json.dumps({'status': 200, 'msg': u'操作成功!'})
             except Exception, err:
                 return json.dumps({
                     'status': 400,
                     'msg': u'%s\n请检查学号/工号是否合法!' % err
                 })
         elif action == 'config':
             # TODO: 增加几个新设置项的处理机制
             try:
                 # TODO: 这里可以为更多设置项增加检查函数,似乎这就是单子的一种用法吧?
                 CheckFunc = {
                     'SiteName': None,
                     'GlobalPos': check_path,
                     'DateCheckingInterval': int,
                     'WorkerCheckingInterval': int,
                     'CleanerCheckingInterval': int,
                     'PortName': int,
                     'MaxThreads': int,
                     'MaxBuf': int
                 }
                 ConfigName2Str = {
                     'SiteName': 'site_name',
                     'GlobalPos': 'global_pos',
                     'DateCheckingInterval': 'date_checking_interval',
                     'WorkerCheckingInterval': 'worker_checking_interval',
                     'CleanerCheckingInterval': 'cleaner_checking_interval',
                     'PortName': 'port_name',
                     'MaxThreads': 'max_threads',
                     'MaxBuf': 'max_buf'
                 }
                 # 首先检查一遍全部数据,看其中是否有空项
                 for key in ConfigName2Str.keys():
                     val = data.get(key)
                     if not val:
                         raise Exception(u'提交的数据中存在无效项/空项!')
                     if CheckFunc[key]:
                         CheckFunc[key](val)
                 # 如果所有数据正常,就直接继续更新
                 for key in ConfigName2Str.keys():
                     val = data.get(key)
                     cfg.write(ConfigName2Str[key], val)
                 return json.dumps({'status': 200, 'msg': u'操作成功!'})
             except Exception, err:
                 return json.dumps({
                     'status': 400,
                     'msg': u'%s\n请检查输入数据是否合法!' % err
                 })
Esempio n. 17
0
class ModifyRules():
    def GET(self):
        stat, UserInfo = CheckLogin()
        if stat:
            if UserInfo['UserStatus'] == USER_STATUS_FORBIDDEN:
                return Notice(u'无效访问', u'被封禁用户无权操作!', '/login')
            MyTemplate = CreateMyTemplate('ModifyRules.html')
            if UserInfo['UserStatus'] == USER_STATUS_ADMIN:
                sql = "SELECT Rule_Name, URL_Rule, Status, RepeatType, RepeatValue, TaskID, TimeZone " \
                      "FROM UserTask"
            else:
                sql = "SELECT Rule_Name, URL_Rule, Status, RepeatType, RepeatValue, TaskID, TimeZone " \
                      "FROM UserTask WHERE UID='%s'" % UserInfo['UID']
            results = db.Query(sql)
            return MyTemplate.render(results=results, **UserInfo)
        else:
            return Notice(u'无效访问', u'请先登录!', '/login')

    def POST(self):
        stat, UserInfo = CheckLogin()
        if stat:
            if UserInfo['UserStatus'] == USER_STATUS_FORBIDDEN:
                return json.dumps({'status': 401, 'msg': u'被封禁用户无权操作!'})
            UID = UserInfo['UID'].encode('utf-8')
            data = web.input(month=[], day=[], hour=[], minute=[])
            action = data.get('action', '')
            URL_Rule = data.get('URL_Rule', '').encode('utf-8')
            # 检查URL是否合法
            if match('^\w+://', URL_Rule) is None:
                URL_Rule = 'http://%s' % URL_Rule
            Rule_Name = data.get('Rule_Name', '').encode('utf-8')
            Status = int(data.get('Status', '0'))
            TaskID = int(data.get('TaskID', '0'))
            if action == 'modify':
                try:
                    sql = "UPDATE UserTask SET URL_Rule='%s', Status=%d, Rule_Name='%s' "\
                          "WHERE TaskID=%d" % (URL_Rule, Status, Rule_Name, TaskID)
                    db.Execute(sql)
                    return json.dumps({'status': 200, 'msg': u'操作成功!'})
                except Exception, e:
                    return json.dumps({
                        'status': 400,
                        'msg': u'意外错误:%s。请检查你的输入数据。' % e
                    })
            elif action == 'delete':
                try:
                    # 注意要删除任务对应文件夹:
                    sql = "SELECT `UID`, `SubDirectory` FROM `UserTask` WHERE `TaskID` = %d" % TaskID
                    Dirs = db.QueryFirst(sql)
                    del_path = os.path.join(cfg.read('global_pos'),
                                            Dirs[0].decode('utf-8'),
                                            Dirs[1].decode('utf-8'))
                    if Dirs[1] and os.path.exists(del_path):
                        rmtree(del_path)
                    sql = "DELETE FROM `UserTask` WHERE `TaskID`=%d" % TaskID
                    db.Execute(sql)
                    sql = "DELETE FROM `CurrentTask` WHERE `TaskID`=%d" % TaskID
                    db.Execute(sql)
                    return json.dumps({'status': 200, 'msg': u'操作成功!'})
                except Exception, e:
                    return json.dumps({
                        'status': 400,
                        'msg': u'意外错误:%s。删除失败!' % e
                    })
            elif action == 'add':
                try:
                    RepeatType = data['RepeatType']
                    TimeZone = data['TimeZone'].encode('utf-8')
                    lst_day = ['0', data['Weekday']]
                    lst_month = ['0', '0', '0']
                    lst_year = ['0', '0', '0', '0', data.get('year')]
                    lst_day.extend(data['day'])
                    lst_month.extend(data['month'])
                    lst_minute = data['minute']
                    lst_hour = data['hour']
                    dic2idx = {
                        'day': 0,
                        'week': 1,
                        'month': 2,
                        'year': 3,
                        'once': 4
                    }
                    dic2val = {
                        'day': REP_PER_DAY,
                        'week': int(data['Weekday']),
                        'month': REP_PER_MONTH,
                        'year': REP_PER_YEAR,
                        'once': REP_PER_ONCE
                    }
                    idx = dic2idx[RepeatType]
                    RepeatLevel = dic2val[RepeatType]
                    RepeatValue = ' '.join(
                        map(
                            str,
                            map(int, [
                                lst_year[idx], lst_month[idx], lst_day[idx],
                                lst_hour[idx], lst_minute[idx]
                            ])))
                    SubDir = data.get('Sub_Dir', '')
                    NameRule = data.get('NameRule', 'auto').encode('utf-8')
                    Downloader = data.get('Downloader',
                                          'aria2').encode('utf-8')
                    CheckType = data.get('CheckType', 'auto').encode('utf-8')
                    TaskTime = int(data.get('TaskTime', '12'))
                    CheckSize = int(data.get('CheckSize', '4096'))
                    sql = "INSERT INTO UserTask (UID, URL_Rule, Rule_Name, RepeatType, RepeatValue, " \
                          "TimeZone, Status, SubDirectory, NameRule, TaskTime, Downloader, CheckType, CheckSize) " \
                          "VALUES ('%s', '%s', '%s', %d, '%s', '%s', %d, '%s', '%s', %d, '%s', '%s', %d)" % \
                          (UID, URL_Rule, Rule_Name, RepeatLevel, RepeatValue, TimeZone, Status,
                           SubDir.encode('utf-8'), NameRule, TaskTime, Downloader, CheckType, CheckSize)
                    if len(URL_Rule) == 0 or len(Rule_Name) == 0:
                        raise Exception(u'请输入有效的下载链接和任务名称')
                    # 为任务建立子目录
                    # 注意路径必须是unicode编码的!
                    Rule_Folder = os.path.join(cfg.read('global_pos'), UID,
                                               SubDir)
                    if not os.path.exists(Rule_Folder):
                        os.mkdir(Rule_Folder)
                    db.Execute(sql)
                    return json.dumps({'status': 200, 'msg': u'操作成功!'})
                except Exception, err:
                    return json.dumps({
                        'status': 400,
                        'msg': u'意外错误:%s。请检查你的输入数据。' % err
                    })
Esempio n. 18
0
 def cleaner_daemon(self):
     while True:
         sleep(int(cfg.read('cleaner_checking_interval')))
         self.clean_worker()
Esempio n. 19
0
def start_web_server():
    app = web.application(urls, globals())
    sys.stderr.write('Web server started at %d port!\n' % int(cfg.read('port_name')))
    # 启动http服务监听指定端口
    web.httpserver.runsimple(app.wsgifunc(), ("0.0.0.0", int(cfg.read('port_name'))))
Esempio n. 20
0
 def POST(self):
     stat, UserInfo = CheckLogin()
     if stat and UserInfo['UserStatus'] == USER_STATUS_ADMIN:
         data = web.input()
         action = data.get('action')
         # TODO: 增加一个停止/启动所有线程的功能
         if action == 'modify':
             try:
                 UID = data.get('UID').encode('utf-8')
                 UserName = data.get('UserName').encode('utf-8')
                 PassWord = data.get('PassWord').encode('utf-8')
                 MaxFiles = int(data.get('MaxFiles'))
                 MaxSize = int(data.get('MaxSize'))
                 sql = "UPDATE Users SET UserName='******', PassWord='******', MaxFiles=%d, MaxSize=%d " \
                       "WHERE UID='%s'" % (UserName, PassWord, MaxFiles, MaxSize, UID)
                 db.Execute(sql)
                 return json.dumps({
                     'status': 200,
                     'msg': u'操作成功!'
                 })
             except:
                 return json.dumps({
                     'status': 400,
                     'msg': u'未知错误!请检查数据是否合法!'
                 })
         elif action == 'delete':
             try:
                 UID = data.get('UID').encode('utf-8')
                 if UID == 'root':
                     raise Exception(u'不允许删除管理员!')
                 sql = "DELETE FROM `Users` WHERE `UID`='%s'" % UID
                 db.Execute(sql)
                 sql = "DELETE FROM `UserTask` WHERE `UID`='%s'" % UID
                 db.Execute(sql)
                 sql = "DELETE FROM `CurrentTask` WHERE `UID`='%s'" % UID
                 db.Execute(sql)
                 # 最后注意删除用户的目录
                 del_path = os.path.join(cfg.read('global_pos'), UID)
                 if os.path.exists(del_path):
                     rmtree(del_path)
                 return json.dumps({
                     'status': 200,
                     'msg': u'操作成功!'
                 })
             except Exception, err:
                 return json.dumps({
                     'status': 400,
                     'msg': u'%s\n请检查学号/工号是否合法!' % err
                 })
         elif action == 'config':
             # TODO: 增加几个新设置项的处理机制
             try:
                 # TODO: 这里可以为更多设置项增加检查函数,似乎这就是单子的一种用法吧?
                 CheckFunc = {
                     'SiteName': None,
                     'GlobalPos': check_path,
                     'DateCheckingInterval': int,
                     'WorkerCheckingInterval': int,
                     'CleanerCheckingInterval': int,
                     'PortName': int,
                     'MaxThreads': int,
                     'MaxBuf': int
                 }
                 ConfigName2Str = {
                     'SiteName': 'site_name',
                     'GlobalPos': 'global_pos',
                     'DateCheckingInterval': 'date_checking_interval',
                     'WorkerCheckingInterval': 'worker_checking_interval',
                     'CleanerCheckingInterval': 'cleaner_checking_interval',
                     'PortName': 'port_name',
                     'MaxThreads': 'max_threads',
                     'MaxBuf': 'max_buf'
                 }
                 # 首先检查一遍全部数据,看其中是否有空项
                 for key in ConfigName2Str.keys():
                     val = data.get(key)
                     if not val:
                         raise Exception(u'提交的数据中存在无效项/空项!')
                     if CheckFunc[key]:
                         CheckFunc[key](val)
                 # 如果所有数据正常,就直接继续更新
                 for key in ConfigName2Str.keys():
                     val = data.get(key)
                     cfg.write(ConfigName2Str[key], val)
                 return json.dumps({
                     'status': 200,
                     'msg': u'操作成功!'
                 })
             except Exception, err:
                 return json.dumps({
                     'status': 400,
                     'msg': u'%s\n请检查输入数据是否合法!' % err
                 })
Esempio n. 21
0
 def worker_daemon(self):
     sys.stderr.write('Worker daemon of Download Server started!\n')
     while True:
         sleep(int(cfg.read('worker_checking_interval')))
         self.update_worker()
Esempio n. 22
0
 def calendar_daemon(self):
     sys.stderr.write('Calendar daemon of Download Server started!\n')
     while True:
         self.update_calendar()
         sleep(int(cfg.read('date_checking_interval')))
Esempio n. 23
0
    def update_calendar(self, overwrite_time=None):
        # 注意同一个规则所实例化的任务,只能被添加一次
        sql = "SELECT * FROM `UserTask` WHERE " \
              "`TaskID` NOT IN (SELECT `TaskID` FROM `CurrentTask`) " \
              "AND `Status` != 0"
        this_day = {}
        all_tasks = db.Query(sql)
        for task in all_tasks:
            # 首先读取时区信息,并转换为当前任务所在时区的时间
            TimeZone = timezone(str(task[6]))
            if overwrite_time is None:
                today = datetime.now(TimeZone)
            else:
                today = overwrite_time

            # 然后判断在该时区是否进入了新的一天
            is_new_day = False
            if self.prev_day.get(TimeZone, None) is None \
                    or today.day != self.prev_day[TimeZone]:
                this_day[TimeZone] = today.day
                is_new_day = True

            # 如果确实进入了新的一天
            if is_new_day:
                # 首先生成任务开始和结束时间
                # 同样注意转换为任务所在的时区
                date_nums = map(int, task[5].split())
                StartTime = datetime(year=today.year,
                                     month=today.month,
                                     day=today.day,
                                     hour=date_nums[3],
                                     minute=date_nums[4],
                                     tzinfo=TimeZone)
                FinishTime = StartTime + timedelta(hours=task[10])

                 # 生成一些与日期相关的数据
                yesterday = today + timedelta(days=-1)
                tomorrow = today + timedelta(days=1)
                keywords = {
                    '%year%': today.year,
                    '%mon%': today.month,
                    '%day%': today.day,
                    '%prev_year%': yesterday.year,
                    '%prev_mon%': yesterday.month,
                    '%prev_day%': yesterday.day,
                    '%next_year%': tomorrow.year,
                    '%next_mon%': tomorrow.month,
                    '%next_day%': tomorrow.day
                }
                for key in keywords.keys():
                        keywords[key] = '%02d' % keywords[key]

                # 其次生成下载链接
                # 用dict中的关键字不断替换URL中字符串
                TaskID = task[0]
                UID = task[1]
                URL = task[2]
                for key in keywords.keys():
                    while URL.find(key) != -1:
                        URL = URL.replace(key, keywords[key])
                # 生成URL后,更新文件保存位置:
                # 1. 首先读取全局位置
                Location = cfg.read('global_pos')
                # 2. 然后定位到用户家目录位置
                Location = os.path.join(Location, UID)
                # 3. 再定位到规则目录位置,这里的类型都是unicode
                RuleName = task[3]
                SubDir = task[8]
                if SubDir:
                    if type(SubDir) == str:
                        SubDir = SubDir.decode('utf-8')
                    Location = os.path.join(Location, SubDir)
                # 4. 最后根据命名规则确定文件名
                if task[9] == 'auto':
                    Location = os.path.join(Location, URL.split('/')[-1])
                else:
                    Location = os.path.join(Location, RuleName + '.' + URL.split('.')[-1])

                # 重新转换编码
                if type(Location) == unicode:
                    Location = Location.encode('utf-8')

                sql = "INSERT INTO `CurrentTask` VALUES ('%s', '%s', 1, '%s', '%s', '%s', %d, '%s', 0)" % (
                        UID, URL, Location, StartTime.ctime(), FinishTime.ctime(), TaskID, TimeZone.zone)

                RepeatType = int(task[4])
                if RepeatType == REP_PER_DAY:
                    # 如果是每天执行的任务,直接添加到任务列表
                    db.Execute(sql)
                elif REP_PER_MON <= RepeatType <= REP_PER_SUN:
                    # 如果是周任务,则当前weekday必须匹配
                    if today.isoweekday() == RepeatType:
                        db.Execute(sql)
                elif RepeatType == REP_PER_MONTH:
                    # 如果是月任务,日期必须匹配
                    if today.day == date_nums[2]:
                        db.Execute(sql)
                elif RepeatType == REP_PER_YEAR:
                    # 如果是年任务,月日必须匹配
                    if today.month == date_nums[1] and today.day == date_nums[2]:
                        db.Execute(sql)
                elif RepeatType == REP_PER_ONCE:
                    # 对于仅执行一次的任务,年月日必须匹配
                    # 并且放入任务列表中后就暂停掉这项任务
                    if today.year == date_nums[0] and today.month == date_nums[1] and today.day == date_nums[2]:
                        db.Execute(sql)
                        db.Execute("UPDATE `UserTask` SET `Status` = 0 WHERE `TaskID` = %d" % TaskID)
        self.prev_day = this_day