|
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。
先说需求:平台会把虚拟机备份的文件打包到服务器A,再同步备份到服务器B(只需要考虑A到B)。
思路:
服务器A作为服务端,定时遍历自己的文件目录,把文件目录信息打包成一个校验文件。
服务器B作为客户端,下载校验文件,遍历自己的文件目录是否和服务器相同,并下载本地没有的文件。
通过http传输,使用python开启一个简单的http服务。
测试环境:
win10→CentOS7, python3.7。
首先开启Http服务:
在win10上找到需要备份的文件夹,在空白处shift+鼠标右键,点击在此处打开powershell窗口。
然后输入:
- python -m http.server 8000
复制代码
开启后访问http://本机Ip:8000即可
服务端代码如下:
- import os
-
- path = r'C:\Users\001\Desktop\backup'
- def content(path):
- list = []
- dir = []
- x = os.walk(path, topdown=True)
- for (root, dirs, files) in x:
- dir.append(root.replace(r'C:\Users\001\Desktop\backup', ''))
- for j in files:
- list.append(root.replace(r'C:\Users\001\Desktop\backup', '') + '\\' + j)
- return [dir, list]
-
- x = content(path)
-
- with open(path+'\\'+'init.txt', 'w', encoding='utf-8') as f:
- for i in x[1]:
- f.write(i)
- f.write('\n')
-
- with open(path+'\\'+'dir.txt', 'w', encoding='utf-8') as f:
- for i in x[0]:
- f.write(i)
- f.write('\n')
复制代码
客户端代码如下:- import os
- import requests
- import shutil
- import time
- from tqdm import tqdm
-
- start_time = time.perf_counter()
-
- def init():
- # 下载服务端目录,文件信息
- url = ['http://192.168.1.13:8000/init.txt', 'http://192.168.1.13:8000/dir.txt']
-
- download_init = requests.get(url[0], stream=True)
- with open('/download/init.txt', 'wb') as f:
- for chunk in download_init.iter_content(chunk_size=1024):
- f.write(chunk)
-
- download_dir = requests.get(url[1], stream=True)
- with open('/download/dir.txt', 'wb') as f:
- for chunk in tqdm(download_dir.iter_content(chunk_size=1024)):
- f.write(chunk)
-
- init()
-
- path = '/download/backup'
-
- def content(path):
- list = []
- dir = []
- x = os.walk(path, topdown=True)
- for (root, dirs, files) in x:
- dir.append(root)
- for j in files:
- list.append(root+ '/' + j)
- return [dir, list]
-
-
- def check_dir():
- # 获取本地目录
- x = content(path)
- dir_so = x[0]
-
- # 清洗服务端目录
- dirs = open('/download/dir.txt', 'r', encoding='utf-8')
- dir_dst = dirs.readlines()
- dir_dst_info = []
- for i in dir_dst:
- i = i.replace('\n', '')
- i = i.replace('\\', '/')
- i = '/download/backup' + i # 修改路径不然会报错
- dir_dst_info.append(i)
-
-
- # 比较目录,目录不一致就添加
- for i in dir_dst_info[1:]+dir_so:
- if i not in dir_so:
- os.mkdir(i)
- print('创建了' + i)
- if i not in dir_dst_info:
- try:
- shutil.rmtree(i)
- print('删除了' + i)
- except:
- pass
-
-
- check_dir()
-
- def check_file():
- # 获取本地文件
- x = content(path)
- file_so = x[1]
-
- # 清洗服务端文件
- files = open('/download/init.txt', 'r', encoding='utf-8')
- files_dst = files.readlines()
- files_dst_info = []
- for i in files_dst:
- i = i.replace('\n', '')
- i = i.replace('\\', '/')
- files_dst_info.append('/download/backup' + i)
-
- # 没有的下载,多余的删掉
- for i in file_so + files_dst_info:
- if i not in file_so:
- url = 'http://192.168.1.13:8000' + i.replace('/download/backup', '')
- download_file = requests.get(url, stream=True)
- with open(i, 'wb') as f :
- for chunk in download_file.iter_content(chunk_size=10240) :
- f.write(chunk)
- print('添加了' + i)
- if i not in files_dst_info:
- os.remove(i)
- print('删除了' + i)
-
- check_file()
-
- end_time =time.perf_counter()
-
- cost = end_time - start_time
- print(cost,':s')
复制代码
代码还在优化,目前的功能有:
1、可以添加定时任务,做到同步更新。
2、支持同步删除。
待开发的功能:
1、多线程/多进程下载。
还没有投入到生产环境中正式测试,测试图片先欠着,代码调优完了再来改。
如果有更好的建议欢迎各位指教。
|
|