diff --git a/multi-watch.sh b/multi-watch.sh index 0a08fa5..7e0b267 100644 --- a/multi-watch.sh +++ b/multi-watch.sh @@ -4,15 +4,12 @@ CONFIG_DIR="/config" CONFIG_FILE="$CONFIG_DIR/watchdog.conf" STATE_FILE="$CONFIG_DIR/watch_state.json" -# Initialisierung: Existiert die Datei UND ist sie valides JSON? -# Falls nein (oder leer/korrupt), schreiben wir {} hinein. if [ ! -f "$STATE_FILE" ] || ! jq -e . "$STATE_FILE" >/dev/null 2>&1; then echo "⚠️ State-Datei war ungültig oder leer. Setze Reset auf {}." echo "{}" > "$STATE_FILE" fi while true; do - # 1. Config laden if [ -f "$CONFIG_FILE" ]; then source "$CONFIG_FILE" else @@ -20,8 +17,6 @@ while true; do sleep 60; continue fi - # 2. HIER NEU: msmtp Konfiguration IMMER neu schreiben - # Damit ist sie immer verfügbar für Tests und Updates cat < /etc/msmtprc defaults auth on @@ -47,7 +42,6 @@ EOF 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="" @@ -96,7 +90,6 @@ EOF continue fi - # Logik: Wenn kein alter Wert da ist ODER der neue Wert anders ist if [ -z "$OLD_VAL" ] || [ "$OLD_VAL" != "$NEW_VAL" ]; then if [ -z "$OLD_VAL" ]; then echo " 🆕 Erstaufnahme in Datenbank." @@ -105,19 +98,16 @@ EOF UPDATES_FOUND="${UPDATES_FOUND}Update fuer $REPO ($EXTRA)\n" fi - # Wir generieren das neue JSON NEW_JSON_CONTENT=$(jq ".[\"$KEY\"] = \"$NEW_VAL\"" "$STATE_FILE" 2>&1) JQ_EXIT_CODE=$? if [ $JQ_EXIT_CODE -eq 0 ] && [ -n "$NEW_JSON_CONTENT" ]; then - # Nur schreiben, wenn jq Erfolg hatte UND Inhalt da ist echo "$NEW_JSON_CONTENT" > "${STATE_FILE}.tmp" && mv "${STATE_FILE}.tmp" "$STATE_FILE" echo " 💾 gespeichert." else echo " ❌ FEHLER BEIM SPEICHERN!" echo " jq Exit Code: $JQ_EXIT_CODE" echo " jq Output: $NEW_JSON_CONTENT" - # Notfall-Reset, falls die Datei korrupt ist, damit es beim nächsten Mal wieder geht if ! jq -e . "$STATE_FILE" >/dev/null 2>&1; then echo "{}" > "$STATE_FILE" fi @@ -127,7 +117,18 @@ EOF fi done - # E-Mail Versand + echo "Säubere veraltete Einträge aus der Datenbank..." + VALID_KEYS=() + for entry in "${TARGETS[@]}"; do + IFS="|" read -r TYPE REPO EXTRA <<< "$entry" + VALID_KEYS+=("${TYPE}_${REPO//[\/\.]/_}_${EXTRA}") + done + VALID_KEYS_JSON=$(printf '%s\n' "${VALID_KEYS[@]}" | jq -R . | jq -s .) + CLEAN_JSON=$(jq "with_entries(select(.key as \$k | $VALID_KEYS_JSON | index(\$k)))" "$STATE_FILE") + if [ $? -eq 0 ]; then + echo "$CLEAN_JSON" > "${STATE_FILE}.tmp" && mv "${STATE_FILE}.tmp" "$STATE_FILE" + fi + if [ -n "$UPDATES_FOUND" ]; then echo " 📧 Versuche E-Mail zu senden an $EMAIL_TO..." if echo -e "Subject: Watchdog Alert\n\n$UPDATES_FOUND" | timeout 20s msmtp --debug "$EMAIL_TO" 2>&1; then