From 6c339db86b44b72e0cbd681cdebea6486fe0cbba Mon Sep 17 00:00:00 2001 From: Marcus Stoegbauer Date: Mon, 14 Jan 2013 22:23:48 +0000 Subject: [PATCH] debug angepasst und konsequenter gemacht --- Userconfig/Tools.py | 28 +++++++++++++------- Userconfig/cfgfile.py | 36 +++++++++++++++++++++---- userconfig.py | 61 +++++++++++++++++++++++++------------------ 3 files changed, 84 insertions(+), 41 deletions(-) diff --git a/Userconfig/Tools.py b/Userconfig/Tools.py index 39ceb45..55582b0 100644 --- a/Userconfig/Tools.py +++ b/Userconfig/Tools.py @@ -31,14 +31,16 @@ class Debug(object): self.verbose = verbose # def setverbose + def addverbose(self): + """docstring for setverbose""" + self.verbose += 1 + # def addverbose + def debug(self, out, level=0): """docstring for debug""" - if self.verbose: - if level > 0: - print "*"*level,out - else: - print out - # if verbose + if self.verbose >= level: + print out + # if level # def debug # class Debug @@ -89,9 +91,9 @@ def read_skip_comment(fp, commentstring): def diff(destfile, tempfile, commentstring, debug): """diff destfile and tempfile, returns True if files differ, False if they are the same""" - debug.debug("Diffing %s and %s" % (destfile, tempfile)) + debug.debug("Diffing %s and %s" % (destfile, tempfile), 3) if not os.path.isfile(destfile): - debug.debug("Destfile %s does not exist, returning True." % destfile) + debug.debug("Destfile %s does not exist, returning True." % destfile, 3) # destfile does not exist -> copy tempfile over return True # if not destfile @@ -142,6 +144,7 @@ def userConfigGenerated(filename, cfg): def backupFile(filename, debug): """make backup of filename, returns True if backup is successful, False else""" if os.path.isfile(filename): + debug.debug("%s exists, finding backup name." % filename, 3) backupname = filename+".userconfig."+time.strftime("%F") testbackupname = backupname counter = 0 @@ -149,9 +152,11 @@ def backupFile(filename, debug): counter+=1 testbackupname=backupname+"."+str(counter) # while - debug.debug("Renaming %s to %s" % (filename, testbackupname)) + debug.debug("Renaming %s to %s" % (filename, testbackupname), 1) os.rename(filename, testbackupname) return True + else: + debug.debug("%s does not exist, do not need backup." % filename, 3) # if filename return False # def backupFile @@ -161,11 +166,14 @@ def copyFile(sourcefile, destfile, debug): if os.path.isfile(sourcefile): # sourcefile exists + debug.debug("Source file %s exists, proceeding with copy." % sourcefile, 3) if not os.path.isfile(destfile) or os.access(destfile, os.W_OK): - debug.debug("Copying %s to %s" % (sourcefile, destfile)) + debug.debug("Copying %s to %s" % (sourcefile, destfile), 1) shutil.copy(sourcefile, destfile) return True # destfile is writable + else: + debug.debug("Destination file %s does not exist or is not writable." % destfile, 3) # if write ok return False # def copyFile diff --git a/Userconfig/cfgfile.py b/Userconfig/cfgfile.py index 82b86f1..7e68dda 100644 --- a/Userconfig/cfgfile.py +++ b/Userconfig/cfgfile.py @@ -12,11 +12,13 @@ Copyright (c) 2013 __MyCompanyName__. All rights reserved. """ import ConfigParser import os +import re class Conf(object): confobj = ConfigParser.RawConfigParser() cfgfile = '' - + debug = None + def __init__(self, filename = None): """if filename is set, open config file and initialize the ConfigParser """ @@ -25,7 +27,12 @@ class Conf(object): self.setfilename(filename) # if filename # def __init__ - + + def setdebug(self, debug): + """docstring for setdebug""" + self.debug = debug + # def setdebug + def setfilename(self, filename): """initialize the ConfigParser """ @@ -34,9 +41,28 @@ class Conf(object): raise Exception('Cannot read config file ' + filename) # if cannot read self.cfgfile = filename - - configdir=self.get("Main","configdir").replace("$HOME",os.environ['HOME']) - self.confobj.set("Main","configdir",configdir) + if self.debug: + self.debug.debug("Read config file %s" % filename, 2) + self.debug.debug("Replacing environment variables in %s." % filename, 3) + # if debug + + for s in self.confobj.sections(): + for (i, val) in self.confobj.items(s): + tempre = re.search("\$([A-Z]+)[^A-Z]*", val) + if tempre: + varname = tempre.group(1) + if self.debug: + self.debug.debug("Found variable %s in %s." % (varname, i), 3) + # if debug + if os.environ.has_key(varname): + if self.debug: + self.debug.debug("%s exists in environment, replacing with %s." % (varname, os.environ[varname])) + # if debug + self.set(s, i, val.replace("$"+varname, os.environ[varname])) + # if has_key + # if tempre + # for i + # for s # def setfilename def get(self, section, option): diff --git a/userconfig.py b/userconfig.py index bd8293b..1c4663a 100755 --- a/userconfig.py +++ b/userconfig.py @@ -36,7 +36,7 @@ class Usage(Exception): # def __init__ help_message = """ -h help --d debug +-v verbose level (multiple v for higher level) -c userconfig.cfg config file """ # class Usage @@ -45,6 +45,7 @@ def workconf(directory, depth=2): """walks through directory, collecting all filenames, returns list of all filenames""" dirs = os.listdir(directory) ret = [] + debug.debug("Finding files in directory %s." % directory, 4) for d in dirs: name = directory+"/"+d if os.path.isdir(name): @@ -53,7 +54,7 @@ def workconf(directory, depth=2): # if dir if not name.endswith(".swp"): ret.append(name) - debug.debug("workconf: found file %s" % name, depth) + debug.debug("Found file %s in directory %s" % (name, directory), 4) # if not .swp # for d return ret @@ -63,9 +64,8 @@ def workdir(directory): """walks through all host classes, checking if the classes directory exists in directory then collect all filenames within this directory and return a dict of all files for this directory - """ - debug.debug("===============================", 1) - + """ + debug.debug("Working on directory %s" % directory, 3) # skip directory if no CONFIGFILE present if not os.path.isfile(directory+"/"+cfg.get("Main", "configfile")): debug.debug("No %s in %s, skipping." % (cfg.get("Main", "configfile"), directory), 1) @@ -93,13 +93,13 @@ def workdir(directory): else: classdir = directory+"/"+h[1] # if all - + debug.debug("Looking for directory %s." % classdir, 4) # if class directory exists if os.path.isdir(classdir): - debug.debug("workdir: %s" % classdir, 1) + debug.debug("Found directory %s, getting files." % classdir, 4) # get list of files within this class directory tempfiles = workconf(classdir) - + debug.debug("Got %d files: %s." % (len(tempfiles), str(tempfiles)), 4) # put files into dict for f in tempfiles: destname = destdir+os.path.basename(f) # destination filename @@ -107,12 +107,12 @@ def workdir(directory): destfiles[destname] = [] # if not destname, create key with empty list destfiles[destname].append(f) # append each file to dict + debug.debug("Added file to %s, now %d files: %s" % (destname, len(destfiles[destname]), destfiles[destname]), 4) # for tempfiles # if classdir # for hostclasses - debug.debug("workdir: %s, Files: %s" % (directory, str(destfiles))) - debug.debug("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", 1) + debug.debug("workdir: %s, Files: %s" % (directory, str(destfiles)), 3) return (destfiles, dirConfig) # def work @@ -121,16 +121,19 @@ def buildFile(classfiles, destfile, commentstring): returns the name of tempfile""" content = [] if commentstring != "": + debug.debug("commentstring found, adding header.", 3) content.append(commentstring + " " + cfg.get("Main","stamp") + " " + time.strftime("%+") + "\n") # if commentstring not empty for f in classfiles: + debug.debug("Merging %s." % f, 4) fp = open(f, "r") filecontent = fp.read() fp.close() if commentstring == "": # look for stamp in content, replace with real stamp if re.search(re.escape(cfg.get("Main","stampreplace")), filecontent): + debug.debug("commentstring empty, replacing stamp in file", 3) filecontent = re.sub(re.escape(cfg.get("Main","stampreplace")), cfg.get("Main","stamp"), filecontent) # if search # if commentstring empty @@ -147,7 +150,7 @@ def buildFile(classfiles, destfile, commentstring): os.remove(tempfilename) return False # try - + debug.debug("Writing merged files into tempfile %s." % tempfilename, 3) for block in content: fp.write(block) fp.write("\n") @@ -159,37 +162,36 @@ def buildFile(classfiles, destfile, commentstring): def processAllFiles(destfiles, dirConfig): """processes all files in destfiles, generate files from classes, compare and copy if necessary""" - debug.debug("processAllFiles, dirConfig: %s" % (str(dirConfig.getitems("Main")))) - for df in destfiles.keys(): + debug.debug("Processing source files for %s." % df, 2) # assemble file to tmp commentstring = "" if dirConfig.check("Main", "commentstring"): commentstring = dirConfig.get("Main", "commentstring") - debug.debug("Found commentstring %s in %s" % (commentstring, df)) + debug.debug("Found commentstring %s in %s" % (commentstring, df), 3) # if COMMENTSTRNIG tempfilename = buildFile(destfiles[df], df, commentstring) if not tempfilename: - debug.debug("Error while creating temp file for %s, skipping." % df) + debug.debug("Error while creating temp file for %s, skipping." % df, 1) continue # if not tempfilename - + debug.debug("Merged files %s for %s into %s" % (str(destfiles[df]), df, tempfilename), 2) # diff assembled file and config file if Tools.diff(df, tempfilename, commentstring, debug): - print df,"changed", + debug.debug("File %s has changed" % df, 0) if not Tools.userConfigGenerated(df, cfg): - print "(trying to back up file)", - debug.debug("%s not generated by userconfig, backing up." % df) + debug.debug("%s not generated by userconfig, backing up." % df, 2) # file not generated from userconfig -> back up Tools.backupFile(df, debug) # if not userConfigGenerated # copy tmp file to real location - print "copying new version." + debug.debug("Copy %s to %s." % (tempfilename, df), 0) Tools.copyFile(tempfilename, df, debug) # if diff # remove tmp + debug.debug("Removing temporary file %s." % tempfilename, 2) os.remove(tempfilename) # for df # def buildAllFiles @@ -207,7 +209,7 @@ def main(): for option, value in opts: if option == "-v": - debug.setverbose(1) + debug.addverbose() if option in ("-h", "--help"): raise Usage(help_message) if option in ("-d", "--debug.debug"): @@ -222,32 +224,39 @@ def main(): return 2 # try + debug.debug("Using configfile %s." % configfile, 1) if not os.path.isfile(configfile): Tools.error( "No config file specified.") return 2 # if configfile + cfg.setdebug(debug) cfg.setfilename(configfile) - - debug.debug("Classes for host: %s" % hostclasses) + + debug.debug("Current host is in classes %s" % hostclasses, 1) configdir = cfg.get("Main", "configdir") for d in os.listdir(configdir): destfiles = {} - name = configdir+d + name = configdir+"/"+d + debug.debug("Working in %s" % name, 1) if not os.path.isdir(name): + debug.debug("%s is not a directory, skipping." % name, 3) continue elif d.startswith(".svn"): + debug.debug("%s is .svn, skipping." % name, 3) continue elif os.path.isfile(name+"/.ignore"): + debug.debug("%s contains file .ignore, skipping." % name, 3) continue else: - debug.debug("main: %s" % name) + debug.debug("Processing files in %s" % name, 2) (destfiles, dirConfig) = workdir(name) if isinstance(destfiles, dict): if len(destfiles.keys()) > 0: + debug.debug("Building %d files: %s" % (len(destfiles.keys()), destfiles.keys()), 3) processAllFiles(destfiles, dirConfig) # if > 0 else: - debug.debug("No destfiles for %s, skipping." % d) + debug.debug("No files found for %s, skipping." % name, 1) # if # for d # def main