根据客户的要求: 重新整理代码,通过获取本地文件目录的json格式数据和服务器返回的json数据做对比,来判断是否要更新服务器的文件到本地。然后先将文件下载到本地,保存为临时文件,判断下载到本地文件的MD5值跟服务器上文件的MD5是否一致来判断下载是成功。 如果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,HOMEDIR
import logging
import re
log = getLogger(__name__)
#服务请求根路径
SERVICE_ADDRESS='http://132.121.130.21:5000/sync/'
#文件名称过滤表达式(Python正则表达式),暂时先过滤掉以.pyc结尾的文件
FILTER_FILENAME_REG=[r'.*?\.pyc$']
#生成本地的MD5文件,用于比对服务器上的MD5文件
def sendRequest():
log.info('send request to service............')
local_json = readLocalDir(DIRS,FILTER_FILENAME_REG)
servi_json = readRemote(SERVICE_ADDRESS)
if len(servi_json) < 3:
log.info('没有需要同步的文件,请检查item表的配置是否正确..........')
else:
#下载文件
compFileMd5(local_json,servi_json)
'''
读取本地文件目录 ,返回json格式的数据, 包括filepath,md5,mtime
返回的数据格式为:{"py/out.py":{"md5":"c6c5fd509ca6f9384a8633a1455de851","mtime":1464231434.0}}
'''
def readLocalDir(dirs,ignored_reg=[]):
jsonDict={}
for dir in dirs.values():
gci(dir,ignored_reg,jsonDict)
return json.dumps(jsonDict)
'''
读取远程目录 返回json格式数据
'''
def readRemote(remote_addr):
return urllib2.urlopen(SERVICE_ADDRESS).read()
'''
递归遍历文件目录
'''
def gci(dir,ignored_reg,jsonDict):
#根目录的绝对路径
absHomeDir = os.path.abspath(HOMEDIR)
for dirpath, dirnames, filenames in os.walk(dir):
for filename in filenames:
filepath = os.path.join(dirpath,filename)
if os.path.isfile(filepath):
#文件的绝对路径
absFilePath=os.path.abspath(filepath)
#截取相对
rela_path = absFilePath[ len(absHomeDir) +1: ]
#过滤掉匹配的文件
for reg in ignored_reg:
reObj=re.compile(reg)
if not reObj.match(filepath):
tempDict = {"md5":MD5(filepath),"mtime":str(os.stat(filepath).st_mtime)}
jsonDict[rela_path] = tempDict
'''
比较本地文件和服务器上的文件是否一致,如果不一致,则重新下载
local_json:本地的文件的json字符串
servi_json:服务器上文件的json字符串
'''
def compFileMd5(local_json,servi_json):
local_obj = json.loads(local_json)
servi_obj = json.loads(servi_json)
for key1 in servi_obj.keys():
servi_md5 = servi_obj[key1]['md5']
servi_mtime = servi_obj[key1]['mtime']
down =False
if key1 in local_obj:
#如果本地目录中有,则判断md5值
local_md5= local_obj[key1]['md5']
local_mtime = local_obj[key1]['mtime']
if servi_md5 == local_md5:
pass
else:
#md5不相等,则下载
down=True
else:
#本地文件不存在,则下载
down=True
if down:
dowloadFile(os.path.join(SERVICE_ADDRESS,key1),os.path.join(HOMEDIR,key1),servi_md5,tempfile=True)
time.sleep(1)
'''
将文件下载到本地目录中,先保存为以.tmp结尾的文件,然后比较.tmp文件的md5值是否和服务器上的文件一致,一致则重命名
filepath:远程文件路径
locapath:本地文件路径
servimd5:文件的md5值
tempfile:为True,则生成临时文件,在原文件名结尾添加.tmp
'''
def dowloadFile(remotepath,locapath,servimd5,tempfile=True):
time.sleep(1)
tempath = ''
#将临时文件目录保存在集合中,用于下载完直接修改文件后缀名
if tempfile==True:
tempath = locapath + '.tmp'
log.info(remotepath + '--->' + tempath)
urllib.urlretrieve(remotepath,tempath)
time.sleep(1)
if os.path.exists(tempath):
if MD5(tempath) == servimd5:
try:
time.sleep(1)
os.rename(tempath, locapath)
log.info('rename: ' + tempath + '---->' + locapath)
#修改文件的执行权限
chmod(locapath)
except Exception,e:
log.error('修改文件名称出错..........')
log.error('rename file has error.......' + tempath)
else:
log.error('Error downing the file ' + remotepath)
else:
urllib.urlretrieve(remotepath,locapath)
log.info(remotepath + '--->' + tempath)
urllib.urlretrieve(remotepath,locapath)
'''
获取文件的md5值
filepath:文件的绝对路径
'''
def MD5(filepath):
with open(filepath,'rb') as f:
md5obj = hashlib.md5()
md5obj.update(f.read())
hash = md5obj.hexdigest()
return hash
#修改文件的执行权限
def chmod(filepath):
os.system("chmod 744 %s" %(filepath))
def main():
log.info('.............开始同步服务器文件.............')
sendRequest()
log.info('.............同步服务器文件结束.............')
if __name__ == '__main__':
main()
---2016-05-30
@dianxinguangchang.zhongshanerlu.yuexiuqu.guangzhoushi.guangdongsheng
分享到:
相关推荐
下载服务器文件到本地,并删除已下载的服务器文件
主要介绍了本地文件与服务器文件同步shell脚本的方法,然后在文章给大家补充介绍了shell脚本备份本地服务器的文件到远程服务器的实例代码,需要的朋友可以参考下
NULL 博文链接:https://listen-raining.iteye.com/blog/2300602
Java 实现对比ftp文件和本地文件的修改时间 ftp服务器文件比本地文件新时 把服务器文件下载覆盖本地文件 更新本地文件
服务器与本地文件通过文件对比进行数据的更新 ……
VB编程,实现上传本地文件到服务器
如下所示: ...以上这篇linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文
2、检查服务器上是否存在,不存在直接上传,存在的话,文件夹无视,文件比较大小,大小不一致则覆盖,最后检查服务器上是否存在本地没有的文件,存在则删除 3、之后增加了忽略列表,忽略文件类型 4、然后增加了重启...
该项目主要是实现将本地文件上传到FTP服务器中,主要有以下功能: 1、可以定时自动上传也可以手动上传 2、通过XML文件可以配置FTP服务器信息 3、自动上传时需要配置上传文件所在本地的文件夹,也通过XML进行配置 4、...
NodeJS本地上传文件至服务器
NULL 博文链接:https://1017401036.iteye.com/blog/2311922
使用JavaScript实现文件上传到本地服务器并获取到上传后文件所在路径,是由到JavaScript,java以及html页面。这个比较好,不是在jsp上获取路径,jsp太简单了,而且过时了,所以就在html页面实现了下功能,我主要是做...
从服务器上下载文件、webreuqest类,当然方法很多了,读取页面上的数据流后还可以正则表达式,抓取到自己想要的部分
上传本地文件夹的文件到FTP服务器指定目录,可直接使用,也可修改源码,编译器VS2015
采用SFTP定时扫描本地文件,同时判断本地文件是否传输完成,如果传输完成,则向服务器开始上传本地文件,.bat启动,包含配置文件等,已通过公司测试
Finallshel 可以上传/下载 文件到服务器/本地,中间不会中断,比ftp要好用的多。
java上传文件到服务器,将本地的文件上传到服务器上去
服务器与本地文件互通教程,通过该教程,可以将服务器你自己的用户磁盘挂载到本地电脑,可在本地对服务器上的文件进行修改,并且可同步修改服务器上文件。
用WinForm做的,可以上传文件到服务器。
用来把本地的文件上传到服务器的工具 用来把本地的文件上传到服务器的工具