免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5376 | 回复: 1
打印 上一主题 下一主题

Python配置文件部署自动更新脚本教程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-31 20:08 |只看该作者 |倒序浏览
系统中存在配置文件几乎是没有悬念的事情,每次系统升级,手动修改配置文件是一件让人非常头痛的事情,既然计算机能够自动搞定这些事情,为什么人工还要干预呢?所以写个脚本来批量处理这个事情。

    需求分析

   1. 新添加的配置能够自动添加到生成环境中去,删除的配置能够自动从生成环境删除;
   2. 对新添加的配置能够展示给用户,当用户输入某行行号后,能够修改配置到生产环境。

    用shell脚本写出第一版的程序,发现对空的判断(行内多个空格,空行)无法解决,所以还是用python来实现需求。

    实现的过程

1:把*.properties文件内容转化为Dictionary,供后续校对2个文件使用
def readFile(name):
    propFile= file(name, "rb")
    propDict= dict()
    for propLine in propFile:
        propDef= propLine.strip()
        if len(propDef) == 0:
            continue
        if propDef[0] in ( '!', '#' ):
            continue
        punctuation= [ propDef.find(c) for c in ':= ' ] + [ len(propDef) ]
        found= min( [ pos for pos in punctuation if pos != -1 ] )
        name= propDef[:found].rstrip()
        value= propDef[found:].lstrip(":= ").rstrip()
        propDict[name]= value
    propFile.close()
    return propDict

2:把生产环境A中没有,但是开发配置B中有的配置添加到A中去,同时把添加的内容放到一个Dictionary中,让后续输入行号可以修改改内容
def diffFile(baseFile,serverFile,diffPrintFlag):
    myFile1 = readFile(baseFile) #base file
    myFile2 = readFile(serverFile) #the file on server
    f = open(serverFile,"ab")
    global count
    for key in myFile1:
        value = myFile1.get(key)
        value2 = myFile2.get(key)
        #property nedd add to server file
        if(value != "" and not value2):
            print str(count) + ": " + key + "=" + value
            f.write("\r\n" + key + "=" + value)
            dictGolable[str(count)] = key
            count += 1
        if(value2 != value and diffPrintFlag):
            print "base properties:",key,"=",value,"\t","server properties:",key,"=",value2,"\n"
        else:
            pass
    f.close

3:删除生产环境A中有,但是开发配置B没有的配置
for key in myFile2:
        value = myFile1.get(key)
        value2 = myFile2.get(key)
        #property already delete deal;
        if(value2 != "" and not value):
            replaceFile(serverFile,key+"="+value2,"")

4:在删除生产环境A中内容的时候需要一个公用方法:
def replaceFile(inputFile,old,new):
    data = open(inputFile).read()
    data = re.sub(old,new, data)
    open(inputFile, 'wb').write(data)

5:手工输入行号,能够把前面添加的配置的value修改。
def add2File(serverFile):
    flag = True
    server = readFile(serverFile)
    if(count <= 1):
        flag = False
    else:
        print 'press n to exsit!'
    while(flag):
        num = raw_input("which row do you want do modify:")
        try:
            if(num == 'n' or num == 'N'):
                flag = False
                break
            key = dictGolable[str(num)]
        except KeyError:
            print 'error input!'
            continue
        if(not key):
            print 'input wrong,need to reinput:'
            continue
        oldVlaue = server.get(key)
        print 'input value: ',key+"=",
        value = raw_input('')
        replaceFile(serverFile,key+"="+oldVlaue,key+"="+value)

当然在这个过程中会碰到KeyError的问题,注意try except一下。

6:unix下面的换行和dos下面的表示有区别,当在 linux下面出现^M的时候,需要用代码来处理:

os.system("sed -i'' \"s/\r//\" "+serverFile)


好了,经过一整子的整理,代码第一个版本终于出炉,满足了开始提出的需求。点击这里下载全部代码。水平有限,谨慎围观!

via : http://www.longtask.con/blog

论坛徽章:
0
2 [报告]
发表于 2010-03-31 21:42 |只看该作者
本帖最后由 luffy.deng 于 2010-03-31 22:08 编辑

回复 1# hoorace

没有完全看明白用途,简单说一下,a里有的b里没有的删掉,b有的a没有的添加上,是不需要把a,b都遍历一次的,也不需要设置一个全局字典。
比如这样:

  1. a = {'cat':5,'dog':2,'egg':3,'duck':6}
  2. b = {'cat':2,'dog':8,'egg':0,'dig':1}
  3. for key in a.keys() :
  4.     if b.has_key(key):
  5.         b[key]=a[key]
  6. print b
  7.    
复制代码
生产环境应用新配置文件 也不许要那么复杂,把 *.properties重命名为*.properties.bak 重新生成*.properties文件把 b写入就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP