需求:
h3c的cas平台打包备份虚拟机文件到服务器A,通过A同步到服务器B和C。
思路:
服务器A遍历目标文件夹和文件生成一个带有文件和文件夹信息的校验文件。
服务器B下载校验文件,校验本地的备份文件夹并同步下载/同步删除。
A和B通过python的http服务传输。
测试环境:
win10→CentOS7, python3.7.
接下来我们开始:
一、python开启http服务
在win10上找到需要备份的文件夹,在空白处shift+鼠标右键,点击在此处打开powershell窗口。
然后输入:
python -m http.server 8000
二、服务端
import os
path = r'C:Users001Desktopbackup' # 需要备份的文件夹
# 通过os.walk()方法遍历到所有文件夹和文件
def content(path):
list = []
dir = []
x = os.walk(path, topdown=True)
for (root, dirs, files) in x:
dir.append(root.replace(r'C:Users001Desktopbackup', ''))
for j in files:
list.append(root.replace(r'C:Users001Desktopbackup', '') + '' + 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
# 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):
# 通过os.walk()方法遍历到所有文件夹和文件
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、执行服务端的python文件。
会在本地生成init.txt, dir.txt。
3、执行客户端的python文件。
正在执行。
执行完成。
总结:
还可以再研究下多进程/多线程,效率还会更高。
如果有更好的思路欢迎指教。