From 0b37a34528fc652a5eb51e2bac2374fc007c2f5c Mon Sep 17 00:00:00 2001 From: Mr Chen Date: Tue, 26 Nov 2024 00:37:55 +0800 Subject: [PATCH] up --- panel_task.py | 49 ++++++++++++++++++++------------------ web/admin/files/files.py | 20 +++++++++++++++- web/admin/task/__init__.py | 10 ++++---- web/core/mw.py | 7 ++++-- web/static/app/public.js | 2 +- web/thisdb/tasks.py | 30 ++++++++++++++++++++++- 6 files changed, 85 insertions(+), 33 deletions(-) diff --git a/panel_task.py b/panel_task.py index 1c26b6fb0..39e436064 100755 --- a/panel_task.py +++ b/panel_task.py @@ -77,43 +77,46 @@ def downloadFile(url, filename): if not mw.isAppleSystem(): os.system('chown www.www ' + filename) - writeLogs('done') + writeLogs(filename + ' download success!') except Exception as e: writeLogs(str(e)) return True def downloadHook(count, blockSize, totalSize): # 下载文件进度回调 - global pre used = count * blockSize - pre1 = int((100.0 * used / totalSize)) - if pre == (100 - pre1): - return - speed = {'total': totalSize, 'used': used, 'pre': pre1} + pre = int((100.0 * used / totalSize)) + speed = {'total': totalSize, 'used': used, 'pre': pre} writeLogs(json.dumps(speed)) def runPanelTask(): # 站点过期检查 siteEdateCheck() + lock_file = mw.getTriggerTaskLockFile() + # mw.writeFile(lock_file,'True') try: - bash_list = thisdb.getTaskList(status=-1) - for task in bash_list: - thisdb.setTaskStatus(task['id'], 0) - - run_list = thisdb.getTaskList(status=0) - for run_task in run_list: - start = int(time.time()) - thisdb.setTaskData(run_task['id'], start=start) - thisdb.setTaskStatus(run_task['id'], -1) - if run_task['type'] == 'download': - argv = run_task['cmd'].split('|mw|') - downloadFile(argv[0], argv[1]) - elif run_task['type'] == 'execshell': - execShell(run_task['cmd']) - end = int(time.time()) - thisdb.setTaskData(run_task['id'], end=end) - thisdb.setTaskStatus(run_task['id'], 1) + if os.path.exists(lock_file): + bash_list = thisdb.getTaskList(status=-1) + for task in bash_list: + thisdb.setTaskStatus(task['id'], 0) + + run_list = thisdb.getTaskList(status=0) + for run_task in run_list: + start = int(time.time()) + thisdb.setTaskData(run_task['id'], start=start) + thisdb.setTaskStatus(run_task['id'], -1) + + if run_task['type'] == 'download': + argv = run_task['cmd'].split('|mw|') + downloadFile(argv[0], argv[1]) + elif run_task['type'] == 'execshell': + execShell(run_task['cmd']) + + end = int(time.time()) + thisdb.setTaskData(run_task['id'], end=end) + thisdb.setTaskStatus(run_task['id'], 1) + os.remove(lock_file) except Exception as e: pass diff --git a/web/admin/files/files.py b/web/admin/files/files.py index 326ff7e9c..dcca06a1b 100644 --- a/web/admin/files/files.py +++ b/web/admin/files/files.py @@ -9,6 +9,7 @@ # --------------------------------------------------------------------------------- import os +import time from flask import Blueprint, render_template from flask import request @@ -185,7 +186,7 @@ def delete_dir(): path = request.form.get('path', '') return file.dirDelete(path) -# 删除文件 +# 下载文件 @blueprint.route('/download', endpoint='download', methods=['GET']) @panel_login_required def download(): @@ -199,6 +200,23 @@ def download(): response = make_response(send_from_directory(os.path.dirname(filename), os.path.basename(filename), as_attachment=is_attachment)) return response +# 远程下载 +@blueprint.route('/download_file', endpoint='download_file', methods=['POST']) +@panel_login_required +def download_file(): + url = request.form.get('url', '') + path = request.form.get('path', '') + filename = request.form.get('filename', '') + + execstr = url + '|mw|' + path + '/' + filename + execstr = execstr.strip() + + title = '下载文件[' + filename + ']' + thisdb.addTaskByDownload(name=title, cmd=execstr) + # self.setFileAccept(path + '/' + filename) + mw.triggerTask() + return mw.returnData(True, '已将下载任务添加到队列!') + # 日志清空 @blueprint.route('/close_logs', endpoint='close_logs', methods=['POST']) @panel_login_required diff --git a/web/admin/task/__init__.py b/web/admin/task/__init__.py index 68598414c..92465b109 100644 --- a/web/admin/task/__init__.py +++ b/web/admin/task/__init__.py @@ -8,6 +8,8 @@ # Author: midoks # --------------------------------------------------------------------------------- +import json +import time from flask import Blueprint, render_template from flask import request @@ -62,14 +64,12 @@ def get_task_speed(): data['cmd'] = row['cmd'] if row['type'] == 'download': - readLine = "" + readLine = '' for i in range(3): try: readLine = mw.readFile(task_logfile) - if len(readLine) > 10: - data['msg'] = json.loads(readLine) - data['isDownload'] = True - break + data['msg'] = json.loads(readLine) + data['isDownload'] = True except Exception as e: if i == 2: thisdb.setTaskStatus(row['id'],0) diff --git a/web/core/mw.py b/web/core/mw.py index bcf565d6b..d9bccef99 100644 --- a/web/core/mw.py +++ b/web/core/mw.py @@ -1273,9 +1273,12 @@ def fileNameCheck(filename): return False return True +def getTriggerTaskLockFile(): + return getPanelDir() + '/logs/panel_task.lock' + def triggerTask(): - isTask = getPanelDir() + '/logs/panel_task.lock' - writeFile(isTask, 'True') + lock_file = getTriggerTaskLockFile() + writeFile(lock_file, 'True') def restartTask(): initd = getPanelDir() + '/scripts/init.d/mw' diff --git a/web/static/app/public.js b/web/static/app/public.js index 6188975cf..d0df5768d 100755 --- a/web/static/app/public.js +++ b/web/static/app/public.js @@ -1493,7 +1493,7 @@ function getReloads() {
\ " + h.task[g].name + "" + (toSize(h.msg.used) + "/" + toSize(h.msg.total)) + "\ " + h.msg.pre + "%\ - "+lan.bt.task_downloading+" | "+lan.public.close+"\ + 下载中 | "+lan.public.close+"\ " } } else { diff --git a/web/thisdb/tasks.py b/web/thisdb/tasks.py index 44c4c1722..317e5e065 100644 --- a/web/thisdb/tasks.py +++ b/web/thisdb/tasks.py @@ -22,6 +22,34 @@ def getTaskCount( def getTaskUnexecutedCount() -> int: return mw.M('tasks').where('status!=?',(1,)).count() +def addTaskByDownload( + name: str | None = '下载文件', + cmd: str | None = None, + type: str | None = 'download', + status: int | None = 0, +): + ''' + 添加后台任务 + :name -> str 类型 + :cmd -> str 日志内容 (必填) + :type -> str 用户ID + ''' + if cmd is None: + return False + + add_time = mw.formatDate() + insert_data = { + 'name':name, + 'type':type, + 'cmd':cmd, + 'start':0, + 'end':0, + 'status':status, + 'add_time':add_time, + } + mw.M('tasks').insert(insert_data) + return True + def addTask( name: str | None = '常用任务', cmd: str | None = None, @@ -77,7 +105,7 @@ def getTaskPage( return rdata def getTaskFirstByRun() -> None: - data = mw.M('tasks').where('status=?', (-1,)).field(__FIELD).order('id asc').find() + data = mw.M('tasks').where('status=? or status=0', (-1,)).field(__FIELD).order('id asc').find() if data is None: return None return data