diff --git a/plugins/rsyncd/conf/config.json b/plugins/rsyncd/conf/config.json
new file mode 100644
index 000000000..2e301d90e
--- /dev/null
+++ b/plugins/rsyncd/conf/config.json
@@ -0,0 +1,26 @@
+{
+ "receive":{
+ "default":{
+ "uid": "root",
+ "use chroot": "no",
+ "dont compress": "*.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 *.mp4 *.avi *.swf *.rar",
+ "hosts allow": "",
+ "max connections": 200,
+ "gid": "root",
+ "timeout": 600,
+ "pid file": "/var/run/rsyncd.pid",
+ "log file": "/var/log/rsyncd.log",
+ "port": 873
+ },
+ "list":[]
+ },
+ "send":{
+ "default":{
+ "logfile": "/www/server/rsyncd/lsyncd.log",
+ "inotifyMode": "CloseWrite",
+ "maxProcesses": "8",
+ "statusFile": "/www/server/rsyncd/lsyncd.status"
+ },
+ "list":[]
+ }
+}
\ No newline at end of file
diff --git a/plugins/rsyncd/index.py b/plugins/rsyncd/index.py
index 42436a931..993915142 100755
--- a/plugins/rsyncd/index.py
+++ b/plugins/rsyncd/index.py
@@ -202,12 +202,36 @@ def initDSend():
return file_bin
+def getDefaultConf():
+ path = getServerDir() + "/config.json"
+ data = mw.readFile(path)
+ data = json.loads(data)
+ return data
+
+
+def setDefaultConf(data):
+ path = getServerDir() + "/config.json"
+ mw.writeFile(path, json.dumps(data))
+ return True
+
+
+def initConfigJson():
+ path = getServerDir() + "/config.json"
+ tpl = getPluginDir() + "/conf/config.json"
+ if not os.path.exists(path):
+ data = mw.readFile(tpl)
+ data = json.loads(data)
+ mw.writeFile(path, json.dumps(data))
+
+
def initDreplace():
initDSend()
# conf
file_bin = initDReceive()
+ initConfigJson()
+
return file_bin
@@ -299,23 +323,18 @@ def getRecListData():
return ret_list
+def getRecListDataBy(name):
+ l = getRecListData()
+ for x in range(len(l)):
+ if name == l[x]["name"]:
+ return l[x]
+
+
def getRecList():
ret_list = getRecListData()
return mw.returnJson(True, 'ok', ret_list)
-def getUPwdList():
- pwd_path = appConfPwd()
- pwd_content = mw.readFile(pwd_path)
- plist = pwd_content.strip().split('\n')
- plist_len = len(plist)
- data = {}
- for x in range(plist_len):
- tmp = plist[x].split(':')
- data[tmp[0]] = tmp[1]
- return data
-
-
def addRec():
args = getArgs()
data = checkArgs(args, ['name', 'path', 'pwd', 'ps'])
@@ -327,6 +346,8 @@ def addRec():
args_path = args['path']
args_ps = args['ps']
+ delRecBy(args_name)
+
auth_path = appAuthPwd(args_name)
pwd_content = args_name + ':' + args_pwd + "\n"
mw.writeFile(auth_path, pwd_content)
@@ -343,69 +364,168 @@ def addRec():
con += 'secrets file = ' + auth_path + "\n"
con += 'read only = false'
- content = content + con
+ content = content.strip() + "\n" + con
mw.writeFile(path, content)
return mw.returnJson(True, '添加成功')
+def getRec():
+ args = getArgs()
+ data = checkArgs(args, ['name'])
+ if not data[0]:
+ return data[1]
+
+ name = args['name']
+
+ if name == "":
+ tmp = {}
+ tmp["name"] = ""
+ tmp["path"] = mw.getWwwDir()
+ tmp["pwd"] = mw.getRandomString(16)
+ return mw.returnJson(True, 'OK', tmp)
+
+ data = getRecListDataBy(name)
+
+ content = mw.readFile(data['secrets file'])
+ pwd = content.strip().split(":")
+ data['pwd'] = pwd[1]
+ return mw.returnJson(True, 'OK', data)
+
+
+def delRecBy(name):
+ try:
+ path = appConf()
+ content = mw.readFile(path)
+
+ reclist = getRecListData()
+ ret_list_len = len(reclist)
+ is_end = False
+ next_name = ''
+ for x in range(ret_list_len):
+ tmp = reclist[x]
+ if tmp['name'] == name:
+
+ secrets_file = tmp['secrets file']
+ tp = os.path.dirname(secrets_file)
+ if os.path.exists(tp):
+ mw.execShell("rm -rf " + tp)
+
+ if x + 1 == ret_list_len:
+ is_end = True
+ else:
+ next_name = reclist[x + 1]['name']
+ reg = ''
+ if is_end:
+ reg = '\[' + name + '\]\s*(.*)'
+ else:
+ reg = '\[' + name + '\]\s*(.*)\s*\[' + next_name + '\]'
+
+ conre = re.search(reg, content, re.S)
+ content = content.replace(
+ "[" + name + "]\n" + conre.groups()[0], '')
+ mw.writeFile(path, content)
+ except Exception as e:
+ return False
+ return True
+
+
def delRec():
args = getArgs()
data = checkArgs(args, ['name'])
if not data[0]:
return data[1]
- args_name = args['name']
-
- cmd = "sed -i '_bak' '/" + args_name + "/d' " + appConfPwd()
- mw.execShell(cmd)
-
- try:
-
- path = appConf()
- content = mw.readFile(path)
-
- ret_list = getRecListData()
- ret_list_len = len(ret_list)
- is_end = False
- next_name = ''
- for x in range(ret_list_len):
- tmp = ret_list[x]
- if tmp['name'] == args_name:
- if x + 1 == ret_list_len:
- is_end = True
- else:
- next_name = ret_list[x + 1]['name']
- reg = ''
- if is_end:
- reg = '\[' + args_name + '\]\s*(.*)'
- else:
- reg = '\[' + args_name + '\]\s*(.*)\s*\[' + next_name + '\]'
-
- conre = re.search(reg, content, re.S)
- content = content.replace(
- "[" + args_name + "]\n" + conre.groups()[0], '')
- mw.writeFile(path, content)
+ name = args['name']
+ ok = delRecBy(name)
+ if ok:
return mw.returnJson(True, '删除成功!')
- except Exception as e:
- return mw.returnJson(False, '删除失败!')
+ return mw.returnJson(False, '删除失败!')
-def cmdRec():
+def cmdRecSecretKey():
+ import base64
+
args = getArgs()
data = checkArgs(args, ['name'])
if not data[0]:
return data[1]
- an = args['name']
- pwd_list = getUPwdList()
- ip = mw.getLocalIp()
+ name = args['name']
+ info = getRecListDataBy(name)
- cmd = 'echo "' + pwd_list[an] + '" > /tmp/p.pass' + "
"
- cmd += 'chmod 600 /tmp/p.pass' + "
"
- cmd += 'rsync -arv --password-file=/tmp/p.pass --progress --delete /project ' + \
- an + '@' + ip + '::' + an
+ m = json.dumps(info)
+ m = m.encode("utf-8")
+ m = base64.b64encode(m)
+ cmd = m.decode("utf-8")
return mw.returnJson(True, 'OK!', cmd)
-# rsyncdReceive
+
+def cmdRecCmd():
+ args = getArgs()
+ data = checkArgs(args, ['name'])
+ if not data[0]:
+ return data[1]
+
+ name = args['name']
+ info = getRecListDataBy(name)
+ ip = mw.getLocalIp()
+
+ content = mw.readFile(info['secrets file'])
+ pwd = content.strip().split(":")
+
+ tmp_name = '/tmp/' + name + '.pass'
+
+ cmd = 'echo "' + pwd[1] + '" > ' + tmp_name + '
'
+ cmd += 'chmod 600 ' + tmp_name + '
'
+ cmd += 'rsync -arv --password-file=' + tmp_name + \
+ ' --progress --delete /project ' + name + '@' + ip + '::' + name
+ return mw.returnJson(True, 'OK!', cmd)
+
+
+# ----------------------------- rsyncdSend start -------------------------
+
+
+def lsyncdListFindIp(slist, ip):
+ for x in range(len(slist)):
+ if slist[x]["ip"] == ip:
+ return (True, x)
+ return (False, -1)
+
+
+def lsyncdList():
+ data = getDefaultConf()
+ send = data['send']
+ return mw.returnJson(True, "设置成功!", send)
+
+
+def lsyncdAdd():
+
+ args = getArgs()
+ data = checkArgs(args, ['ip', 'name'])
+ if not data[0]:
+ return data[1]
+
+ ip = args['ip']
+ path = args['path']
+
+ info = {
+ "ip": ip,
+ "path": path
+ }
+
+ data = getDefaultConf()
+ slist = data['send']["list"]
+ res = lsyncdListFindIp(slist, ip)
+ if res[0]:
+ list_index = res[1]
+ slist[list_index] = info
+ else:
+ slist.append(info)
+ data['send']["list"] = slist
+
+ setDefaultConf(data)
+ return mw.returnJson(True, "设置成功!")
+
+
if __name__ == "__main__":
func = sys.argv[1]
if func == 'status':
@@ -434,7 +554,15 @@ if __name__ == "__main__":
print(addRec())
elif func == 'del_rec':
print(delRec())
- elif func == 'cmd_rec':
- print(cmdRec())
+ elif func == 'get_rec':
+ print(getRec())
+ elif func == 'cmd_rec_secret_key':
+ print(cmdRecSecretKey())
+ elif func == 'cmd_rec_cmd':
+ print(cmdRecCmd())
+ elif func == 'lsyncd_list':
+ print(lsyncdList())
+ elif func == 'lsyncd_add':
+ print(lsyncdAdd())
else:
print('error')
diff --git a/plugins/rsyncd/js/rsyncd.js b/plugins/rsyncd/js/rsyncd.js
index 04d86cb8d..0f83aa026 100755
--- a/plugins/rsyncd/js/rsyncd.js
+++ b/plugins/rsyncd/js/rsyncd.js
@@ -38,42 +38,204 @@ function rsPost(method,args,callback, title){
///////////////// ----------------- 发送配置 ---------------- //////////////
+function createSendTask(){
+
+ layer.open({
+ type: 1,
+ area: ['600px','500px'],
+ title: "创建发送任务",
+ closeBtn: 1,
+ shift: 0,
+ shadeClose: false,
+ btn: ['提交','取消'],
+ content:"
| 服务名 | '; - con += '路径 | '; - con += '备注 | '; - con += '操作(添加) | '; + con += '名称(标识) | '; + con += '源目录 | '; + con += '同步到 | '; + con += '模式 | '; + con += '周期 | '; + con += '操作 | '; con += '
|---|---|---|---|---|---|---|---|---|---|
| ' + list[i]['name']+' | ' + - '' + list[i]['path']+' | ' + - '' + list[i]['comment']+' | ' + + '' + "dd"+' | ' + + '' + list[i]['path']+' | ' + + '' + list[i]['ip']+":"+"cc"+' | ' + + '' + "增量"+' | ' + + '' + "实时" +' | ' + '\ - 命令\ - | 删除 | \ + 同步\ + | 日志\ + | 过滤器\ + | 编辑\ + | 删除\ + \' + list[i]['path']+' | ' + '' + list[i]['comment']+' | ' + '\ - 命令\ + 命令\ + | 密钥\ + | 编辑\ | 删除 | \ '; } @@ -148,61 +312,67 @@ function rsyncdReceive(){ }); } -function addReceive(){ - var loadOpen = layer.open({ - type: 1, - title: '创建接收', - area: '400px', - content:"