`

更新服务器文件到本地3

阅读更多
        根据客户的要求: 重新整理代码,通过获取本地文件目录的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


0
1
分享到:
评论

相关推荐

    更新服务器文件到本地

    标题“更新服务器文件到本地”涉及的是在IT领域中常见的版本控制或文件同步操作,尤其在软件开发过程中,经常需要将远程服务器上的文件更新到本地工作环境中。这可能包括代码库、配置文件或其他项目资源。这里提到的...

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

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

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

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

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

    ### Shell脚本实现本地文件与服务器文件同步 #### 背景与意义 在软件开发过程中,经常需要将本地开发环境中的文件同步到服务器上进行部署或测试。手动上传不仅耗时而且容易出错,因此编写一个自动化脚本来实现文件...

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

    总的来说,本地与服务器之间的文件更新是通过自动更新机制实现的,它涉及到文件的检测、下载、校验、安装和刷新等多个步骤。而文件对比则优化了这一过程,仅传输必要的变化,提高了效率。了解并掌握这一技术对于保持...

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

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

    VB上传本地文件到服务器

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

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

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

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

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

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

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

    用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协议进行文件上传。 首先,本地文件管理是计算机操作的基础。在Windows、macOS或Linux等操作系统中,都有内置的文件...

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

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

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

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

    NodeJS本地上传文件至服务器

    在Node.js环境中,将本地文件上传到服务器是一个常见的任务,主要应用于文件共享、数据备份、内容发布等场景。本文将详细讲解如何使用Node.js实现这一功能。 首先,我们需要理解Node.js的基本概念。Node.js是一个...

    服务器与本地文件互通教程.docx

    通过将服务器文件系统映射到本地,用户可以在本地操作系统上直接编辑和管理远程服务器上的文件,而无需频繁地通过FTP或其他文件传输协议手动上传和下载。本教程将详细解释如何实现这一功能,主要依赖于WinSSHFS工具...

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

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

Global site tag (gtag.js) - Google Analytics