diff --git a/msmtprc b/msmtprc new file mode 100644 index 0000000..17c97bf --- /dev/null +++ b/msmtprc @@ -0,0 +1,12 @@ +defaults +auth on +tls on +tls_trust_file /etc/ssl/certs/ca-certificates.crt +logfile /var/log/msmtp.log + +account default +host smtp.dein-anbieter.de +port 587 +from deine-email@beispiel.de +user dein-benutzername +password dein-passwort \ No newline at end of file diff --git a/multi-watch.sh b/multi-watch.sh index a7ee72b..7239326 100644 --- a/multi-watch.sh +++ b/multi-watch.sh @@ -1,54 +1,88 @@ #!/bin/bash -# Datei für den Status -STATE_FILE="watch_state.json" -# Liste der zu prüfenden Quellen (Typ|Name|Zusatz) -# Formate: -# DOCKER|user/repo|tag -# GITHUB|user/repo|branch -TARGETS=( - "DOCKER|library/ubuntu|latest" - "DOCKER|grafana/grafana|9.5.0" - "GITHUB|docker/cli|master" - "GITHUB|torvalds/linux|master" -) +# Pfade definieren +CONFIG_DIR="/config" +CONFIG_FILE="$CONFIG_DIR/watchdog.conf" +STATE_FILE="$CONFIG_DIR/watch_state.json" -# Falls jq nicht installiert ist -if ! command -v jq &> /dev/null; then echo "Bitte 'jq' installieren!"; exit 1; fi +# 1. Prüfen, ob das Config-Verzeichnis existiert +if [ ! -d "$CONFIG_DIR" ]; then + echo "Fehler: Verzeichnis $CONFIG_DIR nicht gefunden!" + exit 1 +fi -# Initialisiere State-Datei falls nicht vorhanden -if [ ! -f "$STATE_FILE" ]; then echo "{}" > "$STATE_FILE"; fi +# 2. Config laden +if [ -f "$CONFIG_FILE" ]; then + source "$CONFIG_FILE" +else + echo "Fehler: $CONFIG_FILE nicht gefunden!" + exit 1 +fi +# 3. msmtp Konfiguration dynamisch schreiben +# (Nutzt die Variablen aus der watchdog.conf) +cat < /etc/msmtprc +defaults +auth on +tls on +tls_trust_file /etc/ssl/certs/ca-certificates.crt +logfile /var/log/msmtp.log + +account default +host $SMTP_HOST +port $SMTP_PORT +from $EMAIL_FROM +user $SMTP_USER +password $SMTP_PASS +EOF +chmod 600 /etc/msmtprc + +# 4. State-Datei initialisieren falls nötig +if [ ! -f "$STATE_FILE" ] || [ ! -s "$STATE_FILE" ]; then + echo "{}" > "$STATE_FILE" +fi + +UPDATES_FOUND="" + +# --- Logik-Schleife --- for entry in "${TARGETS[@]}"; do IFS="|" read -r TYPE REPO EXTRA <<< "$entry" + # Key-Generierung (Punkte und Slashes durch Unterstrich ersetzen) KEY="${TYPE}_${REPO//[\/\.]/_}_${EXTRA}" - OLD_VAL=$(jq -r ".${KEY} // empty" "$STATE_FILE") + + # Alten Wert aus der JSON im /config/ Ordner lesen + OLD_VAL=$(jq -r ".[\"$KEY\"] // empty" "$STATE_FILE") NEW_VAL="" if [ "$TYPE" == "DOCKER" ]; then - # Holt das letzte Update-Datum vom Docker Hub NEW_VAL=$(curl -s "https://hub.docker.com/v2/repositories/${REPO}/tags/${EXTRA}" | jq -r '.last_updated // empty') elif [ "$TYPE" == "GITHUB" ]; then - # Holt den neuesten Commit-SHA vom GitHub Branch NEW_VAL=$(curl -s "https://api.github.com/repos/${REPO}/branches/${EXTRA}" | jq -r '.commit.sha // empty') fi - if [ -z "$NEW_VAL" ] || [ "$NEW_VAL" == "null" ]; then - echo "Fehler: Konnte Daten für $REPO ($EXTRA) nicht abrufen." - continue + # Validierung der API-Antwort + if [ -z "$NEW_VAL" ] || [ "$NEW_VAL" == "null" ]; then + echo "⚠️ Konnte Daten für $REPO ($EXTRA) nicht abrufen." + continue fi + # Vergleich if [ -n "$OLD_VAL" ] && [ "$OLD_VAL" != "$NEW_VAL" ]; then - echo "🔔 UPDATE GEFUNDEN: $REPO ($EXTRA)" - echo " Alt: $OLD_VAL" - echo " Neu: $NEW_VAL" - # HIER: Befehl für E-Mail oder Push-Dienst einfügen + MSG="Update für $REPO ($EXTRA)! Alt: $OLD_VAL | Neu: $NEW_VAL" + echo "🔔 $MSG" + UPDATES_FOUND="${UPDATES_FOUND}${MSG}\n" else echo "✅ $REPO ($EXTRA) ist aktuell." fi - # Status aktualisieren - TEMP_JSON=$(jq ".${KEY} = \"$NEW_VAL\"" "$STATE_FILE") + # Neuen Wert in die JSON im /config/ Ordner schreiben + TEMP_JSON=$(jq ".[\"$KEY\"] = \"$NEW_VAL\"" "$STATE_FILE") echo "$TEMP_JSON" > "$STATE_FILE" -done \ No newline at end of file +done + +# 5. Mail versenden, falls Updates gefunden wurden +if [ -n "$UPDATES_FOUND" ]; then + echo -e "Subject: Watchdog Alert - Neue Versionen gefunden\nFrom: $EMAIL_FROM\nTo: $EMAIL_TO\n\nFolgende Änderungen wurden erkannt:\n\n$UPDATES_FOUND" | msmtp "$EMAIL_TO" + echo "Info: Benachrichtigung an $EMAIL_TO versendet." +fi \ No newline at end of file diff --git a/watch_state.json b/watch_state.json new file mode 100644 index 0000000..5e647be --- /dev/null +++ b/watch_state.json @@ -0,0 +1,6 @@ +{ + "DOCKER_library_ubuntu_latest": "2026-01-19T00:04:34.988138Z", + "DOCKER_grafana_grafana_9.5.0": "2023-04-26T06:56:09.639877Z", + "GITHUB_docker_cli_master": "727bc3ea5b2cccf0d1ef77d7049848851e973477", + "GITHUB_torvalds_linux_master": "b7ff7151e653aa296ab6c5495b2c1ab7c21eb250" +} diff --git a/watchdog.conf b/watchdog.conf new file mode 100644 index 0000000..06f869b --- /dev/null +++ b/watchdog.conf @@ -0,0 +1,16 @@ +# E-Mail Einstellungen +EMAIL_TO="empfaenger@beispiel.de" +EMAIL_FROM="watchdog@dein-server.de" + +# Quellen (Format: TYPE|REPO|EXTRA) +TARGETS=( + "DOCKER|library/ubuntu|latest" + "DOCKER|grafana/grafana|9.5.0" + "GITHUB|docker/cli|master" +) + +# SMTP Einstellungen für msmtp +SMTP_HOST="smtp.dein-anbieter.de" +SMTP_PORT="587" +SMTP_USER="dein-benutzername" +SMTP_PASS="dein-passwort" \ No newline at end of file