这次很强了。就差最后一步,判断一下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()

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

  1. python的工作记录A

    马上进入工作自动化: [root@localhost ~]# cat svn_bbs.py import os,sys,commands,subprocess import re,time svnUr ...

  2. [工作记录] Android OpenGL ES: non-square texture - continue

    previous: [工作记录] Android OpenGL ES 2.0: square texture not supported on some device recently I found ...

  3. MySQL跨表更新字段 工作记录

    工作中遇到两表查询,从user表中获取用户唯一id字段 写入到另外一张qiuzu表中的uid字段中; 二者可以关联起来的只有用户的手机号码tel字段; 了解需求后数据量稍多,不可能一个一个的手动修改 ...

  4. 最近的linux工作记录

    最近的linux工作记录 最近公司走了一些同事,部分服务器交到了我的手里,总结一些常用的操作 注:大写的字符串一般是用来占位,需要替换 创建账户和使用密钥对登陆 1,账户系列 useradd 选项 用 ...

  5. 工作记录 - OBB的解决方案

    之前关于OBB的内容: Android上使用native IO 最近工作中的问题笔记 工作记录[续] android OBB 自从用了Java来mount OBB, 再也没有遇到挂载的问题. 但最近在 ...

  6. Python爬虫个人记录(三)爬取妹子图

    这此教程可能会比较简洁,具体细节可参考我的第一篇教程: Python爬虫个人记录(一)豆瓣250 Python爬虫个人记录(二)fishc爬虫 一.目的分析 获取煎蛋妹子图并下载 http://jan ...

  7. Python爬虫个人记录(二) 获取fishc 课件下载链接

    参考: Python爬虫个人记录(一)豆瓣250 (2017.9.6更新,通过cookie模拟登陆方法,已成功实现下载文件功能!!) 一.目的分析 获取http://bbs.fishc.com/for ...

  8. 工作记录--WPF自定义控件,实现一个可设置编辑模式的TextBox

    原文:工作记录--WPF自定义控件,实现一个可设置编辑模式的TextBox 1. 背景 因为最近在使用wpf开发桌面端应用,在查看页面需要把TextBox和Combox等控件设置为只读的.原本是个很简 ...

  9. 图书馆管理系统程序+全套开发文档(系统计划书,系统使用说明,测试报告,UML分析与设计,工作记录)

    图书馆管理系统程序+全套开发文档(系统计划书,系统使用说明,测试报告,UML分析与设计,工作记录): https://download.csdn.net/download/qq_39932172/11 ...

随机推荐

  1. 将大型 Page Blob 的页范围进行分段

     Windows Azure 存储支持一种 Blob 类型,即 Page Blob.Page Blob 通过仅将已写入但未清除的页存入物理存储, 来有效存储稀疏数据.每页大小为 512 字节.Ge ...

  2. 【Linux】部署apache

    部署前的准备: 1.安装apr #wget http://mirror.bit.edu.cn/apache/apr/apr-1.4.8.tar.gz #tar -zxvf apr-1.4.8.tar. ...

  3. 护肤品总结 Skin Care (2)

    接护肤品总结(1) 面膜篇 个人不太喜欢片状面膜,所以用膏状面膜比较多. 1. Origins Drink Up-Intensive Overnight Mask 悦木之源补水睡眠面膜 牛油果油油的质 ...

  4. [LeetCode] 179. Largest Number 解题思路

    Given a list of non negative integers, arrange them such that they form the largest number. For exam ...

  5. [LeetCode] 11. Container With Most Water My Submissions Question 解题思路

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai).  ...

  6. 学习DNS路上之CloudXNS

    使用CloudXNS已经有两年了,趁着他们现在做活动的机会也发表一下这两年来使用感受与CloudXNS的变化,也对我学习使用的一次总结. 简介 CloudXNS是北京快网开发的一套授权DNS系统, 用 ...

  7. HDFS文件系统的操作

    package com.bank.utils; import java.io.BufferedInputStream;import java.io.BufferedOutputStream;impor ...

  8. nginx本地的测试环境添加SSL

    要在本地添加SSL,首先要做的是防火墙是不是放开了443端口,同时,在nginx安装时是不是支持了ssl模块,这个安装网上很容易找到相关资料 防火墙,个人还是用iptables比较直观 先将selin ...

  9. 只要关闭浏览器,session就消失了

    程序一般都是在用户做log off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经关闭.服务器会一直保留这个会话对象直 ...

  10. Mybatis高级映射、动态SQL及获得自增主键

    一.动态SQL 相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list authorList,需要根据authorList里已有的作者信息在数据库中查询相应作者 ...