From f7c3549ccbe68b7305378b53a1d78260415c114b Mon Sep 17 00:00:00 2001 From: pi-farm Date: Fri, 6 Feb 2026 23:19:34 +0100 Subject: [PATCH] fix writing to watch_status.json --- multi-watch.sh | 70 ++++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/multi-watch.sh b/multi-watch.sh index 9bfd798..30a1a08 100644 --- a/multi-watch.sh +++ b/multi-watch.sh @@ -4,6 +4,9 @@ CONFIG_DIR="/config" CONFIG_FILE="$CONFIG_DIR/watchdog.conf" STATE_FILE="$CONFIG_DIR/watch_state.json" +# Sicherstellen, dass die Datei existiert und valides JSON ist +if [ ! -f "$STATE_FILE" ] || [ ! -s "$STATE_FILE" ]; then echo "{}" > "$STATE_FILE"; fi + while true; do if [ -f "$CONFIG_FILE" ]; then source "$CONFIG_FILE" @@ -13,14 +16,14 @@ while true; do fi INTERVAL=${CHECK_INTERVAL:-3600} - if [ ! -f "$STATE_FILE" ] || [ ! -s "$STATE_FILE" ]; then echo "{}" > "$STATE_FILE"; fi - UPDATES_FOUND="" echo "--- Starte Check: $(date) ---" for entry in "${TARGETS[@]}"; do IFS="|" read -r TYPE REPO EXTRA <<< "$entry" KEY="${TYPE}_${REPO//[\/\.]/_}_${EXTRA}" + + # Aktuellen Wert aus Datei lesen OLD_VAL=$(jq -r ".[\"$KEY\"] // empty" "$STATE_FILE") NEW_VAL="" @@ -28,66 +31,67 @@ while true; do if [ "$TYPE" == "DOCKER" ]; then if [[ "$REPO" != *"."* ]] || [[ "$REPO" == *"docker.io"* ]]; then - # --- Docker Hub Logik --- CLEAN_REPO=${REPO#docker.io/} [[ "$CLEAN_REPO" != *"/"* ]] && CLEAN_REPO="library/$CLEAN_REPO" NEW_VAL=$(curl -s "https://hub.docker.com/v2/repositories/${CLEAN_REPO}/tags/${EXTRA}" | jq -r '.last_updated // empty') else - # --- Custom Registry (z.B. Gitea) --- REG_HOST=$(echo $REPO | cut -d/ -f1) IMG_NAME=$(echo $REPO | cut -d/ -f2-) - - # 1. Versuche einen anonymen Token zu holen (Standard V2 Auth) TOKEN=$(curl -s "https://${REG_HOST}/v2/token?service=${REG_HOST}&scope=repository:${IMG_NAME}:pull" | jq -r '.token // empty') - - # 2. Abfrage mit Token (falls vorhanden) und explizitem GET statt HEAD - if [ -n "$TOKEN" ] && [ "$TOKEN" != "null" ]; then - AUTH_HEADER="Authorization: Bearer $TOKEN" - else - AUTH_HEADER="X-No-Auth: true" # Dummy Header - fi - - # Wir nutzen curl -i (Header + Body) und fangen den Digest ab - RESPONSE=$(curl -s -i -H "$AUTH_HEADER" \ - -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \ - "https://${REG_HOST}/v2/${IMG_NAME}/manifests/${EXTRA}") + [[ -n "$TOKEN" && "$TOKEN" != "null" ]] && AUTH_H="Authorization: Bearer $TOKEN" || AUTH_H="X-No-Auth: true" + + RESPONSE=$(curl -s -i -L -H "$AUTH_H" -H "Accept: application/vnd.docker.distribution.manifest.v2+json" "https://${REG_HOST}/v2/${IMG_NAME}/manifests/${EXTRA}") NEW_VAL=$(echo "$RESPONSE" | grep -i "docker-content-digest" | awk '{print $2}' | tr -d '\r') - - # Falls Digest leer, versuche ETag (Backup für manche Registries) - if [ -z "$NEW_VAL" ]; then - NEW_VAL=$(echo "$RESPONSE" | grep -i "etag" | awk '{print $2}' | tr -d '\r' | tr -d '"') - fi + [[ -z "$NEW_VAL" ]] && NEW_VAL=$(echo "$RESPONSE" | grep -i "etag" | awk '{print $2}' | tr -d '\r' | tr -d '"') fi elif [ "$TYPE" == "GITHUB" ]; then NEW_VAL=$(curl -s "https://api.github.com/repos/${REPO}/branches/${EXTRA}" | jq -r '.commit.sha // empty') fi - # Debug-Ausgabe falls leer if [ -z "$NEW_VAL" ] || [ "$NEW_VAL" == "null" ]; then - echo " ⚠️ Konnte keine Daten für $REPO abrufen (API-Antwort leer)." + echo " ⚠️ Fehler: Keine Daten empfangen." continue fi - if [ -n "$OLD_VAL" ] && [ "$OLD_VAL" != "$NEW_VAL" ]; then + # Logik: Wenn kein alter Wert da ist ODER der neue Wert anders ist + if [ -z "$OLD_VAL" ]; then + echo " 🆕 Erstaufnahme in Datenbank." + # Wir schreiben hier sofort, damit der Zustand gespeichert wird + TEMP_JSON=$(jq ".[\"$KEY\"] = \"$NEW_VAL\"" "$STATE_FILE") + echo "$TEMP_JSON" > "$STATE_FILE" + elif [ "$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" + # Wert aktualisieren + TEMP_JSON=$(jq ".[\"$KEY\"] = \"$NEW_VAL\"" "$STATE_FILE") + echo "$TEMP_JSON" > "$STATE_FILE" else echo " ✅ Aktuell." fi - - # Speichern - TEMP_JSON=$(jq ".[\"$KEY\"] = \"$NEW_VAL\"" "$STATE_FILE") - echo "$TEMP_JSON" > "$STATE_FILE" done - # Mail-Versand (bleibt gleich) + # E-Mail Versand if [ -n "$UPDATES_FOUND" ]; then - # SMTP Konfig schreiben (msmtp Logik hier einfügen wie zuvor...) + # Dynamische msmtp config (wie vorher) + cat < /etc/msmtprc +defaults +auth on +tls on +tls_trust_file /etc/ssl/certs/ca-certificates.crt +account default +host $SMTP_HOST +port $SMTP_PORT +from $EMAIL_FROM +user $SMTP_USER +password $SMTP_PASS +EOF + chmod 600 /etc/msmtprc echo -e "Subject: Watchdog Alert\n\n$UPDATES_FOUND" | msmtp "$EMAIL_TO" + echo " 📧 E-Mail gesendet." fi - echo "Check beendet. Nächster Scan in $INTERVAL s." + echo "Nächster Scan in $INTERVAL s." sleep "$INTERVAL" done \ No newline at end of file