从SVN一键对比版本

公司的部署程序太多,每次部署安装完后,还得从SVN上对比版本,手工做实在太麻烦。

比如下面的一个版本

思路:

将需要检查的部件及安装的位置、SVN相关信息写入配置文件,然后程序读取配置文件

配置文件内容如下:

[server1]
ipaddr=192.168.3.2
password=qqqqq
port=22
dir=/home/gx/    ----##部件按装的位置
compent=sc,cag,ghomeAgent,IfTImg,Stream,TransDownload  ---###服务器上安装的部件

[Server2]
ipaddr=192.168.14.31
password=qqqqq
port=22
dir=/home/gx/
compent=bms,bussinessAgent

[SVN]
svnserver=192.168.3.185
user=nenenen
password=xxxx
url=http://192.168.3.185/TM/VS/VSP/04_Build
~

因设计到公司内部的产品,代码屏蔽了一些东西:

#!/usr/bin/python
#coding:utf-8
import paramiko
import sys
import subprocess
import ConfigParser
import os,time
import re
import urllib2
from urlparse import urlparse
import unittest

#从SVN获取组件及版本号
class snvparser():

    aa={}
    def __init__(self,url,server,user,passwd):
        
        auth_handler = urllib2.HTTPBasicAuthHandler()
        auth_handler.add_password(realm='TM Repository',
                          uri=server,
                          user=user,
                          passwd=passwd)
        self.opener = urllib2.build_opener(auth_handler)
        urllib2.install_opener(self.opener)
        self.url=url
        
        #print self.url
        a=self.opener.open(self.url)
        data=a.read()
        patten='href="(w*?)/"'
        self.compentlist=re.findall(patten,data)
        #print self.compentlist
        if  'mvp' in "".join(self.compentlist) or 'GXVCP' in ''.join(self.compentlist):
            urldd = urlparse(self.url)
            result=urldd.path.split('/')[-1]
            self.compentlist.sort(reverse=True)
            #print self.compentlist
            #print self.compentlist[0]
            self.aa[result]=self.compentlist[0]
        else:
            for self.subb in self.compentlist:
                #print self.subb
                #print '-'*50
                self.suburl=self.url+'/'+self.subb
                #print self.suburl
                self.openurl(self.suburl)
   
    def openurl(self,url):
        #self.url=url
        #print url
        a=self.opener.open(url)
        data=a.read()
        patten='href="(w*?)/"'
        self.compentlist=re.findall(patten,data)

        if  'mvp' in "".join(self.compentlist) or 'GXVCP' in ''.join(self.compentlist):
            urldd = urlparse(url)
            result=urldd.path.split('/')[-1]
            self.compentlist.sort(reverse=True)
           # print self.compentlist
           # print self.compentlist[0]
            self.aa[result]=self.compentlist[0]
        else:
            for self.subb in self.compentlist:
                #print self.subb
                #print '-'*50
                self.suburl=url+'/'+self.subb
                #print self.suburl
                self.openurl(self.suburl)

    def result(self):
        return self.aa



#配置文件判断及读取
config=ConfigParser.ConfigParser()
if not os.path.exists('config.ini'):
    print "config.ini is not exists,please check it!!"
    exit(-1)

config.read('config.ini')
print 
print "You want to check follow Component:"
print config.get('server1','compent')
print config.get('Server2','compent')

#SSH远程操作函数
def ssh2(ip,pt,pw,us,comm):
    try:
        ssh = paramiko.SSHClient()
        ssh.load_system_host_keys()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(ip,port=int(pt),username=us,password=pw)
        #for COMM in comm:
        stdin,stdout,stderr = ssh.exec_command(comm)
        print "The Installed Version is          :",
        read = stdout.read()
        #print read
        compi=re.compile('Implementation-Version:(.*)')
        qq=re.search(compi,read).group(1)
        #print '======================'
        print "33[36m %s 33[0m" % (qq.strip())
        print '-'*30
        ssh.close()
    except Exception,e:
        print "33[36mError33[0m is :",ip,e

