mirror of
https://github.com/midoks/mdserver-web.git
synced 2026-10-18 23:45:52 +08:00
rsyncd xx2
This commit is contained in:
@@ -1,9 +1,18 @@
|
||||
<style type="text/css">
|
||||
.overflow_hide {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
</style>
|
||||
<div class="bt-form">
|
||||
<div class="bt-w-main">
|
||||
<div class="bt-w-menu">
|
||||
<p class="bgw" onclick="pluginService('rsyncd');">服务</p>
|
||||
<p onclick="pluginInitD('rsyncd');">自启动</p>
|
||||
<p onclick="rsyncdSend();">发送配置</p>
|
||||
<p onclick="lsyncdSend();">发送配置</p>
|
||||
<p onclick="rsyncdReceive();">接收配置</p>
|
||||
<p onclick="rsRead()">说明</p>
|
||||
</div>
|
||||
@@ -14,7 +23,11 @@
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
resetPluginWinWidth(700);
|
||||
// $.getScript("/plugins/file?name=rsyncd&f=js/base64.js", function() {
|
||||
// console.log('base64 load');
|
||||
// });
|
||||
$.getScript("/plugins/file?name=rsyncd&f=js/rsyncd.js", function() {
|
||||
pluginService('rsyncd');
|
||||
});
|
||||
|
||||
+135
-6
@@ -452,7 +452,12 @@ def cmdRecSecretKey():
|
||||
name = args['name']
|
||||
info = getRecListDataBy(name)
|
||||
|
||||
m = json.dumps(info)
|
||||
secrets_file = info['secrets file']
|
||||
content = mw.readFile(info['secrets file'])
|
||||
pwd = content.strip().split(":")
|
||||
|
||||
m = {"A": info['name'], "B": pwd[1], "C": "873"}
|
||||
m = json.dumps(m)
|
||||
m = m.encode("utf-8")
|
||||
m = base64.b64encode(m)
|
||||
cmd = m.decode("utf-8")
|
||||
@@ -491,37 +496,157 @@ def lsyncdListFindIp(slist, ip):
|
||||
return (False, -1)
|
||||
|
||||
|
||||
def lsyncdListFindName(slist, name):
|
||||
for x in range(len(slist)):
|
||||
if slist[x]["name"] == name:
|
||||
return (True, x)
|
||||
return (False, -1)
|
||||
|
||||
|
||||
def lsyncdList():
|
||||
data = getDefaultConf()
|
||||
send = data['send']
|
||||
return mw.returnJson(True, "设置成功!", send)
|
||||
|
||||
|
||||
def lsyncdGet():
|
||||
import base64
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['name'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
name = args['name']
|
||||
data = getDefaultConf()
|
||||
|
||||
slist = data['send']["list"]
|
||||
res = lsyncdListFindName(slist, name)
|
||||
|
||||
rsync = {
|
||||
'bwlimit': "1024",
|
||||
"compress": "true",
|
||||
"archive": "true",
|
||||
"verbose": "true"
|
||||
}
|
||||
|
||||
info = {
|
||||
"secret_key": '',
|
||||
"ip": '',
|
||||
"path": getServerDir(),
|
||||
'rsync': rsync,
|
||||
'realtime': "true",
|
||||
}
|
||||
if res[0]:
|
||||
list_index = res[1]
|
||||
info = slist[list_index]
|
||||
m = {"A": info['name'], "B": info["password"], "C": "873"}
|
||||
m = json.dumps(m)
|
||||
m = m.encode("utf-8")
|
||||
m = base64.b64encode(m)
|
||||
info['secret_key'] = m.decode("utf-8")
|
||||
return mw.returnJson(True, "OK", info)
|
||||
|
||||
|
||||
def lsyncdDelete():
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['name'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
name = args['name']
|
||||
data = getDefaultConf()
|
||||
slist = data['send']["list"]
|
||||
res = lsyncdListFindName(slist, name)
|
||||
retdata = {}
|
||||
if res[0]:
|
||||
list_index = res[1]
|
||||
slist.pop(list_index)
|
||||
|
||||
data['send']["list"] = slist
|
||||
setDefaultConf(data)
|
||||
return mw.returnJson(True, "OK")
|
||||
|
||||
|
||||
def lsyncdAdd():
|
||||
import base64
|
||||
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['ip', 'name', 'path'])
|
||||
data = checkArgs(args, ['ip', 'conn_type', 'path',
|
||||
'secret_key', 'delay', 'period'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
ip = args['ip']
|
||||
path = args['path']
|
||||
name = args['name']
|
||||
|
||||
conn_type = args['conn_type']
|
||||
secret_key = args['secret_key']
|
||||
delete = args['delete']
|
||||
realtime = args['realtime']
|
||||
delay = args['delay']
|
||||
bwlimit = args['bwlimit']
|
||||
compress = args['compress']
|
||||
period = args['period']
|
||||
|
||||
hour = args['hour']
|
||||
minute = args['minute']
|
||||
minute_n = args['minute-n']
|
||||
|
||||
info = {
|
||||
"name": name,
|
||||
"ip": ip,
|
||||
"path": path
|
||||
"path": path,
|
||||
"delete": delete,
|
||||
"realtime": realtime,
|
||||
'delay': delay,
|
||||
"conn_type": conn_type,
|
||||
"period": period,
|
||||
"hour": hour,
|
||||
"minute": minute,
|
||||
"minute-n": minute_n,
|
||||
}
|
||||
|
||||
if conn_type == "key":
|
||||
try:
|
||||
m = base64.b64decode(secret_key)
|
||||
m = json.loads(m)
|
||||
info['name'] = m['A']
|
||||
info['password'] = m['B']
|
||||
info['port'] = m['C']
|
||||
except Exception as e:
|
||||
return mw.returnJson(False, "接收密钥格式错误!")
|
||||
else:
|
||||
data = checkArgs(args, ['uname'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
info['name'] = args['uname']
|
||||
info['password'] = args['uname']
|
||||
|
||||
rsync = {
|
||||
'bwlimit': bwlimit,
|
||||
"port": info['port'],
|
||||
"compress": compress,
|
||||
"archive": "true",
|
||||
"verbose": "true"
|
||||
}
|
||||
|
||||
info['rsync'] = rsync
|
||||
|
||||
data = getDefaultConf()
|
||||
slist = data['send']["list"]
|
||||
res = lsyncdListFindIp(slist, ip)
|
||||
res = lsyncdListFindName(slist, info['name'])
|
||||
if res[0]:
|
||||
list_index = res[1]
|
||||
slist[list_index] = info
|
||||
else:
|
||||
info["exclude"] = [
|
||||
"/**.upload.tmp",
|
||||
"**/*.log",
|
||||
"**/*.tmp",
|
||||
"**/*.temp"
|
||||
]
|
||||
slist.append(info)
|
||||
|
||||
data['send']["list"] = slist
|
||||
|
||||
setDefaultConf(data)
|
||||
@@ -566,5 +691,9 @@ if __name__ == "__main__":
|
||||
print(lsyncdList())
|
||||
elif func == 'lsyncd_add':
|
||||
print(lsyncdAdd())
|
||||
elif func == 'lsyncd_get':
|
||||
print(lsyncdGet())
|
||||
elif func == 'lsyncd_delete':
|
||||
print(lsyncdDelete())
|
||||
else:
|
||||
print('error')
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
//base64.js
|
||||
function base64_encode(str) {
|
||||
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
var out, i, len;
|
||||
var c1, c2, c3;
|
||||
|
||||
len = str.length;
|
||||
i = 0;
|
||||
out = "";
|
||||
while(i < len) {
|
||||
c1 = str.charCodeAt(i++) & 0xff;
|
||||
if(i == len)
|
||||
{
|
||||
out += base64EncodeChars.charAt(c1 >> 2);
|
||||
out += base64EncodeChars.charAt((c1 & 0x3) << 4);
|
||||
out += "==";
|
||||
break;
|
||||
}
|
||||
c2 = str.charCodeAt(i++);
|
||||
if(i == len)
|
||||
{
|
||||
out += base64EncodeChars.charAt(c1 >> 2);
|
||||
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
|
||||
out += base64EncodeChars.charAt((c2 & 0xF) << 2);
|
||||
out += "=";
|
||||
break;
|
||||
}
|
||||
c3 = str.charCodeAt(i++);
|
||||
out += base64EncodeChars.charAt(c1 >> 2);
|
||||
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
|
||||
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
|
||||
out += base64EncodeChars.charAt(c3 & 0x3F);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function base64_decode(str) {
|
||||
var base64DecodeChars = new Array(
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
|
||||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
|
||||
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
|
||||
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
||||
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
|
||||
var c1, c2, c3, c4;
|
||||
var i, len, out;
|
||||
|
||||
len = str.length;
|
||||
i = 0;
|
||||
out = "";
|
||||
while(i < len) {
|
||||
/* c1 */
|
||||
do {
|
||||
c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
|
||||
} while(i < len && c1 == -1);
|
||||
if(c1 == -1)
|
||||
break;
|
||||
|
||||
/* c2 */
|
||||
do {
|
||||
c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
|
||||
} while(i < len && c2 == -1);
|
||||
if(c2 == -1)
|
||||
break;
|
||||
|
||||
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
|
||||
|
||||
/* c3 */
|
||||
do {
|
||||
c3 = str.charCodeAt(i++) & 0xff;
|
||||
if(c3 == 61)
|
||||
return out;
|
||||
c3 = base64DecodeChars[c3];
|
||||
} while(i < len && c3 == -1);
|
||||
if(c3 == -1)
|
||||
break;
|
||||
|
||||
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
|
||||
|
||||
/* c4 */
|
||||
do {
|
||||
c4 = str.charCodeAt(i++) & 0xff;
|
||||
if(c4 == 61)
|
||||
return out;
|
||||
c4 = base64DecodeChars[c4];
|
||||
} while(i < len && c4 == -1);
|
||||
if(c4 == -1)
|
||||
break;
|
||||
out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function utf16to8(str) {
|
||||
var out, i, len, c;
|
||||
|
||||
out = "";
|
||||
len = str.length;
|
||||
for(i = 0; i < len; i++) {
|
||||
c = str.charCodeAt(i);
|
||||
if ((c >= 0x0001) && (c <= 0x007F)) {
|
||||
out += str.charAt(i);
|
||||
} else if (c > 0x07FF) {
|
||||
out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
|
||||
out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
|
||||
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
|
||||
} else {
|
||||
out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
|
||||
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function utf8to16(str) {
|
||||
var out, i, len, c;
|
||||
var char2, char3;
|
||||
|
||||
out = "";
|
||||
len = str.length;
|
||||
i = 0;
|
||||
while(i < len) {
|
||||
c = str.charCodeAt(i++);
|
||||
switch(c >> 4)
|
||||
{
|
||||
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
|
||||
// 0xxxxxxx
|
||||
out += str.charAt(i-1);
|
||||
break;
|
||||
case 12: case 13:
|
||||
// 110x xxxx 10xx xxxx
|
||||
char2 = str.charCodeAt(i++);
|
||||
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
|
||||
break;
|
||||
case 14:
|
||||
// 1110 xxxx 10xx xxxx 10xx xxxx
|
||||
char2 = str.charCodeAt(i++);
|
||||
char3 = str.charCodeAt(i++);
|
||||
out += String.fromCharCode(((c & 0x0F) << 12) |
|
||||
((char2 & 0x3F) << 6) |
|
||||
((char3 & 0x3F) << 0));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
+344
-159
@@ -38,162 +38,332 @@ function rsPost(method,args,callback, title){
|
||||
|
||||
///////////////// ----------------- 发送配置 ---------------- //////////////
|
||||
|
||||
function createSendTask(){
|
||||
function createSendTask(name = ''){
|
||||
var args = {};
|
||||
args["name"] = name;
|
||||
rsPost('lsyncd_get', args, function(rdata){
|
||||
var rdata = $.parseJSON(rdata.data);
|
||||
var data = rdata.data;
|
||||
console.log(data);
|
||||
|
||||
layer.open({
|
||||
type: 1,
|
||||
area: ['600px','500px'],
|
||||
title: "创建发送任务",
|
||||
closeBtn: 1,
|
||||
shift: 0,
|
||||
shadeClose: false,
|
||||
btn: ['提交','取消'],
|
||||
content:"<form class='bt-form pd20' id='fromServerPath' accept-charset='utf-8'>\
|
||||
<div class='line'>\
|
||||
<span class='tname'>服务器IP</span>\
|
||||
<div class='info-r c4'>\
|
||||
<input class='bt-input-text' type='text' name='ip' placeholder='请输入接收服务器IP' value='' style='width:310px' />\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line'>\
|
||||
<span class='tname'>同步目录</span>\
|
||||
<div class='info-r c4'>\
|
||||
<input id='inputPath' class='bt-input-text mr5' type='text' name='path' value='/www/wwwroot' placeholder='请选择同步目录' style='width:310px' /><span class='glyphicon glyphicon-folder-open cursor' onclick='changePath(\"inputPath\")'></span>\
|
||||
<span data-toggle='tooltip' data-placement='top' title='【同步目录】若不以/结尾,则表示将数据同步到二级目录,一般情况下目录路径请以/结尾' class='bt-ico-ask' style='cursor: pointer;'>?</span>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line'>\
|
||||
<span class='tname'>同步方式</span>\
|
||||
<div class='info-r c4'>\
|
||||
<select class='bt-input-text' name='delete' style='width:100px'>\
|
||||
<option value='false'>增量</option>\
|
||||
<option value='true'>完全</option>\
|
||||
</select>\
|
||||
<span data-toggle='tooltip' data-placement='top' title='【同步方式】增量: 数据更改/增加时同步,且只追加和替换文件\n【同步方式】完全: 保持两端的数据与目录结构的一致性,会同步删除、追加和替换文件和目录' class='bt-ico-ask' style='cursor: pointer;'>?</span>\
|
||||
<span style='margin-left: 20px;margin-right: 10px;'>同步周期</span>\
|
||||
<select class='bt-input-text synchronization' name='realtime' style='width:100px'>\
|
||||
<option value='true'>实时同步</option>\
|
||||
<option value='false'>定时同步</option>\
|
||||
</select>\
|
||||
</div>\
|
||||
</div>\
|
||||
<!--<div class='line'>\
|
||||
<span class='tname'>同步周期</span>\
|
||||
<div class='info-r c4'>\
|
||||
<select class='bt-input-text synchronization' name='realtime' style='width:100px'>\
|
||||
<option value='true'>实时同步</option>\
|
||||
<option value='false'>定时同步</option>\
|
||||
</select>\
|
||||
</div>\
|
||||
</div>-->\
|
||||
<div class='line' id='period' style='height:45px;display:none;'>\
|
||||
<span class='tname'>定时周期</span>\
|
||||
<div class='info-r c4'>\
|
||||
<select class='bt-input-text pull-left mr20' name='period' style='width:100px;display:none;'>\
|
||||
<option value='day' >每天</option>\
|
||||
<option value='minute-n' >N分钟</option>\
|
||||
</select>\
|
||||
<div class='plan_hms pull-left mr20 bt-input-text hour' style='display:none;'>\
|
||||
<span><input type='number' name='hour' value='0' maxlength='2' max='23' min='0'></span>\
|
||||
<span class='name'>小时</span>\
|
||||
</div>\
|
||||
<div class='plan_hms pull-left mr20 bt-input-text minute' style='display:none;'>\
|
||||
<span><input type='number' name='minute' value='0' maxlength='2' max='59' min='0'></span>\
|
||||
<span class='name'>分钟</span>\
|
||||
</div>\
|
||||
<div class='plan_hms pull-left mr20 bt-input-text minute-n' style='display:none;'>\
|
||||
<span><input type='number' name='minute-n' value='0' maxlength='2' max='59' min='0'></span>\
|
||||
<span class='name'>分钟</span>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line'>\
|
||||
<span class='tname'>限速</span>\
|
||||
<div class='info-r c4'>\
|
||||
<input class='bt-input-text' type='number' name='bwlimit' min='0' value='1000' style='width:100px' /> KB\
|
||||
<span data-toggle='tooltip' data-placement='top' title='【限速】限制数据同步任务的速度,防止因同步数据导致带宽跑高' class='bt-ico-ask' style='cursor: pointer;'>?</span>\
|
||||
<span style='margin-left: 29px;margin-right: 10px;'>延迟</span><input class='bt-input-text' min='0' type='number' name='delay' value='3' style='width:100px' /> 秒\
|
||||
<span data-toggle='tooltip' data-placement='top' title='【延迟】在延迟时间周期内仅记录不同步,到达周期后一次性同步数据,以节省开销' class='bt-ico-ask' style='cursor: pointer;'>?</span>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line'>\
|
||||
<span class='tname'>连接方式</span>\
|
||||
<div class='info-r c4'>\
|
||||
<select class='bt-input-text' name='conn_type' style='width:100px'>\
|
||||
<option value='key'>密钥</option>\
|
||||
<option value='user'>帐号</option>\
|
||||
</select>\
|
||||
<span style='margin-left: 45px;margin-right: 10px;'>压缩传输</span>\
|
||||
<select class='bt-input-text' name='compress' style='width:100px'>\
|
||||
<option value='true'>开启</option>\
|
||||
<option value='false'>关闭</option>\
|
||||
</select>\
|
||||
<span data-toggle='tooltip' data-placement='top' title='【压缩传输】开启后可减少带宽开销,但会增加CPU开销,如带宽充足,建议关闭此选项' class='bt-ico-ask' style='cursor: pointer;'>?</span>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line conn-key'>\
|
||||
<span class='tname'>接收密钥</span>\
|
||||
<div class='info-r c4'>\
|
||||
<textarea id='mainDomain' class='bt-input-text' name='secret_key' style='width:310px;height:75px;line-height:22px' placeholder='此密钥为 接收配置[接收账号] 的密钥'></textarea>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line conn-user'>\
|
||||
<span class='tname'>用户名</span>\
|
||||
<div class='info-r c4'>\
|
||||
<input class='bt-input-text' type='text' name='u_user' min='0' value='' style='width:310px' />\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line conn-user'>\
|
||||
<span class='tname'>密码</span>\
|
||||
<div class='info-r c4'>\
|
||||
<input class='bt-input-text' type='text' name='u_pass' min='0' value='' style='width:310px' />\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line conn-user'>\
|
||||
<span class='tname'>端口</span>\
|
||||
<div class='info-r c4'>\
|
||||
<input class='bt-input-text' type='number' name='u_port' min='0' value='' style='width:310px' />\
|
||||
</div>\
|
||||
</div>\
|
||||
<ul class=\"help-info-text c7\">\
|
||||
</ul>\
|
||||
</form>",
|
||||
success:function(){
|
||||
$('[data-toggle="tooltip"]').tooltip();
|
||||
|
||||
$(".conn-user").hide();
|
||||
$("select[name='conn_type']").change(function(){
|
||||
if($(this).val() == 'key'){
|
||||
$(".conn-user").hide();
|
||||
$(".conn-key").show();
|
||||
}else{
|
||||
$(".conn-user").show();
|
||||
$(".conn-key").hide();
|
||||
}
|
||||
});
|
||||
},
|
||||
yes:function(){
|
||||
var args = {};
|
||||
args['ip'] = $('input[name="ip"]').val();
|
||||
args['path'] = $('input[name="path"]').val();
|
||||
args['delete'] = $('input[name="delete"]').val();
|
||||
args['realtime'] = $('input[name="realtime"]').val();
|
||||
|
||||
args['bwlimit'] = $('input[name="bwlimit"]').val();
|
||||
args['conn_type'] = $('input[name="conn_type"]').val();
|
||||
args['compress'] = $('input[name="compress"]').val();
|
||||
|
||||
|
||||
console.log(args);
|
||||
rsPost('lsyncd_add', args, function(rdata){
|
||||
console.log(rdata);
|
||||
});
|
||||
return false;
|
||||
var layerName = '创建';
|
||||
if (name!=''){
|
||||
layerName = '编辑';
|
||||
}
|
||||
|
||||
var compress_true = "";
|
||||
var compress_false = "";
|
||||
if (data['rsync']['compress'] == 'true'){
|
||||
compress_true = "selected";
|
||||
compress_false = "";
|
||||
} else {
|
||||
compress_true = "";
|
||||
compress_false = "selected";
|
||||
}
|
||||
|
||||
|
||||
var delete_true = "";
|
||||
var delete_false = "";
|
||||
if (data['delete'] == 'false'){
|
||||
delete_true = "selected";
|
||||
delete_false = "";
|
||||
} else {
|
||||
delete_true = "";
|
||||
delete_false = "selected";
|
||||
}
|
||||
|
||||
|
||||
var realtime_true = "";
|
||||
var realtime_false = "";
|
||||
if (data['realtime'] == 'true'){
|
||||
realtime_true = "selected";
|
||||
realtime_false = "";
|
||||
} else {
|
||||
realtime_true = "";
|
||||
realtime_false = "selected";
|
||||
}
|
||||
|
||||
|
||||
var period_day = "";
|
||||
var period_minute_n = "";
|
||||
if (data['period'] == 'day'){
|
||||
period_day = "selected";
|
||||
period_minute_n = "";
|
||||
} else {
|
||||
period_day = "";
|
||||
period_minute_n = "selected";
|
||||
}
|
||||
|
||||
|
||||
var layerID = layer.open({
|
||||
type: 1,
|
||||
area: ['600px','500px'],
|
||||
title: layerName+"发送任务",
|
||||
closeBtn: 1,
|
||||
shift: 0,
|
||||
shadeClose: false,
|
||||
btn: ['提交','取消'],
|
||||
content:"<form class='bt-form pd20' id='fromServerPath' accept-charset='utf-8'>\
|
||||
<div class='line'>\
|
||||
<span class='tname'>服务器IP</span>\
|
||||
<div class='info-r c4'>\
|
||||
<input class='bt-input-text' type='text' name='ip' placeholder='请输入接收服务器IP' value='"+data["ip"]+"' style='width:310px' />\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line'>\
|
||||
<span class='tname'>同步目录</span>\
|
||||
<div class='info-r c4'>\
|
||||
<input id='inputPath' class='bt-input-text mr5' type='text' name='path' value='/www/wwwroot' placeholder='请选择同步目录' style='width:310px' /><span class='glyphicon glyphicon-folder-open cursor' onclick='changePath(\"inputPath\")'></span>\
|
||||
<span data-toggle='tooltip' data-placement='top' title='【同步目录】若不以/结尾,则表示将数据同步到二级目录,一般情况下目录路径请以/结尾' class='bt-ico-ask' style='cursor: pointer;'>?</span>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line'>\
|
||||
<span class='tname'>同步方式</span>\
|
||||
<div class='info-r c4'>\
|
||||
<select class='bt-input-text' name='delete' style='width:100px'>\
|
||||
<option value='false' "+delete_true+">增量</option>\
|
||||
<option value='true' "+delete_false+">完全</option>\
|
||||
</select>\
|
||||
<span data-toggle='tooltip' data-placement='top' title='【同步方式】增量: 数据更改/增加时同步,且只追加和替换文件\n【同步方式】完全: 保持两端的数据与目录结构的一致性,会同步删除、追加和替换文件和目录' class='bt-ico-ask' style='cursor: pointer;'>?</span>\
|
||||
<span style='margin-left: 20px;margin-right: 10px;'>同步周期</span>\
|
||||
<select class='bt-input-text synchronization' name='realtime' style='width:100px'>\
|
||||
<option value='true' "+realtime_true+">实时同步</option>\
|
||||
<option value='false' "+realtime_false+">定时同步</option>\
|
||||
</select>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line' id='period' style='height:45px;display:none;'>\
|
||||
<span class='tname'>定时周期</span>\
|
||||
<div class='info-r c4'>\
|
||||
<select class='bt-input-text pull-left mr20' name='period' style='width:100px;'>\
|
||||
<option value='day' "+period_day+">每天</option>\
|
||||
<option value='minute-n' "+period_minute_n+">N分钟</option>\
|
||||
</select>\
|
||||
<div class='plan_hms pull-left mr20 bt-input-text hour'>\
|
||||
<span><input class='bt-input-text' type='number' name='hour' value='"+data["hour"]+"' maxlength='2' max='23' min='0'></span>\
|
||||
<span class='name'>小时</span>\
|
||||
</div>\
|
||||
<div class='plan_hms pull-left mr20 bt-input-text minute'>\
|
||||
<span><input class='bt-input-text' type='number' name='minute' value='"+data["minute"]+"' maxlength='2' max='59' min='0'></span>\
|
||||
<span class='name'>分钟</span>\
|
||||
</div>\
|
||||
<div class='plan_hms pull-left mr20 bt-input-text minute-n' style='display:none;'>\
|
||||
<span><input class='bt-input-text' type='number' name='minute-n' value='"+data["minute-n"]+"' maxlength='2' max='59' min='0'></span>\
|
||||
<span class='name'>分钟</span>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line'>\
|
||||
<span class='tname'>限速</span>\
|
||||
<div class='info-r c4'>\
|
||||
<input class='bt-input-text' type='number' name='bwlimit' min='0' value='1024' style='width:100px' /> KB\
|
||||
<span data-toggle='tooltip' data-placement='top' title='【限速】限制数据同步任务的速度,防止因同步数据导致带宽跑高' class='bt-ico-ask' style='cursor: pointer;'>?</span>\
|
||||
<span style='margin-left: 29px;margin-right: 10px;'>延迟</span><input class='bt-input-text' min='0' type='number' name='delay' value='3' style='width:100px' /> 秒\
|
||||
<span data-toggle='tooltip' data-placement='top' title='【延迟】在延迟时间周期内仅记录不同步,到达周期后一次性同步数据,以节省开销' class='bt-ico-ask' style='cursor: pointer;'>?</span>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line'>\
|
||||
<span class='tname'>连接方式</span>\
|
||||
<div class='info-r c4'>\
|
||||
<select class='bt-input-text' name='conn_type' style='width:100px'>\
|
||||
<option value='key'>密钥</option>\
|
||||
<option value='user'>帐号</option>\
|
||||
</select>\
|
||||
<span style='margin-left: 45px;margin-right: 10px;'>压缩传输</span>\
|
||||
<select class='bt-input-text' name='compress' style='width:100px'>\
|
||||
<option value='true' "+compress_true+">开启</option>\
|
||||
<option value='false' "+compress_false+">关闭</option>\
|
||||
</select>\
|
||||
<span data-toggle='tooltip' data-placement='top' title='【压缩传输】开启后可减少带宽开销,但会增加CPU开销,如带宽充足,建议关闭此选项' class='bt-ico-ask' style='cursor: pointer;'>?</span>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line conn-key'>\
|
||||
<span class='tname'>接收密钥</span>\
|
||||
<div class='info-r c4'>\
|
||||
<textarea id='mainDomain' class='bt-input-text' name='secret_key' style='width:310px;height:75px;line-height:22px' placeholder='此密钥为 接收配置[接收账号] 的密钥'>"+data['secret_key']+"</textarea>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line conn-user'>\
|
||||
<span class='tname'>用户名</span>\
|
||||
<div class='info-r c4'>\
|
||||
<input class='bt-input-text' type='text' name='u_user' min='0' value='"+data["name"]+"' style='width:310px' />\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line conn-user'>\
|
||||
<span class='tname'>密码</span>\
|
||||
<div class='info-r c4'>\
|
||||
<input class='bt-input-text' type='text' name='u_pass' min='0' value='"+data["password"]+"' style='width:310px' />\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='line conn-user'>\
|
||||
<span class='tname'>端口</span>\
|
||||
<div class='info-r c4'>\
|
||||
<input class='bt-input-text' type='number' name='u_port' min='0' value='"+data["rsync"]["port"]+"' style='width:310px' />\
|
||||
</div>\
|
||||
</div>\
|
||||
<ul class=\"help-info-text c7\">\
|
||||
</ul>\
|
||||
</form>",
|
||||
success:function(){
|
||||
$('[data-toggle="tooltip"]').tooltip();
|
||||
|
||||
$(".conn-user").hide();
|
||||
$("select[name='conn_type']").change(function(){
|
||||
if($(this).val() == 'key'){
|
||||
$(".conn-user").hide();
|
||||
$(".conn-key").show();
|
||||
}else{
|
||||
$(".conn-user").show();
|
||||
$(".conn-key").hide();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
var selVal = $('.synchronization option:selected').val();
|
||||
if (selVal == "false"){
|
||||
$('#period').show();
|
||||
}else{
|
||||
$('#period').hide();
|
||||
$('.hour input,.minute input').val('0');
|
||||
$('.minute-n input').val('1');
|
||||
}
|
||||
$('.synchronization').change(function(event) {
|
||||
var selVal = $('.synchronization option:selected').val();
|
||||
if (selVal == "false"){
|
||||
$('#period').show();
|
||||
}else{
|
||||
$('#period').hide();
|
||||
$('.hour input,.minute input').val('0');
|
||||
$('.minute-n input').val('1');
|
||||
}
|
||||
});
|
||||
|
||||
$("select[name='delete']").change(function(){
|
||||
if($(this).val() == 'true'){
|
||||
var mpath = $('input[name="path"]').val();
|
||||
var msg = '<div><span style="color:orangered;">警告:您选择了完全同步,将会使本机同步与目标机器指定目录的文件保持一致,'
|
||||
+'<br />请确认目录设置是否有误,一但设置错误,可能导致目标机器的目录文件被删除!</span>'
|
||||
+'<br /><br /> <span style="color:red;">注意: 同步程序将本机目录:'
|
||||
+mpath+'的所有数据同步到目标服务器,若目标服务器的同步目录存在其它文件将被删除!</span> <br /><br /> 已了解风险,请按确定继续</div>';
|
||||
|
||||
layer.confirm(msg,{title:'数据安全风险警告',icon:2,closeBtn: 1,shift: 5,
|
||||
btn2:function(){
|
||||
setTimeout(function(){$($("select[name='delete']").children("option")[0]).prop('selected',true);},100);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
var selVal = $('#period select option:selected').val();
|
||||
if (selVal == 'day'){
|
||||
$('.hour,.minute').show();
|
||||
if ($('.hour input').val() == ''){
|
||||
$('.hour input,.minute input').val('0');
|
||||
}
|
||||
$('.minute-n').hide();
|
||||
}else{
|
||||
$('.hour,.minute').hide();
|
||||
$('.minute-n').show();
|
||||
if ($('.minute-n input').val() == ''){
|
||||
$('.minute-n input').val('1');
|
||||
}
|
||||
}
|
||||
$('#period').change(function(event) {
|
||||
var selVal = $('#period select option:selected').val();
|
||||
if (selVal == 'day'){
|
||||
$('.hour,.minute').show();
|
||||
if ($('.hour input').val() == ''){
|
||||
$('.hour input,.minute input').val('0');
|
||||
}
|
||||
$('.minute-n').hide();
|
||||
}else{
|
||||
$('.hour,.minute').hide();
|
||||
$('.minute-n').show();
|
||||
if ($('.minute-n input').val() == ''){
|
||||
$('.minute-n input').val('1');
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
yes:function(index){
|
||||
var args = {};
|
||||
var conn_type = $("select[name='conn_type']").val();
|
||||
|
||||
if(conn_type == 'key'){
|
||||
if ( $('textarea[name="secret_key"]').val() != ''){
|
||||
args['secret_key'] = $('textarea[name="secret_key"]').val();
|
||||
} else {
|
||||
layer.msg('请输入接收密钥!');
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
args['sname'] = $("input[name='u_user']").val();
|
||||
args['password'] = $("input[name='u_pass']").val();
|
||||
var port = Number($("input[name='u_port']").val());
|
||||
args['port'] = port;
|
||||
if (!args['sname'] || !args['password'] || !args['port']){
|
||||
layer.msg('请输入帐号、密码、端口信息');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if ($('input[name="ip"]').val() == ''){
|
||||
layer.msg('请输入服务器IP地址!');
|
||||
return false;
|
||||
}
|
||||
|
||||
args['sname'] = $("input[name='u_user']").val();
|
||||
args['password'] = $("input[name='u_pass']").val();
|
||||
var port = Number($("input[name='u_port']").val());
|
||||
args['port'] = port;
|
||||
|
||||
|
||||
args['ip'] = $('input[name="ip"]').val();
|
||||
args['path'] = $('input[name="path"]').val();
|
||||
args['delete'] = $('select[name="delete"]').val();
|
||||
args['realtime'] = $('select[name="realtime"]').val();
|
||||
args['delay'] = $('input[name="delay"]').val();
|
||||
|
||||
args['bwlimit'] = $('input[name="bwlimit"]').val();
|
||||
args['conn_type'] = $('select[name="conn_type"]').val();
|
||||
args['compress'] = $('select[name="compress"]').val();
|
||||
|
||||
args['period'] = $('select[name="period"]').val();
|
||||
args['hour'] = $('input[name="hour"]').val();
|
||||
args['minute'] = $('input[name="minute"]').val();
|
||||
args['minute-n'] = $('input[name="minute-n"]').val();
|
||||
|
||||
rsPost('lsyncd_add', args, function(rdata){
|
||||
var rdata = $.parseJSON(rdata.data);
|
||||
layer.msg(rdata.msg,{icon:rdata.status?1:2,time:2000,shade: [0.3, '#000']});
|
||||
|
||||
if (rdata.status){
|
||||
setTimeout(function(){layer.close(index);},2000);
|
||||
return;
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function rsyncdSend(){
|
||||
function lsyncdDelete(name){
|
||||
safeMessage('删除['+name+']', '您真的要删除['+name+']吗?', function(){
|
||||
var args = {};
|
||||
args['name'] = name;
|
||||
rsPost('lsyncd_delete', args, function(rdata){
|
||||
var rdata = $.parseJSON(rdata.data);
|
||||
layer.msg(rdata.msg,{icon:rdata.status?1:2,time:2000,shade: [0.3, '#000']});
|
||||
setTimeout(function(){lsyncdSend();},2000);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function lsyncdSend(){
|
||||
rsPost('lsyncd_list', '', function(data){
|
||||
var rdata = $.parseJSON(data.data);
|
||||
console.log(rdata);
|
||||
@@ -206,7 +376,6 @@ function rsyncdSend(){
|
||||
|
||||
con += '<div style="padding-top:1px;">\
|
||||
<button class="btn btn-success btn-sm" onclick="createSendTask();">创建发送任务</button>\
|
||||
<button class="btn btn-success btn-sm" onclick="rsyncdLog();">创建本地同步</button>\
|
||||
<button class="btn btn-success btn-sm" onclick="rsyncdLog();">日志</button>\
|
||||
</div>';
|
||||
|
||||
@@ -222,19 +391,35 @@ function rsyncdSend(){
|
||||
|
||||
con += '<tbody>';
|
||||
|
||||
|
||||
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
var mode = '增量';
|
||||
if (list[i]['delete'] == 'true'){
|
||||
mode = '完全';
|
||||
} else {
|
||||
mode = '增量';
|
||||
}
|
||||
|
||||
var period = "实时";
|
||||
if (list[i]['realtime'] == 'true'){
|
||||
period = '实时';
|
||||
} else {
|
||||
period = '定时';
|
||||
}
|
||||
|
||||
con += '<tr>'+
|
||||
'<td>' + "dd"+'</td>' +
|
||||
'<td><a class="btlink" onclick="openPath(\''+list[i]['path']+'\')">' + list[i]['path']+'</a></td>' +
|
||||
'<td>' + list[i]['name']+'</td>' +
|
||||
'<td><a class="btlink overflow_hide" style="width:40px;" onclick="openPath(\''+list[i]['path']+'\')">' + list[i]['path']+'</a></td>' +
|
||||
'<td>' + list[i]['ip']+":"+"cc"+'</td>' +
|
||||
'<td>' + "增量"+'</td>' +
|
||||
'<td>' + "实时" +'</td>' +
|
||||
'<td>' + mode+'</td>' +
|
||||
'<td>' + period +'</td>' +
|
||||
'<td>\
|
||||
<a class="btlink" onclick="cmdReceive(\''+list[i]['name']+'\')">同步</a>\
|
||||
| <a class="btlink" onclick="delReceive(\''+list[i]['name']+'\')">日志</a>\
|
||||
| <a class="btlink" onclick="delReceive(\''+list[i]['name']+'\')">过滤器</a>\
|
||||
| <a class="btlink" onclick="delReceive(\''+list[i]['name']+'\')">编辑</a>\
|
||||
| <a class="btlink" onclick="delReceive(\''+list[i]['name']+'\')">删除</a>\
|
||||
<a class="btlink" onclick="lsyncdRun(\''+list[i]['name']+'\')">同步</a>\
|
||||
| <a class="btlink" onclick="lsyncdLog(\''+list[i]['name']+'\')">日志</a>\
|
||||
| <a class="btlink" onclick="lsyncdExclude(\''+list[i]['name']+'\')">过滤器</a>\
|
||||
| <a class="btlink" onclick="createSendTask(\''+list[i]['name']+'\')">编辑</a>\
|
||||
| <a class="btlink" onclick="lsyncdDelete(\''+list[i]['name']+'\')">删除</a>\
|
||||
</td>\
|
||||
</tr>';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user