diff --git a/plugins/task_manager/task_manager_index.py b/plugins/task_manager/task_manager_index.py index a864e3c4a..9790b19b9 100755 --- a/plugins/task_manager/task_manager_index.py +++ b/plugins/task_manager/task_manager_index.py @@ -11,8 +11,12 @@ import json from typing import List, Dict -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 if mw.isAppleSystem(): diff --git a/web/admin/__init__.py b/web/admin/__init__.py index b1c51c334..12786430f 100644 --- a/web/admin/__init__.py +++ b/web/admin/__init__.py @@ -20,13 +20,17 @@ from flask_socketio import SocketIO, emit, send from flask import Flask, abort, request, current_app, session, url_for from flask import Blueprint, render_template from flask import render_template_string -from flask_migrate import Migrate +from flask_migrate import Migrate +from flask_caching import Cache from werkzeug.local import LocalProxy -from admin.model import db as sys_db +from admin import model from admin import setup +from admin.model import db as sys_db + + import core.mw as mw import config import utils.config as utils_config @@ -59,6 +63,9 @@ app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=31) app.config['SQLALCHEMY_DATABASE_URI'] = mw.getSqitePrefix()+config.SQLITE_PATH # 使用 SQLite 数据库 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True +# 缓存配置 +cache = Cache(config={'CACHE_TYPE': 'simple'}) +cache.init_app(app, config={'CACHE_TYPE': 'simple'}) # 初始化db sys_db.init_app(app) @@ -91,6 +98,7 @@ for module in get_submodules(): if app.blueprints.get(module.name) is None: app.register_blueprint(module) + @app.before_request def requestCheck(): # print("hh") diff --git a/web/admin/common.py b/web/admin/common.py new file mode 100644 index 000000000..c1692c081 --- /dev/null +++ b/web/admin/common.py @@ -0,0 +1,37 @@ +# coding:utf-8 + +# --------------------------------------------------------------------------------- +# MW-Linux面板 +# --------------------------------------------------------------------------------- +# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved. +# --------------------------------------------------------------------------------- +# Author: midoks +# --------------------------------------------------------------------------------- + +import time + +from admin import model +from admin import session + +def isLogined(): + if 'login' in session and session['login'] == True and 'username' in session: + username = session['username'] + info = model.getUserByName(username) + if info is None: + return False + + # print(userInfo) + if info['name'] != session['username']: + return False + + now_time = int(time.time()) + + if 'overdue' in session and now_time > session['overdue']: + # 自动续期 + session['overdue'] = int(time.time()) + 7 * 24 * 60 * 60 + return False + + if 'tmp_login_expire' in session and now_time > int(session['tmp_login_expire']): + session.clear() + return False + return True \ No newline at end of file diff --git a/web/admin/crontab/__init__.py b/web/admin/crontab/__init__.py index 203b78685..6162e7272 100644 --- a/web/admin/crontab/__init__.py +++ b/web/admin/crontab/__init__.py @@ -12,6 +12,7 @@ from flask import Blueprint, render_template from flask import request +from admin.user_login_check import panel_login_required from admin.model import Crontab blueprint = Blueprint('crontab', __name__, url_prefix='/crontab', template_folder='../../templates/default') @@ -21,6 +22,7 @@ def index(): # 插件列表 @blueprint.route('/list', endpoint='list', methods=['GET','POST']) +@panel_login_required def list(): page = request.args.get('p', 1) size = 10 diff --git a/web/admin/dashboard/__init__.py b/web/admin/dashboard/__init__.py index 426c65905..0d9ece5bb 100644 --- a/web/admin/dashboard/__init__.py +++ b/web/admin/dashboard/__init__.py @@ -8,14 +8,24 @@ # Author: midoks # --------------------------------------------------------------------------------- +import io +import time from flask import Blueprint, render_template +from flask import make_response +from flask import Response from flask import request,g +from admin.common import isLogined +from admin.user_login_check import panel_login_required +from admin import cache,session +from admin import model import core.mw as mw + blueprint = Blueprint('dashboard', __name__, url_prefix='/', template_folder='../../templates') @blueprint.route('/') +@panel_login_required def index(): return render_template('default/index.html') @@ -24,6 +34,19 @@ def index(): # 定义登录入口相关方法 # --------------------------------------------------------------------------------- +# 验证码 +@blueprint.route('/code') +def code(): + import utils.vilidate as vilidate + vie = vilidate.vieCode() + codeImage = vie.GetCodeImage(80, 4) + out = io.BytesIO() + codeImage[0].save(out, "png") + session['code'] = mw.md5(''.join(codeImage[1]).lower()) + + img = Response(out.getvalue(), headers={'Content-Type': 'image/png'}) + return make_response(img) + @blueprint.route('/login') def login(): return render_template('default/login.html') @@ -31,7 +54,9 @@ def login(): # 检查是否登录 @blueprint.route('/check_login',methods=['GET','POST']) def check_login(): - return "0" + if isLogined(): + return "true" + return "false" # 执行登录操作 @blueprint.route('/do_login', endpoint='do_login', methods=['POST']) @@ -41,7 +66,11 @@ def do_login(): password = request.form.get('password', '').strip() code = request.form.get('code', '').strip() - print(g) - print(username, password, code ) + if 'code' in session: + if session['code'] != mw.md5(code): + return mw.returnData(False, code_msg) - return mw.returnData(False, '面板已经关闭!') + print(username, password, code) + print(cache,session) + + return mw.returnData(1, '登录成功,正在跳转...') diff --git a/web/admin/files/__init__.py b/web/admin/files/__init__.py index 31ae28f9f..bd14375c8 100644 --- a/web/admin/files/__init__.py +++ b/web/admin/files/__init__.py @@ -15,23 +15,26 @@ from flask import request from admin import model - +from admin.user_login_check import panel_login_required import core.mw as mw import utils.file as file blueprint = Blueprint('files', __name__, url_prefix='/files', template_folder='../../templates/default') @blueprint.route('/index', endpoint='index') +@panel_login_required def index(): return render_template('files.html') # 获取文件内容 @blueprint.route('/get_body', endpoint='get_file_body', methods=['POST']) +@panel_login_required def get_file_body(): path = request.form.get('path', '') return file.getFileBody(path) # 获取文件内容 @blueprint.route('/save_body', endpoint='save_body', methods=['POST']) +@panel_login_required def save_body(): path = request.form.get('path', '') data = request.form.get('data', '') @@ -56,6 +59,7 @@ def save_body(): # 获取文件内容(最新行数) @blueprint.route('/get_last_body', endpoint='get_file_last_body', methods=['POST']) +@panel_login_required def get_file_last_body(): path = request.form.get('path', '') line = request.form.get('line', '100') @@ -72,6 +76,7 @@ def get_file_last_body(): # 获取文件列表 @blueprint.route('/get_dir', endpoint='get_dir', methods=['POST']) +@panel_login_required def get_dir(): path = request.form.get('path', '') if not os.path.exists(path): @@ -92,6 +97,7 @@ def get_dir(): # 获取站点日志目录 @blueprint.route('/get_dir_size', endpoint='get_dir_size', methods=['POST']) +@panel_login_required def get_dir_size(): path = request.form.get('path', '') size = file.getDirSize(path) @@ -100,6 +106,7 @@ def get_dir_size(): # 删除文件 @blueprint.route('/delete', endpoint='delete', methods=['POST']) +@panel_login_required def delete(): path = request.form.get('path', '') return file.fileDelete(path) @@ -107,6 +114,7 @@ def delete(): # 删除文件 @blueprint.route('/delete_dir', endpoint='delete_dir', methods=['POST']) +@panel_login_required def delete_dir(): path = request.form.get('path', '') return file.dirDelete(path) @@ -114,17 +122,20 @@ def delete_dir(): # 回收站文件 @blueprint.route('/get_recycle_bin', endpoint='get_recycle_bin', methods=['POST']) +@panel_login_required def get_recycle_bin(): return file.getRecycleBin() # 回收站文件恢复 @blueprint.route('/re_recycle_bin', endpoint='re_recycle_bin', methods=['POST']) +@panel_login_required def re_recycle_bin(): path = request.form.get('path', '') return file.reRecycleBin(path) # 回收站文件 @blueprint.route('/recycle_bin', endpoint='recycle_bin', methods=['POST']) +@panel_login_required def recycle_bin(): return file.toggleRecycleBin() diff --git a/web/admin/firewall/__init__.py b/web/admin/firewall/__init__.py index e3d694fd6..9ed6f057e 100644 --- a/web/admin/firewall/__init__.py +++ b/web/admin/firewall/__init__.py @@ -19,6 +19,7 @@ import core.mw as mw blueprint = Blueprint('firewall', __name__, url_prefix='/firewall', template_folder='../../templates/default') @blueprint.route('/index', endpoint='index') +@panel_login_required def index(): return render_template('firewall.html') @@ -51,12 +52,14 @@ def get_list(): # 获取站点日志目录 @blueprint.route('/get_www_path', endpoint='get_www_path', methods=['POST']) +@panel_login_required def get_www_path(): path = mw.getLogsDir() return {'path': path} # 获取站点日志目录 @blueprint.route('/get_ssh_info', endpoint='get_ssh_info', methods=['POST']) +@panel_login_required def get_ssh_info(): pass diff --git a/web/admin/model/__init__.py b/web/admin/model/__init__.py index 170532902..2537c467b 100644 --- a/web/admin/model/__init__.py +++ b/web/admin/model/__init__.py @@ -21,3 +21,5 @@ from .task import addTask from .task import getTaskCount,getTaskUnexecutedCount,getTaskList,getTaskFirstByRun from .task import setTaskStatus,setTaskData +from .user import getUserByName,isLoginCheck + diff --git a/web/admin/model/user.py b/web/admin/model/user.py new file mode 100644 index 000000000..74542f525 --- /dev/null +++ b/web/admin/model/user.py @@ -0,0 +1,42 @@ +# coding:utf-8 + +# --------------------------------------------------------------------------------- +# MW-Linux面板 +# --------------------------------------------------------------------------------- +# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved. +# --------------------------------------------------------------------------------- +# Author: midoks +# --------------------------------------------------------------------------------- + +from admin.model import db, Users + +import core.mw as mw + +def getUserByName(name, +) -> None: + ''' + 获取用户信息通过用户名 + ''' + item = Users.query.filter(Users.name==name).first() + if item is None: + return None + row = {} + row['id'] = item.id + row['name'] = item.name + row['password'] = item.password + row['login_ip'] = item.login_ip + row['login_time'] = item.login_time + row['phone'] = item.phone + row['email'] = item.email + row['add_time'] = item.add_time + row['update_time'] = item.update_time + return row + +def isLoginCheck(username, password) -> bool: + info = getUserByName(data['username']) + if info is None: + return False + + if info['password'] == mw.md5(password): + return True + return False diff --git a/web/admin/monitor/__init__.py b/web/admin/monitor/__init__.py index c8258caef..0a540268a 100644 --- a/web/admin/monitor/__init__.py +++ b/web/admin/monitor/__init__.py @@ -11,7 +11,10 @@ from flask import Blueprint, render_template +from admin.user_login_check import panel_login_required + blueprint = Blueprint('monitor', __name__, url_prefix='/monitor', template_folder='../../templates/default') @blueprint.route('/index', endpoint='index') +@panel_login_required def index(): - return render_template('monitor.html',) \ No newline at end of file + return render_template('monitor.html') \ No newline at end of file diff --git a/web/admin/setting/__init__.py b/web/admin/setting/__init__.py index 30f24ec68..a7fece270 100644 --- a/web/admin/setting/__init__.py +++ b/web/admin/setting/__init__.py @@ -14,23 +14,28 @@ from flask import Blueprint, render_template from flask import request from admin import model +from admin.user_login_check import panel_login_required + import core.mw as mw # 默认页面 blueprint = Blueprint('setting', __name__, url_prefix='/setting', template_folder='../../templates') @blueprint.route('/index', endpoint='index') +@panel_login_required def index(): return render_template('default/setting.html') @blueprint.route('/get_panel_list', endpoint='get_panel_list', methods=['POST']) +@panel_login_required def get_panel_list(): return [] # 设置面板名称 @blueprint.route('/set_webname', endpoint='set_webname', methods=['POST']) +@panel_login_required def set_webname(): webname = request.form.get('webname', '') src_webname = model.getOption('title') @@ -40,6 +45,7 @@ def set_webname(): # 设置服务器IP @blueprint.route('/set_ip', endpoint='set_ip', methods=['POST']) +@panel_login_required def set_ip(): host_ip = request.form.get('host_ip', '') src_host_ip = model.getOption('server_ip') @@ -49,6 +55,7 @@ def set_ip(): # 默认备份目录 @blueprint.route('/set_backup_dir', endpoint='set_backup_dir', methods=['POST']) +@panel_login_required def set_backup_dir(): backup_path = request.form.get('backup_path', '') src_backup_path = model.getOption('backup_path') @@ -58,6 +65,7 @@ def set_backup_dir(): # 默认站点目录 @blueprint.route('/set_www_dir', endpoint='set_www_dir', methods=['POST']) +@panel_login_required def set_www_dir(): sites_path = request.form.get('sites_path', '') src_sites_path = model.getOption('sites_path') @@ -68,6 +76,7 @@ def set_www_dir(): # 设置安全入口 @blueprint.route('/set_admin_path', endpoint='set_admin_path', methods=['POST']) +@panel_login_required def set_admin_path(): admin_path = request.form.get('admin_path', '') admin_path_sensitive = [ diff --git a/web/admin/setup/option.py b/web/admin/setup/option.py index c941b71d5..3bbb4c575 100644 --- a/web/admin/setup/option.py +++ b/web/admin/setup/option.py @@ -20,6 +20,10 @@ def init_option(): model.setOption('recycle_bin', 'open') model.setOption('template', 'default') + # 调式模式,默认关闭 + model.setOption('debug', 'close') + + # 开启后台任务 # model.setOption('run_bg_task', 'close') diff --git a/web/admin/site/__init__.py b/web/admin/site/__init__.py index 5abe21b76..12ad0468f 100644 --- a/web/admin/site/__init__.py +++ b/web/admin/site/__init__.py @@ -12,10 +12,11 @@ from flask import Blueprint, render_template from flask import request -from utils.mwplugin import MwPlugin - -import core.mw as mw from admin.model import Sites +from admin.user_login_check import panel_login_required + +from utils.mwplugin import MwPlugin +import core.mw as mw blueprint = Blueprint('site', __name__, url_prefix='/site', template_folder='../../templates/default') @blueprint.route('/index', endpoint='index') @@ -24,6 +25,7 @@ def index(): # 插件列表 @blueprint.route('/list', endpoint='list', methods=['GET','POST']) +@panel_login_required def list(): p = request.form.get('p', '1') limit = request.form.get('limit', '10') @@ -55,5 +57,6 @@ def list(): return data @blueprint.route('/get_site_types', endpoint='get_site_types',methods=['POST']) +@panel_login_required def get_site_types(): return [] \ No newline at end of file diff --git a/web/admin/soft/__init__.py b/web/admin/soft/__init__.py index def11c495..b0b73c465 100644 --- a/web/admin/soft/__init__.py +++ b/web/admin/soft/__init__.py @@ -11,6 +11,8 @@ from flask import Blueprint, render_template +from admin.user_login_check import panel_login_required + blueprint = Blueprint('soft', __name__, url_prefix='/soft', template_folder='../../templates/default') @blueprint.route('/index', endpoint='index') def index(): diff --git a/web/admin/system/__init__.py b/web/admin/system/__init__.py index 6b2239b81..0f5779504 100644 --- a/web/admin/system/__init__.py +++ b/web/admin/system/__init__.py @@ -12,14 +12,18 @@ from flask import Blueprint, render_template from flask import request +from admin.user_login_check import panel_login_required +import admin.model.option as option + import core.mw as mw import utils.system as sys -import admin.model.option as option + blueprint = Blueprint('system', __name__, url_prefix='/system', template_folder='../../templates') # 获取系统的统计信息 @blueprint.route('/system_total', endpoint='system_total') +@panel_login_required def system_total(): data = sys.getMemInfo() cpu = sys.getCpuInfo(interval=1) @@ -32,6 +36,7 @@ def system_total(): # 获取系统的网络流量信息 @blueprint.route('/network', endpoint='network') +@panel_login_required def network(): stat = {} stat['cpu'] = sys.getCpuInfo() @@ -43,12 +48,14 @@ def network(): # 获取系统的磁盘信息 @blueprint.route('/disk_info', endpoint='disk_info') +@panel_login_required def disk_info(): data = sys.getDiskInfo() return data # 获取系统的负载统计信息 @blueprint.route('/get_load_average', endpoint='get_load_average', methods=['GET']) +@panel_login_required def get_load_average(): start = request.args.get('start', '') end = request.args.get('end', '') @@ -62,6 +69,7 @@ def get_load_average(): # 获取系统的磁盘IO统计信息 @blueprint.route('/get_disk_io', endpoint='get_disk_io', methods=['GET']) +@panel_login_required def get_disk_io(): start = request.args.get('start', '') end = request.args.get('end', '') @@ -73,6 +81,7 @@ def get_disk_io(): # 获取系统的CPU/IO统计信息 @blueprint.route('/get_cpu_io', endpoint='get_cpu_io', methods=['GET']) +@panel_login_required def get_cpu_io(): start = request.args.get('start', '') end = request.args.get('end', '') @@ -87,6 +96,7 @@ def get_cpu_io(): # 获取系统网络IO统计信息 @blueprint.route('/get_network_io', endpoint='get_network_io', methods=['GET']) +@panel_login_required def get_network_io(): start = request.args.get('start', '') end = request.args.get('end', '') @@ -100,6 +110,7 @@ def get_network_io(): # 获取系统网络IO统计信息 @blueprint.route('/set_control', endpoint='set_control', methods=['POST']) +@panel_login_required def set_control(): stype = request.form.get('type', '') day = request.form.get('day', '') @@ -153,6 +164,7 @@ def set_control(): # 升级检测 @blueprint.route('/update_server', endpoint='update_server') +@panel_login_required def update_server(): panel_type = request.args.get('type', 'check') version = request.args.get('version', '') diff --git a/web/admin/task/__init__.py b/web/admin/task/__init__.py index 94063ed0b..2cb6ea08e 100644 --- a/web/admin/task/__init__.py +++ b/web/admin/task/__init__.py @@ -14,6 +14,7 @@ from flask import request from admin import model from admin.model import db,Tasks +from admin.user_login_check import panel_login_required import core.mw as mw @@ -21,11 +22,13 @@ blueprint = Blueprint('task', __name__, url_prefix='/task', template_folder='../ @blueprint.route('/count', endpoint='task_count') +@panel_login_required def task_count(): return str(model.getTaskUnexecutedCount()) @blueprint.route('/list', endpoint='list', methods=['POST']) +@panel_login_required def list(): p = request.form.get('p', '1') limit = request.form.get('limit', '10').strip() @@ -53,12 +56,14 @@ def list(): return data @blueprint.route('/get_exec_log', endpoint='get_exec_log', methods=['POST']) +@panel_login_required def get_exec_log(): file = mw.getPanelTaskLog() return mw.getLastLine(file, 100) @blueprint.route('/get_task_speed', endpoint='get_task_speed', methods=['POST']) +@panel_login_required def get_task_speed(): count = model.getTaskUnexecutedCount() if count == 0: diff --git a/web/admin/user_login_check.py b/web/admin/user_login_check.py index 85a730a1c..5cc84df46 100644 --- a/web/admin/user_login_check.py +++ b/web/admin/user_login_check.py @@ -10,10 +10,16 @@ from functools import wraps +from admin import model +from admin import session +from admin.common import isLogined + def panel_login_required(func): - + @wraps(func) def wrapper(*args, **kwargs): - # print('panel_login_required', args, kwargs) + if not isLogined(): + return {'status':False, 'msg':'未登录/登录过期'} + return func(*args, **kwargs) return wrapper \ No newline at end of file diff --git a/web/core/mw.py b/web/core/mw.py index ebd52bd5f..c657071b1 100644 --- a/web/core/mw.py +++ b/web/core/mw.py @@ -422,6 +422,22 @@ def getLastLine(path, num, p=1): return "\n".join(data) +# 获取系统温度 +def getSystemDeviceTemperature(): + import psutil + if not hasattr(psutil, "sensors_temperatures"): + return False, "platform not supported" + temps = psutil.sensors_temperatures() + if not temps: + return False, "can't read any temperature" + for name, entries in temps.items(): + for entry in entries: + return True, entry.label + # print("%-20s %s °C (high = %s °C, critical = %s °C)" % ( + # entry.label or name, entry.current, entry.high, + # entry.critical)) + return False, "" + def getPage(args, result='1,2,3,4,5,8'): data = getPageObject(args, result) return data[0] diff --git a/web/static/fonts/2.ttf b/web/static/fonts/2.ttf new file mode 100755 index 000000000..3a452b68f Binary files /dev/null and b/web/static/fonts/2.ttf differ diff --git a/web/templates/default/layout.html b/web/templates/default/layout.html index 98ac32a4c..bf99ad9ec 100755 --- a/web/templates/default/layout.html +++ b/web/templates/default/layout.html @@ -111,23 +111,23 @@ function showAd(){ layer.open({ - type: 1 - ,title: "【AD】求恰饭" - ,closeBtn: 1 - ,area: '300px;' - ,shade: 0.8 - ,id: 'panel_ad_list_mode' - ,btnAlign: 'c' - ,moveType: 1 - ,content: '
\ + type: 1, + title: "【AD】求恰饭", + closeBtn: 1, + area: '300px;', + shade: 0.8, + id: 'panel_ad_list_mode', + btnAlign: 'c', + moveType: 1, + content: '
\ \ \ \ \ \
商家优惠码
mdserver-web
\ -
' - ,success: function(layero){ +
', + success: function(layero){ } }); } diff --git a/web/utils/__init__.py b/web/utils/__init__.py index 5ab1bb9b0..dfba09b52 100644 --- a/web/utils/__init__.py +++ b/web/utils/__init__.py @@ -10,4 +10,6 @@ import os -IS_WIN = (os.name == 'nt') \ No newline at end of file +IS_WIN = (os.name == 'nt') + + diff --git a/web/utils/vilidate.py b/web/utils/vilidate.py index c275bfe76..a2d8ba363 100755 --- a/web/utils/vilidate.py +++ b/web/utils/vilidate.py @@ -30,7 +30,7 @@ class vieCode: __inCurve = True # 是否画干扰线 __inNoise = True # 是否画干扰点 __type = 2 # 验证码类型 1、纯字母 2、数字字母混合 - __fontPatn = 'class/fonts/2.ttf' # 字体 + __fontPatn = 'static/fonts/2.ttf' # 字体 def GetCodeImage(self, size=80, length=4): '''获取验证码图片