Umstellung auf Apprise API mit .env Konfiguration und Debug-Ausgaben

This commit is contained in:
2025-06-27 13:48:20 +02:00
parent 5e2e03098c
commit 1dd444aa5d
6 changed files with 141 additions and 62 deletions

3
.gitignore vendored
View File

@ -1 +1,2 @@
.venv/ .venv/
.env

128
README.md
View File

@ -1,56 +1,110 @@
# TI-Status2Mattermost # 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 ## Features
- 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.
## Voraussetzungen - Überwacht die TI-Status-API auf neue Meldungen
- Python 3.8 oder neuer - Sendet Benachrichtigungen über Apprise (unterstützt viele Dienste wie Mattermost, Slack, Telegram, Discord, etc.)
- Zugriff auf die Mattermost-Webhook-URL - Konfiguration über .env Datei
- Markdown-Formatierung der Nachrichten
- Vermeidet Duplikate durch lokale Statusverfolgung
- Debug-Ausgaben für bessere Transparenz
## Installation ## Installation
1. Repository klonen oder Dateien herunterladen.
2. Abhängigkeiten installieren:
```bash
pip install -r requirements.txt
```
## Nutzung 1. Repository klonen:
Das Skript kann direkt gestartet werden: ```bash
git clone <repository-url>
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 ```bash
python ti_status_checker.py 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) Für kontinuierliche Überwachung (z.B. mit cron):
Um das Skript alle 5 Minuten auszuführen, kann ein Cronjob eingerichtet werden: ```bash
```cron # Alle 5 Minuten ausführen
*/5 * * * * cd /pfad/zum/projekt && /usr/bin/python3 ti_status_checker.py */5 * * * * cd /path/to/TI-Status2Mattermost && python ti_status_checker.py
``` ```
### Automatisierung mit Task Scheduler (Windows) ## Unterstützte Dienste
Nutze die Aufgabenplanung, um das Skript alle 5 Minuten zu starten.
## Nutzung mit Docker Apprise unterstützt über 80 verschiedene Benachrichtigungsdienste, darunter:
1. Docker-Image bauen: - Mattermost
```bash - Slack
docker build -t ti-status2mattermost . - Telegram
``` - Discord
2. Container regelmäßig starten (z.B. mit Cron): - Email
```cron - Pushover
*/5 * * * * docker run --rm -v $(pwd)/ti_status_state.json:/app/ti_status_state.json ti-status2mattermost - Microsoft Teams
``` - und viele weitere
## Konfiguration ## Dateien
- Die Mattermost-Webhook-URL und die API-URL sind im Skript als Konstanten hinterlegt.
## Hinweise - `ti_status_checker.py` - Hauptskript mit Debug-Ausgaben
- Bereits gesendete Meldungen werden in der Datei `ti_status_state.json` gespeichert. - `requirements.txt` - Python-Abhängigkeiten (python-dotenv, apprise)
- Die Markdown-Formatierung der Nachrichten sorgt für eine übersichtliche Darstellung in Mattermost. - `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 ## Lizenz
MIT
[Deine Lizenz hier]

10
env.example Normal file
View File

@ -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

View File

@ -1,2 +1,3 @@
requests requests
beautifulsoup4 python-dotenv
apprise

View File

@ -2,15 +2,28 @@ import requests
import json import json
from datetime import datetime from datetime import datetime
import re 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" 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" 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(): def fetch_status_messages():
print(f"Rufe TI-Status-API ab: {TI_API_URL}")
resp = requests.get(TI_API_URL) resp = requests.get(TI_API_URL)
resp.raise_for_status() resp.raise_for_status()
data = resp.json() data = resp.json()
print(f"API-Antwort erhalten. Anzahl Meldungen: {len(data.get('meldungen', []))}")
messages = [] messages = []
for meldung in data.get("meldungen", []): for meldung in data.get("meldungen", []):
zeit = meldung.get("zeitpunkt", "") zeit = meldung.get("zeitpunkt", "")
@ -19,6 +32,9 @@ def fetch_status_messages():
link = meldung.get("link", "") link = meldung.get("link", "")
msg = f"{zeit}\n- {titel}: {beschreibung}\n{link}".strip() msg = f"{zeit}\n- {titel}: {beschreibung}\n{link}".strip()
messages.append(msg) messages.append(msg)
print(f"Verarbeite Meldung: {titel[:50]}...")
print(f"Insgesamt {len(messages)} Meldungen verarbeitet")
return messages return messages
def load_state(): def load_state():
@ -51,13 +67,25 @@ def markdownify_message(message):
md_message = "\n\n".join([l for l in md_lines if l]) md_message = "\n\n".join([l for l in md_lines if l])
return md_message return md_message
def send_to_mattermost(message): def send_notification(message):
md_message = markdownify_message(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')}_" # Erstelle Apprise Objekt
} apobj = apprise.Apprise()
resp = requests.post(WEBHOOK_URL, json=payload)
resp.raise_for_status() # 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(): def main():
state = load_state() state = load_state()
@ -68,7 +96,7 @@ def main():
new_messages = [m for m in messages if m not in known_messages] new_messages = [m for m in messages if m not in known_messages]
for msg in new_messages: for msg in new_messages:
print(f"Neue Meldung gefunden: {msg}") print(f"Neue Meldung gefunden: {msg}")
send_to_mattermost(msg) send_notification(msg)
known_messages.add(msg) known_messages.add(msg)
if new_messages: if new_messages:
save_state({"messages": list(known_messages)}) save_state({"messages": list(known_messages)})

View File

@ -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"
]
}