Browse Source

Refactor the start script to better handle mandatory parameters

kaiyou 6 years ago
parent
commit
b8a4dceb3c
3 changed files with 35 additions and 24 deletions
  1. 1 1
      contrib/docker/README.md
  2. 1 0
      contrib/docker/docker-compose.yml
  3. 33 23
      contrib/docker/start.py

+ 1 - 1
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).

+ 1 - 0
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

+ 33 - 23
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)