From 2be56303c3428f55dc909333c3a294694d25e93d Mon Sep 17 00:00:00 2001 From: pi-farm Date: Fri, 6 Feb 2026 21:19:41 +0100 Subject: [PATCH] add Dockerfile and config folder & files --- Dockerfile | 18 +++ Dockerfile.aarch64 => config/watch_state.json | 0 watchdog.conf => config/watchdog.conf | 7 +- docker-compose.yml | 10 +- msmtprc | 12 -- multi-watch.sh | 109 ++++++++---------- watch_state.json | 6 - 7 files changed, 74 insertions(+), 88 deletions(-) rename Dockerfile.aarch64 => config/watch_state.json (100%) rename watchdog.conf => config/watchdog.conf (70%) delete mode 100644 msmtprc delete mode 100644 watch_state.json diff --git a/Dockerfile b/Dockerfile index e69de29..b03d080 100644 --- a/Dockerfile +++ b/Dockerfile @@ -0,0 +1,18 @@ +FROM alpine:latest + +# Abhängigkeiten installieren +RUN apk add --no-cache bash curl jq msmtp ca-certificates tzdata + +# Struktur anlegen +RUN mkdir /app /config +WORKDIR /app + +# Skript kopieren +COPY multi-watch.sh /app/multi-watch.sh +RUN chmod +x /app/multi-watch.sh + +# VOLUME markiert den Mount-Punkt für die Persistenz +VOLUME ["/config"] + +# Startbefehl +ENTRYPOINT ["/bin/bash", "/app/multi-watch.sh"] \ No newline at end of file diff --git a/Dockerfile.aarch64 b/config/watch_state.json similarity index 100% rename from Dockerfile.aarch64 rename to config/watch_state.json diff --git a/watchdog.conf b/config/watchdog.conf similarity index 70% rename from watchdog.conf rename to config/watchdog.conf index 06f869b..b8894b6 100644 --- a/watchdog.conf +++ b/config/watchdog.conf @@ -1,6 +1,9 @@ # E-Mail Einstellungen EMAIL_TO="empfaenger@beispiel.de" -EMAIL_FROM="watchdog@dein-server.de" +EMAIL_FROM="multi-watch@dein-server.de" + +# Intervall +CHECK_INTERVAL=21600 # Alle 6 Stunden (in Sekunden) # Quellen (Format: TYPE|REPO|EXTRA) TARGETS=( @@ -13,4 +16,4 @@ TARGETS=( SMTP_HOST="smtp.dein-anbieter.de" SMTP_PORT="587" SMTP_USER="dein-benutzername" -SMTP_PASS="dein-passwort" \ No newline at end of file +SMTP_PASS="dein-passwort" diff --git a/docker-compose.yml b/docker-compose.yml index 7c4564e..da9d0fb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,8 +2,8 @@ services: multi-watch: image: git.pi-farm.de/pi-farm/multi-watch:1.0 container_name: multi-watch - environment: - - PUID=1000 - - PGID=1000 - - TZ=Europe/Berlin - restart: unless-stopped \ No newline at end of file + volumes: + - $(pwd)/config:/config + - /etc/localtime:/etc/localtime:ro + restart: unless-stopped + diff --git a/msmtprc b/msmtprc deleted file mode 100644 index 17c97bf..0000000 --- a/msmtprc +++ /dev/null @@ -1,12 +0,0 @@ -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 7239326..5e5a15c 100644 --- a/multi-watch.sh +++ b/multi-watch.sh @@ -1,33 +1,28 @@ #!/bin/bash -# Pfade definieren CONFIG_DIR="/config" CONFIG_FILE="$CONFIG_DIR/watchdog.conf" STATE_FILE="$CONFIG_DIR/watch_state.json" -# 1. Prüfen, ob das Config-Verzeichnis existiert -if [ ! -d "$CONFIG_DIR" ]; then - echo "Fehler: Verzeichnis $CONFIG_DIR nicht gefunden!" - exit 1 -fi +while true; do + # 1. Config bei jedem Durchlauf neu laden (erlaubt Änderungen ohne Neustart) + if [ -f "$CONFIG_FILE" ]; then + source "$CONFIG_FILE" + else + echo "Fehler: $CONFIG_FILE nicht gefunden! Warte 60s..." + sleep 60 + continue + fi -# 2. Config laden -if [ -f "$CONFIG_FILE" ]; then - source "$CONFIG_FILE" -else - echo "Fehler: $CONFIG_FILE nicht gefunden!" - exit 1 -fi + # Standard-Intervall falls nicht definiert (1 Stunde) + INTERVAL=${CHECK_INTERVAL:-3600} -# 3. msmtp Konfiguration dynamisch schreiben -# (Nutzt die Variablen aus der watchdog.conf) -cat < /etc/msmtprc + # msmtp Konfig schreiben + 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 @@ -35,54 +30,42 @@ from $EMAIL_FROM user $SMTP_USER password $SMTP_PASS EOF -chmod 600 /etc/msmtprc + chmod 600 /etc/msmtprc -# 4. State-Datei initialisieren falls nötig -if [ ! -f "$STATE_FILE" ] || [ ! -s "$STATE_FILE" ]; then - echo "{}" > "$STATE_FILE" -fi + if [ ! -f "$STATE_FILE" ] || [ ! -s "$STATE_FILE" ]; then echo "{}" > "$STATE_FILE"; fi -UPDATES_FOUND="" + UPDATES_FOUND="" + echo "--- Starte Check: $(date) ---" -# --- 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}" - - # Alten Wert aus der JSON im /config/ Ordner lesen - OLD_VAL=$(jq -r ".[\"$KEY\"] // empty" "$STATE_FILE") - NEW_VAL="" + for entry in "${TARGETS[@]}"; do + IFS="|" read -r TYPE REPO EXTRA <<< "$entry" + KEY="${TYPE}_${REPO//[\/\.]/_}_${EXTRA}" + OLD_VAL=$(jq -r ".[\"$KEY\"] // empty" "$STATE_FILE") + NEW_VAL="" - if [ "$TYPE" == "DOCKER" ]; then - NEW_VAL=$(curl -s "https://hub.docker.com/v2/repositories/${REPO}/tags/${EXTRA}" | jq -r '.last_updated // empty') - elif [ "$TYPE" == "GITHUB" ]; then - NEW_VAL=$(curl -s "https://api.github.com/repos/${REPO}/branches/${EXTRA}" | jq -r '.commit.sha // empty') + if [ "$TYPE" == "DOCKER" ]; then + NEW_VAL=$(curl -s "https://hub.docker.com/v2/repositories/${REPO}/tags/${EXTRA}" | jq -r '.last_updated // empty') + elif [ "$TYPE" == "GITHUB" ]; then + 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 continue; fi + + if [ -n "$OLD_VAL" ] && [ "$OLD_VAL" != "$NEW_VAL" ]; then + MSG="Update für $REPO ($EXTRA)! Alt: $OLD_VAL | Neu: $NEW_VAL" + echo "🔔 $MSG" + UPDATES_FOUND="${UPDATES_FOUND}${MSG}\n" + fi + + TEMP_JSON=$(jq ".[\"$KEY\"] = \"$NEW_VAL\"" "$STATE_FILE") + echo "$TEMP_JSON" > "$STATE_FILE" + done + + # Mail senden + if [ -n "$UPDATES_FOUND" ]; then + echo -e "Subject: Watchdog Alert\nFrom: $EMAIL_FROM\nTo: $EMAIL_TO\n\n$UPDATES_FOUND" | msmtp "$EMAIL_TO" fi - # 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 - 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 - - # Neuen Wert in die JSON im /config/ Ordner schreiben - TEMP_JSON=$(jq ".[\"$KEY\"] = \"$NEW_VAL\"" "$STATE_FILE") - echo "$TEMP_JSON" > "$STATE_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 + echo "Check beendet. Nächster Scan in $INTERVAL Sekunden." + sleep "$INTERVAL" +done \ No newline at end of file diff --git a/watch_state.json b/watch_state.json deleted file mode 100644 index 5e647be..0000000 --- a/watch_state.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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" -}