diff --git a/core/kcconf.py b/core/kcconf.py index d6f5f83..663d726 100644 --- a/core/kcconf.py +++ b/core/kcconf.py @@ -1,61 +1,77 @@ -"""This module provides functions for easy editing of kopano config files \ -via environment variables""" - -import re -import os -import os.path - -def configkopano(configs): - for filename, config in configs.items(): - if not os.path.exists(filename): - return - with open(filename) as f: - contents = f.read() - f.close() - - for key, newvalue in config.items(): - if key == "kccomment": - for line in newvalue: - contents = re.sub(r"^\s*" + re.escape(line), r"#{}".format(line), contents, 0, re.MULTILINE) - elif key == "kcuncomment": - for line in newvalue: - contents = re.sub(r"^\s*#\s*" + re.escape(line) , line, contents, 0, re.MULTILINE) - else: - contents = re.sub(r"^\s*#?\s*{}\s*=.*".format(key), r"{} = {}".format(key, newvalue), contents, 0, re.MULTILINE) - - with open(filename, "w") as f: - f.write(contents) - f.close() - -def parseenvironmentvariables(prependingpath): - configs = dict() - - for name, value in os.environ.items(): - 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 - 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) - 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 +"""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