From d58514ed1610482fe39edaac426c791f9b14b7ee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?V=C3=A1clav=20Barto=C5=A1?= <bartos@cesnet.cz>
Date: Mon, 4 Apr 2022 11:31:43 +0200
Subject: [PATCH] configuration variables taken from local files

The UI should run from a directory directly under soctools root (or the "SOCTOOLS_BASE" must be modified)
---
 main.py          | 34 ++++++++++++++++++++++++++--------
 requirements.txt |  3 ++-
 2 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/main.py b/main.py
index 6e5a121..2ffca26 100644
--- a/main.py
+++ b/main.py
@@ -5,18 +5,36 @@ from wtforms import StringField
 from wtforms.validators import DataRequired, Email
 
 import requests
-from datetime import datetime
+import yaml
 
+from datetime import datetime
+import os.path
+import re
 import subprocess
 
 app = Flask(__name__)
 app.secret_key = "ASDF1234 - CHANGE ME!"
 
-# *** Configuration ***
-# TODO get this from config/environment
-CA_CERT = "" # path to secrets/CA/ca.crt
-KEYCLOAK_BASE_URL = "" # https://{{soctoolsproxy}}:12443
-KEYCLOAK_ADMIN_PASSWORD = "" # take from secrets/passwords/keykloak_admin (Note: should be keycloak, not keykloak)
+# *** Configuration of file paths ***
+SOCTOOLS_BASE = ".." # path to the root of soctools files
+VARIABLES_FILE = os.path.join(SOCTOOLS_BASE, "group_vars/all/variables.yml")
+CA_CERT_FILE = os.path.join(SOCTOOLS_BASE, "secrets/CA/ca.crt")
+KEYCLOAK_ADMIN_PASSWORD_FILE = os.path.join(SOCTOOLS_BASE, "secrets/passwords/keykloak_admin") # Note: should be keycloak, not keykloak
+
+@app.before_first_request
+def load_config():
+    """Load various variables, api keys, etc. and set configuration parameters"""
+    global SOCTOOLSPROXY, KEYCLOAK_BASE_URL, KEYCLOAK_ADMIN_PASSWORD
+    variables = yaml.safe_load(open(VARIABLES_FILE, "r"))
+    print(variables)
+    # Get FQDN of the main server
+    SOCTOOLSPROXY = variables["soctoolsproxy"]
+    assert re.match('[a-zA-Z0-9.-]+', SOCTOOLSPROXY), f"ERROR: The 'soctoolsproxy' variable loaded from '{VARIABLES_FILE}' is not a valid domain name."
+    # Set base URL to Keycloak
+    KEYCLOAK_BASE_URL = f"https://{SOCTOOLSPROXY}:12443"
+    # Load API key for Keycloak
+    KEYCLOAK_ADMIN_PASSWORD = open(KEYCLOAK_ADMIN_PASSWORD_FILE, "r").read(100) # read max 100 B, the key should never be so long
+
 
 # *** Custom Jinja filters ***
 def ts_to_str(ts):
@@ -37,7 +55,7 @@ def get_token():
         "grant_type": "password"
     }
     try:
-        resp = requests.post(url, data, verify=CA_CERT)
+        resp = requests.post(url, data, verify=CA_CERT_FILE)
         if resp.status_code != 200:
             flash(f"ERROR: Can't get token for API access: ({resp.status_code}) {resp.text[:200]}", "error")
             return None
@@ -52,7 +70,7 @@ def get_users():
     token = get_token()
     if token is None:
         return [] # can't get token, error message is already flashed by get_token function
-    resp = requests.get(url, headers={'Authorization': 'Bearer ' + token}, verify=CA_CERT)
+    resp = requests.get(url, headers={'Authorization': 'Bearer ' + token}, verify=CA_CERT_FILE)
     if not resp.ok:
         flash(f"ERROR: Can't get list of users: ({resp.status_code}) {resp.text[:200]}", "error")
         return []
diff --git a/requirements.txt b/requirements.txt
index 92710e6..532a5a0 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,4 +3,5 @@ flask_wtf~=1.0.0
 wtforms~=3.0.1
 email-validator~=1.1.3
 requests~=2.27.1
-jinja2~=3.1.1
\ No newline at end of file
+jinja2~=3.1.1
+PyYAML~=5.2
\ No newline at end of file
-- 
GitLab