import requests import json import configparser import os from time import sleep CONFIG_FILE = "/opt/nextcloud_log_alert/config.conf" LOG_LEVELS = {0: "DEBUG", 1: "INFO", 2: "WARN", 3: "ERROR", 4: "FATAL"} # Konfigurationswerte aus Datei laden def load_config(): config = configparser.ConfigParser() if os.path.exists(CONFIG_FILE): config.read(CONFIG_FILE) webhook_url = config.get("SETTINGS", "WEBHOOK_URL", fallback=None) log_file = config.get("SETTINGS", "LOG_FILE", fallback="/home/data/nextcloud.log") return webhook_url, log_file return None, "/home/data/nextcloud.log" # Webhook und Log-Dateipfad abrufen webhook_url, LOG_FILE = load_config() # Log-Datei auslesen def read_logs(): try: with open(LOG_FILE, "r") as file: return file.readlines() except FileNotFoundError: return [] # Letzte gesendete Logs speichern last_sent = set() while True: logs = read_logs() for log in logs[-10:]: # Nur die letzten 10 Zeilen überprüfen try: log_entry = json.loads(log) log_level = log_entry.get("level", -1) log_level_text = LOG_LEVELS.get(log_level, "UNKNOWN") if log not in last_sent: last_sent.add(log) # Verhindert doppelte Einträge embed = { "title": f"Nextcloud Log Alert ({log_level_text}) :bell:", "description": log_entry.get("message", "Keine Nachricht"), "color": 5814783 if log_level < 3 else 16711680, # Rot für ERROR/FATAL "fields": [ {"name": "Log Level", "value": log_level_text, "inline": True}, {"name": "App", "value": log_entry.get("app", "Unbekannt"), "inline": True}, {"name": "URL", "value": log_entry.get("url", "Unbekannt"), "inline": False}, {"name": "User", "value": log_entry.get("user", "System"), "inline": False}, ], "timestamp": log_entry.get("time", "") } payload = {"embeds": [embed]} response = requests.post(webhook_url, json=payload) if response.status_code != 204: print(f"Fehler beim Senden an {webhook_url}: {response.status_code}, {response.text}") except json.JSONDecodeError: continue sleep(30)