pull/632/head
Mr Chen 6 months ago
parent 7d83f29db7
commit 9c130746fb
  1. 5
      cli.sh
  2. 8
      web/admin/dashboard/dashboard.py
  3. 18
      web/admin/site/redirect.py
  4. 220
      web/static/app/site.js
  5. 95
      web/utils/site.py

@ -82,14 +82,13 @@ mw_start_bgtask(){
mw_stop()
{
PLIST=`ps -ef|grep app:app |grep -v grep|awk '{print $2}'`
for i in ${($PLIST)[@]}
for i in $PLIST
do
kill -9 $i > /dev/null 2>&1
done
PIDS=`ps -ef|grep panel_task.py | grep -v grep |awk '{print $2}'`
ARR=($PIDS)
for p in ${ARR[@]}
for p in $PIDS
do
kill -9 $p > /dev/null 2>&1
done

@ -37,16 +37,16 @@ def index():
@blueprint.route('/<path>',endpoint='admin_safe_path',methods=['GET'])
def admin_safe_path(path):
db_path = thisdb.getOption('admin_path')
name = thisdb.getOption('template', default='default')
if isLogined():
return redirect('/')
print(db_path,path)
# print(db_path,path)
if db_path == path:
return render_template('default/login.html')
return render_template('%s/login.html' % name)
unauthorized_status = thisdb.getOption('unauthorized_status')
if unauthorized_status == '0':
return render_template('default/path.html')
return render_template('%s/path.html' % name)
return Response(status=int(unauthorized_status))
# 仅针对webhook插件

@ -43,21 +43,31 @@ def set_redirect():
keep_path = request.form.get("keep_path", '') # keep path
return MwSites.instance().setRedirect(site_name, site_from, to, type, r_type, keep_path)
# 设置重定向状态
@blueprint.route('/set_redirect_status', endpoint='set_redirect_status', methods=['POST'])
@panel_login_required
def set_redirect_status():
site_name = request.form.get("siteName", '')
status = request.form.get("status")
redirect_id = request.form.get("id", '')
return MwSites.instance().setRedirectStatus(site_name, redirect_id, status)
# 获取重定向配置
@blueprint.route('/get_redirect_conf', endpoint='get_redirect_conf', methods=['POST'])
@panel_login_required
def get_redirect_conf():
site_name = request.form.get("siteName", '')
rid = request.form.get("id", '')
return MwSites.instance().getRedirectConf(site_name, rid)
redirect_id = request.form.get("id", '')
return MwSites.instance().getRedirectConf(site_name, redirect_id)
# 删除重定向配置
@blueprint.route('/del_redirect', endpoint='del_redirect', methods=['POST'])
@panel_login_required
def del_redirect():
site_name = request.form.get("siteName", '')
rid = request.form.get("id", '')
return MwSites.instance().delRedirect(site_name, rid)
redirect_id = request.form.get("id", '')
return MwSites.instance().delRedirect(site_name, redirect_id)

@ -1373,70 +1373,75 @@ function to301(siteName, type, obj){
// 设置 页面展示
if(type == 1) {
obj = {
var obj = {
type: 1,
keep_path: 1,
to: 'http://',
from: '',
r_type: '',
type: 'path'
};
var keep_path_ht = obj.keep_path == 1 ? 'checked="checked"' : '';
var redirect_title = type == 1 ? '创建重定向' : '修改重定向[' + obj.redirectname + ']';
layer.open({
type: 1,
type: 'path',
keep_path: 1
}
var redirect_form = layer.open({
type: 1,
skin: 'demo-class',
area: '650px',
title: type == 1 ? '创建重定向' : '修改重定向[' + obj.redirectname + ']',
area: ['650px','270px'],
title: redirect_title,
closeBtn: 1,
shift: 5,
btn: ['提交','关闭'],
shadeClose: false,
content: "<form id='form_redirect' class='divtable pd20' style='padding-bottom: 60px'>" +
"<div class='line' style='overflow:hidden;height: 40px;'>" +
"<div style='display: inline-block;'>" +
"<span class='tname' style='margin-left:10px;position: relative;top: -5px;'>保留URI参数</span>" +
"<input class='btswitch btswitch-ios' id='keep_path' type='checkbox' name='keep_path' " + (obj.keep_path == 1 ? 'checked="checked"' : '') + " /><label class='btswitch-btn phpmyadmin-btn' for='keep_path' style='float:left'></label>" +
"</div>" +
"</div>" +
"<div class='line' style='clear:both;'>" +
"<span class='tname'>重定向类型</span>" +
"<div class='info-r ml0'>" +
"<select class='bt-input-text mr5' name='type' style='width:100px'><option value='domain' " + (obj.type == 'domain' ? 'selected ="selected"' : "") + ">域名</option><option value='path' " + (obj.type == 'path' ? 'selected ="selected"' : "") + ">路径</option></select>" +
"<span class='mlr15'>重定向方式</span>" +
"<select class='bt-input-text ml10' name='r_type' style='width:100px'><option value='301' " + (obj.r_type == '301' ? 'selected ="selected"' : "") + " >301</option><option value='302' " + (obj.r_type == '302' ? 'selected ="selected"' : "") + ">302</option></select></div>" +
"</div>" +
"<div class='line redirectdomain'>" +
"<span class='tname'>重定向源</span>" +
"<div class='info-r ml0'>" +
"<input name='from' placeholder='域名或路径' class='bt-input-text mr5' type='text' style='width:200px;float: left;margin-right:0px' value='" + obj.from + "'>" +
"<span class='tname' style='width:90px'>目标URL</span>" +
"<input name='to' class='bt-input-text mr5' type='text' style='width:200px' value='" + obj.to + "'>" +
"</div>" +
"</div>" +
"</div>" +
"<div class='bt-form-submit-btn'><button type='button' class='btn btn-sm btn-danger btn-colse-prosy'>关闭</button><button type='button' class='btn btn-sm btn-success btn-submit-redirect'>" + (type == 1 ? " 提交" : "保存") + "</button></div>" +
"</form>"
});
setTimeout(function() {
$('.btn-colse-prosy').click(function() {
layer.close(redirect_form);
});
$('.btn-submit-redirect').click(function() {
content: "<form id='form_redirect' class='divtable pd20'>\
<div class='line' style='overflow:hidden;height: 40px;'>\
<div style='display: inline-block;'>\
<span class='tname' style='margin-left:10px;position: relative;top: -5px;'>保留URI参数</span>\
<input class='btswitch btswitch-ios' id='keep_path' type='checkbox' name='keep_path' " + keep_path_ht + " />\
<label class='btswitch-btn' for='keep_path' style='float:left'></label>\
</div>\
</div>\
<div class='line' style='clear:both;'><span class='tname'>重定向类型</span>\
<div class='info-r ml0'>\
<select class='bt-input-text mr5' name='type' style='width:100px'>\
<option value='domain' " + (obj.type == 'domain' ? 'selected ="selected"' : "") + ">域名</option>\
<option value='path' " + (obj.type == 'path' ? 'selected ="selected"' : "") + ">路径</option>\
</select>\
<span class='mlr15'>重定向方式</span>\
<select class='bt-input-text ml10' name='r_type' style='width:100px'>\
<option value='301' " + (obj.r_type == '301' ? 'selected ="selected"' : "") + " >301</option>\
<option value='302' " + (obj.r_type == '302' ? 'selected ="selected"' : "") + ">302</option>\
</select>\
</div>\
</div>\
<div class='line redirectdomain'>\
<span class='tname'>重定向源</span>\
<div class='info-r ml0'>\
<input name='from' placeholder='域名或路径' class='bt-input-text mr5' type='text' style='width:200px;float: left;margin-right:0px' value='" + obj.from + "'>\
<span class='tname' style='width:90px'>目标URL</span>\
<input name='to' class='bt-input-text mr5' type='text' style='width:200px' value='" + obj.to + "'>\
</div>\
</div>\
</form>",
success:function(index,layero){
},
yes:function(index,index1){
var keep_path = $('[name="keep_path"]').prop('checked') ? 1 : 0;
var r_type = $('[name="r_type"]').val();
var type = $('[name="type"]').val();
var from = $('[name="from"]').val();
var to = $('[name="to"]').val();
$.post('/site/set_redirect', {siteName: siteName,type: type,r_type: r_type,from: from,to: to,keep_path: keep_path}, function(data) {
var pdata = {siteName: siteName, type: type,r_type: r_type,from: from,to: to,keep_path: keep_path};
$.post('/site/set_redirect', pdata, function(data) {
if (data.status) {
layer.close(redirect_form);
layer.close(index);
to301(siteName);
} else {
layer.msg(data.msg, {icon: 2});
}
},'json');
});
}, 100);
}
});
}
if (type == 2) {
@ -1516,40 +1521,53 @@ function to301(siteName, type, obj){
}
var body = '<div id="redirect_list" class="bt_table">\
<div style="padding-bottom: 10px">\
<button type="button" title="添加重定向" class="btn btn-success btn-sm mr5" onclick="to301(\''+siteName+'\',1)" ><span>添加重定向</span></button>\
</div>\
<div class="divtable" style="max-height:200px;">\
<table class="table table-hover" >\
<thead style="position: relative;z-index: 1;">\
<tr>\
<th><span data-index="1"><span>重定向类型</span></span></th>\
<th><span data-index="2"><span>重定向方式</span></span></th>\
<th><span data-index="3"><span>保留URL参数</span></span></th>\
<th><span data-index="4"><span>操作</span></span></th>\
</tr>\
</thead>\
<tbody id="md-301-body">\
</tbody>\
</table>\
</div>\
</div>';
<div style="padding-bottom: 10px">\
<button type="button" title="添加重定向" class="btn btn-success btn-sm mr5" onclick="to301(\''+siteName+'\',1)" >\
<span>添加重定向</span>\
</button>\
</div>\
<div class="divtable" style="max-height:200px;">\
<table class="table table-hover" >\
<thead style="position: relative;z-index: 1;">\
<tr>\
<th><span data-index="1"><span>重定向类型</span></span></th>\
<th><span data-index="2"><span>重定向方式</span></span></th>\
<th><span data-index="3"><span>保留URL参数</span></span></th>\
<th><span data-index="4"><span>状态</span></span></th>\
<th><span data-index="5"><span>操作</span></span></th>\
</tr>\
</thead>\
<tbody id="md-301-body">\
</tbody>\
</table>\
</div>\
</div>';
$("#webedit-con").html(body);
var loadT = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']});
$.post('/site/get_redirect','siteName='+siteName, function(res) {
layer.close(loadT);
$("#md-301-loading").remove();
if (res.status === true) {
let data = res.data.result;
if (res.status) {
var data = res.data.result;
data.forEach(function(item){
lan_r_type = item.r_type == 0 ? "永久重定向" : "临时重定向"
keep_path = item.keep_path == 0 ? "不保留" : "保留"
var lan_r_type = item.r_type == 0 ? "永久重定向" : "临时重定向";
var keep_path = item.keep_path == 0 ? "不保留" : "保留";
var switchProxy = '<span onclick="toRedirect(\''+siteName+'\',\''+ item.id +'\',10)" style="color:rgb(92, 184, 92);" class="btlink glyphicon glyphicon-play"></span>';
if (!item['status']){
switchProxy = '<span onclick="toRedirect(\''+siteName+'\',\''+ item.id +'\',11)" style="color:rgb(255, 0, 0);" class="btlink glyphicon glyphicon-pause"></span>';
}
let tmp = '<tr>\
<td><span data-index="1"><span>'+item.r_from+'</span></span></td>\
<td><span data-index="2"><span>'+lan_r_type+'</span></span></td>\
<td><span data-index="2"><span>'+keep_path+'</span></span></td>\
<td><span data-index="4" onclick="to301(\''+siteName+'\', 3, \''+ item.id +'\')" class="btlink">详细</span> | <span data-index="5" onclick="to301(\''+siteName+'\', 2, \''+ item.id +'\')" class="btlink"></span></td>\
<td><span data-index="3"><span>'+keep_path+'</span></span></td>\
<td><span data-index="4"><span>'+switchProxy+'</span></span></td>\
<td>\
<span data-index="5" onclick="to301(\''+siteName+'\', 3, \''+ item.id +'\')" class="btlink">详细</span> | \
<span data-index="5" onclick="to301(\''+siteName+'\', 2, \''+ item.id +'\')" class="btlink">删除</span>\
</td>\
</tr>';
$("#md-301-body").append(tmp);
})
@ -1560,6 +1578,28 @@ function to301(siteName, type, obj){
}
function toRedirect(siteName, redirect_id, type){
if (type == 10 || type == 11) {
//[11]启动 或 停止[10]
var status = type == 10 ? '0' : '1';
var loading = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']});
var pdata = {siteName: siteName, 'status':status,'id':redirect_id };
$.post('/site/set_redirect_status', pdata, function(rdata) {
layer.close(loading);
if (!rdata.status){
layer.msg(res.msg, {time: 3000,icon: 2});
return;
}
showMsg("设置成功",function(){
to301(siteName);
},{icon: 1,time:2000});
},'json');
return;
}
}
//反向代理
function toProxy(siteName, type, obj) {
// 设置 页面展示
@ -1828,27 +1868,27 @@ function toProxy(siteName, type, obj) {
}
var body = '<div id="proxy_list" class="bt_table">\
<div style="padding-bottom: 10px">\
<button type="button" title="添加反向代理" class="btn btn-success btn-sm mr5" onclick="toProxy(\''+siteName+'\',1)" >\
<span>添加反向代理</span>\
</button>\
</div>\
<div class="divtable" style="max-height:200px;">\
<table class="table table-hover" >\
<thead style="position: relative;z-index: 1;">\
<tr>\
<th>名称</th>\
<th>代理目录</th>\
<th>目标地址</th>\
<th>缓存</th>\
<th>状态</th>\
<th>操作</th>\
</tr>\
</thead>\
<tbody id="md-301-body"></tbody>\
</table>\
</div>\
</div>';
<div style="padding-bottom: 10px">\
<button type="button" title="添加反向代理" class="btn btn-success btn-sm mr5" onclick="toProxy(\''+siteName+'\',1)" >\
<span>添加反向代理</span>\
</button>\
</div>\
<div class="divtable" style="max-height:200px;">\
<table class="table table-hover" >\
<thead style="position: relative;z-index: 1;">\
<tr>\
<th>名称</th>\
<th>代理目录</th>\
<th>目标地址</th>\
<th>缓存</th>\
<th>状态</th>\
<th>操作</th>\
</tr>\
</thead>\
<tbody id="md-301-body"></tbody>\
</table>\
</div>\
</div>';
$("#webedit-con").html(body);
var loading = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']});

@ -128,20 +128,20 @@ class sites(object):
mw.removeBackFile(path)
return rdata
def getRewriteConf(self, siteName):
return self.rewritePath + '/' + siteName + '.conf'
def getRewriteConf(self, site_name):
return self.rewritePath + '/' + site_name + '.conf'
def getRedirectDataPath(self, siteName):
return "{}/{}/data.json".format(self.redirectPath, siteName)
def getRedirectDataPath(self, site_name):
return "{}/{}/data.json".format(self.redirectPath, site_name)
def getRedirectPath(self, siteName):
return "{}/{}".format(self.redirectPath, siteName)
def getRedirectPath(self, site_name):
return "{}/{}".format(self.redirectPath, site_name)
def getProxyDataPath(self, siteName):
return "{}/{}/data.json".format(self.proxyPath, siteName)
def getProxyDataPath(self, site_name):
return "{}/{}/data.json".format(self.proxyPath, site_name)
def getProxyPath(self, siteName):
return "{}/{}".format(self.proxyPath, siteName)
def getProxyPath(self, site_name):
return "{}/{}".format(self.proxyPath, site_name)
def getDirBindRewrite(self, site_name, dir_name):
return self.rewritePath + '/' + site_name + '_' + dir_name + '.conf'
@ -1084,8 +1084,10 @@ class sites(object):
rep = r"limit_rate\s+([0-9]+)\w+;"
conf = re.sub(rep, str_limit_rate, conf)
else:
conf = conf.replace('#error_page 404/404.html;', "#error_page 404/404.html;\n " +
str_perserver + "\n " + str_perip + "\n " + str_limit_rate)
conf = conf.replace('#error_page 404/404.html;', "#error_page 404/404.html;\n "+\
str_perserver+"\n "+\
str_perip+"\n "+\
str_limit_rate)
mw.writeFile(filename, conf)
mw.restartWeb()
@ -1116,17 +1118,39 @@ class sites(object):
# 获取重定向配置
def getRedirect(self, siteName):
redirect_file = self.getRedirectDataPath(siteName)
def getRedirect(self, site_name):
redirect_file = self.getRedirectDataPath(site_name)
if not os.path.exists(redirect_file):
mw.execShell("mkdir {}/{}".format(self.redirectPath, siteName))
mw.execShell("mkdir " + self.getRedirectPath(site_name))
return mw.returnData(True, "no exists!", {"result": [], "count": 0})
content = mw.readFile(redirect_file)
data = json.loads(content)
# 处理301信息
for i in range(len(data)):
redirect_dir = self.getRedirectPath(site_name)
redirect_file = redirect_dir + '/' + data[i]['id'] + '.conf'
if os.path.exists(redirect_file):
data[i]['status'] = True
else:
data[i]['status'] = False
return mw.returnData(True, "ok", {"result": data, "count": len(data)})
def setRedirectStatus(self, site_name, redirect_id, status):
if status == '' or site_name == '' or redirect_id == '':
return mw.returnData(False, "必填项不能为空!")
conf_file = "{}/{}/{}.conf".format(self.redirectPath, site_name, redirect_id)
conf_txt = "{}/{}/{}.conf.txt".format(self.redirectPath, site_name, redirect_id)
if status == '1':
mw.execShell('mv ' + conf_txt + ' ' + conf_file)
else:
mw.execShell('mv ' + conf_file + ' ' + conf_txt)
mw.restartWeb()
return mw.returnData(True, "OK")
# 操作 重定向配置
def operateRedirectConf(self, siteName, method='start'):
vhost_file = self.getHostConf(siteName)
@ -1134,7 +1158,7 @@ class sites(object):
cnf_301 = '''#301-START
include %s/*.conf;
#301-END''' % (self.getRedirectPath( siteName))
#301-END''' % (self.getRedirectPath(siteName,))
cnf_301_source = '#301-START'
# print('operateRedirectConf', content.find('#301-END'))
@ -1213,12 +1237,12 @@ class sites(object):
mw.restartWeb()
return mw.returnData(True, "设置成功")
def getRedirectConf(self, siteName, rid):
if rid == '' or siteName == '':
def getRedirectConf(self, site_name, redirect_id):
if redirect_id == '' or site_name == '':
return mw.returnData(False, "必填项不能为空!")
path = self.getRedirectPath(siteName)
conf = "{}/{}.conf".format(path, rid)
path = self.getRedirectPath(site_name)
conf = "{}/{}.conf".format(path, redirect_id)
data = mw.readFile(conf)
if data == False:
return mw.returnData(False, "获取失败!")
@ -1407,7 +1431,7 @@ location ^~ {from} {\n\
"open_cache": open_cache,
"open_proxy": open_proxy,
"cache_time": cache_time,
"id": pid,
"id": proxy_id,
})
else:
# 修改代理
@ -1478,6 +1502,33 @@ location ^~ {from} {\n\
self.close_proxy = []
return True
def closeRedirectAll(self, site_name):
self.close_redirect = []
redirect_path = self.getRedirectDataPath(site_name)
if os.path.exists(redirect_path):
content = mw.readFile(redirect_path)
data = json.loads(content)
for r in data:
redirect_dir = "{}/{}".format(self.redirectPath, site_name)
redirect_conf = redirect_dir + '/' + r['id'] + '.conf'
redirect_txt = "{}/{}/{}.conf.txt".format(self.redirectPath, site_name, r['id'])
if os.path.exists(proxy_conf):
self.close_redirect.append(r['id'])
mw.execShell('mv ' + proxy_conf + ' ' + proxy_txt)
mw.restartWeb()
def openProxyByOpen(self, site_name):
for redirect_id in self.close_redirect:
redirect_dir = "{}/{}".format(self.redirectPath, site_name)
redirect_conf = redirect_dir + '/' + redirect_id + '.conf'
redirect_txt = "{}/{}/{}.conf.txt".format(self.redirectPath, site_name, redirect_id)
if os.path.exists(proxy_txt):
mw.execShell('mv ' + redirect_txt + ' ' + redirect_conf)
if len(self.close_redirect) > 0:
mw.restartWeb()
self.close_redirect = []
return True
def getProxyConf(self, site_name, proxy_id):

Loading…
Cancel
Save