From 6b73d5f2a0b949b08cab84f893cc57e77f158ba9 Mon Sep 17 00:00:00 2001 From: "torge.eiben" Date: Thu, 30 Jan 2025 18:38:59 +0000 Subject: [PATCH] =?UTF-8?q?nextcloud=5Flog=5Falert.py=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nextcloud_log_alert.py | 64 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 nextcloud_log_alert.py diff --git a/nextcloud_log_alert.py b/nextcloud_log_alert.py new file mode 100644 index 0000000..9fa928c --- /dev/null +++ b/nextcloud_log_alert.py @@ -0,0 +1,64 @@ +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("DEFAULT", "WEBHOOK_URL", fallback=None) + log_file = config.get("DEFAULT", "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) \ No newline at end of file