# coding: utf-8 # --------------------------------------------------------------------------------- # MW-Linux面板 # --------------------------------------------------------------------------------- # copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved. # --------------------------------------------------------------------------------- # Author: midoks # --------------------------------------------------------------------------------- # --------------------------------------------------------------------------------- # 计划任务 # --------------------------------------------------------------------------------- import sys import os import json import time import threading import psutil web_dir = os.getcwd() + "/web" os.chdir(web_dir) sys.path.append(web_dir) from admin import app from admin import model import core.mw as mw import core.db as db global pre, timeoutCount, logPath, isTask, oldEdate, isCheck pre = 0 timeoutCount = 0 isCheck = 0 oldEdate = None g_log_file = mw.getPanelTaskLog() isTask = mw.getMWLogs() + '/panelTask.pl' if not os.path.exists(g_log_file): os.system("touch " + g_log_file) def execShell(cmdstring, cwd=None, timeout=None, shell=True): try: global g_log_file import shlex import datetime import subprocess if timeout: end_time = datetime.datetime.now() + datetime.timedelta(seconds=timeout) cmd = cmdstring + ' > ' + g_log_file + ' 2>&1' sub = subprocess.Popen(cmd, cwd=cwd, stdin=subprocess.PIPE, shell=shell, bufsize=4096) while sub.poll() is None: time.sleep(0.1) data = sub.communicate() # python3 fix 返回byte数据 if isinstance(data[0], bytes): t1 = str(data[0], encoding='utf-8') if isinstance(data[1], bytes): t2 = str(data[1], encoding='utf-8') return (t1, t2) except Exception as e: return (None, None) def service_cmd(method): cmd = '/etc/init.d/mw' if os.path.exists(cmd): execShell(cmd + ' ' + method) return cmd = mw.getPanelDir() + '/scripts/init.d/mw' print(cmd) if os.path.exists(cmd): print(cmd + ' ' + method) data = execShell(cmd + ' ' + method) print(data) return def openresty_cmd(method = 'reload'): # 检查是否安装 odir = mw.getServerDir() + '/openresty' if not os.path.exists(odir): return False # systemd systemd = mw.systemdCfgDir()+'/openresty.service' if os.path.exists(systemd): execShell('systemctl ' + method + ' openresty') return True sys_initd = '/etc/init.d/openresty' if os.path.exists(sys_initd): os.system(sys_initd + ' ' + method) return True install_initd = mw.getServerDir()+'/openresty/init.d/openresty' if os.path.exists(install_initd): os.system(install_initd + ' ' + method) return True return False def mw_async(f): def wrapper(*args, **kwargs): thr = threading.Thread(target=f, args=args, kwargs=kwargs) thr.start() return wrapper @mw_async def restartMw(): time.sleep(1) cmd = mw.getPanelDir() + '/scripts/init.d/mw reload &' mw.execShell(cmd) def downloadFile(url, filename): # 下载文件 try: import urllib import socket socket.setdefaulttimeout(300) headers = ('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36') opener = urllib.request.build_opener() opener.addheaders = [headers] urllib.request.install_opener(opener) urllib.request.urlretrieve(url, filename=filename, reporthook=downloadHook) if not mw.isAppleSystem(): os.system('chown www.www ' + filename) writeLogs('done') 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} writeLogs(json.dumps(speed)) def writeLogs(data): # 写输出日志 try: fp = open(g_log_file, 'w+') fp.write(data) fp.close() except: pass 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: runPanelTask() time.sleep(1) except Exception as e: print(str(e)) time.sleep(10) startPanelTask() # 网站到期处理 def siteEdate(): global oldEdate try: if not oldEdate: oldEdate = mw.readFile('data/edate.pl') if not oldEdate: oldEdate = '0000-00-00' mEdate = time.strftime('%Y-%m-%d', time.localtime()) if oldEdate == mEdate: return False edateSites = mw.M('sites').where('edate>? AND edate= 10: t.daemon = True else: t.setDaemon(True) return t def run(): # # 系统监控 sysTask = threading.Thread(target=systemTask) sysTask = setDaemon(sysTask) sysTask.start() # # PHP 502错误检查线程 # php502 = threading.Thread(target=check502Task) # php502 = setDaemon(php502) # php502.start() # # OpenResty Restart At Once Start # oraos = threading.Thread(target=openrestyRestartAtOnce) # oraos = setDaemon(oraos) # oraos.start() # # OpenResty Auto Restart Start # oar = threading.Thread(target=openrestyAutoRestart) # oar = setDaemon(oar) # oar.start() # Panel Restart Start rps = threading.Thread(target=restartPanelService) rps = setDaemon(rps) rps.start() # 面板后台任务 startPanelTask() if __name__ == "__main__": with app.app_context(): run()