mirror of
https://github.com/midoks/mdserver-web.git
synced 2026-10-10 01:29:26 +08:00
update
This commit is contained in:
@@ -43,14 +43,15 @@ CREATE TABLE IF NOT EXISTS `firewall` (
|
||||
`port` TEXT,
|
||||
`protocol` TEXT DEFAULT 'tcp',
|
||||
`ps` TEXT,
|
||||
`add_time` TEXT
|
||||
`add_time` TEXT,
|
||||
`update_time` TEXT
|
||||
);
|
||||
|
||||
ALTER TABLE `firewall` ADD COLUMN `protocol` TEXT DEFAULT 'tcp';
|
||||
|
||||
INSERT INTO `firewall` (`id`, `port`, `protocol`, `ps`, `add_time`) VALUES
|
||||
(1, '80', 'tcp','网站默认端口', '0000-00-00 00:00:00'),
|
||||
(2, '443', 'tcp/udp', 'HTTPS', '0000-00-00 00:00:00');
|
||||
(1, '80', 'tcp','网站默认端口', '0000-00-00 00:00:00','0000-00-00 00:00:00'),
|
||||
(2, '443', 'tcp/udp', 'HTTPS', '0000-00-00 00:00:00','0000-00-00 00:00:00');
|
||||
|
||||
|
||||
|
||||
|
||||
+12
-14
@@ -100,13 +100,12 @@ setup.init_db_system()
|
||||
|
||||
|
||||
app.config['BASIC_AUTH_OPEN'] = False
|
||||
with app.app_context():
|
||||
try:
|
||||
basic_auth = model.getOptionByJson('basic_auth', default={'open':False})
|
||||
if basic_auth['open']:
|
||||
app.config['BASIC_AUTH_OPEN'] = True
|
||||
except Exception as e:
|
||||
pass
|
||||
try:
|
||||
basic_auth = model.getOptionByJson('basic_auth', default={'open':False})
|
||||
if basic_auth['open']:
|
||||
app.config['BASIC_AUTH_OPEN'] = True
|
||||
except Exception as e:
|
||||
pass
|
||||
|
||||
|
||||
|
||||
@@ -127,6 +126,7 @@ def sendAuthenticated():
|
||||
|
||||
@app.before_request
|
||||
def requestCheck():
|
||||
config.APP_START_TIME=time.time()
|
||||
# 自定义basic auth认证
|
||||
if app.config['BASIC_AUTH_OPEN']:
|
||||
basic_auth = model.getOptionByJson('basic_auth', default={'open':False})
|
||||
@@ -152,6 +152,8 @@ def requestCheck():
|
||||
def requestAfter(response):
|
||||
response.headers['soft'] = config.APP_NAME
|
||||
response.headers['mw-version'] = config.APP_VERSION
|
||||
if mw.isDebugMode():
|
||||
response.headers['mw-debug-cos'] = time.time() - config.APP_START_TIME
|
||||
return response
|
||||
|
||||
|
||||
@@ -163,20 +165,16 @@ def page_unauthorized(error):
|
||||
# 设置模板全局变量
|
||||
@app.context_processor
|
||||
def inject_global_variables():
|
||||
start_t = time.time()
|
||||
ver = config.APP_VERSION;
|
||||
app_ver = config.APP_VERSION
|
||||
if mw.isDebugMode():
|
||||
ver = ver + str(time.time())
|
||||
app_ver = app_ver + str(time.time())
|
||||
|
||||
data = utils_config.getGlobalVar()
|
||||
g_config = {
|
||||
'version': ver,
|
||||
'version': app_ver,
|
||||
'title' : 'MW面板',
|
||||
'ip' : '127.0.0.1'
|
||||
}
|
||||
|
||||
end_t = time.time()
|
||||
print("cos:"+str(end_t-start_t))
|
||||
return dict(config=g_config, data=data)
|
||||
|
||||
|
||||
|
||||
@@ -23,40 +23,82 @@ blueprint = Blueprint('crontab', __name__, url_prefix='/crontab', template_folde
|
||||
def index():
|
||||
return render_template('crontab.html')
|
||||
|
||||
# 插件列表
|
||||
@blueprint.route('/list', endpoint='list', methods=['GET','POST'])
|
||||
# 计划任务列表
|
||||
@blueprint.route('/list', endpoint='list', methods=['POST'])
|
||||
@panel_login_required
|
||||
def list():
|
||||
page = request.args.get('p', '1').strip()
|
||||
limit = request.args.get('limit', '10').strip()
|
||||
return MwCrontab.instance().getCrontabList(page=int(page),size=int(limit))
|
||||
|
||||
# 插件列表
|
||||
@blueprint.route('/logs', endpoint='logs', methods=['GET','POST'])
|
||||
def logs(self):
|
||||
sid = request.form.get('id', '')
|
||||
echo = mw.M('crontab').where("id=?", (sid,)).field('echo').find()
|
||||
logFile = mw.getServerDir() + '/cron/' + echo['echo'] + '.log'
|
||||
if not os.path.exists(logFile):
|
||||
return mw.returnData(False, '当前日志为空!')
|
||||
log = mw.getLastLine(logFile, 500)
|
||||
return mw.returnData(True, log)
|
||||
# 计划任务日志
|
||||
@blueprint.route('/logs', endpoint='logs', methods=['POST'])
|
||||
def logs():
|
||||
cron_id = request.form.get('id', '')
|
||||
return MwCrontab.instance().cronLog(cron_id)
|
||||
|
||||
# 获取计划任务
|
||||
@blueprint.route('/del', endpoint='del', methods=['GET','POST'])
|
||||
# 删除计划任务
|
||||
@blueprint.route('/del', endpoint='del', methods=['POST'])
|
||||
def crontab_del():
|
||||
task_id = request.form.get('id', '')
|
||||
return MwCrontab.instance().delete(task_id)
|
||||
cron_id = request.form.get('id', '')
|
||||
return MwCrontab.instance().delete(cron_id)
|
||||
|
||||
# 删除计划任务日志
|
||||
@blueprint.route('/del_logs', endpoint='del_logs', methods=['POST'])
|
||||
def del_logs():
|
||||
cron_id = request.form.get('id', '')
|
||||
return MwCrontab.instance().delLogs(cron_id)
|
||||
|
||||
|
||||
# 设置计划任务状态
|
||||
@blueprint.route('/set_cron_status', endpoint='set_cron_status', methods=['POST'])
|
||||
def set_cron_status():
|
||||
cron_id = request.form.get('id', '')
|
||||
return MwCrontab.instance().setCronStatus(cron_id)
|
||||
|
||||
# 设置计划任务状态
|
||||
@blueprint.route('/get_data_list', endpoint='get_data_list', methods=['POST'])
|
||||
def get_data_list():
|
||||
stype = request.form.get('type', '')
|
||||
return MwCrontab.instance().getDataList(stype)
|
||||
|
||||
|
||||
# 获取计划任务
|
||||
@blueprint.route('/get_crond_find', endpoint='get_crond_find', methods=['GET','POST'])
|
||||
@blueprint.route('/get_crond_find', endpoint='get_crond_find', methods=['POST'])
|
||||
def get_crond_find():
|
||||
sid = request.form.get('id', '')
|
||||
data = MwCrontab.instance().getCrondFind(sid)
|
||||
cron_id = request.form.get('id', '')
|
||||
data = MwCrontab.instance().getCrondFind(cron_id)
|
||||
return data
|
||||
|
||||
# 修改计划任务
|
||||
@blueprint.route('/modify_crond', endpoint='modify_crond', methods=['POST'])
|
||||
def modify_crond():
|
||||
request_data = {}
|
||||
|
||||
request_data['name'] = request.form.get('name', '')
|
||||
request_data['type'] = request.form.get('type', '')
|
||||
request_data['week'] = request.form.get('week', '')
|
||||
request_data['where1'] = request.form.get('where1', '')
|
||||
request_data['hour'] = request.form.get('hour', '')
|
||||
request_data['minute'] = request.form.get('minute', '')
|
||||
request_data['save'] = request.form.get('save', '')
|
||||
request_data['backup_to'] = request.form.get('backupTo', '')
|
||||
request_data['stype'] = request.form.get('stype', '')
|
||||
request_data['sname'] = request.form.get('sname', '')
|
||||
request_data['sbody'] = request.form.get('sbody', '')
|
||||
request_data['url_address'] = request.form.get('urladdress', '')
|
||||
cron_id = request.form.get('id', '')
|
||||
data = MwCrontab.instance().modifyCrond(cron_id,request_data)
|
||||
return data
|
||||
|
||||
# 执行计划任务
|
||||
@blueprint.route('/start_task', endpoint='start_task', methods=['POST'])
|
||||
def start_task():
|
||||
cron_id = request.form.get('id', '')
|
||||
return MwCrontab.instance().startTask(cron_id)
|
||||
|
||||
# 添加计划任务
|
||||
@blueprint.route('/add', endpoint='add', methods=['GET','POST'])
|
||||
@blueprint.route('/add', endpoint='add', methods=['POST'])
|
||||
@panel_login_required
|
||||
def add():
|
||||
request_data = {}
|
||||
|
||||
@@ -33,25 +33,7 @@ def index():
|
||||
def get_list():
|
||||
p = request.form.get('p', '1').strip()
|
||||
limit = request.form.get('limit', '10').strip()
|
||||
|
||||
count = Firewall.query.filter_by().count()
|
||||
pagination = Firewall.query.filter_by().paginate(page=int(p), per_page=int(limit))
|
||||
|
||||
rows = []
|
||||
for item in pagination.items:
|
||||
t = {}
|
||||
t['id'] = item.id
|
||||
t['port'] = item.port
|
||||
t['protocol'] = item.protocol
|
||||
t['ps'] = item.ps
|
||||
t['add_time'] = item.add_time
|
||||
t['update_time'] = item.update_time
|
||||
rows.append(t)
|
||||
|
||||
data = {}
|
||||
data['data'] = rows
|
||||
data['page'] = mw.getPage({'count':count,'tojs':'getLogs','p':p,'row':limit})
|
||||
return data
|
||||
return MwFirewall.instance().getList(p,limit)
|
||||
|
||||
# 获取站点日志目录
|
||||
@blueprint.route('/get_www_path', endpoint='get_www_path', methods=['POST'])
|
||||
@@ -64,8 +46,7 @@ def get_www_path():
|
||||
@blueprint.route('/get_ssh_info', endpoint='get_ssh_info', methods=['POST'])
|
||||
@panel_login_required
|
||||
def get_ssh_info():
|
||||
mf = MwFirewall.instance()
|
||||
return mf.getSshInfo()
|
||||
return MwFirewall.instance().getSshInfo()
|
||||
|
||||
|
||||
# 切换ping开关
|
||||
@@ -88,8 +69,7 @@ def add_accept_port():
|
||||
protocol = request.form.get('protocol', '').strip()
|
||||
stype = request.form.get('type', '').strip()
|
||||
|
||||
data = mf.addAcceptPort(port, ps, stype, protocol=protocol)
|
||||
return mw.getJson(data)
|
||||
return mf.addAcceptPort(port, ps, stype, protocol=protocol)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -60,3 +60,6 @@ SQLITE_PATH = os.path.join(DATA_DIR, APP_SQLITE_NAME + '.db')
|
||||
DEFAULT_SERVER = '127.0.0.1'
|
||||
DEFAULT_SERVER_PORT = 7201
|
||||
|
||||
# APP启动时间
|
||||
APP_START_TIME=0
|
||||
|
||||
|
||||
@@ -97,6 +97,13 @@ def getServerDir():
|
||||
def getLogsDir():
|
||||
return getFatherDir() + '/wwwlogs'
|
||||
|
||||
def getWwwDir():
|
||||
file = getPanelDir() + '/data/site.pl'
|
||||
if os.path.exists(file):
|
||||
return readFile(file).strip()
|
||||
return getFatherDir() + '/wwwroot'
|
||||
|
||||
|
||||
def getRecycleBinDir():
|
||||
rb_dir = getFatherDir() + '/recycle_bin'
|
||||
if not os.path.exists(rb_dir):
|
||||
|
||||
@@ -83,7 +83,6 @@ function getBackupName(hook_data, name){
|
||||
function getCronData(page){
|
||||
var load = layer.msg(lan.public.the,{icon:16,time:0,shade: [0.3, '#000']});
|
||||
$.post("/crontab/list?p="+page,'', function(rdata){
|
||||
console.log(rdata);
|
||||
layer.close(load);
|
||||
var cbody = "";
|
||||
if(rdata == ""){
|
||||
|
||||
+23
-29
@@ -259,7 +259,6 @@ function getFormatTime(tm, format) {
|
||||
|
||||
|
||||
function changePathCallback(default_dir, callback) {
|
||||
|
||||
var c = layer.open({
|
||||
type: 1,
|
||||
area: "650px",
|
||||
@@ -276,7 +275,7 @@ function changePathCallback(default_dir, callback) {
|
||||
</div>\
|
||||
<div class='path-con'>\
|
||||
<div class='path-con-left'>\
|
||||
<dl><dt id='changecomlist' onclick='backMyComputer()'>计算机</dt></dl>\
|
||||
<dl><dt id='changecomlist' onclick='backMyComputer()'>计算机</dt></dl>\
|
||||
</div>\
|
||||
<div class='path-con-right'>\
|
||||
<ul class='default' id='computerDefautl'></ul>\
|
||||
@@ -387,14 +386,15 @@ function getDiskList(b) {
|
||||
var a = "";
|
||||
var c = "path=" + b + "&disk=True";
|
||||
$.post("/files/get_dir", c, function(h) {
|
||||
if(h.DISK != undefined) {
|
||||
for(var f = 0; f < h.DISK.length; f++) {
|
||||
a += "<dd onclick=\"getDiskList('" + h.DISK[f].path + "')\"><span class='glyphicon glyphicon-hdd'></span> " + h.DISK[f].path + "</dd>"
|
||||
}
|
||||
$("#changecomlist").html(a)
|
||||
}
|
||||
for(var f = 0; f < h.DIR.length; f++) {
|
||||
var g = h.DIR[f].split(";");
|
||||
// console.log(h);
|
||||
// if(h.dir != undefined) {
|
||||
// for(var f = 0; f < h.dir.length; f++) {
|
||||
// a += "<dd onclick=\"getDiskList('" + h.dir[f].path + "')\"><span class='glyphicon glyphicon-hdd'></span> " + h.dir[f].path + "</dd>";
|
||||
// }
|
||||
// $("#changecomlist").html(a);
|
||||
// }
|
||||
for(var f = 0; f < h.dir.length; f++) {
|
||||
var g = h.dir[f].split(";");
|
||||
var e = g[0];
|
||||
|
||||
if(isChineseChar(e)) {
|
||||
@@ -408,16 +408,16 @@ function getDiskList(b) {
|
||||
}
|
||||
|
||||
d += "<tr>\
|
||||
<td onclick=\"getDiskList('" + h.PATH + "/" + g[0] + "')\" title='" + g[0] + "'>\
|
||||
<td onclick=\"getDiskList('" + h.path + "/" + g[0] + "')\" title='" + g[0] + "'>\
|
||||
<span class='glyphicon glyphicon-folder-open'></span>" + e + "</td><td>" + getLocalTime(g[2]) + "</td>\
|
||||
<td>" + g[3] + "</td>\
|
||||
<td>" + g[4] + "</td>\
|
||||
<td><span class='delfile-btn' onclick=\"NewDelFile('" + h.PATH + "/" + g[0] + "')\">X</span></td>\
|
||||
<td><span class='delfile-btn' onclick=\"NewDelFile('" + h.path + "/" + g[0] + "')\">X</span></td>\
|
||||
</tr>";
|
||||
}
|
||||
if(h.FILES != null && h.FILES != "") {
|
||||
for(var f = 0; f < h.FILES.length; f++) {
|
||||
var g = h.FILES[f].split(";");
|
||||
if(h.files != null && h.files != "") {
|
||||
for(var f = 0; f < h.files.length; f++) {
|
||||
var g = h.files[f].split(";");
|
||||
var e = g[0];
|
||||
if(isChineseChar(e)) {
|
||||
if(e.length > 10) {
|
||||
@@ -441,10 +441,10 @@ function getDiskList(b) {
|
||||
$(".default").hide();
|
||||
$(".file-list").show();
|
||||
$("#tbody").html(d);
|
||||
if(h.PATH.substr(h.PATH.length - 1, 1) != "/") {
|
||||
h.PATH += "/";
|
||||
if(h.path.substr(h.path.length - 1, 1) != "/") {
|
||||
h.path += "/";
|
||||
}
|
||||
$("#PathPlace").find("span").html(h.PATH);
|
||||
$("#PathPlace").find("span").html(h.path);
|
||||
activeDisk();
|
||||
return;
|
||||
},'json');
|
||||
@@ -530,10 +530,11 @@ function activeDisk() {
|
||||
}
|
||||
|
||||
function backMyComputer() {
|
||||
$(".default").show();
|
||||
$(".file-list").hide();
|
||||
$("#PathPlace").find("span").html("");
|
||||
activeDisk();
|
||||
// $(".default").show();
|
||||
// $(".file-list").hide();
|
||||
// $("#PathPlace").find("span").html("");
|
||||
// activeDisk();
|
||||
return;
|
||||
}
|
||||
|
||||
function backFile() {
|
||||
@@ -1601,13 +1602,6 @@ function activeDisk() {
|
||||
}
|
||||
|
||||
|
||||
function backMyComputer() {
|
||||
$(".default").show();
|
||||
$(".file-list").hide();
|
||||
$("#PathPlace").find("span").html("");
|
||||
activeDisk();
|
||||
}
|
||||
|
||||
//检查登陆状态
|
||||
function check_login(){
|
||||
$.post('/check_login',{},function(rdata){
|
||||
|
||||
@@ -15,3 +15,4 @@ from .sites import *
|
||||
from .tasks import *
|
||||
from .logs import *
|
||||
from .crontab import *
|
||||
from .firewall import *
|
||||
|
||||
+10
-1
@@ -20,6 +20,14 @@ def addCrontab(data):
|
||||
data['update_time'] = now_time
|
||||
return mw.M('crontab').insert(data)
|
||||
|
||||
def setCrontabData(cron_id, data):
|
||||
mw.M('crontab').where('id=?', (cron_id,)).update(data)
|
||||
return True
|
||||
|
||||
def setCrontabStatus(cron_id, status):
|
||||
mw.M('crontab').where('id=?', (cron_id,)).update({'status':status})
|
||||
return True
|
||||
|
||||
def getCrond(id):
|
||||
return mw.M('crontab').where('id=?', (id,)).field(__field).find()
|
||||
|
||||
@@ -40,4 +48,5 @@ def getCrontabList(
|
||||
data = {}
|
||||
data['count'] = count
|
||||
data['list'] = cron_list
|
||||
return data
|
||||
return data
|
||||
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
# coding:utf-8
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# MW-Linux面板
|
||||
# ---------------------------------------------------------------------------------
|
||||
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Author: midoks <midoks@163.com>
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
import core.mw as mw
|
||||
|
||||
__FIELD = 'id,port,protocol,ps,add_time,update_time'
|
||||
|
||||
def getFirewallList(
|
||||
page:int | None = 1,
|
||||
size:int | None = 10,
|
||||
):
|
||||
start = (int(page) - 1) * (int(size))
|
||||
limit = str(start) + ',' +str(size)
|
||||
|
||||
firewall_list = mw.M('firewall').field(__FIELD).limit(limit).order('id desc').select()
|
||||
count = mw.M('firewall').count()
|
||||
|
||||
data = {}
|
||||
data['count'] = count
|
||||
data['list'] = firewall_list
|
||||
return data
|
||||
|
||||
def addFirewall(port,
|
||||
protocol: str | None = 'tcp',
|
||||
ps: str | None = '备注'
|
||||
) -> bool:
|
||||
'''
|
||||
设置配置的值
|
||||
:port -> str 端口 (必填)
|
||||
:protocol -> str 协议 (可选|tcp,udp,tcp/udp)
|
||||
:ps -> str 备注 (可选)
|
||||
'''
|
||||
now_time = mw.formatDate()
|
||||
insert_data = {
|
||||
'port':port,
|
||||
'protocol':protocol,
|
||||
'ps':ps,
|
||||
'add_time':now_time,
|
||||
'update_time':now_time,
|
||||
}
|
||||
mw.M('firewall').insert(insert_data)
|
||||
return True
|
||||
|
||||
|
||||
def getFirewallCountByPort(port):
|
||||
return mw.M('firewall').where('port=?',(port,)).count()
|
||||
|
||||
|
||||
+176
-36
@@ -10,6 +10,7 @@
|
||||
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
import time
|
||||
import json
|
||||
import threading
|
||||
@@ -20,6 +21,7 @@ from admin import model
|
||||
import core.mw as mw
|
||||
import thisdb
|
||||
|
||||
|
||||
class crontab(object):
|
||||
# lock
|
||||
_instance_lock = threading.Lock()
|
||||
@@ -32,6 +34,119 @@ class crontab(object):
|
||||
crontab._instance = crontab(*args, **kwargs)
|
||||
return crontab._instance
|
||||
|
||||
def modifyCrond(self,cron_id,data):
|
||||
if len(data['name']) < 1:
|
||||
return mw.returnData(False, '任务名称不能为空!')
|
||||
|
||||
is_check_pass, msg = self.cronCheck(data)
|
||||
if not is_check_pass:
|
||||
return mw.returnData(is_check_pass, msg)
|
||||
|
||||
info = thisdb.getCrond(cron_id)
|
||||
|
||||
dbdata = {}
|
||||
dbdata['name'] = data['name']
|
||||
dbdata['type'] = data['type']
|
||||
dbdata['where1'] = data['where1']
|
||||
dbdata['where_hour'] = data['hour']
|
||||
dbdata['where_minute'] = data['minute']
|
||||
dbdata['save'] = data['save']
|
||||
dbdata['backup_to'] = data['backup_to']
|
||||
dbdata['sname'] = data['sname']
|
||||
dbdata['sbody'] = data['sbody']
|
||||
dbdata['stype'] = data['stype']
|
||||
dbdata['url_address'] = data['url_address']
|
||||
|
||||
if not self.removeForCrond(info['echo']):
|
||||
return mw.returnData(False, '无法写入文件,是否开启了系统加固功能!')
|
||||
|
||||
thisdb.setCrontabData(cron_id, dbdata)
|
||||
self.syncToCrond(cron_id)
|
||||
msg = '修改计划任务[' + data['name'] + ']成功'
|
||||
mw.writeLog('计划任务', msg)
|
||||
return mw.returnData(True, msg)
|
||||
|
||||
# 取数据列表
|
||||
def getDataList(self,stype=''):
|
||||
|
||||
bak_data = []
|
||||
if stype == 'site' or stype == 'sites' or stype == 'database' or stype.find('database_') > -1 or stype == 'path':
|
||||
hookPath = mw.getPanelDataDir() + "/hook_backup.json"
|
||||
if os.path.exists(hookPath):
|
||||
t = mw.readFile(hookPath)
|
||||
bak_data = json.loads(t)
|
||||
|
||||
if stype == 'database' or stype.find('database_') > -1:
|
||||
sqlite3_name = 'mysql'
|
||||
path = mw.getServerDir() + '/mysql'
|
||||
if stype != 'database':
|
||||
soft_name = stype.replace('database_', '')
|
||||
path = mw.getServerDir() + '/' + soft_name
|
||||
|
||||
if soft_name == 'postgresql':
|
||||
sqlite3_name = 'pgsql'
|
||||
|
||||
if soft_name == 'mongodb':
|
||||
sqlite3_name = 'mongodb'
|
||||
|
||||
db_list = {}
|
||||
db_list['orderOpt'] = bak_data
|
||||
|
||||
if not os.path.exists(path + '/' + sqlite3_name + '.db'):
|
||||
db_list['data'] = []
|
||||
else:
|
||||
db_list['data'] = mw.M('databases').dbPos(path, sqlite3_name).field('name,ps').select()
|
||||
return mw.getJson(db_list)
|
||||
|
||||
if stype == 'path':
|
||||
db_list = {}
|
||||
db_list['data'] = [{"name": mw.getWwwDir(), "ps": "www"}]
|
||||
db_list['orderOpt'] = bak_data
|
||||
return mw.getJson(db_list)
|
||||
|
||||
data = {}
|
||||
data['orderOpt'] = bak_data
|
||||
|
||||
default_db = 'sites'
|
||||
data['data'] = mw.M(default_db).field('name,ps').select()
|
||||
return mw.getJson(data)
|
||||
|
||||
def setCronStatus(self,cron_id):
|
||||
data = thisdb.getCrond(cron_id)
|
||||
|
||||
status = 1
|
||||
status_msg = '开启'
|
||||
if data['status'] == status:
|
||||
status = 0
|
||||
status_msg = '关闭'
|
||||
self.removeForCrond(data['echo'])
|
||||
else:
|
||||
data['status'] = 1
|
||||
self.syncToCrond(cron_id)
|
||||
|
||||
thisdb.setCrontabStatus(cron_id, status)
|
||||
|
||||
msg = '修改计划任务[' + data['name'] + ']状态为[' + str(status_msg) + ']'
|
||||
mw.writeLog('计划任务', msg)
|
||||
return mw.returnJson(True, msg)
|
||||
|
||||
|
||||
def cronLog(self, cron_id):
|
||||
data = thisdb.getCrond(cron_id)
|
||||
log_file = mw.getServerDir() + '/cron/' + data['echo'] + '.log'
|
||||
if not os.path.exists(log_file):
|
||||
return mw.returnData(False, '当前日志为空!')
|
||||
content = mw.getLastLine(log_file, 500)
|
||||
return mw.returnData(True, content)
|
||||
|
||||
def startTask(self, cron_id):
|
||||
data = thisdb.getCrond(cron_id)
|
||||
cmd_file = mw.getServerDir() + '/cron/' + data['echo']
|
||||
os.system('chmod +x ' + cmd_file)
|
||||
os.system('nohup ' + cmd_file + ' >> ' + cmd_file + '.log 2>&1 &')
|
||||
return mw.returnData(True, '计划任务【%s】已执行!' % data['name'])
|
||||
|
||||
|
||||
# 获取指定任务数据
|
||||
def getCrondFind(self, cron_id):
|
||||
return thisdb.getCrond(cron_id)
|
||||
@@ -78,7 +193,7 @@ class crontab(object):
|
||||
def delete(self, tid):
|
||||
data = thisdb.getCrond(tid)
|
||||
if not self.removeForCrond(data['echo']):
|
||||
return mw.returnData(False, '无法写入文件,请检查是否开启了系统加固功能!')
|
||||
return mw.returnData(False, '无法写入文件,是否开启了系统加固功能!')
|
||||
|
||||
cron_path = mw.getServerDir() + '/cron'
|
||||
cron_file = cron_path + '/' + data['echo']
|
||||
@@ -94,6 +209,17 @@ class crontab(object):
|
||||
mw.writeLog('计划任务', msg)
|
||||
return mw.returnData(True, msg)
|
||||
|
||||
|
||||
def delLogs(self,cron_id):
|
||||
try:
|
||||
data = thisdb.getCrond(cron_id)
|
||||
log_file = mw.getServerDir() + '/cron/' + data['echo'] + '.log'
|
||||
if os.path.exists(log_file):
|
||||
os.remove(log_file)
|
||||
return mw.returnData(True, '任务日志已清空!')
|
||||
except:
|
||||
return mw.returnData(False, '任务日志清空失败!')
|
||||
|
||||
def getCrontabHuman(self, data):
|
||||
rdata = []
|
||||
for i in range(len(data)):
|
||||
@@ -129,18 +255,23 @@ class crontab(object):
|
||||
if mw.isAppleSystem():
|
||||
return True
|
||||
|
||||
u_file = '/var/spool/cron/crontabs/root'
|
||||
if not os.path.exists(u_file):
|
||||
file = '/var/spool/cron/root'
|
||||
if not os.path.exists(file):
|
||||
return False
|
||||
else:
|
||||
file = u_file
|
||||
cron_file = [
|
||||
'/var/spool/cron/crontabs/root',
|
||||
'/var/spool/cron/root',
|
||||
]
|
||||
|
||||
conf = mw.readFile(file)
|
||||
file = ''
|
||||
for i in cron_file:
|
||||
if os.path.exists(file):
|
||||
file = i
|
||||
|
||||
if file == '':
|
||||
return False
|
||||
|
||||
content = mw.readFile(file)
|
||||
rep = ".+" + str(echo) + ".+\n"
|
||||
conf = re.sub(rep, "", conf)
|
||||
if not mw.writeFile(file, conf):
|
||||
content = re.sub(rep, "", content)
|
||||
if not mw.writeFile(file, content):
|
||||
return False
|
||||
self.crondReload()
|
||||
return True
|
||||
@@ -288,7 +419,6 @@ class crontab(object):
|
||||
shell = param.sFile
|
||||
else:
|
||||
head = "#!/bin/bash\nPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin\nexport PATH\n"
|
||||
|
||||
start_head = '''
|
||||
SCRIPT_RUN_TIME="0s"
|
||||
MW_ToSeconds()
|
||||
@@ -336,22 +466,16 @@ fi''' % (mw.getPanelDir(),)
|
||||
'rememory': head + "/bin/bash " + script_dir + '/rememory.sh'
|
||||
}
|
||||
if param['backup_to'] != 'localhost':
|
||||
cfile = mw.getPluginDir() + "/" + \
|
||||
param['backup_to'] + "/index.py"
|
||||
cfile = mw.getPluginDir() + "/" + param['backup_to'] + "/index.py"
|
||||
|
||||
wheres['path'] = head + "python3 " + cfile + \
|
||||
" path " + param['sname'] + " " + str(param['save'])
|
||||
wheres['site'] = head + "python3 " + cfile + \
|
||||
" site " + param['sname'] + " " + str(param['save'])
|
||||
wheres['database'] = head + "python3 " + cfile + " " + \
|
||||
source_stype + " " + \
|
||||
param['sname'] + " " + str(param['save'])
|
||||
wheres['path'] = head + "python3 " + cfile + " path " + param['sname'] + " " + str(param['save'])
|
||||
wheres['site'] = head + "python3 " + cfile + " site " + param['sname'] + " " + str(param['save'])
|
||||
wheres['database'] = head + "python3 " + cfile + " " + source_stype + " " + param['sname'] + " " + str(param['save'])
|
||||
try:
|
||||
shell = wheres[stype]
|
||||
except:
|
||||
if stype == 'toUrl':
|
||||
shell = head + "curl -sS --connect-timeout 10 -m 60 '" + \
|
||||
param['urladdress'] + "'"
|
||||
shell = head + "curl -sS --connect-timeout 10 -m 60 '" + param['urladdress'] + "'"
|
||||
else:
|
||||
shell = head + param['sbody'].replace("\r\n", "\n")
|
||||
|
||||
@@ -381,19 +505,19 @@ echo "--------------------------------------------------------------------------
|
||||
def checkScript(self, shell):
|
||||
keys = ['shutdown', 'init 0', 'mkfs', 'passwd',
|
||||
'chpasswd', '--stdin', 'mkfs.ext', 'mke2fs']
|
||||
for key in keys:
|
||||
shell = shell.replace(key, '[***]')
|
||||
for k in keys:
|
||||
shell = shell.replace(k, '[***]')
|
||||
return shell
|
||||
|
||||
|
||||
|
||||
# 将Shell脚本写到文件
|
||||
def writeShell(self, config):
|
||||
def writeShell(self, bash_script):
|
||||
if mw.isAppleSystem():
|
||||
return mw.returnData(True, 'ok')
|
||||
file = '/var/spool/cron/crontabs/root'
|
||||
current_os = mw.getOs()
|
||||
if current_os == 'darwin':
|
||||
sys_os = mw.getOs()
|
||||
if sys_os == 'darwin':
|
||||
file = '/etc/crontab'
|
||||
elif current_os.startswith("freebsd"):
|
||||
elif sys_os.startswith("freebsd"):
|
||||
file = '/var/cron/tabs/root'
|
||||
|
||||
if not os.path.exists(file):
|
||||
@@ -401,15 +525,16 @@ echo "--------------------------------------------------------------------------
|
||||
|
||||
if not os.path.exists(file):
|
||||
mw.writeFile(file, '')
|
||||
conf = mw.readFile(file)
|
||||
conf += str(config) + "\n"
|
||||
if mw.writeFile(file, conf):
|
||||
|
||||
content = mw.readFile(file)
|
||||
content += str(bash_script) + "\n"
|
||||
if mw.writeFile(file, content):
|
||||
if not os.path.exists(file):
|
||||
mw.execShell("chmod 600 '" + file +"' && chown root.root " + file)
|
||||
else:
|
||||
mw.execShell("chmod 600 '" + file +"' && chown root.crontab " + file)
|
||||
return mw.returnData(True, 'ok')
|
||||
return mw.returnData(False, '文件写入失败,请检查是否开启系统加固功能!')
|
||||
return mw.returnData(False, '文件写入失败,是否开启系统加固功能!')
|
||||
|
||||
# 重载配置
|
||||
def crondReload(self):
|
||||
@@ -424,7 +549,22 @@ echo "--------------------------------------------------------------------------
|
||||
else:
|
||||
mw.execShell("systemctl reload crond")
|
||||
|
||||
def syncToCrond(self, cron_id):
|
||||
info = thisdb.getCrond(cron_id)
|
||||
if 'status' in info:
|
||||
if info['status'] == 0:
|
||||
return False
|
||||
|
||||
if 'where_hour' in info:
|
||||
info['hour'] = info['where_hour']
|
||||
info['minute'] = info['where_minute']
|
||||
info['week'] = info['where1']
|
||||
|
||||
|
||||
cmd, _ = self.getCrondCycle(info)
|
||||
cron_path = mw.getServerDir() + '/cron'
|
||||
cron_name = self.getShell(info)
|
||||
cmd += ' ' + cron_path + '/' + cron_name + ' >> ' + cron_path + '/' + cron_name + '.log 2>&1'
|
||||
self.writeShell(cmd)
|
||||
self.crondReload()
|
||||
return True
|
||||
|
||||
|
||||
+10
-3
@@ -14,9 +14,9 @@ import threading
|
||||
import re
|
||||
import time
|
||||
|
||||
from admin import model
|
||||
|
||||
import core.mw as mw
|
||||
import thisdb
|
||||
|
||||
class Firewall(object):
|
||||
|
||||
@@ -47,6 +47,14 @@ class Firewall(object):
|
||||
elif mw.isAppleSystem():
|
||||
self.__isMac = True
|
||||
|
||||
def getList(self, page=1,size=10):
|
||||
info = thisdb.getFirewallList(page=page, size=size)
|
||||
|
||||
rdata = {}
|
||||
rdata['data'] = info['list']
|
||||
rdata['page'] = mw.getPage({'count':info['count'],'tojs':'showAccept','p':page,'row':size})
|
||||
return rdata
|
||||
|
||||
def reload(self):
|
||||
if self.__isUfw:
|
||||
mw.execShell('/usr/sbin/ufw reload')
|
||||
@@ -236,8 +244,7 @@ class Firewall(object):
|
||||
|
||||
msg = mw.getInfo('放行端口[{1}][{2}]成功', (port, protocol,))
|
||||
mw.writeLog("防火墙管理", msg)
|
||||
|
||||
return mw.returnData(True, '添加放行(' + port + ')端口成功!')
|
||||
return mw.returnData(True, msg)
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user