add function to remove old entries
All checks were successful
Docker Build Smart Logic / Build amd64 & arm64 (push) Successful in 18s

This commit is contained in:
2026-02-08 14:32:37 +01:00
parent 1848e28bed
commit e44e5f64fd

View File

@@ -4,15 +4,12 @@ CONFIG_DIR="/config"
CONFIG_FILE="$CONFIG_DIR/watchdog.conf" CONFIG_FILE="$CONFIG_DIR/watchdog.conf"
STATE_FILE="$CONFIG_DIR/watch_state.json" 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 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-Datei war ungültig oder leer. Setze Reset auf {}."
echo "{}" > "$STATE_FILE" echo "{}" > "$STATE_FILE"
fi fi
while true; do while true; do
# 1. Config laden
if [ -f "$CONFIG_FILE" ]; then if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE" source "$CONFIG_FILE"
else else
@@ -20,8 +17,6 @@ while true; do
sleep 60; continue sleep 60; continue
fi fi
# 2. HIER NEU: msmtp Konfiguration IMMER neu schreiben
# Damit ist sie immer verfügbar für Tests und Updates
cat <<EOF > /etc/msmtprc cat <<EOF > /etc/msmtprc
defaults defaults
auth on auth on
@@ -47,7 +42,6 @@ EOF
IFS="|" read -r TYPE REPO EXTRA <<< "$entry" IFS="|" read -r TYPE REPO EXTRA <<< "$entry"
KEY="${TYPE}_${REPO//[\/\.]/_}_${EXTRA}" KEY="${TYPE}_${REPO//[\/\.]/_}_${EXTRA}"
# Aktuellen Wert aus Datei lesen
OLD_VAL=$(jq -r ".[\"$KEY\"] // empty" "$STATE_FILE") OLD_VAL=$(jq -r ".[\"$KEY\"] // empty" "$STATE_FILE")
NEW_VAL="" NEW_VAL=""
@@ -96,7 +90,6 @@ EOF
continue continue
fi 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" ] || [ "$OLD_VAL" != "$NEW_VAL" ]; then
if [ -z "$OLD_VAL" ]; then if [ -z "$OLD_VAL" ]; then
echo " 🆕 Erstaufnahme in Datenbank." echo " 🆕 Erstaufnahme in Datenbank."
@@ -105,19 +98,16 @@ EOF
UPDATES_FOUND="${UPDATES_FOUND}Update fuer $REPO ($EXTRA)\n" UPDATES_FOUND="${UPDATES_FOUND}Update fuer $REPO ($EXTRA)\n"
fi fi
# Wir generieren das neue JSON
NEW_JSON_CONTENT=$(jq ".[\"$KEY\"] = \"$NEW_VAL\"" "$STATE_FILE" 2>&1) NEW_JSON_CONTENT=$(jq ".[\"$KEY\"] = \"$NEW_VAL\"" "$STATE_FILE" 2>&1)
JQ_EXIT_CODE=$? JQ_EXIT_CODE=$?
if [ $JQ_EXIT_CODE -eq 0 ] && [ -n "$NEW_JSON_CONTENT" ]; then 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 "$NEW_JSON_CONTENT" > "${STATE_FILE}.tmp" && mv "${STATE_FILE}.tmp" "$STATE_FILE"
echo " 💾 gespeichert." echo " 💾 gespeichert."
else else
echo " ❌ FEHLER BEIM SPEICHERN!" echo " ❌ FEHLER BEIM SPEICHERN!"
echo " jq Exit Code: $JQ_EXIT_CODE" echo " jq Exit Code: $JQ_EXIT_CODE"
echo " jq Output: $NEW_JSON_CONTENT" 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 if ! jq -e . "$STATE_FILE" >/dev/null 2>&1; then
echo "{}" > "$STATE_FILE" echo "{}" > "$STATE_FILE"
fi fi
@@ -127,7 +117,18 @@ EOF
fi fi
done 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 if [ -n "$UPDATES_FOUND" ]; then
echo " 📧 Versuche E-Mail zu senden an $EMAIL_TO..." 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 if echo -e "Subject: Watchdog Alert\n\n$UPDATES_FOUND" | timeout 20s msmtp --debug "$EMAIL_TO" 2>&1; then