"""This module provides functions for easy editing of kopano config files via environment variables""" import re import os import os.path def configkopano(configs): """ Changes configuration files according to configs typically returned from parseenvironmentvariables(..)""" for filename, config in configs.items(): if not os.path.exists(filename): return # read configuration file with open(filename) as f: contents = f.read() f.close() for key, newvalue in config.items(): if key == "kccomment": # comment lines for line in newvalue: contents = re.sub(r"^\s*" + re.escape(line), r"#{}".format(line), contents, 0, re.MULTILINE) elif key == "kcuncomment": # uncomment lines for line in newvalue: contents = re.sub(r"^\s*#\s*" + re.escape(line) , line, contents, 0, re.MULTILINE) else: # find config line if re.search(r"^\s*#?\s*{}\s*=.*".format(key), contents, re.MULTILINE) == None: # add configuration as new line contents += "\n{} = {}".format(key, newvalue) else: # change existing line contents = re.sub(r"^\s*#?\s*{}\s*=.*".format(key), r"{} = {}".format(key, newvalue), contents, 0, re.MULTILINE) # save new configuration with open(filename, "w") as f: f.write(contents) f.close() def parseenvironmentvariables(prependingpath): """ Parse all environment variables starting with KCCONF_, KCCOMMENT_ and KCUNCOMMENT_ and return as multi dimensional dict """ configs = dict() for name, value in os.environ.items(): # parse change/add configuration commands namematch = re.match(r"^KCCONF_([A-Z]+)_([A-Z0-9_]+)$", name) if namematch != None: filename = namematch.group(1).lower() + ".cfg" if prependingpath + filename not in configs: configs[prependingpath + filename] = dict() confkey = namematch.group(2).lower() configs[prependingpath + filename][confkey] = value # parse comment configuration commands commentmatch = re.match(r"^KCCOMMENT_([A-Z]+)_([A-Z0-9_]+)$", name) if commentmatch != None: filename = commentmatch.group(1).lower() + ".cfg" if prependingpath + filename not in configs: configs[prependingpath + filename] = dict() try: configs[prependingpath + filename]["kccomment"].append(value) except KeyError: configs[prependingpath + filename]["kccomment"] = [] configs[prependingpath + filename]["kccomment"].append(value) # parse uncomment configuration commands uncommentmatch = re.match(r"^KCUNCOMMENT_([A-Z]+)_([A-Z0-9_]+)$", name) if uncommentmatch != None: filename = uncommentmatch.group(1).lower() + ".cfg" if prependingpath + filename not in configs: configs[prependingpath + filename] = dict() try: configs[prependingpath + filename]["kcuncomment"].append(value) except KeyError: configs[prependingpath + filename]["kcuncomment"] = [] configs[prependingpath + filename]["kcuncomment"].append(value) return configs