根据xml内容修改配置文件
maojj
|
1#
maojj 发表于 2007-05-15 14:48
根据xml内容修改配置文件
#!/usr/bin/python
import shutil import string import os import sys import time import re import xml import xml.etree.ElementTree from xml.dom.minidom import Document class UpdateCfg: _modifiedDict = {} _modifiedFilename = '' def updateFile(self, asFilename, aoDict, asModifyMethod): self._modifiedFilename = asFilename self._modifiedDict = aoDict #backup the file to be modified first. shutil.copyfile(self._modifiedFilename, "%(filename)s_BAK"%{"filename":self._modifiedFilename}) #open the file to read f = open(self._modifiedFilename) loContentLst = f.readlines() #begin modify for loKey, loValue in self._modifiedDict.iteritems(): loMethod = getattr(self, asModifyMethod) loMethod(loContentLst, loKey, loValue) ##begin to save changes f2 = open(self._modifiedFilename, 'w') #f2 = open(self._modifiedFilename + ".txt",'w') # for test purpose for lsLine in loContentLst: f2.write(lsLine) f2.close() print 'Process %(filename)s done.' % {"filename":self._modifiedFilename} def replaceByKeyValue(self, aoContentLst, asKey, asValue): #parameter style as key = value. for i in range(len(aoContentLst)): lsLine = aoContentLst #todo, use RE to do the replacement. if lsLine.find(asKey)>=0: #print lsLine loList = aoContentLst.split("=") lsLine = loList[0] + " = " + asValue + "\n" aoContentLst = lsLine def replaceByLine(self, aoContentLst, asKey, asValue): #parameter as data line. for i in range(len(aoContentLst)): lsLine = aoContentLst #todo, use RE to do the replacement. if lsLine.find(asKey)>=0: #print lsLine lsLine = asValue + '\n' aoContentLst = lsLine def replaceAll(self, aoContentLst, asKey, asValue): #do not care parameter style, repalce all key with value. for i in range(len(aoContentLst)): lsLine = aoContentLst #todo, use RE to do the replacement. if lsLine.find(asKey)>=0: #print lsLine lsLine = lsLine.replace(asKey, asValue) aoContentLst = lsLine def replaceAllAfterLine(self, aoContentLst, asKey, asValue): for i in range(len(aoContentLst)): lsLine = aoContentLst #todo, use RE to do the replacement. if lsLine.find(asKey)>=0: lst = i #print str(lst) #print aoContentLst #lsLine = asValue #aoContentLst.append(lsLine) #print aoContentLst try: if lst: ls = string.split(asValue, " [url=file://\\n]\\n[/url] ") #print ls del aoContentLst[lst:] for ll in ls: #print ll aoContentLst.append(ll + "\n") #aoContentLst=lst #print lst except UnboundLocalError: print "replaceAllAfterLine Error:: " + asKey + " no find" def append(self, aoContentLst, asKey, asValue): #do not care parameter style, repalce all key with value. for i in range(len(aoContentLst)): lsLine = aoContentLst #todo, use RE to do the replacement. if lsLine.find(asKey)>=0: #print lsLine #lsLine = lsLine.replace(asKey, asValue) aoContentLst.insert(i+1, asValue+"\n") break #i = i+1 # skip one line class ConfigHandler: flagadd = False flag = False key = "" childtuple = [] roottuple = [] def doc_order_iter(self, node): yield node for child in node.childNodes: for cn in self.doc_order_iter(child): yield cn return def pasernodecfg(self, node): self.flag = False self.flagadd = False def pasernodefileName(self, node): #print dir(node) self.key = node.nodeName self.flag = True def pasernodemodify(self, node): self.key = node.nodeName self.flag = True def pasernodedict(self, node): self.key = node.nodeName self.flag = True self.flagadd = True def addValue(self, node): print self.key + "=" + node.nodeValue self.childtuple.append(node.nodeValue) if (self.flagadd == True): print "add++++" self.roottuple.append(self.childtuple) self.childtuple = [] def gettasknewxml(self, asConfigFilename): tree = xml.etree.ElementTree.parse(asConfigFilename).getroot() result = [] for el in tree.findall("ConfigurationFilename"): confel = [] #print el.get("path") #print dir(confel) confel.append(el.get("path")) for elc in el.findall("ModifyMethod"): #print elc.tag confel.append(elc.get("type")) #print elc.get("type") item = {} for elitem in elc.findall("key"): #print elitem.get("name") #print elitem.text item[elitem.get("name")] = elitem.text #print item confel.append(item) result.append(confel) return result def getTasksFromXML(self, asConfigFilename): #lsContent = open(asConfigFilename).read() f = open(asConfigFilename) s = f.read() f.close() doc = xml.dom.minidom.parseString(s) for node in self.doc_order_iter(doc): if self.flag == True: self.addValue(node) if node.nodeName == "cfg": self.pasernodecfg(node) elif node.nodeName == "ConfigurationFilename": self.pasernodefileName(node) elif node.nodeName == "ModifyMethod": self.pasernodemodify(node) elif node.nodeName == "ToBeModifiedSecion": self.pasernodedict(node) else: self.flag = False return self.roottuple def getTasks(self, asConfigFilename): #read file lsContent = open(asConfigFilename).read() #print lsContent import re #Allow space leading Configu..., must end with a ] at a line tail(leading only space allowed. lsRE = "^[ ]*ConfigurationFilename[\s\S]*?^[ ]*}$" loCpl = re.compile(lsRE, re.M) loResults = loCpl.findall(lsContent) #print loResults #print "length is " + str(len(loResults)) #print loResults[0] lsRE2 = "[^(\^\[ \]ConfigurationFilename)][\s\S]*(?=ModifyMethod)" ''' to process: get the filename ConfigurationFilename = C:\Holibut\Workshop\Quest\Test case\ModifyCFGs\mm7p2a.properties ToBeModifiedSecion = [ (MM7P2AHTTP_opco1.port, 7798,ReplaceByKeyValue), (MM7P2AHTTPSSL_opco1.port, 7799,]ReplaceByKeyValue) ] ''' lsRE3 = "ModifyMethod[\s\S]*(?=ToBeModifiedSecion)" lsRE4 = "ToBeModifiedSecion[\s\S]*" loRets = [] for lsItem in loResults: ''' ConfigurationFilename = C:\Holibut\Workshop\Quest\Test case\ModifyCFGs\mgw.properties ModifyMethod = replaceByKeyValue ToBeModifiedSecion = { "MM7P2ASOAPHANDLER_opco1.allowedMethods":"deliver deliveryreport readreply", "MM7SOAPHANDLER_opco1.allowedMethods":"submit deliver deliveryreport readreply", "DSMPSOAPHANDLER_opco1.allowedMethods":"MonthFeeReq MonthFeeReceiptReq AuthPriceReq",, "DSMPCDRQP_opco1.dsmp_reply_port":"18888" } ''' #print lsItem #get the filename loCpl = re.compile(lsRE2) loResults2 = loCpl.findall(lsItem) #print loResults2 # ['= C:\\Holibut\\Workshop\\Quest\\Test case\\ModifyCFGs\\mm7p2a.properties\n'] lsFilename = loResults2[0].split("=")[1][:-1] # emit the trailling /n lsFilename = lsFilename.strip()#removing white space #print lsFilename #get the modifyMethod loCpl = re.compile(lsRE3) loResults3 = loCpl.findall(lsItem) lsModifyMethod = loResults3[0].split("=")[1][:-1] # emit the trailling /n lsModifyMethod = lsModifyMethod.strip()#removing white space #print lsModifyMethod #get the dict loCpl = re.compile(lsRE4) loResults4 = loCpl.findall(lsItem) lsDict = loResults4[0].split("{")[1] #The dict must start a line with {, and end with a } in a new line. #print lsDict #print "here1" loDict = eval("{"+lsDict) #print "Here2" #print loDict loRets.append((lsFilename, loDict, lsModifyMethod)) #return the result return loRets def doUpdate(config_file): lsConfigFile = config_file if os.path.isfile(lsConfigFile): ch = ConfigHandler() loArray = ch.getTasks(lsConfigFile) for lsFilename, loDict, lsModifyMethod in loArray: uc = UpdateCfg() uc.updateFile(lsFilename, loDict, lsModifyMethod) def doxmlupdate(config_file, ipaddress): lsConfigFile = config_file if (ipaddress == "localhost"): if os.path.isfile(lsConfigFile): ch = ConfigHandler() loArray = ch.gettasknewxml(lsConfigFile) print loArray for lsFilename, lsModifyMethod, loDict in loArray: print "filename to be modified = " + lsFilename print "modify items : " + str(loDict) print "modify method: " + lsModifyMethod #loDict = eval(loDict) uc = UpdateCfg() uc.updateFile(lsFilename, loDict, lsModifyMethod) return True else: return False else: if (checkipadress(ipaddress)): if os.path.isfile(lsConfigFile): os.system("scp /root/updateCFG.py root@" + ipaddress + ":/tmp") os.system("scp " + lsConfigFile + " root@" + ipaddress + ":/tmp") os.system("ssh root@" + ipaddress + " '(/usr/local/gemini/gtf/bin/python /tmp/updateCFG.py /tmp/"+ lsConfigFile.split("/")[-1] + ")'") return True else: return False else: return False def checkipadress(ipaddress): return True if __name__ == "__main__": import sys #print sys.argv[1]#the config file is import as command line arg. if len(sys.argv) lsConfigFile = sys.argv[1] #loTest = MGWUpdateCfg() #loTest.update() #print "Configuration file modified done." ch = ConfigHandler() #loArray = ch.getTasks(r"C:\Holibut\Workshop\Quest\Test case\ModifyCFGs\ModifyCFGs.config.windows")#for windows os test #loArray = ch.getTasks(r"/home/holibut/work/artifacts/ModifyCFGs.config") #loArray = ch.getTasks(lsConfigFile) if (lsConfigFile[-3:] == "txt"): loArray = ch.getTasks(lsConfigFile) #[(filename,method,dict),(filename,method,dict)] #print loArray for lsFilename, loDict, lsModifyMethod in loArray: print "filename to be modified = " + lsFilename print "modify items : " + str(loDict) print "modify method: " + lsModifyMethod #loDict = eval(loDict) uc = UpdateCfg() uc.updateFile(lsFilename, loDict, lsModifyMethod) else: loArray = ch.gettasknewxml(lsConfigFile) #[(filename,method,dict),(filename,method,dict)] print loArray for lsFilename, lsModifyMethod, loDict in loArray: print "filename to be modified = " + lsFilename print "modify items : " + str(loDict) print "modify method: " + lsModifyMethod #loDict = eval(loDict) uc = UpdateCfg() uc.updateFile(lsFilename, loDict, lsModifyMethod) |