Simple Linux Panel
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
mdserver-web/route/static/app/config.js

667 lines
23 KiB

/** op **/
// $(".set-submit").click(function(){
// var data = $("#set_config").serialize();
// layer.msg('正在保存配置...',{icon:16,time:0,shade: [0.3, '#000']});
// $.post('/config/set',data,function(rdata){
// layer.closeAll();
// layer.msg(rdata.msg,{icon:rdata.status?1:2});
// if(rdata.status){
// setTimeout(function(){
// window.location.href = ((window.location.protocol.indexOf('https') != -1)?'https://':'http://') + rdata.data.host + window.location.pathname;
// },2500);
// }
// },'json');
// });
$('input[name="webname"]').change(function(){
var webname = $(this).val();
$('.btn_webname').removeAttr('disabled');
$('.btn_webname').unbind().click(function(){
$.post('/config/set_webname','webname='+webname, function(rdata){
showMsg(rdata.msg,function(){window.location.reload();},{icon:rdata.status?1:2},2000);
},'json');
});
});
$('input[name="host_ip"]').change(function(){
var host_ip = $(this).val();
$('.btn_host_ip').removeAttr('disabled');
$('.btn_host_ip').unbind().click(function(){
$.post('/config/set_ip','host_ip='+host_ip, function(rdata){
showMsg(rdata.msg,function(){window.location.reload();},{icon:rdata.status?1:2},2000);
},'json');
});
});
$('input[name="port"]').change(function(){
var port = $(this).val();
$('.btn_port').removeAttr('disabled');
$('.btn_port').unbind().click(function(){
$.post('/config/set_port','port='+port, function(rdata){
showMsg(rdata.msg,function(){window.location.reload();},{icon:rdata.status?1:2},2000);
},'json');
});
});
$('input[name="sites_path"]').change(function(){
var sites_path = $(this).val();
$('.btn_sites_path').removeAttr('disabled');
$('.btn_sites_path').unbind().click(function(){
$.post('/config/set_www_dir','sites_path='+sites_path, function(rdata){
showMsg(rdata.msg,function(){window.location.reload();},{icon:rdata.status?1:2},2000);
},'json');
});
});
$('input[name="backup_path"]').change(function(){
var backup_path = $(this).val();
$('.btn_backup_path').removeAttr('disabled');
$('.btn_backup_path').unbind().click(function(){
$.post('/config/set_backup_dir','backup_path='+backup_path, function(rdata){
showMsg(rdata.msg,function(){window.location.reload();},{icon:rdata.status?1:2},2000);
},'json');
});
});
/** op **/
//关闭面板
function closePanel(){
layer.confirm('关闭面板会导致您无法访问面板 ,您真的要关闭Linux面板吗?',{title:'关闭面板',closeBtn:2,icon:13,cancel:function(){
$("#closePl").prop("checked",false);
}}, function() {
$.post('/config/close_panel','',function(rdata){
layer.msg(rdata.msg,{icon:rdata.status?1:2});
setTimeout(function(){
window.location.reload();
},1000);
},'json');
},function(){
$("#closePl").prop("checked",false);
});
}
//开发模式
function debugMode(){
var loadT = layer.msg('正在发送请求,请稍候...', { icon: 16, time: 0, shade: [0.3, '#000'] });
$.post('/config/open_debug', {}, function (rdata) {
layer.close(loadT);
showMsg(rdata.msg, function(){
window.location.reload();
} ,{icon:rdata.status?1:2}, 1000);
},'json');
}
function modifyAuthPath() {
var auth_path = $("#admin_path").val();
layer.open({
type: 1,
area: "500px",
title: "修改安全入口",
closeBtn: 1,
shift: 5,
btn:['提交','关闭'],
shadeClose: false,
content: '<div class="bt-form bt-form pd20">\
<div class="line ">\
<span class="tname">入口地址</span>\
<div class="info-r">\
<input name="auth_path_set" class="bt-input-text mr5" type="text" style="width: 311px" value="' + auth_path + '">\
</div>\
</div>\
</div>',
yes:function(index){
var auth_path = $("input[name='auth_path_set']").val();
if (auth_path == '/' || auth_path == ''){
layer.confirm('警告,关闭安全入口等于直接暴露你的后台地址在外网,十分危险, 您真的要这样更改吗?',{title:'安全入口修改',closeBtn:1,icon:13,
cancel:function(){
}}, function() {
var loadT = layer.msg(lan.config.config_save, { icon: 16, time: 0, shade: [0.3, '#000'] });
$.post('/config/set_admin_path', { admin_path: auth_path }, function (rdata) {
showMsg(rdata.msg, function(){
layer.close(index);
layer.close(loadT);
$("#admin_path").val(auth_path);
},{ icon: rdata.status ? 1 : 2 }, 2000);
},'json');
});
return;
} else {
var loadT = layer.msg(lan.config.config_save, { icon: 16, time: 0, shade: [0.3, '#000'] });
$.post('/config/set_admin_path', { admin_path: auth_path }, function (rdata) {
showMsg(rdata.msg, function(){
layer.close(index);
layer.close(loadT);
$("#admin_path").val(auth_path);
},{ icon: rdata.status ? 1 : 2 }, 2000);
},'json');
}
}
});
}
function setPassword(a) {
if(a == 1) {
p1 = $("#p1").val();
p2 = $("#p2").val();
if(p1 == "" || p1.length < 8) {
layer.msg('面板密码不能少于8位!', {icon: 2});
return
}
//准备弱口令匹配元素
var checks = ['admin888','123123123','12345678','45678910','87654321','asdfghjkl','password','qwerqwer'];
pchecks = 'abcdefghijklmnopqrstuvwxyz1234567890';
for(var i=0;i<pchecks.length;i++){
checks.push(pchecks[i]+pchecks[i]+pchecks[i]+pchecks[i]+pchecks[i]+pchecks[i]+pchecks[i]+pchecks[i]);
}
//检查弱口令
cps = p1.toLowerCase();
var isError = "";
for(var i=0;i<checks.length;i++){
if(cps == checks[i]){
isError += '['+checks[i]+'] ';
}
}
if(isError != ""){
layer.msg('面板密码不能为弱口令'+isError,{icon:5});
return;
}
if(p1 != p2) {
layer.msg('两次输入的密码不一致', {icon: 2});
return;
}
$.post("/config/set_password", "password1=" + encodeURIComponent(p1) + "&password2=" + encodeURIComponent(p2), function(b) {
if(b.status) {
layer.closeAll();
layer.msg(b.msg, {icon: 1});
} else {
layer.msg(b.msg, {icon: 2});
}
},'json');
return;
}
layer.open({
type: 1,
area: "290px",
title: '修改密码',
closeBtn: 1,
shift: 5,
shadeClose: false,
content: "<div class='bt-form pd20 pb70'>\
<div class='line'>\
<span class='tname'>密码</span>\
<div class='info-r'><input class='bt-input-text' type='text' name='password1' id='p1' value='' placeholder='新的密码' style='width:100%'/></div>\
</div>\
<div class='line'>\
<span class='tname'>重复</span>\
<div class='info-r'><input class='bt-input-text' type='text' name='password2' id='p2' value='' placeholder='再输一次' style='width:100%' /></div>\
</div>\
<div class='bt-form-submit-btn'>\
<span style='float: left;' title='随机密码' class='btn btn-default btn-sm' onclick='randPwd(10)'>随机</span>\
<button type='button' class='btn btn-danger btn-sm' onclick=\"layer.closeAll()\">关闭</button>\
<button type='button' class='btn btn-success btn-sm' onclick=\"setPassword(1)\">修改</button>\
</div>\
</div>"
});
}
function randPwd(){
var pwd = randomStrPwd(12);
$("#p1").val(pwd);
$("#p2").val(pwd);
layer.msg(lan.bt.pass_rep_ps,{time:2000})
}
function setUserName(a) {
if(a == 1) {
p1 = $("#p1").val();
p2 = $("#p2").val();
if(p1 == "" || p1.length < 3) {
layer.msg('用户名长度不能少于3位', {icon: 2});
return;
}
if(p1 != p2) {
layer.msg('两次输入的用户名不一致', {icon: 2});
return;
}
$.post("/config/set_name", "name1=" + encodeURIComponent(p1) + "&name2=" + encodeURIComponent(p2), function(b) {
if(b.status) {
layer.closeAll();
layer.msg(b.msg, {icon: 1});
$("input[name='username_']").val(p1)
} else {
layer.msg(b.msg, {icon: 2});
}
},'json');
return
}
layer.open({
type: 1,
area: "290px",
title: '修改面板用户名',
closeBtn: 1,
shift: 5,
shadeClose: false,
content: "<div class='bt-form pd20 pb70'>\
<div class='line'><span class='tname'>用户名</span>\
<div class='info-r'><input class='bt-input-text' type='text' name='password1' id='p1' value='' placeholder='新的用户名' style='width:100%'/></div>\
</div>\
<div class='line'>\
<span class='tname'>重复</span>\
<div class='info-r'><input class='bt-input-text' type='text' name='password2' id='p2' value='' placeholder='再输一次' style='width:100%'/></div>\
</div>\
<div class='bt-form-submit-btn'>\
<button type='button' class='btn btn-danger btn-sm' onclick=\"layer.closeAll()\">关闭</button>\
<button type='button' class='btn btn-success btn-sm' onclick=\"setUserName(1)\">修改</button>\
</div>\
</div>"
})
}
function syncDate(){
var loadT = layer.msg('正在同步时间...',{icon:16,time:0,shade: [0.3, '#000']});
$.post('/config/sync_date','',function(rdata){
layer.close(loadT);
layer.msg(rdata.msg,{icon:rdata.status?1:2});
setTimeout(function(){window.location.reload();},1500);
},'json');
}
function setIPv6() {
var loadT = layer.msg('正在配置,请稍候...', { icon: 16, time: 0, shade: [0.3, '#000'] });
$.post('/config/set_ipv6_status', {}, function (rdata) {
layer.close(loadT);
layer.msg(rdata.msg, {icon:rdata.status?1:2});
setTimeout(function(){window.location.reload();},5000);
},'json');
}
//设置面板SSL
function setPanelSSL(){
var status = $("#sshswitch").prop("checked")==true?1:0;
var msg = $("#panelSSL").attr('checked')?'关闭SSL后,必需使用http协议访问面板,继续吗?':'<a style="font-weight: bolder;font-size: 16px;">危险!此功能不懂别开启!</a>\
<li style="margin-top: 12px;color:red;">必须要用到且了解此功能才决定自己是否要开启!</li>\
<li>面板SSL是自签证书,不被浏览器信任,显示不安全是正常现象</li>\
<li>开启后导致面板不能访问,可以点击下面链接了解解决方法</li>\
<p style="margin-top: 10px;">\
<input type="checkbox" id="checkSSL" /><label style="font-weight: 400;margin: 3px 5px 0px;" for="checkSSL">我已了经解详情,并愿意承担风险</label>\
</p>';
layer.confirm(msg,{title:'设置面板SSL',closeBtn:1,icon:3,area:'550px',cancel:function(){
if(status == 0){
$("#panelSSL").prop("checked",false);
}
else{
$("#panelSSL").prop("checked",true);
}
}},function(){
if(window.location.protocol.indexOf('https') == -1){
if(!$("#checkSSL").prop('checked')){
layer.msg(lan.config.ssl_ps,{icon:2});
return false;
}
}
var loadT = layer.msg('正在安装并设置SSL组件,这需要几分钟时间...',{icon:16,time:0,shade: [0.3, '#000']});
$.post('/config/set_panel_ssl','',function(rdata){
layer.close(loadT);
layer.msg(rdata.msg,{icon:rdata.status?1:5});
if(rdata.status === true){
$.post('/system/restart','',function (rdata) {
layer.close(loadT);
layer.msg(rdata.msg);
setTimeout(function(){
window.location.href = ((window.location.protocol.indexOf('https') != -1)?'http://':'https://') + window.location.host + window.location.pathname;
},3000);
},'json');
}
},'json');
},function(){
if(status == 0){
$("#panelSSL").prop("checked",false);
}
else{
$("#panelSSL").prop("checked",true);
}
});
}
function getPanelSSL(){
var loadT = layer.msg('正在获取证书信息...',{icon:16,time:0,shade: [0.3, '#000']});
$.post('/config/get_panel_ssl',{},function(cert){
layer.close(loadT);
var certBody = '<div class="tab-con">\
<div class="myKeyCon ptb15">\
<div class="ssl-con-key pull-left mr20">密钥(KEY)<br>\
<textarea id="key" class="bt-input-text">'+cert.privateKey+'</textarea>\
</div>\
<div class="ssl-con-key pull-left">证书(PEM格式)<br>\
<textarea id="csr" class="bt-input-text">'+cert.certPem+'</textarea>\
</div>\
<div class="ssl-btn pull-left mtb15" style="width:100%">\
<button class="btn btn-success btn-sm" onclick="savePanelSSL()">保存</button>\
</div>\
</div>\
<ul class="help-info-text c7 pull-left">\
<li>粘贴您的*.key以及*.pem内容,然后保存即可。</li>\
<li>如果浏览器提示证书链不完整,请检查是否正确拼接PEM证书</li><li>PEM格式证书 = 域名证书.crt + 根证书(root_bundle).crt</li>\
</ul>\
</div>'
layer.open({
type: 1,
area: "600px",
title: '自定义面板证书',
closeBtn: 1,
shift: 5,
shadeClose: false,
content:certBody
});
},'json');
}
function savePanelSSL(){
var data = {
privateKey:$("#key").val(),
certPem:$("#csr").val()
}
var loadT = layer.msg('正在安装并设置SSL组件,这需要几分钟时间...',{icon:16,time:0,shade: [0.3, '#000']});
$.post('/config/save_panel_ssl',data,function(rdata){
layer.close(loadT);
if(rdata.status){
layer.closeAll();
}
layer.msg(rdata.msg,{icon:rdata.status?1:2});
},'json');
}
function removeTempAccess(id){
$.post('/config/remove_temp_login', {id:id}, function(rdata){
showMsg(rdata.msg, function(){
setTempAccessReq();
},{ icon: rdata.status ? 1 : 2 }, 2000);
},'json');
}
function getTempAccessLogsReq(id){
$.post('/config/get_temp_login_logs', {id:id}, function(rdata){
var tbody = '';
for (var i = 0; i < rdata.data.length; i++) {
tbody += '<tr>';
tbody += '<td>' + (rdata.data[i]['type']) +'</td>';
tbody += '<td>' + rdata.data[i]['addtime'] +'</td>';
tbody += '<td>'+ rdata.data[i]['log'] +'</td>';
tbody += '</tr>';
}
$('#logs_list').html(tbody);
},'json');
}
function getTempAccessLogs(id){
layer.open({
area: ['700px', '250px'],
title: '临时授权管理',
closeBtn:1,
shift: 0,
type: 1,
content: "<div class=\"pd20\">\
<button class=\"btn btn-success btn-sm refresh_log\">刷新日志</button>\
<div class=\"divtable mt10\">\
<table class=\"table table-hover\">\
<thead>\
<tr><th>操作类型</th><th>操作时间</th><th>日志</th></tr>\
</thead>\
<tbody id=\"logs_list\"></tbody>\
</table>\
</div>\
</div>",
success:function(){
getTempAccessLogsReq(id);
$('.refresh_log').click(function(){
getTempAccessLogsReq(id);
});
}
});
}
function setTempAccessReq(page){
if (typeof(page) == 'undefined'){
page = 1;
}
$.post('/config/get_temp_login', {page:page}, function(rdata){
if ( typeof(rdata.status) !='undefined' && !rdata.status){
showMsg(rdata.msg,function(){
layer.closeAll();
},{icon:2}, 2000);
return;
}
var tbody = '';
for (var i = 0; i < rdata.data.length; i++) {
tbody += '<tr>';
tbody += '<td>' + (rdata.data[i]['login_addr']||'未登陆') +'</td>';
tbody += '<td>';
switch (parseInt(rdata.data[i]['state'])) {
case 0:
tbody += '<a style="color:green;">待使用</a>';
break;
case 1:
tbody += '<a style="color:brown;">已使用</a>';
break;
case -1:
tbody += '<a>已过期</a>';
break;
}
tbody += '</td>';
tbody += '<td>' + (getLocalTime(rdata.data[i]['login_time'])||'未登陆') +'</td>';
tbody += '<td>' + getLocalTime(rdata.data[i]['expire']) +'</td>';
tbody += '<td>';
if (rdata.data[i]['state'] == '1' ){
tbody += '<a class="btlink" onclick="getTempAccessLogs(\''+rdata.data[i]['id']+'\')">操作日志</a>';
} else{
tbody += '<a class="btlink" onclick="removeTempAccess(\''+rdata.data[i]['id']+'\')">删除</a>';
}
tbody += '</td>';
tbody += '</tr>';
}
$('#temp_login_view_tbody').html(tbody);
$('.temp_login_view_page').html(rdata.page);
},'json');
}
function setTempAccess(){
layer.open({
area: ['700px', '250px'],
title: '临时授权管理',
closeBtn:1,
shift: 0,
type: 1,
content: "<div class=\"login_view_table pd20\">\
<button class=\"btn btn-success btn-sm create_temp_login\" >临时访问授权</button>\
<div class=\"divtable mt10\">\
<table class=\"table table-hover\">\
<thead>\
<tr><th>登录IP</th><th>状态</th><th>登录时间</th><th>过期时间</th><th style=\"text-align:right;\">操作</th></tr>\
</thead>\
<tbody id=\"temp_login_view_tbody\"></tbody>\
</table>\
<div class=\"temp_login_view_page page\"></div>\
</div>\
</div>",
success:function(){
setTempAccessReq();
$('.create_temp_login').click(function(){
layer.confirm('<span style="color:red">注意1:滥用临时授权可能导致安全风险。</br>注意2:请勿在公共场合发布临时授权连接</span></br>即将创建临时授权连接,继续吗?',
{
title:'风险提示',
closeBtn:1,
icon:13,
}, function(create_temp_login_layer) {
$.post('/config/set_temp_login', {}, function(rdata){
layer.close(create_temp_login_layer);
setTempAccessReq();
layer.open({
area: '570px',
title: '创建临时授权',
shift: 0,
type: 1,
content: "<div class=\"bt-form create_temp_view pd15\">\
<div class=\"line\">\
<span class=\"tname\">临时授权地址</span>\
<div>\
<textarea id=\"temp_link\" class=\"bt-input-text mr20\" style=\"margin: 0px;width: 500px;height: 50px;line-height: 19px;\"></textarea>\
</div>\
</div>\
<div class=\"line\"><button type=\"submit\" class=\"btn btn-success btn-sm btn-copy-temp-link\" data-clipboard-text=\"\">复制地址</button></div>\
<ul class=\"help-info-text c7 ptb15\">\
<li>临时授权生成后1小时内使用有效,为一次性授权,使用后立即失效</li>\
<li>使用临时授权登录面板后1小时内拥有面板所有权限,请勿在公共场合发布临时授权连接</li>\
<li>授权连接信息仅在此处显示一次,若在使用前忘记,请重新生成</li>\
</ul>\
</div>",
success:function(){
var temp_link = "".concat(location.origin, "/login?tmp_token=").concat(rdata.token);
$('#temp_link').val(temp_link);
copyText(temp_link);
$('.btn-copy-temp-link').click(function(){
copyText(temp_link);
});
}
});
},'json');
});
});
}
});
}
function setBasicAuthTip(callback){
var tip = layer.open({
area: ['500px', '385px'],
title: '开启BasicAuth认证提示',
closeBtn:0,
shift: 0,
type: 1,
content: '<div class="bt-form pd20">\
<div class="mb15">\
<h3 class="layer-info-title">风险操作!此功能不懂请勿开启!</h3>\
</div>\
<ul class="help-info-text c7 explain-describe-list pd15">\
<li style="color: red;">必须要用到且了解此功能才决定自己是否要开启!</li>\
<li>开启后,以任何方式访问面板,将先要求输入BasicAuth用户名和密码</li>\
<li>开启后,能有效防止面板被扫描发现,但并不能代替面板本身的帐号密码</li>\
<li>请牢记BasicAuth密码,一但忘记将无法访问面板</li>\
<li>如忘记密码,可在SSH通过mw命令来关闭BasicAuth验证</li>\
</ul>\
<div class="mt10 plr15 agreement-box" id="checkBasicAuth">\
<input class="bt-input-text mr5" name="agreement" type="checkbox" value="false" id="agreement_more">\
<label for="agreement_more"><span>我已经了解详情,并愿意承担风险</span></label>\
</div>\
</div>',
btn:["确定","取消"],
yes:function(l,index){
is_agree = $('#agreement_more').prop("checked");
if (is_agree){
layer.close(tip);
callback();
}
return is_agree;
},
btn2: function(index, layero){
$('#cfg_basic_auth').prop("checked", false);
}
});
}
function setBasicAuth(){
var basic_auth = $('#cfg_basic_auth').prop("checked");
if (!basic_auth){
setBasicAuthTip(function(){
var tip = layer.open({
area: ['500px', '385px'],
title: '配置BasicAuth认证',
closeBtn:1,
shift: 0,
type: 1,
content: '<div class="bt-form pd20">\
<div class="line">\
<span class="tname">用户名</span>\
<div class="info-r"><input class="bt-input-text mr5" name="basic_user" type="text" placeholder="请设置用户名" style="width: 280px;"></div>\
</div>\
<div class="line">\
<span class="tname">密码</span>\
<div class="info-r"><input class="bt-input-text mr5" name="basic_pwd" type="text" placeholder="请设置密码" style="width: 280px;"></div>\
</div>\
<div class="line">\
<span class="tname"></span>\
<div class="info-r"><button class="btn btn-success btn-sm save_auth_cfg">保存配置</button></div>\
</div>\
<ul class="help-info-text c7">\
<li style="color: red;">注意:请不要在这里使用您的常用密码,这可能导致密码泄漏!</li>\
<li>开启后,以任何方式访问面板,将先要求输入BasicAuth用户名和密码</li>\
<li>开启后,能有效防止面板被扫描发现,但并不能代替面板本身的帐号密码</li>\
<li>请牢记BasicAuth密码,一但忘记将无法访问面板</li><li>如忘记密码,可在SSH通过mw命令来关闭BasicAuth验证</li>\
</ul>\
</div>',
success:function(){
$('.save_auth_cfg').click(function(){
var basic_user = $('input[name="basic_user"]').val();
var basic_pwd = $('input[name="basic_pwd"]').val();
$.post('/config/set_basic_auth', {'basic_user':basic_user,'basic_pwd':basic_pwd},function(rdata){
showMsg(rdata.msg, function(){
window.location.reload();
} ,{icon:rdata.status?1:2}, 2000);
},'json');
});
},
cancel:function(){
$('#cfg_basic_auth').prop("checked", false);
},
});
});
} else {
layer.confirm('关闭BasicAuth认证后,面板登录将不再验证BasicAuth基础认证,这将会导致面板安全性下降,继续操作!',
{btn: ['确定', '取消'], title: "是否关闭BasicAuth认证?", icon:13}, function (index) {
var basic_user = '';
var basic_pwd = '';
$.post('/config/set_basic_auth', {'is_open':'false'},function(rdata){
showMsg(rdata.msg, function(){
layer.close(index);
window.location.reload();
} ,{icon:rdata.status?1:2}, 2000);
},'json');
},function(){
$('#cfg_basic_auth').prop("checked", true);
});
}
}