diff --git a/panel_task.py b/panel_task.py index 2c9131fcb..62e4c003d 100755 --- a/panel_task.py +++ b/panel_task.py @@ -35,7 +35,7 @@ import core.mw as mw import core.db as db -print(mw.getPanelDir()) +# print(mw.getPanelDir()) # print sys.path @@ -51,12 +51,9 @@ timeoutCount = 0 isCheck = 0 oldEdate = None -g_log_file = mw.getMWLogs() + '/panel_task.log' +g_log_file = mw.getPanelTaskLog() isTask = mw.getMWLogs() + '/panelTask.pl' -if not os.path.exists(os.getcwd() + "/tmp"): - os.system('mkdir -p ' + os.getcwd() + "/tmp") - if not os.path.exists(g_log_file): os.system("touch " + g_log_file) @@ -180,60 +177,44 @@ def writeLogs(data): pass -def runTask(): - - - # mw.writeLog("后台任务", "运行") - - print(model.getTaskCount()) - # global isTask - # try: - - # if os.path.exists(isTask): - # sql = db.Sql() - # sql.table('tasks').where( - # "status=?", ('-1',)).setField('status', '0') - # taskArr = sql.table('tasks').where("status=?", ('0',)).field( - # 'id,type,execstr').order("id asc").select() - # for value in taskArr: - # start = int(time.time()) - # if not sql.table('tasks').where("id=?", (value['id'],)).count(): - # continue - # sql.table('tasks').where("id=?", (value['id'],)).save('status,start', ('-1', start)) - # if value['type'] == 'download': - # argv = value['execstr'].split('|mw|') - # downloadFile(argv[0], argv[1]) - # elif value['type'] == 'execshell': - # execShell(value['execstr']) - # end = int(time.time()) - # sql.table('tasks').where("id=?", (value['id'],)).save( - # 'status,end', ('1', end)) - - # if(sql.table('tasks').where("status=?", ('0')).count() < 1): - # os.system('rm -f ' + isTask) - - # sql.close() - # except Exception as e: - # print(str(e)) +def runPanelTask(): + try: + bash_list = model.getTaskList(status=-1) + for task in bash_list: + model.setTaskStatus(task['id'], 0) + + run_list = model.getTaskList(status=0) + for run_task in run_list: + start = int(time.time()) + model.setTaskData(run_task['id'], start=start) + model.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()) + model.setTaskData(run_task['id'], end=end) + model.setTaskStatus(run_task['id'], 1) + except Exception as e: + print(str(e)) # 站点过期检查 # siteEdate() - +# 任务队列 def startPanelTask(): - # 任务队列 try: while True: - runTask() + runPanelTask() time.sleep(1) except Exception as e: print(str(e)) time.sleep(10) startPanelTask() - +# 网站到期处理 def siteEdate(): - # 网站到期处理 global oldEdate try: if not oldEdate: @@ -430,7 +411,7 @@ def check502(): verlist = [ '52', '53', '54', '55', '56', '70', '71', '72', '73', '74', '80', '81', - '82', '83' + '82', '83', '84' ] for ver in verlist: sdir = mw.getServerDir() diff --git a/web/admin/model/__init__.py b/web/admin/model/__init__.py index ebd9c90c4..170532902 100644 --- a/web/admin/model/__init__.py +++ b/web/admin/model/__init__.py @@ -8,12 +8,16 @@ # Author: midoks # --------------------------------------------------------------------------------- - from .initdb import * + from .logs import addLog + from .option import getOption,getOptionByJson,setOption -from .sites import getSitesCount -from .task import getTaskCount +from .option import setOption +from .sites import getSitesCount +from .task import addTask +from .task import getTaskCount,getTaskUnexecutedCount,getTaskList,getTaskFirstByRun +from .task import setTaskStatus,setTaskData diff --git a/web/admin/model/initdb.py b/web/admin/model/initdb.py index 3555ed667..2c03d7c0d 100644 --- a/web/admin/model/initdb.py +++ b/web/admin/model/initdb.py @@ -156,8 +156,8 @@ class Tasks(db.Model): __tablename__ = 'tasks' id = db.Column(db.Integer(), primary_key=True,autoincrement=True, comment="ID") name = db.Column(db.TEXT, unique=False, nullable=False, comment="任务名称") - type = db.Column(db.TEXT, unique=False, nullable=False, comment="域名") - execstr = db.Column(db.TEXT, unique=False, nullable=False, comment="执行命令") + type = db.Column(db.TEXT, unique=False, nullable=False, comment="类型") + cmd = db.Column(db.TEXT, unique=False, nullable=False, comment="执行命令") start = db.Column(db.Integer(), unique=False, nullable=True, comment="开始执行时间") end = db.Column(db.Integer(), unique=False, nullable=True, comment="结束执行时间") status = db.Column(db.Integer(), unique=False, nullable=True, default=1, comment="状态") diff --git a/web/admin/model/task.py b/web/admin/model/task.py index 933367f81..7195b914c 100644 --- a/web/admin/model/task.py +++ b/web/admin/model/task.py @@ -10,10 +10,105 @@ from admin.model import db, Tasks - +import core.mw as mw def getTaskCount( - status: str | None = None - ) -> int: + status: int | None = -1 + ) -> int: + return Tasks.query.filter(Tasks.status==status).count() + +# 未执行任务总数 +def getTaskUnexecutedCount() -> int: + return Tasks.query.filter(Tasks.status!=1).count() + + +def addTask( + name: str | None = '常用任务', + cmd: str | None = None, + type: str | None = 'execshell', + status: int | None = 0, +): + ''' + 添加后台任务 + :name -> str 类型 + :cmd -> str 日志内容 (必填) + :type -> str 用户ID + ''' + if cmd is None: + return False + + add_time = mw.formatDate() + add_data = Tasks( + name=name, + cmd=cmd, + type=type, + start=0, + end=0, + status=status, + add_time=add_time) + db.session.add(add_data) + db.session.commit() + return True + +def getTaskFirstByRun() -> None: + item = Tasks.query.filter(Tasks.status==-1).order_by(Tasks.id.asc()).first() + + if item is None: + return None + row = {} + row['id'] = item.id + row['name'] = item.name + row['type'] = item.type + row['cmd'] = item.cmd + row['start'] = item.start + row['end'] = item.end + row['status'] = item.status + row['add_time'] = item.add_time + return row + +def getTaskList( + status: int | None = 1, + page: int | None = 1, + size: int | None = 10, +): + pagination = Tasks.query.filter(Tasks.status==status).order_by(Tasks.id.asc()).paginate(page=int(page), per_page=int(size)) + + rows = [] + for item in pagination.items: + t = {} + t['id'] = item.id + t['name'] = item.name + t['type'] = item.type + t['cmd'] = item.cmd + t['start'] = item.start + t['end'] = item.end + t['status'] = item.status + t['add_time'] = item.add_time + rows.append(t) + return rows + + + + +def setTaskStatus(id, + status: int | None = 0 +): + Tasks.query.filter(Tasks.id==id).update({'status':status}) + db.session.commit() + return True + +def setTaskData(id, + start: int | None = None, + end: int | None = None, +): + update_data = {} + + if start is not None: + update_data['start'] = start + if end is not None: + update_data['end'] = end + + Tasks.query.filter(Tasks.id==id).update(update_data) + db.session.commit() + return True - return Tasks.query.filter_by().count() \ No newline at end of file diff --git a/web/admin/setup/__init__.py b/web/admin/setup/__init__.py index f5e9e23db..234f2f7de 100644 --- a/web/admin/setup/__init__.py +++ b/web/admin/setup/__init__.py @@ -8,4 +8,6 @@ # Author: midoks # --------------------------------------------------------------------------------- -from .user import * \ No newline at end of file +from .user import init_admin_user +from .option import init_option + diff --git a/web/admin/setup/option.py b/web/admin/setup/option.py new file mode 100644 index 000000000..959e7e29e --- /dev/null +++ b/web/admin/setup/option.py @@ -0,0 +1,38 @@ +# coding:utf-8 + +# --------------------------------------------------------------------------------- +# MW-Linux面板 +# --------------------------------------------------------------------------------- +# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved. +# --------------------------------------------------------------------------------- +# Author: midoks +# --------------------------------------------------------------------------------- + +from flask import request + +from admin import model +from admin.model import db, Users + +import core.mw as mw + +def init_option(): + model.setOption('title', '后羿面板') + model.setOption('recycle_bin', 'open') + model.setOption('template', 'default') + + # 开启后台任务 + # model.setOption('run_bg_task', 'close') + + # 首页展示初始化 + model.setOption('display_index', '[]') + + # 监控默认配置 + model.setOption('monitor_status', 'open', type='monitor') + model.setOption('monitor_day', '30', type='monitor') + model.setOption('monitor_only_netio', 'open', type='monitor') + + # 初始化安全路径 + model.setOption('admin_path', mw.getRandomString(8)) + model.setOption('server_ip', '127.0.0.1') + + return True \ No newline at end of file diff --git a/web/admin/setup/user.py b/web/admin/setup/user.py index b025a4e56..f31f85a27 100644 --- a/web/admin/setup/user.py +++ b/web/admin/setup/user.py @@ -39,21 +39,3 @@ def init_admin_user(): db.session.close() return True -def init_option(): - model.setOption('title', '后羿面板') - model.setOption('recycle_bin', 'open') - model.setOption('template', 'default') - - # 首页展示初始化 - model.setOption('display_index', '[]') - - # 监控默认配置 - model.setOption('monitor_status', 'open', type='monitor') - model.setOption('monitor_day', '30', type='monitor') - model.setOption('monitor_only_netio', 'open', type='monitor') - - # 初始化安全路径 - model.setOption('admin_path', mw.getRandomString(8)) - model.setOption('server_ip', '127.0.0.1') - - return True \ No newline at end of file diff --git a/web/admin/task/__init__.py b/web/admin/task/__init__.py index 491dcaae2..415869a5e 100644 --- a/web/admin/task/__init__.py +++ b/web/admin/task/__init__.py @@ -10,10 +10,96 @@ from flask import Blueprint, render_template +from flask import request + +from admin import model +from admin.model import db,Tasks + +import core.mw as mw blueprint = Blueprint('task', __name__, url_prefix='/task', template_folder='../../templates/default') @blueprint.route('/count', endpoint='task_count') def task_count(): - return "0" \ No newline at end of file + return str(model.getTaskUnexecutedCount()) + + +@blueprint.route('/list', endpoint='list', methods=['POST']) +def list(): + p = request.form.get('p', '1') + limit = request.form.get('limit', '10').strip() + search = request.form.get('search', '').strip() + + count = Tasks.query.filter_by().count() + pagination = Tasks.query.filter_by().order_by(Tasks.id.desc()).paginate(page=int(p), per_page=int(limit)) + + rows = [] + for item in pagination.items: + t = {} + t['id'] = item.id + t['name'] = item.name + t['type'] = item.type + t['cmd'] = item.cmd + t['start'] = item.start + t['end'] = item.end + t['status'] = item.status + t['add_time'] = item.add_time + rows.append(t) + + data = {} + data['data'] = rows + data['page'] = mw.getPage({'count':count,'tojs':'remind','p':p}) + return data + +@blueprint.route('/get_exec_log', endpoint='get_exec_log', methods=['POST']) +def get_exec_log(): + file = mw.getPanelTaskLog() + return mw.getLastLine(file, 100) + + +@blueprint.route('/get_task_speed', endpoint='get_task_speed', methods=['POST']) +def get_task_speed(): + count = model.getTaskUnexecutedCount() + if count == 0: + return mw.returnData(False, '当前没有任务队列在执行-2!') + + row = model.getTaskFirstByRun() + if row is None: + return mw.returnData(False, '当前没有任务队列在执行-3!') + + task_logfile = mw.getPanelTaskLog() + + data = {} + data['name'] = row['name'] + data['cmd'] = row['cmd'] + + if row['type'] == 'download': + 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 + except Exception as e: + if i == 2: + mw.M('tasks').where("id=?", (row['id'],)).save( + 'status', ('0',)) + return mw.returnJson(False, '当前没有任务队列在执行-4:' + str(e)) + time.sleep(0.5) + else: + data['msg'] = mw.getLastLine(task_logfile, 10) + data['isDownload'] = False + + + data['task'] = model.getTaskList(status=-1) + return data + + # file = mw.getPanelTaskLog() + # return mw.getLastLine(file, 100) + + + + \ No newline at end of file diff --git a/web/core/mw.py b/web/core/mw.py index ca199b3aa..edef5be41 100644 --- a/web/core/mw.py +++ b/web/core/mw.py @@ -87,6 +87,9 @@ def getMWLogs(): def getPanelTmp(): return getPanelDir() + '/tmp' +def getPanelTaskLog(): + return getMWLogs() + '/panel_task.log' + def getServerDir(): return getFatherDir() + '/server' diff --git a/web/static/app/public.js b/web/static/app/public.js index c67358887..f839cb1d8 100755 --- a/web/static/app/public.js +++ b/web/static/app/public.js @@ -1400,7 +1400,7 @@ function remind(a){ '+cos_text+'\ \ \ - '+g.data[d].addtime+'\ + '+g.data[d].add_time+'\ '; } var con = '
\ @@ -1458,7 +1458,7 @@ function getReloads() { a++; $.post('/task/get_task_speed', '', function(h) { if(h.task == undefined) { - $(".cmdlist").html(lan.bt.task_not_list); + $(".cmdlist").html('当前没有任务!'); return; } var b = ""; diff --git a/web/utils/mwplugin.py b/web/utils/mwplugin.py index 5401c80ac..226b302be 100644 --- a/web/utils/mwplugin.py +++ b/web/utils/mwplugin.py @@ -15,6 +15,8 @@ import json import threading import multiprocessing +from admin import model + import core.mw as mw import admin.model.option as option @@ -191,11 +193,11 @@ class MwPlugin(object): version ) - if mw.isDebugMode(): - print(exec_bash) - title = '{0}[{1}-{2}]'.format(msg_head,name,version) + model.addTask(name=title,cmd=exec_bash, status=0) + if mw.isDebugMode(): + print(exec_bash) return mw.returnData(True, '已将安装任务添加到队列!') # 卸载插件