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