pull/143/head
midoks 3 years ago
parent 95658a1e6d
commit 8e1d226fec
  1. 2
      class/core/config_api.py
  2. 248
      index.html
  3. 15
      plugins/rsyncd/index.html
  4. 141
      plugins/rsyncd/index.py
  5. 149
      plugins/rsyncd/js/base64.js
  6. 485
      plugins/rsyncd/js/rsyncd.js

@ -17,7 +17,7 @@ class config_api:
# 进行中.
# 兼容主流Linux系统
__version = '0.8.6.11'
__version = '0.8.6.12'
def __init__(self):
pass

File diff suppressed because one or more lines are too long

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

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

@ -38,162 +38,332 @@ function rsPost(method,args,callback, title){
///////////////// ----------------- 发送配置 ---------------- //////////////
function createSendTask(){
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>\
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);
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>-->\
<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 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 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='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 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 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>\
<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 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>\
<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 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>\
<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 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>\
<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 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>\
<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 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>\
<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 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>\
</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();
<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{
$(".conn-user").show();
$(".conn-key").hide();
$('.hour,.minute').hide();
$('.minute-n').show();
if ($('.minute-n input').val() == ''){
$('.minute-n input').val('1');
}
}
});
},
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;
}
$('#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 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 rsyncdSend(){
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>';
}

Loading…
Cancel
Save