summary refs log tree commit diff
diff options
context:
space:
mode:
authorkaiyou <pierre@jaury.eu>2018-02-08 20:41:41 +0100
committerkaiyou <pierre@jaury.eu>2018-02-08 20:41:41 +0100
commitb8a4dceb3cee6b69d1b1b882cef1f96a3ff6249f (patch)
tree860d2e3c26d4acf38342f88df151f181dc2384e5
parentRename the permissions variable to avoid confusion (diff)
downloadsynapse-b8a4dceb3cee6b69d1b1b882cef1f96a3ff6249f.tar.xz
Refactor the start script to better handle mandatory parameters
-rw-r--r--contrib/docker/README.md2
-rw-r--r--contrib/docker/docker-compose.yml1
-rwxr-xr-xcontrib/docker/start.py56
3 files changed, 35 insertions, 24 deletions
diff --git a/contrib/docker/README.md b/contrib/docker/README.md
index 3710afb0cf..0493d2ee6e 100644
--- a/contrib/docker/README.md
+++ b/contrib/docker/README.md
@@ -90,7 +90,7 @@ Otherwise, a dynamic configuration file will be used. The following environment
 variables are available for configuration:
 
 * ``SYNAPSE_SERVER_NAME`` (mandatory), the current server public hostname.
-* ``SYNAPSE_REPORT_STATS``, (mandatory, ``yes`` or ``not``), enable anonymous
+* ``SYNAPSE_REPORT_STATS``, (mandatory, ``yes`` or ``no``), enable anonymous
   statistics reporting back to the Matrix project which helps us to get funding.
 * ``SYNAPSE_NO_TLS``, set this variable to disable TLS in Synapse (use this if
   you run your own TLS-capable reverse proxy).
diff --git a/contrib/docker/docker-compose.yml b/contrib/docker/docker-compose.yml
index b07984ea34..3d0b3c0ea4 100644
--- a/contrib/docker/docker-compose.yml
+++ b/contrib/docker/docker-compose.yml
@@ -13,6 +13,7 @@ services:
     # See the readme for a full documentation of the environment settings
     environment:
       - SYNAPSE_SERVER_NAME=my.matrix.host
+      - SYNAPSE_REPORT_STATS=no
       - SYNAPSE_ENABLE_REGISTRATION=yes
     volumes:
       # You may either store all the files in a local folder
diff --git a/contrib/docker/start.py b/contrib/docker/start.py
index 13a10a11bb..32142bbe00 100755
--- a/contrib/docker/start.py
+++ b/contrib/docker/start.py
@@ -6,42 +6,52 @@ import sys
 import subprocess
 import glob
 
+# Utility functions
 convert = lambda src, dst, environ: open(dst, "w").write(jinja2.Template(open(src).read()).render(**environ))
-mode = sys.argv[1] if len(sys.argv) > 1 else None
-environ = os.environ.copy()
 
-# Check mandatory parameters and build the base start arguments
-if "SYNAPSE_SERVER_NAME" not in environ:
-    print("Environment variable SYNAPSE_SERVER_NAME is mandatory, exiting.")
-    sys.exit(2)
-
-ownership = "{}:{}".format(environ.get("UID", 991), environ.get("GID", 991))
-args = ["python", "-m", "synapse.app.homeserver",
-        "--server-name", environ.get("SYNAPSE_SERVER_NAME"),
-        "--report-stats", environ.get("SYNAPSE_REPORT_STATS", "no"),
-        "--config-path", environ.get("SYNAPSE_CONFIG_PATH", "/compiled/homeserver.yaml")]
+def check_arguments(environ, args):
+    for argument in args:
+        if argument not in environ:
+            print("Environment variable %s is mandatory, exiting." % argument)
+            sys.exit(2)
 
-# Generate any missing shared secret
-for secret in ("SYNAPSE_REGISTRATION_SHARED_SECRET", "SYNAPSE_MACAROON_SECRET_KEY"):
-    if secret not in environ:
-        print("Generating a random secret for {}".format(secret))
-        environ[secret] = os.urandom(32).encode("hex")
+def generate_secrets(environ, secrets):
+    for secret in secrets:
+        if secret not in environ:
+            print("Generating a random secret for {}".format(secret))
+            environ[secret] = os.urandom(32).encode("hex")
 
-# Load appservices configurations
-environ["SYNAPSE_APPSERVICES"] = glob.glob("/data/appservices/*.yaml")
+# Prepare the configuration
+mode = sys.argv[1] if len(sys.argv) > 1 else None
+environ = os.environ.copy()
+ownership = "{}:{}".format(environ.get("UID", 991), environ.get("GID", 991))
+args = ["python", "-m", "synapse.app.homeserver"]
 
 # In generate mode, generate a configuration, missing keys, then exit
 if mode == "generate":
-    os.execv("/usr/local/bin/python", args + ["--generate-config"])
+    check_arguments(environ, ("SYNAPSE_SERVER_NAME", "SYNAPSE_REPORT_STATS", "SYNAPSE_CONFIG_PATH"))
+    args += [
+        "--server-name", environ["SYNAPSE_SERVER_NAME"],
+        "--report-stats", environ["SYNAPSE_REPORT_STATS"],
+        "--config-path", environ["SYNAPSE_CONFIG_PATH"],
+        "--generate-config"
+    ]
+    os.execv("/usr/local/bin/python", args)
 
 # In normal mode, generate missing keys if any, then run synapse
 else:
     # Parse the configuration file
-    if "SYNAPSE_CONFIG_PATH" not in environ:
+    if "SYNAPSE_CONFIG_PATH" in environ:
+        args += ["--config-path", environ["SYNAPSE_CONFIG_PATH"]]
+    else:
+        check_arguments(environ, ("SYNAPSE_SERVER_NAME", "SYNAPSE_REPORT_STATS"))
+        generate_secrets(environ, ("SYNAPSE_REGISTRATION_SHARED_SECRET", "SYNAPSE_MACAROON_SECRET_KEY"))
+        environ["SYNAPSE_APPSERVICES"] = glob.glob("/data/appservices/*.yaml")
         if not os.path.exists("/compiled"): os.mkdir("/compiled")
         convert("/conf/homeserver.yaml", "/compiled/homeserver.yaml", environ)
-        convert("/conf/log.config", "/compiled/%s.log.config" % environ.get("SYNAPSE_SERVER_NAME"), environ)
+        convert("/conf/log.config", "/compiled/%s.log.config" % environ["SYNAPSE_SERVER_NAME"], environ)
+        subprocess.check_output(["chown", "-R", ownership, "/data"])
+        args += ["--config-path", "/compiled/homeserver.yaml"]
     # Generate missing keys and start synapse
     subprocess.check_output(args + ["--generate-keys"])
-    subprocess.check_output(["chown", "-R", ownership, "/data"])
     os.execv("/sbin/su-exec", ["su-exec", ownership] + args)