class testCheckVersion(unittest.TestCase):
    def setUp(self):
        pass
    def tearDown(self):
        pass
    def testVersion(self):
        #self.assert(1==2)
        pass

 
if __name__ == '__main__':
    #print config.sections()
    server=config.get('SVN','svnserver')
    user=config.get('SVN','user')
    password=config.get('SVN','password')
    url=config.get('SVN','url')
    try:

        cc=snvparser(url,server,user,password)
        result=cc.result()
    except Exception,e:
        print e
        exit(-1)
    #print result
    #print '='*70
   
    for section_name in config.sections():
        if not section_name=='SVN':
            print '='*70
            configdd=dict(config.items(section_name))
        #configdd=getconfig(section_name)
       # print configdd
            for compent in configdd['compent'].split(","):
                try:
                    if compent=='sc' or compent=='bussinessAgent' or compent=='cag':
                        comm='cat %s%s-vcp/META-INF/MANIFEST.MF' % (configdd['dir'],compent)
                        print "The SVN 33[31m %-13s 33[0m Version is:" % compent ,
                        print "33[36m %s 33[0m" % result[compent]
                        ssh2(configdd['ipaddr'],configdd['port'],configdd['password'],us='root',comm=comm)
                    if compent=='ghomeAgent':
                        comm='cat %s%s/META-INF/MANIFEST.MF' % (configdd['dir'],compent)
                        print "The SVN 33[31m %-13s 33[0m Version is:" % compent,
                        print "33[36m %s 33[0m" % result[compent]
                        ssh2(configdd['ipaddr'],configdd['port'],configdd['password'],us='root',comm=comm)
                    if compent=='bms':
                        comm='cat %sbms/apache-tomcat-6.0.36/webapps/bms/META-INF/MANIFEST.MF' % configdd['dir']
                        print "The SVN 33[31m %-13s 33[0m Version is:" % compent,
                        print "33[36m %s 33[0m" % result[compent]
                        ssh2(configdd['ipaddr'],configdd['port'],configdd['password'],us='root',comm=comm)
                    #if compent=='IfTImg' or compent=='Stream' or compent=='TransDownload':
                        #comm='ls /home/gx'
                        #print result
                        
                        
                except KeyError,e:
                    print "Please Check input !",e
                except Exception,e:
                    print "Error",e
    print '='*70

在写完程序后才发现,公司的SVN 命令太不规范,甚至单词也有拼错;目录安装也非常随意,查看版本方式多样花。一时没心情再将程序往下写了,有需要的可以根据实际情况更改

程序运行如下:

[root@localhost tools]# python checkVersion.py 
['sc', 'bussinessAgent', 'cag', 'bms', 'ghomeAgent', 'server1', 'Server2']
======================================================================
 sc 
20160218 14:01:01 The Installed Version is: 'NoneType' object has no attribute 'group'
The SVN NESTEST Version is : GXVCP_sc_D10V200_alpha1 
======================================================================
bussinessAgent
[Errno None] Unable to connect to port 22 on  or 192.168.14.31  --#服务器密码被更改了
The SVN NESTEST Version is : GXVCP_businessAgent_D10V200_alpha1 
======================================================================
cag
20160218 14:01:12 The Installed Version is: 'NoneType' object has no attribute 'group'   ---文件已改名了
The SVN NESTEST Version is : GXVCP_cag_D10V200_alpha1 
======================================================================
bms
[Errno None] Unable to connect to port 22 on  or 192.168.14.31
The SVN NESTEST Version is : GXVCP_bms_D10V200_alpha1 
======================================================================
ghomeAgent
20160218 14:01:22 The Installed Version is:  GXVCP_ghomeAgent_D10V200_alpha1 
------------------------------
The SVN NESTEST Version is : GXVCP_ghomeAgent_D10V200_alpha1 
======================================================================
原文地址:https://www.cnblogs.com/landhu/p/5198023.html