pull/628/head
Mr Chen 11 months ago
parent a015c32e42
commit eb3f78ef4a
  1. 8
      plugins/task_manager/task_manager_index.py
  2. 12
      web/admin/__init__.py
  3. 37
      web/admin/common.py
  4. 2
      web/admin/crontab/__init__.py
  5. 37
      web/admin/dashboard/__init__.py
  6. 13
      web/admin/files/__init__.py
  7. 3
      web/admin/firewall/__init__.py
  8. 2
      web/admin/model/__init__.py
  9. 42
      web/admin/model/user.py
  10. 5
      web/admin/monitor/__init__.py
  11. 9
      web/admin/setting/__init__.py
  12. 4
      web/admin/setup/option.py
  13. 7
      web/admin/site/__init__.py
  14. 2
      web/admin/soft/__init__.py
  15. 14
      web/admin/system/__init__.py
  16. 5
      web/admin/task/__init__.py
  17. 10
      web/admin/user_login_check.py
  18. 16
      web/core/mw.py
  19. BIN
      web/static/fonts/2.ttf
  20. 22
      web/templates/default/layout.html
  21. 4
      web/utils/__init__.py
  22. 2
      web/utils/vilidate.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():

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

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

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

@ -8,14 +8,24 @@
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
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)
print(username, password, code)
print(cache,session)
return mw.returnData(False, '面板已经关闭!')
return mw.returnData(1, '登录成功,正在跳转...')

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

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

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

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

@ -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',)
return render_template('monitor.html')

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

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

@ -12,10 +12,11 @@
from flask import Blueprint, render_template
from flask import request
from utils.mwplugin import MwPlugin
from admin.model import Sites
from admin.user_login_check import panel_login_required
from utils.mwplugin import MwPlugin
import core.mw as mw
from admin.model import Sites
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 []

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

@ -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', '')

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

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

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

Binary file not shown.

@ -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: '<div style="padding: 10px; line-height: 22px; font-weight: 300;">\
type: 1,
title: "【AD】求恰饭",
closeBtn: 1,
area: '300px;',
shade: 0.8,
id: 'panel_ad_list_mode',
btnAlign: 'c',
moveType: 1,
content: '<div style="padding: 10px; line-height: 22px; font-weight: 300;">\
<table class="table table-hover">\
<thead><tr><td style="text-align: center;">商家</td><td style="text-align: center;">优惠码</td><tr></thead>\
<tbody>\
<tr><td><a target="_blank" href="https://digitalvirt.com/aff.php?aff=154"><img src="https://digitalvirt.com/templates/BlueWhite/img/logo-dark.svg"/></a></td><td>mdserver-web</td></tr>\
</tbody>\
</table>\
</div>'
,success: function(layero){
</div>',
success: function(layero){
}
});
}

@ -10,4 +10,6 @@
import os
IS_WIN = (os.name == 'nt')
IS_WIN = (os.name == 'nt')

@ -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):
'''获取验证码图片

Loading…
Cancel
Save