This commit is contained in:
Mr Chen 2024-10-29 18:47:46 +08:00
parent 2337ea901b
commit e7bf5ef8b9
11 changed files with 272 additions and 79 deletions

View File

@ -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():
def runPanelTask():
try:
bash_list = model.getTaskList(status=-1)
for task in bash_list:
model.setTaskStatus(task['id'], 0)
# 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))
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()

View File

@ -8,12 +8,16 @@
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
from .initdb import *
from .logs import addLog
from .option import getOption,getOptionByJson,setOption
from .option import setOption
from .sites import getSitesCount
from .task import getTaskCount
from .task import addTask
from .task import getTaskCount,getTaskUnexecutedCount,getTaskList,getTaskFirstByRun
from .task import setTaskStatus,setTaskData

View File

@ -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="状态")

View File

@ -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()

View File

@ -8,4 +8,6 @@
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
from .user import *
from .user import init_admin_user
from .option import init_option

38
web/admin/setup/option.py Normal file
View File

@ -0,0 +1,38 @@
# coding:utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
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

View File

@ -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

View File

@ -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"
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)

View File

@ -87,6 +87,9 @@ def getMWLogs():
def getPanelTmp():
return getPanelDir() + '/tmp'
def getPanelTaskLog():
return getMWLogs() + '/panel_task.log'
def getServerDir():
return getFatherDir() + '/server'

View File

@ -1400,7 +1400,7 @@ function remind(a){
<span class="rs-time">'+cos_text+'</span>\
</div>\
</td>\
<td class="text-right c3">'+g.data[d].addtime+'</td>\
<td class="text-right c3">'+g.data[d].add_time+'</td>\
</tr>';
}
var con = '<div class="divtable"><table class="table table-hover">\
@ -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 = "";

View File

@ -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
)
title = '{0}[{1}-{2}]'.format(msg_head,name,version)
model.addTask(name=title,cmd=exec_bash, status=0)
if mw.isDebugMode():
print(exec_bash)
title = '{0}[{1}-{2}]'.format(msg_head,name,version)
return mw.returnData(True, '已将安装任务添加到队列!')
# 卸载插件