功能要求:
通过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('.............同步服务器文件结束.............')
分享到:
相关推荐
标题“更新服务器文件到本地”涉及的是在IT领域中常见的版本控制或文件同步操作,尤其在软件开发过程中,经常需要将远程服务器上的文件更新到本地工作环境中。这可能包括代码库、配置文件或其他项目资源。这里提到的...
如下所示: ...以上这篇linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文
在IT行业中,下载服务器文件到本地以及在下载后删除服务器上的源文件是一项常见的操作,尤其在数据迁移、备份或更新场景下。以下是一些相关的知识点: 1. **FTP(File Transfer Protocol)**:FTP是最传统的文件...
### Shell脚本实现本地文件与服务器文件同步 #### 背景与意义 在软件开发过程中,经常需要将本地开发环境中的文件同步到服务器上进行部署或测试。手动上传不仅耗时而且容易出错,因此编写一个自动化脚本来实现文件...
2. **下载更新**:如果检测到有新版本,客户端会从服务器下载更新文件,这些文件可能包括补丁、完整的新版本或者其他必要的资源。 3. **校验文件**:下载完成后,客户端会验证文件的完整性,通常是通过校验和(如MD...
综上所述,这篇文章可能涵盖的内容包括:使用JavaScript发起HTTP请求获取服务器文件,处理响应的`blob`数据,生成可下载的链接,以及可能提及的服务器端工具如Apache Ant和Apache Commons IO的作用。通过这些技术,...
在VB(Visual Basic)编程中,上传本地文件到服务器是一个常见的任务,特别是在开发Web应用程序时。这个过程涉及客户端(用户计算机)与服务器之间的数据交互,通常通过HTTP协议完成。以下是对这一主题的详细阐述: ...
Java 实现对比ftp文件和本地文件的修改时间 ftp服务器文件比本地文件新时 把服务器文件下载覆盖本地文件 更新本地文件
**下载Linux服务器文件** 下载文件的过程与上传类似,只是使用了`get()`方法。该方法会将服务器上的文件下载到本地。 ```java sftp.get(远程文件路径, 本地保存路径); ``` **删除Linux服务器文件** 删除文件可以...
在这个场景中,我们将探讨如何使用PUTTY自动将服务器上的备份文件取到本地。 首先,理解SSH协议是关键。SSH提供了一种加密的网络通信方式,确保数据传输的安全性。PUTTY基于此协议,通过输入服务器的IP地址、端口号...
在这个Windows版本中,Finalshell提供了简单易用的界面,使得上传和下载文件到服务器或本地计算机变得异常轻松。 1. **文件传输**: - **上传文件**:Finalshell支持用户直接从本地文件系统选择文件或文件夹,通过...
本项目聚焦于如何将本地文件夹中的文件上传到FTP服务器的特定目录,这在网站更新、数据迁移或备份场景中尤其有用。我们将探讨相关的知识点,并提供一些基础的实现方法。 1. FTP基本概念:FTP是一种基于TCP的应用层...
在这个场景中,我们使用VC2015(Visual C++ 2015)开发环境,通过FTP来实现服务器文件与本地文件的同步。这个过程主要包括两个核心部分:文件的检查和文件的下载。 首先,我们需要理解FTP的工作原理。FTP使用TCP...
本篇文章将深入探讨“本地文件管理、上传至服务器、服务器文件管理”这一主题,以及如何利用FTP协议进行文件上传。 首先,本地文件管理是计算机操作的基础。在Windows、macOS或Linux等操作系统中,都有内置的文件...
使用JavaScript实现文件上传到本地服务器并获取到上传后文件所在路径,是由到JavaScript,java以及html页面。这个比较好,不是在jsp上获取路径,jsp太简单了,而且过时了,所以就在html页面实现了下功能,我主要是做...
【标题】"SFTP定时扫描本地文件上传到Linux服务器"涉及的关键知识点主要集中在SFTP(Secure File Transfer Protocol)协议的使用、文件系统的监控以及自动化任务的执行。SFTP是一种安全的网络协议,用于在不同主机...
2、检查服务器上是否存在,不存在直接上传,存在的话,文件夹无视,文件比较大小,大小不一致则覆盖,最后检查服务器上是否存在本地没有的文件,存在则删除 3、之后增加了忽略列表,忽略文件类型 4、然后增加了重启...
通过将服务器文件系统映射到本地,用户可以在本地操作系统上直接编辑和管理远程服务器上的文件,而无需频繁地通过FTP或其他文件传输协议手动上传和下载。本教程将详细解释如何实现这一功能,主要依赖于WinSSHFS工具...
在Node.js环境中,将本地文件上传到服务器是一个常见的任务,主要应用于文件共享、数据备份、内容发布等场景。本文将详细讲解如何使用Node.js实现这一功能。 首先,我们需要理解Node.js的基本概念。Node.js是一个...
标题中的“本地的文件上传到服务器的工具”指的是用于在个人计算机(本地)与远程服务器之间传输文件的应用程序。这种工具通常支持FTP(文件传输协议)、SFTP(安全文件传输协议)和其他相关协议,使用户能够方便、...