python文件自动同步备份v1【运维必备】
先说需求:平台会把虚拟机备份的文件打包到服务器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
x = content(path)
with open(path+'\\'+'init.txt', 'w', encoding='utf-8') as f:
for i in x:
f.write(i)
f.write('\n')
with open(path+'\\'+'dir.txt', 'w', encoding='utf-8') as f:
for i in x:
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, 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, 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
def check_dir():
# 获取本地目录
x = content(path)
dir_so = x
# 清洗服务端目录
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+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
# 清洗服务端文件
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、多线程/多进程下载。
还没有投入到生产环境中正式测试,测试图片先欠着,代码调优完了再来改。
如果有更好的建议欢迎各位指教。
多谢楼主分享 6666
感谢分享,谢谢提供分享
感谢楼主的分享 谢谢分享! 多谢分享多谢分享
页:
[1]