commit 604e89d8a899fd8c8e75c27ffbe6d7d4c85c927e Author: Thorsten Date: Sat Dec 21 11:32:50 2024 +0100 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f739f4c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +shell_ntfy_duplicati.env diff --git a/README.md b/README.md new file mode 100644 index 0000000..a94cfb4 --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +# Backup Notification Script + +Dieses Bash-Skript sendet Benachrichtigungen basierend auf dem Ergebnis eines Duplicati-Backups. Die Zustände, die eine Benachrichtigung auslösen, können flexibel konfiguriert werden. + +## Anforderungen +- Ein ntfy-Server für das Senden von Benachrichtigungen +- Zugriff auf den Duplicati-Server + +## Funktionen +- Benachrichtigungen werden über `ntfy` gesendet. +- Zustände, die Benachrichtigungen auslösen, können in der Variable `SEND_NOTIFICATIONS` festgelegt werden. +- Jeder Zustand („Success“, „Warning“, „Error“, „Fatal“) hat einen eigenen Block für spezifische Titel, Nachrichten und Prioritäten. + +## Verwendung + +### 1. Konfiguration +1. Platzieren Sie das Skript und eine .env-Datei im gleichen Verzeichnis. Die .env-Datei muss denselben Namen wie das Skript haben, jedoch mit der Endung `.env` (z. B. `shell_ntfy_duplicaty.sh` und `shell_ntfy_duplicaty.env`). + +```bash +# NTFY Server +NTFY_URL=https://ntfy.server.net/ +AUTH_TOKEN=tk_dd5geasc9844jcm3d45adio3rtchs + +#Duplicati Server +DUPLICATI_URL=http://192.168.178.25:8200 +SERVER_NAME=n100 +ICON=http://192.168.178.25:3030/icons/n100.png + +# Zustände, die Benachrichtigungen auslösen +# (Success, Warning, Error, Fatal, Unknown) +SEND_NOTIFICATIONS="Fatal Unknown" + +# Optional kann bei jedem Ausführen des Scripts ein Logeintrag erstellt werden. +# Die Logdatei wird im gleichen Verzeichnis wie das Script selbst gespeichert. +# Vermerkt werden der Inhalt der $DUPLICATI__PARSED_RESULT-Variable +# und der daraus resultierende cURL-Befehl. +LOGGING=false +``` + +3. Setzen Sie die korrekten Dateiberechtigungen, um die Sicherheit zu gewährleisten und das Script ausführbar zu machen: +```bash +chmod 700 shell_ntfy_duplicaty.sh +chmod 600 shell_ntfy_duplicaty.env +chmod +x shell_ntfy_duplicaty.sh +``` + +### 2. Zustände +Das Skript unterstützt die folgenden Zustände: +- `Success`: Das Backup war erfolgreich. +- `Warning`: Das Backup wurde abgeschlossen, aber es gab Warnungen. +- `Error`: Es gab ein Problem beim Backup. +- `Fatal`: Das Backup ist aufgrund eines schwerwiegenden Fehlers fehlgeschlagen. +- Jeder nicht erkannte Zustand wird als „Unbekannter Zustand“ behandelt. + +### 3. Ausführen in Duplicati +Das Skript sollte in den Einstellungen eines Backup-Jobs unter `--run-script-after` eingetragen werden, damit es nach Abschluss des Backups automatisch ausgeführt wird. + +## Aufbau des Skripts + +Variable `SEND_NOTIFICATIONS` +Enthält eine Liste von Zuständen, die eine Benachrichtigung auslösen sollen. + +Funktion `should_notify` +Überprüft, ob der aktuelle Zustand (`DUPLICATI__PARSED_RESULT`) in der Liste `SEND_NOTIFICATIONS` enthalten ist. + +`case`-Block +Definiert Titel, Nachrichten, Prioritäten und Tags für jeden Zustand. + +Abschließend wird ein `POST`-Request an den ntfy-Server gesendet. diff --git a/shell_ntfy_duplicati.sh b/shell_ntfy_duplicati.sh new file mode 100644 index 0000000..1b4175b --- /dev/null +++ b/shell_ntfy_duplicati.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +# Pfad zur .env-Datei dynamisch ermitteln +ENV_FILE="$(dirname "$(realpath "$0")")/$(basename "$0" .sh).env" + +# Prüfen, ob die .env-Datei existiert +if [[ ! -f "$ENV_FILE" ]]; then + echo "Fehler: Konfigurationsdatei $ENV_FILE nicht gefunden." + exit 1 +fi + +# .env-Datei laden +source "$ENV_FILE" + +LOG_FILE="$(dirname "$(realpath "$0")")/$(basename "$0" .sh).log" # Logdatei im gleichen Verzeichnis wie das Script + +# Funktion zum Überprüfen, ob ein Zustand in der Benachrichtigungsliste enthalten ist +should_notify() { + local state=$1 + for notify_state in "${SEND_NOTIFICATIONS[@]}"; do + if [[ "$state" == "$notify_state" ]]; then + return 0 + fi + done + return 1 +} + +# Funktion zum Loggen +log_message() { + if [[ "$LOGGING" == true ]]; then + timestamp=$(date +"%Y-%m-%d %H:%M:%S") + echo "$timestamp - $1" >> "$LOG_FILE" + fi +} + +# Zeitstempel in die Logdatei schreiben +log_message "Script aufgerufen. DUPLICATI__PARSED_RESULT: $DUPLICATI__PARSED_RESULT" + +# Überprüfen, ob Benachrichtigung gesendet werden soll +if should_notify "$DUPLICATI__PARSED_RESULT"; then + case "$DUPLICATI__PARSED_RESULT" in + "Success") + PRIORITY="default" + TAGS="heavy_check_mark" + TITLE="Backup abgeschlossen" + MESSAGE="Das Backup wurde erfolgreich abgeschlossen" + ;; + "Warning") + PRIORITY="medium" + TAGS="warning" + TITLE="Backup abgeschlossen mit Warnungen" + MESSAGE="Das Backup wurde abgeschlossen, aber es gab Warnungen" + ;; + "Error") + PRIORITY="high" + TAGS="x" + TITLE="Backup fehlgeschlagen" + MESSAGE="Es gab ein Problem beim Erstellen des Backups" + ;; + "Fatal") + PRIORITY="urgent" + TAGS="skull" + TITLE="Schwerwiegender Fehler beim Backup" + MESSAGE="Das Backup konnte aufgrund eines schwerwiegenden Fehlers nicht abgeschlossen werden" + ;; + *) + PRIORITY="low" + TAGS="question" + TITLE="Unbekannter Zustand" + MESSAGE="Der Zustand des Backups ist unbekannt" + ;; + esac + + # curl Befehl vorbereiten + CURL_CMD="curl -s -X POST \"$NTFY_URL\" \ + -H \"Authorization: Bearer $AUTH_TOKEN\" \ + -H \"Priority: $PRIORITY\" \ + -H \"Tags: $TAGS\" \ + -H \"Icon: $ICON\" \ + -H \"Content-Type: application/json\" \ + -d '{\"topic\": \"Duplicati\", \"title\": \"$TITLE\", \"message\": \"$MESSAGE\\n\\nServer: $SERVER_NAME\\nJobname: $DUPLICATI__backup_name\\nStatus: $DUPLICATI__PARSED_RESULT\", \"click\": \"\", \"actions\": [{ \"action\": \"view\", \"label\": \"Duplicati öffnen\", \"url\": \"$DUPLICATI_URL\" }]}' +" + + # Log den curl-Befehl + log_message "curl Befehl: $CURL_CMD" + + # Benachrichtigung senden + /bin/bash -c "$CURL_CMD" +fi + +exit 0