`

更新服务器文件到本地2

阅读更多
功能要求:
    通过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领域中常见的版本控制或文件同步操作,尤其在软件开发过程中,经常需要将远程服务器上的文件更新到本地工作环境中。这可能包括代码库、配置文件或其他项目资源。这里提到的...

    下载服务器文件到本地,并删除已下载的服务器文件

    在IT行业中,下载服务器文件到本地以及在下载后删除服务器上的源文件是一项常见的操作,尤其在数据迁移、备份或更新场景下。以下是一些相关的知识点: 1. **FTP(File Transfer Protocol)**:FTP是最传统的文件...

    linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器的方法

    如下所示: ...以上这篇linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文

    shell脚本实现本地文件与服务器文件同步

    主要介绍了本地文件与服务器文件同步shell脚本的方法,然后在文章给大家补充介绍了shell脚本备份本地服务器的文件到远程服务器的实例代码,需要的朋友可以参考下

    本地与服务器之间文件更新

    2. **下载更新**:如果检测到有新版本,客户端会从服务器下载更新文件,这些文件可能包括补丁、完整的新版本或者其他必要的资源。 3. **校验文件**:下载完成后,客户端会验证文件的完整性,通常是通过校验和(如MD...

    使用JS自动从服务器端下载文件到本地

    综上所述,这篇文章可能涵盖的内容包括:使用JavaScript发起HTTP请求获取服务器文件,处理响应的`blob`数据,生成可下载的链接,以及可能提及的服务器端工具如Apache Ant和Apache Commons IO的作用。通过这些技术,...

    Java 实现对比ftp文件和本地文件的修改时间 更新本地文件

    Java 实现对比ftp文件和本地文件的修改时间 ftp服务器文件比本地文件新时 把服务器文件下载覆盖本地文件 更新本地文件

    VB上传本地文件到服务器

    在VB(Visual Basic)编程中,上传本地文件到服务器是一个常见的任务,特别是在开发Web应用程序时。这个过程涉及客户端(用户计算机)与服务器之间的数据交互,通常通过HTTP协议完成。以下是对这一主题的详细阐述: ...

    用PUTTY自动将服务器上的备份文件取到本地

    在这个场景中,我们将探讨如何使用PUTTY自动将服务器上的备份文件取到本地。 首先,理解SSH协议是关键。SSH提供了一种加密的网络通信方式,确保数据传输的安全性。PUTTY基于此协议,通过输入服务器的IP地址、端口号...

    Finalshell windows版的 可以上传/下载 文件到服务器/本地。

    在这个Windows版本中,Finalshell提供了简单易用的界面,使得上传和下载文件到服务器或本地计算机变得异常轻松。 1. **文件传输**: - **上传文件**:Finalshell支持用户直接从本地文件系统选择文件或文件夹,通过...

    上传本地文件夹的文件到FTP服务器指定目录

    本项目聚焦于如何将本地文件夹中的文件上传到FTP服务器的特定目录,这在网站更新、数据迁移或备份场景中尤其有用。我们将探讨相关的知识点,并提供一些基础的实现方法。 1. FTP基本概念:FTP是一种基于TCP的应用层...

    FTP同步服务器文件和本地文件下载

    在这个场景中,我们使用VC2015(Visual C++ 2015)开发环境,通过FTP来实现服务器文件与本地文件的同步。这个过程主要包括两个核心部分:文件的检查和文件的下载。 首先,我们需要理解FTP的工作原理。FTP使用TCP...

    自动或手动将本地文件上传到FTP服务器

    该项目主要是实现将本地文件上传到FTP服务器中,主要有以下功能: 1、可以定时自动上传也可以手动上传 2、通过XML文件可以配置FTP服务器信息 3、自动上传时需要配置上传文件所在本地的文件夹,也通过XML进行配置 4、...

    java上传文件到linux服务器,操作linux服务器上文件,下载linux服务器文件,删除linux服务器文件

    **下载Linux服务器文件** 下载文件的过程与上传类似,只是使用了`get()`方法。该方法会将服务器上的文件下载到本地。 ```java sftp.get(远程文件路径, 本地保存路径); ``` **删除Linux服务器文件** 删除文件可以...

    本地文件管理、上传至服务器、服务器文件管理

    本篇文章将深入探讨“本地文件管理、上传至服务器、服务器文件管理”这一主题,以及如何利用FTP协议进行文件上传。 首先,本地文件管理是计算机操作的基础。在Windows、macOS或Linux等操作系统中,都有内置的文件...

    SFTP定时扫描本地文件上传到Linux服务器

    【标题】"SFTP定时扫描本地文件上传到Linux服务器"涉及的关键知识点主要集中在SFTP(Secure File Transfer Protocol)协议的使用、文件系统的监控以及自动化任务的执行。SFTP是一种安全的网络协议,用于在不同主机...

    在html页面使用JavaScript实行文件上传到本地服务器并获取文件所在路径

    使用JavaScript实现文件上传到本地服务器并获取到上传后文件所在路径,是由到JavaScript,java以及html页面。这个比较好,不是在jsp上获取路径,jsp太简单了,而且过时了,所以就在html页面实现了下功能,我主要是做...

    python3写的简单本地文件上传服务器实例

    2、检查服务器上是否存在,不存在直接上传,存在的话,文件夹无视,文件比较大小,大小不一致则覆盖,最后检查服务器上是否存在本地没有的文件,存在则删除 3、之后增加了忽略列表,忽略文件类型 4、然后增加了重启...

    本地的文件上传到服务器的工具

    标题中的“本地的文件上传到服务器的工具”指的是用于在个人计算机(本地)与远程服务器之间传输文件的应用程序。这种工具通常支持FTP(文件传输协议)、SFTP(安全文件传输协议)和其他相关协议,使用户能够方便、...

    Wpf下载网络文件到本地指定路径(简单示例)

    2. **设置目标URL和本地路径**:我们需要指定要下载文件的URL以及在本地存储文件的位置。例如,我们可以通过`Uri`类来创建网络资源的URI,并使用`System.IO`命名空间中的`Path`类来处理本地路径。 3. **处理响应...

Global site tag (gtag.js) - Google Analytics