From cc2232746afdf4b938788dc8a922b685fce5e2ec Mon Sep 17 00:00:00 2001 From: mscadm Date: Mon, 13 Jul 2026 17:23:28 +0000 Subject: [PATCH] feat(services): Live-Erreichbarkeitspruefung fuer gebuchte Services im Katalog Bisher war _aes_live_status() geschrieben, aber nirgends im Service-Katalog eingebunden (totes Code). Jetzt generisch als _service_live_status(endpoint) fuer alle gebuchten Services mit Endpoint (nicht nur AES) und im Katalog als Badge sichtbar: 'gebucht . erreichbar' / 'gebucht . nicht erreichbar' / 'gebucht' (kein Endpoint). Schliesst die Luecke aus Task #69. --- app.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/app.py b/app.py index 892c3db..943ac80 100644 --- a/app.py +++ b/app.py @@ -163,6 +163,8 @@ table.tickets tr.row:hover{background:var(--panel2)} .grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px} .svc-card{display:flex;justify-content:space-between;align-items:flex-start} .svc-card .badge{padding:2px 9px;border-radius:99px;font-size:11px;background:#1a4a35;color:var(--ok)} +.svc-card .badge.err{background:#4a1e22;color:var(--bad)} +.svc-card .badge.unknown{background:#2a2a2a;color:#888} input,textarea,select{ background:var(--bg);border:1px solid var(--border);border-radius:6px; color:var(--text);padding:8px 10px;font-size:13px;width:100%} @@ -651,22 +653,37 @@ def api_ticket(ticket_id): # ── Service-Katalog ───────────────────────────────────────────────────────────── -def _aes_live_status(): - if not AES_DASHBOARD_URL: +def _service_live_status(endpoint): + """Prueft die Live-Erreichbarkeit eines gebuchten Service-Endpunkts (z.B. AES-Dashboard). + Generisch fuer alle Services mit Endpoint, nicht nur AES. Timeout kurz gehalten, + damit ein haengender/ausgefallener Service den Katalog nicht blockiert. + Rueckgabe: True (erreichbar) / False (nicht erreichbar) / None (kein Endpoint hinterlegt).""" + if not endpoint: return None try: - req = urllib.request.Request(AES_DASHBOARD_URL + "/", method="GET") + req = urllib.request.Request(endpoint, method="GET") with urllib.request.urlopen(req, timeout=4) as resp: return 200 <= resp.status < 400 except Exception: - return None + return False def _services_body(tenant_id): services = db.list_services(tenant_id) cards = [] for s in services: - badge = 'gebucht' if s["gebucht"] else 'nicht gebucht' + if not s["gebucht"]: + badge = 'nicht gebucht' + elif s.get("endpoint"): + live = _service_live_status(s["endpoint"]) + if live is True: + badge = 'gebucht · erreichbar' + elif live is False: + badge = 'gebucht · nicht erreichbar' + else: + badge = 'gebucht' + else: + badge = 'gebucht' link = ('
Zum Service →
' % html.escape(s["endpoint"])) if s.get("endpoint") else "" cards.append("""