diff --git a/core/Dockerfile b/core/Dockerfile index 6fdd16d..093d711 100644 --- a/core/Dockerfile +++ b/core/Dockerfile @@ -47,3 +47,6 @@ COPY kcconf.py defaultconfigs/ start-service.sh /kopano/ ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD [ "/kopano/start-service.sh" ] + +HEALTHCHECK --interval=30s --timeout=60s \ + CMD /kopano/healthcheck.sh diff --git a/core/defaultconfigs/server.py b/core/defaultconfigs/server.py index 1ed670e..f93d533 100644 --- a/core/defaultconfigs/server.py +++ b/core/defaultconfigs/server.py @@ -9,7 +9,7 @@ kcconf.configkopano({ 'log_level': "3", 'attachment_path': "/kopano/data/attachments/", 'user_plugin': "ldap", - 'server_listen': "", + 'server_listen': "*:236", 'server_listen_tls': "*:237" } }) diff --git a/core/healthcheck.sh b/core/healthcheck.sh new file mode 100644 index 0000000..cc8bb5e --- /dev/null +++ b/core/healthcheck.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +case "$SERVICE_TO_START" in +server) + dockerize \ + -wait tcp://localhost:237 \ + ([ -f /kopano/data/.user-sync ] || kopano-cli --sync; touch /kopano/data/.user-sync) + exit 0 + ;; +esac diff --git a/core/kcconf.py b/core/kcconf.py index 663d726..a7c6798 100644 --- a/core/kcconf.py +++ b/core/kcconf.py @@ -1,77 +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): - """ 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 +"""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