From 1dd444aa5d97a9e710587d81fa7e9eede37e3763 Mon Sep 17 00:00:00 2001 From: Markus Busche Date: Fri, 27 Jun 2025 13:48:20 +0200 Subject: [PATCH] Umstellung auf Apprise API mit .env Konfiguration und Debug-Ausgaben --- .gitignore | 3 +- README.md | 128 ++++++++++++++++++++++++++++++------------- env.example | 10 ++++ requirements.txt | 3 +- ti_status_checker.py | 44 ++++++++++++--- ti_status_state.json | 15 ----- 6 files changed, 141 insertions(+), 62 deletions(-) create mode 100644 env.example delete mode 100644 ti_status_state.json diff --git a/.gitignore b/.gitignore index 0cafc1c..71b98ca 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.venv/ \ No newline at end of file +.venv/ +.env \ No newline at end of file diff --git a/README.md b/README.md index b9930d5..b93437f 100644 --- a/README.md +++ b/README.md @@ -1,56 +1,110 @@ # TI-Status2Mattermost -Dieses Python-Skript überwacht die TI-Lagebild-API [https://ti-lage.prod.ccs.gematik.solutions/lageapi/v2/tilage](https://ti-lage.prod.ccs.gematik.solutions/lageapi/v2/tilage) auf neue Störungs- und Wartungsmeldungen und sendet diese automatisch an einen Mattermost-Webhook. +Ein Python-Skript, das den TI-Status überwacht und neue Meldungen über Apprise an verschiedene Dienste sendet. -## Funktionsweise -- Die API wird bei jedem Aufruf auf neue Meldungen geprüft. -- Neue Meldungen werden erkannt und als formatierte Nachricht an Mattermost gesendet. -- Bereits gesendete Meldungen werden gespeichert, sodass sie nach einem Neustart nicht erneut verschickt werden. +## Features -## Voraussetzungen -- Python 3.8 oder neuer -- Zugriff auf die Mattermost-Webhook-URL +- Überwacht die TI-Status-API auf neue Meldungen +- Sendet Benachrichtigungen über Apprise (unterstützt viele Dienste wie Mattermost, Slack, Telegram, Discord, etc.) +- Konfiguration über .env Datei +- Markdown-Formatierung der Nachrichten +- Vermeidet Duplikate durch lokale Statusverfolgung +- Debug-Ausgaben für bessere Transparenz ## Installation -1. Repository klonen oder Dateien herunterladen. -2. Abhängigkeiten installieren: - ```bash - pip install -r requirements.txt - ``` -## Nutzung -Das Skript kann direkt gestartet werden: +1. Repository klonen: +```bash +git clone +cd TI-Status2Mattermost +``` + +2. Virtuelle Umgebung erstellen und aktivieren: +```bash +python -m venv .venv +# Windows: +.venv\Scripts\activate +# Linux/Mac: +source .venv/bin/activate +``` + +3. Abhängigkeiten installieren: +```bash +pip install -r requirements.txt +``` + +## Konfiguration + +1. Kopiere die Beispiel-Konfiguration: +```bash +cp env.example .env +``` + +2. Bearbeite die `.env` Datei und setze deine Apprise URL: + +### Mattermost Webhook +``` +APPRISE_URL=mattermost://username:password@mattermost.medisoftware.org/channel?webhook=your_webhook_id +``` + +### Andere Dienste +- **Slack**: `APPRISE_URL=slack://token_a/token_b/token_c/#channel` +- **Telegram**: `APPRISE_URL=telegram://bottoken/ChatID` +- **Discord**: `APPRISE_URL=discord://webhook_id` + +Weitere Apprise-URLs findest du in der [Apprise-Dokumentation](https://github.com/caronc/apprise#supported-notifications). + +## Verwendung + +Skript einmalig ausführen: ```bash python ti_status_checker.py ``` -Das Skript prüft einmalig auf neue Meldungen und beendet sich dann. +Das Skript gibt Debug-Informationen aus: +- API-Aufruf und Antwort +- Anzahl der gefundenen Meldungen +- Verarbeitung jeder einzelnen Meldung -### Automatisierung mit Cron (Linux) -Um das Skript alle 5 Minuten auszuführen, kann ein Cronjob eingerichtet werden: -```cron -*/5 * * * * cd /pfad/zum/projekt && /usr/bin/python3 ti_status_checker.py +Für kontinuierliche Überwachung (z.B. mit cron): +```bash +# Alle 5 Minuten ausführen +*/5 * * * * cd /path/to/TI-Status2Mattermost && python ti_status_checker.py ``` -### Automatisierung mit Task Scheduler (Windows) -Nutze die Aufgabenplanung, um das Skript alle 5 Minuten zu starten. +## Unterstützte Dienste -## Nutzung mit Docker -1. Docker-Image bauen: - ```bash - docker build -t ti-status2mattermost . - ``` -2. Container regelmäßig starten (z.B. mit Cron): - ```cron - */5 * * * * docker run --rm -v $(pwd)/ti_status_state.json:/app/ti_status_state.json ti-status2mattermost - ``` +Apprise unterstützt über 80 verschiedene Benachrichtigungsdienste, darunter: +- Mattermost +- Slack +- Telegram +- Discord +- Email +- Pushover +- Microsoft Teams +- und viele weitere -## Konfiguration -- Die Mattermost-Webhook-URL und die API-URL sind im Skript als Konstanten hinterlegt. +## Dateien -## Hinweise -- Bereits gesendete Meldungen werden in der Datei `ti_status_state.json` gespeichert. -- Die Markdown-Formatierung der Nachrichten sorgt für eine übersichtliche Darstellung in Mattermost. +- `ti_status_checker.py` - Hauptskript mit Debug-Ausgaben +- `requirements.txt` - Python-Abhängigkeiten (python-dotenv, apprise) +- `env.example` - Beispiel-Konfiguration +- `ti_status_state.json` - Lokale Statusverfolgung (wird automatisch erstellt) +- `.env` - Deine Konfiguration (nicht im Repository) + +## Changelog + +### Version 2.0 (Apprise-Integration) +- ✅ Umstellung von Mattermost Webhook auf Apprise API +- ✅ Konfiguration über .env Datei +- ✅ Unterstützung für über 80 Benachrichtigungsdienste +- ✅ Debug-Ausgaben für bessere Transparenz +- ✅ Verbesserte Markdown-Formatierung + +### Version 1.0 (Ursprünglich) +- Mattermost Webhook Integration +- Lokale Statusverfolgung ## Lizenz -MIT \ No newline at end of file + +[Deine Lizenz hier] \ No newline at end of file diff --git a/env.example b/env.example new file mode 100644 index 0000000..0375c51 --- /dev/null +++ b/env.example @@ -0,0 +1,10 @@ +# Apprise Konfiguration +# Beispiel für Mattermost Webhook: +# APPRISE_URL=mattermost://username:password@mattermost.medisoftware.org/channel?webhook=your_webhook_id + +# Beispiel für andere Dienste: +# APPRISE_URL=slack://token_a/token_b/token_c/#channel +# APPRISE_URL=telegram://bottoken/ChatID +# APPRISE_URL=discord://webhook_id + +APPRISE_URL=https://mattermost.medisoftware.org/hooks/i67zgcgajifxxxtfwjxcxace7a \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 7e774f2..647d62d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ requests -beautifulsoup4 \ No newline at end of file +python-dotenv +apprise diff --git a/ti_status_checker.py b/ti_status_checker.py index f0e7695..4adef6f 100644 --- a/ti_status_checker.py +++ b/ti_status_checker.py @@ -2,15 +2,28 @@ import requests import json from datetime import datetime import re +import os +from dotenv import load_dotenv +import apprise + +# Lade Umgebungsvariablen aus .env Datei +load_dotenv() TI_API_URL = "https://ti-lage.prod.ccs.gematik.solutions/lageapi/v2/tilage" -WEBHOOK_URL = "https://mattermost.medisoftware.org/hooks/i67zgcgajifxxxtfwjxcxace7a" STATE_FILE = "ti_status_state.json" +# Apprise Konfiguration aus Umgebungsvariablen +APPRISE_URL = os.getenv('APPRISE_URL') +if not APPRISE_URL: + raise ValueError("APPRISE_URL muss in der .env Datei definiert sein") + def fetch_status_messages(): + print(f"Rufe TI-Status-API ab: {TI_API_URL}") resp = requests.get(TI_API_URL) resp.raise_for_status() data = resp.json() + print(f"API-Antwort erhalten. Anzahl Meldungen: {len(data.get('meldungen', []))}") + messages = [] for meldung in data.get("meldungen", []): zeit = meldung.get("zeitpunkt", "") @@ -19,6 +32,9 @@ def fetch_status_messages(): link = meldung.get("link", "") msg = f"{zeit}\n- {titel}: {beschreibung}\n{link}".strip() messages.append(msg) + print(f"Verarbeite Meldung: {titel[:50]}...") + + print(f"Insgesamt {len(messages)} Meldungen verarbeitet") return messages def load_state(): @@ -51,13 +67,25 @@ def markdownify_message(message): md_message = "\n\n".join([l for l in md_lines if l]) return md_message -def send_to_mattermost(message): +def send_notification(message): md_message = markdownify_message(message) - payload = { - "text": f"#### Neue TI-Status-Meldung\n\n{md_message}\n\n[Zur Statusseite](https://fachportal.gematik.de/ti-status)\n_Gemeldet am {datetime.now().strftime('%d.%m.%Y %H:%M:%S')}_" - } - resp = requests.post(WEBHOOK_URL, json=payload) - resp.raise_for_status() + + # Erstelle Apprise Objekt + apobj = apprise.Apprise() + + # Füge die Apprise URL hinzu + apobj.add(APPRISE_URL) + + # Erstelle die Nachricht + title = "Neue TI-Status-Meldung" + body = f"{md_message}\n\n[Zur Statusseite](https://fachportal.gematik.de/ti-status)\n_Gemeldet am {datetime.now().strftime('%d.%m.%Y %H:%M:%S')}_" + + # Sende die Nachricht + apobj.notify( + title=title, + body=body, + body_format=apprise.NotifyFormat.MARKDOWN + ) def main(): state = load_state() @@ -68,7 +96,7 @@ def main(): new_messages = [m for m in messages if m not in known_messages] for msg in new_messages: print(f"Neue Meldung gefunden: {msg}") - send_to_mattermost(msg) + send_notification(msg) known_messages.add(msg) if new_messages: save_state({"messages": list(known_messages)}) diff --git a/ti_status_state.json b/ti_status_state.json deleted file mode 100644 index d4e7db8..0000000 --- a/ti_status_state.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "messages": [ - "23.06.2025\n - Wartungsarbeiten DEMIS:Mehr erfahren", - "Die gematik informiert Sie auf den Status-Seiten über aktuelle betriebliche Ereignisse. Dazu gehören Störungen in der Telematikinfrastruktur, temporäre Downtimes sowie geplante Wartungsvorhaben, Releases und Updates.Bei einer außerplanmäßigen Unterbrechung im Betrieb berichtet die gematik über Fortschritte in Ursachenanalyse und Behebung.", - "27.05.2025\n - Hinweis: Keine E-Mail-Benachrichtigungen bei TI-Status-Änderungen :Mehr erfahren", - "06.06.2025\n - Konnektoren und Kartenterminals mit veralteter oder nicht mehr zugelassener Software im Einsatz:Mehr erfahren", - "Bereitstellung von allgemeinen Informationen zu den verschiedenen Diensten der Telematikinfrastruktur", - "gematik GmbHFriedrichstr. 13610117 Berlin", - "06.05.2025\n - Am 12.05.2025 beginnen die RSA2ECC Testwochen!:\n Ein besonderer Schwerpunkt liegt diesmal auf der Prüfung von QES-Signaturen (Qualified Electronic Signatures) sowie ihrer Evaluierung und Optimierung.Mehr erfahren", - "24.04.2025\n - Einstellung des Vertriebs und des technischen Supports für den Konnektorsimulator für Primärsysteme (KoPS):Mehr erfahren", - "Planungshilfe für die kollisionsfreie Terminierung von Deployment-Changes für TI-Komponenten", - "16.05.2025\n - Neue Firmware-Versionen für Konnektoren: Vorbereitung auf aktualisierte Vertrauensliste der BNetzA:Mehr erfahren", - "23.06.2025\n - Wartungsarbeiten Versicherten Stammdaten Management (VSDM) des Betreibers BITMARCK Technik GmbH:Mehr erfahren" - ] -} \ No newline at end of file