#!/usr/bin/env python # encoding: utf-8 # # $Id$ # $URL$ """ userconfig.py Created by Marcus Stoegbauer on 2013-01-10. Copyright (c) 2013 __MyCompanyName__. All rights reserved. """ import sys import os import tempfile from checks import checks classchecks = checks() configdir = "../" hostclasses = classchecks.__classesForHost__() verbose = 1 def debug(out, level=0): """docstring for debug""" if verbose: if level > 0: print "*"*level,out else: print out # if verbose # def debug def getDEST(directory): """docstring for getDEST""" f = open(directory+"/DEST") destdir= f.read()[:-1] if destdir == "$HOME": destdir = os.environ['HOME'] # if $HOME if not destdir.endswith("/"): destdir += "/" # if not / return destdir # def getDEST def workconf(directory, destdir, depth=2): """docstring for workconf""" dirs = os.listdir(directory) ret = [] for d in dirs: name = directory+"/"+d if os.path.isdir(name): # fixme: create name workconf(name, destdir, depth+1) # if dir ret.append(name) debug("workconf: found file %s" % name, depth) # for d return ret # def workconf def workdir(directory): """docstring for work""" debug("===============================", 1) if not os.path.isfile(directory+"/DEST"): debug("No DEST in %s, skipping." % directory, 1) return # if not DEST destdir = getDEST(directory) # destfiles is a dict of all files that will be created from the classes config # key is the destination filename, values are all classes filenames that are used to # build the file destfiles = {} # Schritt 1: Dateien einlesen for h in hostclasses: if h[0] != "": classdir = directory+"/"+h[0]+"_"+h[1] else: classdir = directory+"/"+h[1] # if all if os.path.isdir(classdir): debug("workdir: %s" % classdir, 1) tempfiles = workconf(classdir, destdir) # tempfiles is a list of files within one classdir for f in tempfiles: destname = destdir+os.path.basename(f) # destination filename if not destfiles.has_key(destname): destfiles[destname] = [] # if not destname, create key with empty list destfiles[destname].append(f) # append each file to dict # for tempfiles # if classdir # for hostclasses debug("workdir: %s, Files: %s" % (directory, str(destfiles))) debug("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", 1) return destfiles # def work def buildFile(destfile, classfiles): """docstring for buildFile""" content = [] for f in classfiles: fp = open(f, "r") content.append(fp.read()) fp.close() # end f (tempfd, tempfilename) = tempfile.mkstemp(prefix=os.path.basename(destfile), dir="/tmp") fp = None try: fp = os.fdopen(tempfd, "w") except: print "Cannot write to temporary file",tempfilename os.remove(tempfilename) sys.exit(1) # try for block in content: fp.write(block) fp.write("\n") # for content fp.close() # fixme: diff tempfilename destfile # fixme: header marker for "is under userconfig control" # fixme: if diff and not under userconfig control, backup destfile # fixme: copy tempfilename to destfile # fixme: remove tempfilename # def buildFile def buildAllFiles(destfiles): """docstring for buildFiles""" for df in destfiles.keys(): buildFile(df, destfiles[df]) # for df # def buildAllFiles def main(): debug("Classes for host: %s" % hostclasses) for d in os.listdir(configdir): name = configdir+d if not os.path.isdir(name): continue elif d.startswith(".svn"): continue elif os.path.isfile(name+"/.ignore"): continue else: debug("main: %s" % name) destfiles = workdir(name) buildAllFiles(destfiles) # if # for d # def main if __name__ == '__main__': main()