Umstellung auf Apprise API mit .env Konfiguration und Debug-Ausgaben
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
.venv/
|
.venv/
|
||||||
|
.env
|
128
README.md
128
README.md
@ -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
10
env.example
Normal 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
|
@ -1,2 +1,3 @@
|
|||||||
requests
|
requests
|
||||||
beautifulsoup4
|
python-dotenv
|
||||||
|
apprise
|
||||||
|
@ -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)})
|
||||||
|
@ -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"
|
|
||||||
]
|
|
||||||
}
|
|
Reference in New Issue
Block a user