From 5394dd329a699986ce66f72f834b0505cc32e5e8 Mon Sep 17 00:00:00 2001 From: Mr Chen Date: Sun, 27 Oct 2024 19:29:09 +0800 Subject: [PATCH] update --- new_cli.sh | 108 +++++ panel_task.py | 637 +++++++++++++++++++++++++++++ plugins/webstats/webstats_index.py | 8 +- web/admin/config/__init__.py | 22 +- web/admin/files/__init__.py | 8 + web/admin/firewall/__init__.py | 19 +- web/admin/plugins/__init__.py | 16 + web/admin/setup/user.py | 23 +- web/core/mw.py | 28 +- web/templates/default/layout.html | 4 +- web/utils/config.py | 14 +- web/utils/firewall.py | 10 + web/utils/mwplugin.py | 15 +- 13 files changed, 876 insertions(+), 36 deletions(-) create mode 100755 new_cli.sh create mode 100755 panel_task.py create mode 100644 web/utils/firewall.py diff --git a/new_cli.sh b/new_cli.sh new file mode 100755 index 000000000..6016aa138 --- /dev/null +++ b/new_cli.sh @@ -0,0 +1,108 @@ +#!/bin/bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin +DIR=$(cd "$(dirname "$0")"; pwd) +MDIR=$(dirname "$DIR") + + +PATH=$PATH:$DIR/bin +if [ -f bin/activate ];then + source bin/activate + + if [ "$?" != "0" ];then + echo "load local python env fail!" + fi +fi + +export LC_ALL="en_US.UTF-8" + + +mw_start_task() +{ + isStart=$(ps aux |grep 'panel_task.py'|grep -v grep|awk '{print $2}') + if [ "$isStart" == '' ];then + echo -e "starting mw-tasks... \c" + cd $DIR && python3 panel_task.py >> ${DIR}/logs/panel_task.log 2>&1 & + sleep 0.3 + isStart=$(ps aux |grep 'panel_task.py'|grep -v grep|awk '{print $2}') + if [ "$isStart" == '' ];then + echo -e "\033[31mfailed\033[0m" + echo '------------------------------------------------------' + tail -n 20 $DIR/logs/panel_task.log + echo '------------------------------------------------------' + echo -e "\033[31mError: mw-tasks service startup failed.\033[0m" + return; + fi + echo -e "\033[32mdone\033[0m" + else + echo "starting mw-tasks... mw-tasks (pid $(echo $isStart)) already running" + fi +} + +mw_start(){ + cd web && gunicorn -c setting.py app:app + #安全启动 + mw_start_task +} + + +mw_start_debug(){ + if [ ! -f $DIR/logs/task.log ];then + echo '' > $DIR/logs/task.log + fi + + python3 task.py >> $DIR/logs/task.log 2>&1 & + port=7200 + if [ -f /www/server/mdserver-web/data/port.pl ];then + port=$(cat /www/server/mdserver-web/data/port.pl) + fi + # gunicorn -b :${port} -k gevent -w 1 app:app + gunicorn -b :${port} -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 app:app +} + +mw_start_debug2(){ + python3 task.py >> $DIR/logs/task.log 2>&1 & + gunicorn -b :7200 -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 app:app +} + +mw_start_debug3(){ + gunicorn -c setting.py app:app + python3 task.py +} + + +mw_stop() +{ + PLIST=`ps -ef|grep app:app |grep -v grep|awk '{print $2}'` + for i in $PLIST + do + kill -9 $i > /dev/null 2>&1 + done + + pids=`ps -ef|grep task.py | grep -v grep |awk '{print $2}'` + arr=($pids) + for p in ${arr[@]} + do + kill -9 $p > /dev/null 2>&1 + done +} + +case "$1" in + 'start') mw_start;; + 'stop') mw_stop;; + 'restart') + mw_stop + mw_start + ;; + 'debug') + mw_stop + mw_start_debug + ;; + 'debug2') + mw_stop + mw_start_debug2 + ;; + 'debug3') + mw_stop + mw_start_debug3 + ;; +esac \ No newline at end of file diff --git a/panel_task.py b/panel_task.py new file mode 100755 index 000000000..ca3b86915 --- /dev/null +++ b/panel_task.py @@ -0,0 +1,637 @@ +# 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 + +if sys.version_info[0] == 2: + reload(sys) + sys.setdefaultencoding('utf-8') + + +web_dir = os.getcwd() + "/web" +os.chdir(web_dir) +sys.path.append(web_dir) + +import core.mw as mw +import core.db as db + +print(mw.getPanelDir()) + +# print sys.path + +# cmd = 'ls /usr/local/lib/ | grep python | cut -d \\ -f 1 | awk \'END {print}\'' +# info = mw.execShell(cmd) +# p = "/usr/local/lib/" + info[0].strip() + "/site-packages" +# sys.path.append(p) + + +global pre, timeoutCount, logPath, isTask, oldEdate, isCheck +pre = 0 +timeoutCount = 0 +isCheck = 0 +oldEdate = None + +logPath = os.getcwd() + '/tmp/panelExec.log' +isTask = os.getcwd() + '/tmp/panelTask.pl' + +if not os.path.exists(os.getcwd() + "/tmp"): + os.system('mkdir -p ' + os.getcwd() + "/tmp") + +if not os.path.exists(logPath): + os.system("touch " + logPath) + +def execShell(cmdstring, cwd=None, timeout=None, shell=True): + try: + global logPath + import shlex + import datetime + import subprocess + + if timeout: + end_time = datetime.datetime.now() + datetime.timedelta(seconds=timeout) + + cmd = cmdstring + ' > ' + logPath + ' 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.getRunDir() + '/scripts/init.d/mw' + if os.path.exists(cmd): + execShell(cmd + ' ' + method) + 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.getRunDir() + '/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)) + + +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(logMsg): + # 写输出日志 + try: + global logPath + fp = open(logPath, 'w+') + fp.write(logMsg) + fp.close() + except: + pass + + +def runTask(): + 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)) + + # 站点过期检查 + siteEdate() + + +def startTask(): + # 任务队列 + try: + while True: + runTask() + time.sleep(2) + except Exception as e: + time.sleep(60) + startTask() + + +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 80: + panel_title = mw.getConfig('title') + ip = mw.getHostAddr() + now_time = mw.getDateFromNow() + msg = now_time + '|节点[' + panel_title + ':' + ip + \ + ']处于高负载[' + str(tmp['used']) + '],请排查原因!' + mw.notifyMessage(msg, '面板监控', 600) + + if not cpuInfo: + tmp['mem'] = sm.getMemUsed() + cpuInfo = tmp + + if cpuInfo['used'] < tmp['used']: + tmp['mem'] = sm.getMemUsed() + cpuInfo = tmp + + # 取当前网络Io + networkIo = sm.psutilNetIoCounters() + if not network_up: + network_up = networkIo[0] + network_down = networkIo[1] + tmp = {} + tmp['upTotal'] = networkIo[0] + tmp['downTotal'] = networkIo[1] + tmp['up'] = round(float((networkIo[0] - network_up) / 1024), 2) + tmp['down'] = round(float((networkIo[1] - network_down) / 1024), 2) + tmp['downPackets'] = networkIo[3] + tmp['upPackets'] = networkIo[2] + + network_up = networkIo[0] + network_down = networkIo[1] + + if not networkInfo: + networkInfo = tmp + if (tmp['up'] + tmp['down']) > (networkInfo['up'] + networkInfo['down']): + networkInfo = tmp + # 取磁盘Io + # if os.path.exists('/proc/diskstats'): + diskio_2 = psutil.disk_io_counters() + if not diskio_1: + diskio_1 = diskio_2 + tmp = {} + tmp['read_count'] = diskio_2.read_count - diskio_1.read_count + tmp['write_count'] = diskio_2.write_count - diskio_1.write_count + tmp['read_bytes'] = diskio_2.read_bytes - diskio_1.read_bytes + tmp['write_bytes'] = diskio_2.write_bytes - diskio_1.write_bytes + tmp['read_time'] = diskio_2.read_time - diskio_1.read_time + tmp['write_time'] = diskio_2.write_time - diskio_1.write_time + + if not diskInfo: + diskInfo = tmp + else: + diskInfo['read_count'] += tmp['read_count'] + diskInfo['write_count'] += tmp['write_count'] + diskInfo['read_bytes'] += tmp['read_bytes'] + diskInfo['write_bytes'] += tmp['write_bytes'] + diskInfo['read_time'] += tmp['read_time'] + diskInfo['write_time'] += tmp['write_time'] + diskio_1 = diskio_2 + + # print diskInfo + if count >= 12: + try: + addtime = int(time.time()) + deltime = addtime - (day * 86400) + + data = (cpuInfo['used'], cpuInfo['mem'], addtime) + sql.table('cpuio').add('pro,mem,addtime', data) + sql.table('cpuio').where("addtime 100: + lpro = 100 + sql.table('load_average').add('pro,one,five,fifteen,addtime', (lpro, load_average[ + 'one'], load_average['five'], load_average['fifteen'], addtime)) + + lpro = None + load_average = None + cpuInfo = None + networkInfo = None + diskInfo = None + count = 0 + reloadNum += 1 + if reloadNum > 1440: + reloadNum = 0 + mw.writeFile('logs/sys_interrupt.pl', + "reload num:" + str(reloadNum)) + restartMw() + except Exception as ex: + print(str(ex)) + mw.writeFile('logs/sys_interrupt.pl', str(ex)) + + del(tmp) + time.sleep(5) + count += 1 + except Exception as ex: + print(str(ex)) + mw.writeFile('logs/sys_interrupt.pl', str(ex)) + + restartMw() + + time.sleep(30) + systemTask() + + +# -------------------------------------- PHP监控 start --------------------------------------------- # +# 502错误检查线程 +def check502Task(): + try: + while True: + if os.path.exists(mw.getPanelDir() + '/data/502Task.pl'): + check502() + time.sleep(30) + except: + time.sleep(30) + check502Task() + + +def check502(): + try: + verlist = [ + '52', '53', '54', '55', '56', '70', + '71', '72', '73', '74', '80', '81', + '82', '83' + ] + for ver in verlist: + sdir = mw.getServerDir() + php_path = sdir + '/php/' + ver + '/sbin/php-fpm' + if not os.path.exists(php_path): + continue + if checkPHPVersion(ver): + continue + if startPHPVersion(ver): + print('检测到PHP-' + ver + '处理异常,已自动修复!') + mw.writeLog('PHP守护程序', '检测到PHP-' + ver + '处理异常,已自动修复!') + except Exception as e: + print(str(e)) + + +# 处理指定PHP版本 +def startPHPVersion(version): + sdir = mw.getServerDir() + try: + # system + phpService = mw.systemdCfgDir() + '/php' + version + '.service' + if os.path.exists(phpService): + mw.execShell("systemctl restart php" + version) + if checkPHPVersion(version): + return True + + # initd + fpm = sdir + '/php/init.d/php' + version + php_path = sdir + '/php/' + version + '/sbin/php-fpm' + if not os.path.exists(php_path): + if os.path.exists(fpm): + os.remove(fpm) + return False + + if not os.path.exists(fpm): + return False + + # 尝试重载服务 + os.system(fpm + ' reload') + if checkPHPVersion(version): + return True + + # 尝试重启服务 + cgi = '/tmp/php-cgi-' + version + '.sock' + pid = sdir + '/php/' + version + '/var/run/php-fpm.pid' + data = mw.execShell("ps -ef | grep php/" + version +" | grep -v grep|grep -v python |awk '{print $2}'") + if data[0] != '': + os.system("ps -ef | grep php/" + version + " | grep -v grep|grep -v python |awk '{print $2}' | xargs kill ") + time.sleep(0.5) + if not os.path.exists(cgi): + os.system('rm -f ' + cgi) + if not os.path.exists(pid): + os.system('rm -f ' + pid) + os.system(fpm + ' start') + if checkPHPVersion(version): + return True + + # 检查是否正确启动 + if os.path.exists(cgi): + return True + except Exception as e: + print(str(e)) + return True + + +def getFpmConfFile(version): + return mw.getServerDir() + '/php/' + version + '/etc/php-fpm.d/www.conf' + + +def getFpmAddress(version): + fpm_address = '/tmp/php-cgi-{}.sock'.format(version) + php_fpm_file = getFpmConfFile(version) + try: + content = readFile(php_fpm_file) + tmp = re.findall(r"listen\s*=\s*(.+)", content) + if not tmp: + return fpm_address + if tmp[0].find('sock') != -1: + return fpm_address + if tmp[0].find(':') != -1: + listen_tmp = tmp[0].split(':') + if bind: + fpm_address = (listen_tmp[0], int(listen_tmp[1])) + else: + fpm_address = ('127.0.0.1', int(listen_tmp[1])) + else: + fpm_address = ('127.0.0.1', int(tmp[0])) + return fpm_address + except: + return fpm_address + + +def checkPHPVersion(version): + # 检查指定PHP版本 + try: + sock = getFpmAddress(version) + data = mw.requestFcgiPHP(sock, '/phpfpm_status_' + version + '?json') + result = str(data, encoding='utf-8') + except Exception as e: + result = 'Bad Gateway' + + # print(version,result) + # 检查openresty + if result.find('Bad Gateway') != -1: + return False + if result.find('HTTP Error 404: Not Found') != -1: + return False + + # 检查Web服务是否启动 + if result.find('Connection refused') != -1: + return False + # global isTask + # if os.path.exists(isTask): + # isStatus = mw.readFile(isTask) + # if isStatus == 'True': + # return True + + # # systemd + # systemd = mw.systemdCfgDir() + '/openresty.service' + # if os.path.exists(systemd): + # execShell('systemctl reload openresty') + # return True + # # initd + # initd = '/etc/init.d/openresty' + # if os.path.exists(initd): + # os.system(initd + ' reload') + return True + +# --------------------------------------PHP监控 end--------------------------------------------- # + + +# --------------------------------------OpenResty Auto Restart Start --------------------------------------------- # +# 解决acme.sh续签后,未起效。 +def openrestyAutoRestart(): + try: + while True: + # 检查是否安装 + odir = mw.getServerDir() + '/openresty' + if not os.path.exists(odir): + time.sleep(86400) + continue + + openresty_cmd('reload') + time.sleep(86400) + except Exception as e: + print(str(e)) + time.sleep(86400) + +# --------------------------------------OpenResty Auto Restart End --------------------------------------------- # + +# ------------------------------------ OpenResty Restart At Once Start ------------------------------------------ # + + +def openrestyRestartAtOnce(): + restart_nginx_tip = 'data/restart_nginx.pl' + while True: + if os.path.exists(restart_nginx_tip): + os.remove(restart_nginx_tip) + openresty_cmd('reload') + time.sleep(1) +# ----------------------------------- OpenResty Restart At Once End ------------------------------------------ # + + +# --------------------------------------Panel Restart Start --------------------------------------------- # +def restartPanelService(): + restartTip = 'data/restart.pl' + while True: + if os.path.exists(restartTip): + os.remove(restartTip) + service_cmd('restart_panel') + time.sleep(1) +# --------------------------------------Panel Restart End --------------------------------------------- # + + +def setDaemon(t): + if sys.version_info.major == 3 and sys.version_info.minor >= 10: + t.daemon = True + else: + t.setDaemon(True) + return t + +if __name__ == "__main__": + + # 系统监控 + 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() + + startTask() diff --git a/plugins/webstats/webstats_index.py b/plugins/webstats/webstats_index.py index f6cc0734a..411c8297d 100644 --- a/plugins/webstats/webstats_index.py +++ b/plugins/webstats/webstats_index.py @@ -7,8 +7,12 @@ import time import json import re -sys.path.append(os.getcwd() + "/class/core") -import mw + +try: + sys.path.append(os.getcwd() + "/class/core") + import mw +except Exception as e: + import core.mw as mw app_debug = False diff --git a/web/admin/config/__init__.py b/web/admin/config/__init__.py index d169a4c41..5baa4844f 100644 --- a/web/admin/config/__init__.py +++ b/web/admin/config/__init__.py @@ -10,14 +10,30 @@ from flask import Blueprint, render_template +from flask import request -blueprint = Blueprint('config', __name__, url_prefix='/config', template_folder='../../templates/default') +from admin import model +import core.mw as mw + +# 默认页面 +blueprint = Blueprint('config', __name__, url_prefix='/config', template_folder='../../templates') @blueprint.route('/index', endpoint='index') def index(): - return render_template('config.html') + return render_template('default/config.html') @blueprint.route('/get_panel_list', endpoint='get_panel_list', methods=['POST']) def get_panel_list(): - return [] \ No newline at end of file + return [] + + +# 设置面板名称 +@blueprint.route('/set_webname', endpoint='set_webname', methods=['POST']) +def set_webname(): + webname = request.form.get('webname', '') + src_webname = model.getOption('title') + if webname != src_webname: + model.setOption('title', webname) + return mw.returnData(True, '面板别名保存成功!') + diff --git a/web/admin/files/__init__.py b/web/admin/files/__init__.py index e30cdd507..74e7c4fc6 100644 --- a/web/admin/files/__init__.py +++ b/web/admin/files/__init__.py @@ -116,6 +116,14 @@ def get_dir(): return dir_list +# 获取站点日志目录 +@blueprint.route('/get_dir_size', endpoint='get_dir_size', methods=['POST']) +def get_dir_size(): + path = request.form.get('path', '') + size = file.getDirSize(path) + return mw.returnData(True, mw.toSize(size)) + + diff --git a/web/admin/firewall/__init__.py b/web/admin/firewall/__init__.py index 207393fb4..e3d694fd6 100644 --- a/web/admin/firewall/__init__.py +++ b/web/admin/firewall/__init__.py @@ -47,4 +47,21 @@ def get_list(): data = {} data['data'] = rows data['page'] = mw.getPage({'count':count,'tojs':'getLogs','p':p}) - return data \ No newline at end of file + return data + +# 获取站点日志目录 +@blueprint.route('/get_www_path', endpoint='get_www_path', methods=['POST']) +def get_www_path(): + path = mw.getLogsDir() + return {'path': path} + +# 获取站点日志目录 +@blueprint.route('/get_ssh_info', endpoint='get_ssh_info', methods=['POST']) +def get_ssh_info(): + pass + + + + + + diff --git a/web/admin/plugins/__init__.py b/web/admin/plugins/__init__.py index e6071427c..4a857c5db 100644 --- a/web/admin/plugins/__init__.py +++ b/web/admin/plugins/__init__.py @@ -175,3 +175,19 @@ def run(): return r +# 插件统一回调入口API +@blueprint.route('/callback', endpoint='callback', methods=['GET','POST']) +@panel_login_required +def callback(): + name = request.form.get('name', '') + func = request.form.get('func', '') + args = request.form.get('args', '') + script = request.form.get('script', 'index') + + pg = MwPlugin.instance() + data = pg.callback(name, func, args=args, script=script) + if data[0]: + return mw.returnData(True, "OK", data[1]) + return mw.returnData(False, data[1]) + + diff --git a/web/admin/setup/user.py b/web/admin/setup/user.py index f31dc5ee3..b025a4e56 100644 --- a/web/admin/setup/user.py +++ b/web/admin/setup/user.py @@ -10,8 +10,9 @@ from flask import request +from admin import model from admin.model import db, Users -import admin.model.option as option + import core.mw as mw # 初始化用户信息 @@ -39,22 +40,20 @@ def init_admin_user(): return True def init_option(): - option.setOption('title', '后羿面板') - option.setOption('recycle_bin', 'open') - option.setOption('template', 'default') + model.setOption('title', '后羿面板') + model.setOption('recycle_bin', 'open') + model.setOption('template', 'default') # 首页展示初始化 - option.setOption('display_index', '[]') + model.setOption('display_index', '[]') # 监控默认配置 - option.setOption('monitor_status', 'open', type='monitor') - option.setOption('monitor_day', '30', type='monitor') - option.setOption('monitor_only_netio', 'open', type='monitor') + model.setOption('monitor_status', 'open', type='monitor') + model.setOption('monitor_day', '30', type='monitor') + model.setOption('monitor_only_netio', 'open', type='monitor') # 初始化安全路径 - option.setOption('admin_path', mw.getRandomString(8)) - option.setOption('server_ip', '127.0.0.1') - - + 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/core/mw.py b/web/core/mw.py index e7ea4b041..4968c9b24 100644 --- a/web/core/mw.py +++ b/web/core/mw.py @@ -92,7 +92,7 @@ def getServerDir(): return getFatherDir() + '/server' def getLogsDir(): - return getRunDir() + '/wwwlogs' + return getFatherDir() + '/wwwlogs' def getRandomString(length): # 取随机字符串 @@ -115,12 +115,31 @@ def getUniqueId(): unique_id = "{0}".format(str_time) return unique_id +def getDate(): + # 取格式时间 + import time + return time.strftime('%Y-%m-%d %X', time.localtime()) + + +def getDateFromNow(tf_format="%Y-%m-%d %H:%M:%S", time_zone="Asia/Shanghai"): + # 取格式时间 + import time + os.environ['TZ'] = time_zone + time.tzset() + return time.strftime(tf_format, time.localtime()) + + +def getDataFromInt(val): + time_format = '%Y-%m-%d %H:%M:%S' + time_str = time.localtime(val) + return time.strftime(time_format, time_str) + def toSize(size, middle='') -> str: """ 字节单位转换 """ units = ('b', 'KB', 'MB', 'GB', 'TB') - s = d[0] + s = units[0] for u in units: if size < 1024: return str(round(size, 2)) + middle + u @@ -492,10 +511,9 @@ def writeLog(stype, msg, args=()): def writeDbLog(stype, msg, args=(), uid=1): try: - import admin.model.logs as logs + from admin import model format_msg = getInfo(msg, args) - logs.add(stype, format_msg, uid) - # mdate = time.strftime('%Y-%m-%d %X', time.localtime()) + model.addLog(stype, format_msg, uid) return True except Exception as e: print("writeDbLog:"+str(e)) diff --git a/web/templates/default/layout.html b/web/templates/default/layout.html index 205d8f6ea..15e9e65b6 100755 --- a/web/templates/default/layout.html +++ b/web/templates/default/layout.html @@ -138,11 +138,13 @@ $('.panel_ad_list_mode').click(function(){ function getUrlPath(){ - var thisUrl = window.location.href; + var thisUrl = window.location.pathname; + console.log(thisUrl); var pathArr = thisUrl.split('/'); return pathArr[pathArr.length - 1]; } var thisPath = getUrlPath(); +// console.log(thisPath); if (thisPath.indexOf('?')>-1){ var tag = $.getUrlParam('tag'); if(tag != undefined){ diff --git a/web/utils/config.py b/web/utils/config.py index b605d62ba..06dbd3766 100644 --- a/web/utils/config.py +++ b/web/utils/config.py @@ -8,7 +8,7 @@ # Author: midoks # --------------------------------------------------------------------------------- -from admin.model import getOption,getSitesCount +from admin import model import core.mw as mw @@ -17,13 +17,13 @@ def getGlobalVar(): 获取全局变量 ''' data = {} - data['title'] = getOption('title', default='后羿面板') - data['ip'] = getOption('server_ip', default='127.0.0.1') + data['title'] = model.getOption('title', default='后羿面板') + data['ip'] = model.getOption('server_ip', default='127.0.0.1') - data['site_path'] = getOption('site_path', default=mw.getFatherDir()+'/wwwroot') - data['backup_path'] = getOption('backup_path', default=mw.getFatherDir()+'/backup') - data['admin_path'] = '/'+getOption('admin_path', default='') - data['site_count'] = getSitesCount() + data['site_path'] = model.getOption('site_path', default=mw.getFatherDir()+'/wwwroot') + data['backup_path'] = model.getOption('backup_path', default=mw.getFatherDir()+'/backup') + data['admin_path'] = '/'+model.getOption('admin_path', default='') + data['site_count'] = model.getSitesCount() data['port'] = mw.getHostPort() # 服务器时间 diff --git a/web/utils/firewall.py b/web/utils/firewall.py new file mode 100644 index 000000000..b69881868 --- /dev/null +++ b/web/utils/firewall.py @@ -0,0 +1,10 @@ +# coding:utf-8 + +# --------------------------------------------------------------------------------- +# MW-Linux面板 +# --------------------------------------------------------------------------------- +# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved. +# --------------------------------------------------------------------------------- +# Author: midoks +# --------------------------------------------------------------------------------- + diff --git a/web/utils/mwplugin.py b/web/utils/mwplugin.py index f3b19b26c..5401c80ac 100644 --- a/web/utils/mwplugin.py +++ b/web/utils/mwplugin.py @@ -9,6 +9,7 @@ # --------------------------------------------------------------------------------- import os +import sys import threading import json import threading @@ -533,15 +534,19 @@ class MwPlugin(object): sys.path.append(package) eval_str = "__import__('" + script + "')." + func + '(' + args + ')' - newRet = None + + if mw.isDebugMode(): + print('callback', eval_str) + + data = None try: - newRet = eval(eval_str) + data = eval(eval_str) except Exception as e: print(mw.getTracebackInfo()) + return (False, mw.getTracebackInfo()) - if mw.isDebugMode(): - print('callback', eval_str) - return (True, newRet) + + return (True, data)