功能要求:
通过Http协议,向服务器发送请求,得到返回的json格式数据,根据返回的文件路径和MD5值,判断本地对应目录的文件是否和服务器上的文件一致,不一致则更新。
#!/usr/bin/python
#-*- coding: utf-8 -*-
'''
功能描述:用于同步服务器的配置文件
'''
import urllib2
import os
import json
import hashlib
import thread
import time
import urllib
from time import sleep
import threading
from tools import getLogger
from tools import DIRS
import logging
import re
LOG_NAME='syncservicefile'
log =getLogger(LOG_NAME)
#服务请求根路径
SERVICE_ADDRESS='http://132.121.130.21:5000/sync/'
#文件名称过滤表达式(Python正则表达式),暂时先过滤掉以.pyc结尾的文件
FILTER_FILENAME_REG=r'.*?\.pyc$'
#生成本地的MD5文件,用于比对服务器上的MD5文件
def sendRequest():
serviceDict={} #存放服务器上的文件名,字典值
tempList=[] #存放临时文件
log.info('send request to service............')
jsonStr = urllib2.urlopen(SERVICE_ADDRESS).read()
if len(jsonStr) < 3:
log.info('没有需要同步的文件,请检查item表的配置是否正确..........')
else:
#读取本地目录
dirDict=readFileDir()
reObj=re.compile(FILTER_FILENAME_REG)
jsoObj = json.loads(jsonStr)
for path in jsoObj.keys():
#过滤匹配的文件路径
if not reObj.match(path):
#获取服务器返回的文件路径和文件的md5值
filepath = path
md5= jsoObj[path]['md5']
mtime = jsoObj[path]['mtime'] #时间比对暂时没用
#将 filepath 与 字典值中的key进行比对,如果有则说明本地文件已存在,否则本地文件不存在
if dirDict.has_key('/'+filepath):
#说明本地已存在该文件,比较本地文件的MD5值
newmd5=MD5(dirDict['/'+filepath])
if md5==newmd5:
pass
else:
#下载文件到本地,同时将文件路径保存在集合中
dowloadFile(filepath,dirDict['/'+filepath])
else:
#说明该文件在本地不存在
for j in DIRS.keys():
key = j
cpath = DIRS[j]
firstDirName = filepath.split('/')[0]
array = cpath.split('/')
length = len(array)
lastDirName = array[length-2]
if firstDirName == lastDirName:
#说明目录匹配成功
locapath= cpath + filepath[filepath.find('/')+1:len(filepath)]
#判断本地文件夹是否存在,不存在则新建
dirpath=os.path.dirname(locapath)
if not os.path.exists(dirpath):
os.makedirs(dirpath)
#下载文件到本地目录
dowloadFile(filepath,locapath,tempList)
#保存服务器上文件字典值
serviceDict[filepath] = md5
time.sleep(1)
compFileMd5(serviceDict,dirDict)
'''
将文件下载到本地目录中,先保存为以.temp结尾的文件
filepath:远程文件路径
locapath:本地文件路径
tempList:存放本地临时文件路径
'''
def dowloadFile(filepath,locapath,tempList=None):
#将临时文件目录保存在集合中,用于下载完直接修改文件后缀名
tempath = locapath + '.tmp'
tempList.append(tempath)
log.info(filepath + '--->' + locapath+'.tmp')
urllib.urlretrieve(os.path.join(SERVICE_ADDRESS,filepath),tempath)
'''
获取文件的md5值
filepath:文件的路径
'''
def MD5(filepath):
with open(filepath,'rb') as f:
md5obj = hashlib.md5()
md5obj.update(f.read())
hash = md5obj.hexdigest()
return hash
#读取本地文件目录,返回文件字典
def readFileDir():
dirDict={}
for dir in DIRS.values():
gci(dir,dir,dirDict)
return dirDict
#递归遍历文件目录
'''
将文件路径 和 完全路径分别作为key,value保存在字典中
dirpath:文件目录
keydir:主目录 即tools中的DIRS变量中的key
dirDict:返回字典值
'''
def gci(dirpath,keydir,dirDict):
files = os.listdir(dirpath)
for fi in files:
fi_d = os.path.join(dirpath,fi)
if os.path.isdir(fi_d):
gci(fi_d,keydir)
else:
dirDict[fi_d.split('..')[1]]=fi_d
return dirDict
'''
比较下载文件的临时文件的md5值,如果跟服务器上文件的md5值一致,在重命名,否则提示下载失败
dirDict:本地的文件字典
serviceDict:服务器上的文件字典
'''
def compFileMd5(serviceDict,dirDict):
#这里需要重新遍历一下本地路径
dirDict=readFileDir()
for key1 in serviceDict.keys():
serviceKey = key1
serviceMd5 = serviceDict[key1]
temp1 = '/' + serviceKey + '.tmp'
temLocalPath = dirDict[temp1]
localPath = temLocalPath[0:len(temLocalPath)-4]
if os.path.exists(temLocalPath):
#比较临时文件的MD5值是否和服务器一致
localMd5 = MD5(temLocalPath)
if localMd5 == serviceMd5:
rename(temLocalPath,localPath)
else:
log.error('Error downloading file of' + serviceKey)
'''
将文件重命名
oldpath:旧的文件路径
newpath:新的文件路径
'''
def rename(oldpath, newpath):
try:
os.rename(oldpath, newpath)
log.info('rename: ' + oldpath + '---->' + newpath)
except Exception,e:
log.error('修改文件名称出错..........')
log.error('rename file has error.......' + oldpath)
if __name__ == '__main__':
log.info(time.strftime('%Y-%m-%d %H:%M:%S'))
log.info('.............开始同步服务器文件.............')
sendRequest()
log.info(time.strftime('%Y-%m-%d %H:%M:%S'))
log.info('.............同步服务器文件结束.............')
分享到:
相关推荐
下载服务器文件到本地,并删除已下载的服务器文件
如下所示: ...以上这篇linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文
主要介绍了本地文件与服务器文件同步shell脚本的方法,然后在文章给大家补充介绍了shell脚本备份本地服务器的文件到远程服务器的实例代码,需要的朋友可以参考下
NULL 博文链接:https://listen-raining.iteye.com/blog/2300602
Java 实现对比ftp文件和本地文件的修改时间 ftp服务器文件比本地文件新时 把服务器文件下载覆盖本地文件 更新本地文件
服务器与本地文件通过文件对比进行数据的更新 ……
VB编程,实现上传本地文件到服务器
该项目主要是实现将本地文件上传到FTP服务器中,主要有以下功能: 1、可以定时自动上传也可以手动上传 2、通过XML文件可以配置FTP服务器信息 3、自动上传时需要配置上传文件所在本地的文件夹,也通过XML进行配置 4、...
NodeJS本地上传文件至服务器
使用JavaScript实现文件上传到本地服务器并获取到上传后文件所在路径,是由到JavaScript,java以及html页面。这个比较好,不是在jsp上获取路径,jsp太简单了,而且过时了,所以就在html页面实现了下功能,我主要是做...
2、检查服务器上是否存在,不存在直接上传,存在的话,文件夹无视,文件比较大小,大小不一致则覆盖,最后检查服务器上是否存在本地没有的文件,存在则删除 3、之后增加了忽略列表,忽略文件类型 4、然后增加了重启...
NULL 博文链接:https://1017401036.iteye.com/blog/2311922
从服务器上下载文件、webreuqest类,当然方法很多了,读取页面上的数据流后还可以正则表达式,抓取到自己想要的部分
采用SFTP定时扫描本地文件,同时判断本地文件是否传输完成,如果传输完成,则向服务器开始上传本地文件,.bat启动,包含配置文件等,已通过公司测试
Finallshel 可以上传/下载 文件到服务器/本地,中间不会中断,比ftp要好用的多。
上传本地文件夹的文件到FTP服务器指定目录,可直接使用,也可修改源码,编译器VS2015
服务器与本地文件互通教程,通过该教程,可以将服务器你自己的用户磁盘挂载到本地电脑,可在本地对服务器上的文件进行修改,并且可同步修改服务器上文件。
用WinForm做的,可以上传文件到服务器。
用来把本地的文件上传到服务器的工具 用来把本地的文件上传到服务器的工具
代码包含本地文件管理器,可以查看文件及文件夹,长按为上传;可以查看FTP服务器上的文件