Compare commits

...

7 Commits

Author SHA1 Message Date
95c3551a5c fix: output AUTH_HEADER
All checks were successful
ci / docker (push) Successful in 1m5s
2026-03-12 13:07:27 +01:00
31db0c22d2 fix: indent 2026-03-12 12:57:49 +01:00
ce5328da53 fix: make auth header configurable 2026-03-12 12:53:48 +01:00
1d36a9aaed fix: required keys load from env 2026-03-12 12:43:00 +01:00
7fea3bf315 fix: add missing bracket 2026-03-12 12:41:33 +01:00
2e37ddcb8e fix: add pgsql lib to req 2026-03-12 12:38:32 +01:00
7d612c0ccd feat: allow loading from environment & run without static services 2026-03-12 11:57:34 +01:00
2 changed files with 28 additions and 5 deletions

View File

@@ -5,3 +5,4 @@ flask-wtf
waitress
requests
icinga2api
psycopg2-binary

View File

@@ -32,6 +32,7 @@ app = flask.Flask("Icinga Report In Gateway")
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('SQLALCHEMY_DATABASE_URI') or 'sqlite:///database.sqlite'
app.config['JSON_CONFIG_FILE'] = 'services.json'
app.config['JSON_CONFIG_DIR'] = 'config'
app.config['AUTH_HEADER'] = os.environ.get("AUTH_HEADER") or "X-Forwarded-Preferred-Username"
db = SQLAlchemy(app)
class Service(db.Model):
@@ -91,7 +92,7 @@ def buildReponseDict(status, service=None):
@app.route('/overview')
def overview():
user = str(flask.request.headers.get("X-Forwarded-Preferred-Username"))
user = str(flask.request.headers.get(app.config['AUTH_HEADER']))
# query all services #
services = db.session.query(Service).filter(Service.owner == user).all()
@@ -161,7 +162,7 @@ def create_entry(form, user):
@app.route("/service-details")
def service_details():
user = str(flask.request.headers.get("X-Forwarded-Preferred-Username"))
user = flask.request.headers.get(app.config['AUTH_HEADER'])
service = flask.request.args.get("service")
# query service #
@@ -189,7 +190,7 @@ def service_details():
@app.route("/entry-form", methods=["GET", "POST", "DELETE"])
def create_interface():
user = str(flask.request.headers.get("X-Forwarded-Preferred-Username"))
user = flask.request.headers.get(app.config['AUTH_HEADER'])
# check if is delete #
operation = flask.request.args.get("operation")
@@ -448,8 +449,7 @@ def create_app():
config |= json.load(f)
if not config:
print("No valid configuration found - need at least one service")
return
print("No static services configuration found - loading finished.")
for key in config:
timeout = timeparse.timeparse(config[key]["timeout"])
@@ -459,12 +459,34 @@ def create_app():
owner=config[key]["owner"]))
db.session.commit()
LOAD_FROM_ENV = [
"ICINGA_API_USER",
"ICINGA_API_PASS",
"ICINGA_API_URL",
"ICINGA_WEB_URL",
"ASYNC_ICINGA_DUMMY_HOST"
]
enforce_load_from_env = os.environ.get("ENFORCE_LOAD_FROM_ENV") or ""
missing = [k for k in LOAD_FROM_ENV if k not in os.environ]
if missing and enforce_load_from_env.lower() == "true":
print(f"ENFORCE_LOAD_FROM_ENV is 'true' but we are missing: {missing} - Abort.")
sys.exit(1)
for key in LOAD_FROM_ENV:
if key in os.environ:
print(f"Loading/Overwriting {key} from environment", file=sys.stderr)
app.config[key] = os.environ[key]
# create icinga host #
if not app.config.get("ICINGA_API_URL"):
print("ICINGA_API_URL not defined. Not connecting Icinga", file=sys.stderr)
else:
icingatools.create_master_host(app)
print(f"Expected AUTH_HEADER is: {app.config['AUTH_HEADER']}")
if __name__ == "__main__":