python的工作记录B

这次很强了。就差最后一步,判断一下SVN的版本是否是真的库里的。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os,sys,commands,subprocess
import re,time
from optparse import OptionParser

#SVN的仓库地址,其实都是同一个,但为了安全和区别,写入具体地址
svnUrl = "svn://XX"
prefix = "/XX/"
#定义远程更新文件的根目录,与测试和真实环境有关的判断,用字典简单实现
sitePathDic = {"X":"/XX", "X":"/XX"}
#定义将SVN放入本地SALTSTACK的目录
updateFolder = "/srv/salt/XX/"
#定义SALT-MINION客户端地址
saltMinionDic = {"rX":"X", "tX":"X"}
#定义推送文件的saltstack-master的文件地址
saltMasterUrl = "salt://X/"
#维护两个文件列表,一个本地,一个远程
localFileList = []
remoteFileList = []

def getSvnFile(rVersion):
    #清空上次更新的所有文件
    delCmd = "rm -rf " + updateFolder + "*"
    os.system(delCmd)
    print '\033[0;32;40m'
    print "Delete old saltstack files..."
    #因为每次只更新固定版本的文件,所以,要先得到文件列表,再一个一个导出为和网站一样的标准目录结构
    svnLogCmd ="svn log -v -r" + rVersion +" " + svnUrl + " --username "
    svnLogOut = subprocess.Popen(svnLogCmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    for line in svnLogOut.stdout.readlines():
    #将输出命令的非标准行去掉
        if len(line.strip())!=0 and line.startswith("  "):
            #将标准行中的A,C,M等字符去掉
        svnFileName = line.split()[1]
        #替换为相对于网站的根目录
        fileList = svnFileName.replace(prefix,'')
        #取出相对于根目录的文件夹,判断是否存在和建立
        folderList = '/'.join(fileList.split('/')[:-1])
        if not os.path.exists(updateFolder + folderList):
        mkdirCmd = "mkdir " + updateFolder + folderList  + " -p"
        os.system(mkdirCmd)
        #print "Make a new dir: " + updateFolder + folderList
        #判断取出的最后的字段是目录还是文件,如果是文件夹,需要新建,这就需要规定文件夹不能包含.,而文件名必须包含.,否则无法进行这一步判定
        #这个判断我很纠结,如果更新不涉及SVN新建目录,就省事多了。
        if '.' not in fileList.split('/')[-1]:
        mkdirCmd = "mkdir " + updateFolder + fileList  + " -p"
                os.system(mkdirCmd)
        #print "Make a new dir: " + updateFolder + fileList
            #将文件放入列表,方便在更新到正式网站之后,循环修改相关权限()。
        localFileList.append(fileList)
            remoteFileList.append(sitePathDic[svnType] + '/' + fileList)
            svnExportCmd = "svn export " + svnUrl + '/' + fileList + " " + updateFolder + fileList
            subprocess.Popen(svnExportCmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    print "Finished export Svn File into salt-master "

def backupFile(bFileName, str_now):
    #加强安装性,备份后缀加PHP
    suffix = str_now + ".old.php"
    saltCpCmdPre = "salt '" + saltMinionDic[svnType] + "' cmd.run " + "' cp -p "
    cpCmd = saltCpCmdPre + bFileName + " " + bFileName + suffix +"'"
    subprocess.Popen(cpCmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

def updateFile(localFile, remoteFile):
    #更新文件
    saltGetFilePre = "salt '" + saltMinionDic[svnType] + "' cp.get_file " + saltMasterUrl
    saltCpCmd = saltGetFilePre + localFile + " " + remoteFile + " makedirs=True"
    subprocess.Popen(saltCpCmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

#由于新建文件夹,SALTSTACK的权限所有者的更新在第一次不起作用,故而在CP好文件之后,单独进行权限更新
def chOwnMod(remoteFile):
    saltChownCmdPre = "salt '" + saltMinionDic[svnType] + "' cmd.run " + "'chown X"
    saltChownCmd = saltChownCmdPre + remoteFile + "'"
    subprocess.Popen(saltChownCmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    saltChmodCmdPre = "salt '" + saltMinionDic[svnType] + "' cmd.run " + "'chmod X "
    saltChmodCmd = saltChmodCmdPre + remoteFile + "'"
    subprocess.Popen(saltChmodCmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

def main():
    getSvnFile(svnRev)

    #统一更新备份的时间
    now = time.localtime()
    str_now = time.strftime("%Y-%m-%d-%H-%M-%S", now)
    for file in remoteFileList:
        backupFile(file, str_now)
    print "Finished back file-" + str_now
    print '\033[0m'
    for local,remote in zip(localFileList,remoteFileList):
    updateFile(local,remote)
        print "update file : " + remote

    #由于新建文件夹的权限更新执行太快,会不成功,故而停五秒之后再确认权限
    print "Wait 5 seconds to start update permission"
    time.sleep(5)
    for remoteFile in remoteFileList:
    chOwnMod(remoteFile)
    print '\033[0;32;40m'
    print "Finished. update success!"
    print '\033[0m'

if __name__=="__main__":
    #定义命令行参数
    usage = "usage: %prog [options] arg :X.py -rX -tXe"
    parser = OptionParser(usage)
    parser.add_option("-r", "--rev", dest="rev", help="input the rev number.")
    parser.add_option("-t", "--type", dest="type", help="input the update type")
    (options, args) = parser.parse_args()
    if options.rev:
        svnRev = options.rev
    else:
    print '\033[0;31;40m'
        print "input no svn Reversion"
    print '\033[0m'
        sys.exit(1)
    if options.type:
        svnType = options.type
        regex=ur"(Xe|rX)" #判断是否是特定参数
    if re.search(regex, svnType):
            pass
    else:
        print '\033[0;31;40m'
            print "svn type is wrong,it must 'Xe' or 'reX'"
            print '\033[0m'
        sys.exit(1)

    else:
    print '\033[0;31;40m'
        print "input no svn update type"
    print '\033[0m'
        sys.exit(1)

    main()

 

时间: 2025-01-27 04:21:41

python的工作记录B的相关文章

python的工作记录A

马上进入工作自动化: [root@localhost ~]# cat svn_bbs.py import os,sys,commands,subprocess import re,time svnUrl = "svn://xxx" svnExportCmdPre = "svn export svn://xxx/" sitePath = "/xxx" updateFolder = "/srv/salt/xxx/" saltMin

【Spark Summit East 2017】用Yarn监控Scala和Python Spark工作的动态资源使用情况

本讲义出自Ed Barnes与Ruslan Vaulin在Spark Summit East 2017上的演讲,我们都害怕"失去的任务"和"容器由于超出内存限制被Yarn关闭"的消息在Spark Yarn的应用程序出现的比例增多.甚至在分布式Yarn环境中,回答"应用程序使用了多少内存?"这个问题都是非常棘手的.为观察Spark的重要统计工作,包括executor-by-executor内存和CPU使用,JDK以及pySpark Yarn容器中的

python 回溯法 记录

一直不是太理解回溯法,这几天集中学习了一下,记录如下. 回溯法有"通用的解题法"之称. 1.定义:  也叫试探法,它是一种系统地搜索问题的解的方法. 2.基本思想:  从一条路往前走,能进则进,不能进则退回来,换一条路再试. 3.一般步骤:   定义一个解空间(子集树.排列树二选一) 利用适于搜索的方法组织解空间.   利用深度优先法搜索解空间.   利用剪枝函数避免移动到不可能产生解的子空间. 4.约束函数: 是否满足显约束(存在) 5.限界函数: 是否满足隐约束(最优) 6.子集树

《Python数据挖掘:概念、方法与实践》——1.4节如何建立数据挖掘工作环境

1.4 如何建立数据挖掘工作环境 前面几节帮助我们更好地了解了将要从事的项目及原因.现在可以开始建立一个开发环境,支持所有项目工作了.由于本书的目的是介绍如何构建挖掘数据模式的软件,因此我们将用一种通用编程语言编写程序.Python编程语言具有非常强大且仍在不断成长.专门致力于数据挖掘的社区.这个社区已经贡献了一些非常方便的程序库,我们可以用来进行高效的处理,我们还可以依靠他们提供的许多数据类型,更快地工作. 在本书编著时,有两个版本的Python可供下载:现在被视为经典的Python 2(最新

《Python数据挖掘:概念、方法与实践》一1.4 如何建立数据挖掘工作环境

1.4 如何建立数据挖掘工作环境 前面几节帮助我们更好地了解了将要从事的项目及原因.现在可以开始建立一个开发环境,支持所有项目工作了.由于本书的目的是介绍如何构建挖掘数据模式的软件,因此我们将用一种通用编程语言编写程序.Python编程语言具有非常强大且仍在不断成长.专门致力于数据挖掘的社区.这个社区已经贡献了一些非常方便的程序库,我们可以用来进行高效的处理,我们还可以依靠他们提供的许多数据类型,更快地工作. 在本书编著时,有两个版本的Python可供下载:现在被视为经典的Python 2(最新

Python深入学习之内存管理_python

语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征.这里以Python语言为例子,说明一门动态类型的.面向对象的语言的内存管理方式.  对象的内存使用 赋值语句是语言最常见的功能了.但即使是最简单的赋值语句,也可以很有内涵.Python的赋值语句就很值得研究. a = 1 整数1为一个对象.而a是一个引用.利用赋值语句,引用a指向对象1.Python是动态类型的语言(参考动态类型),对象与引用分离.Pytho

Python深入06 Python的内存管理

原文:Python深入06 Python的内存管理 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征.这里以Python语言为例子,说明一门动态类型的.面向对象的语言的内存管理方式.   对象的内存使用 赋值语句是语言最常见的功能了.但即使是最简单的赋值语句,也可以很有内涵.Python

讲解Python中for循环下的索引变量的作用域_python

我们从一个测试开始.下面这个函数的功能是什么?   def foo(lst): a = 0 for i in lst: a += i b = 1 for t in lst: b *= i return a, b 如果你觉得它的功能是"计算lst中所有元素的和与积",不要沮丧.通常很难发现这里的错误.如果在大堆真实的代码中发现了这个错误就非常厉害了.--当你不知道这是一个测试时,很难发现这个错误. 这里的错误是在第二个循环体中使用了i而不是t.等下,这到底是怎么工作的?i在第一个循环外应

Python深入06——python的内存管理详解_python

语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征.这里以Python语言为例子,说明一门动态类型的.面向对象的语言的内存管理方式. 对象的内存使用 赋值语句是语言最常见的功能了.但即使是最简单的赋值语句,也可以很有内涵.Python的赋值语句就很值得研究. a = 1 整数1为一个对象.而a是一个引用.利用赋值语句,引用a指向对象1.Python是动态类型的语言(参考动态类型),对象与引用分离.Python