add Dockerfile and config folder & files
All checks were successful
Docker Build Smart Logic / Build amd64 & arm64 (push) Successful in 16s
All checks were successful
Docker Build Smart Logic / Build amd64 & arm64 (push) Successful in 16s
This commit is contained in:
18
Dockerfile
18
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"]
|
||||
@@ -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"
|
||||
SMTP_PASS="dein-passwort"
|
||||
@@ -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
|
||||
volumes:
|
||||
- $(pwd)/config:/config
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
restart: unless-stopped
|
||||
|
||||
|
||||
12
msmtprc
12
msmtprc
@@ -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
|
||||
109
multi-watch.sh
109
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 <<EOF > /etc/msmtprc
|
||||
# msmtp Konfig schreiben
|
||||
cat <<EOF > /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
|
||||
echo "Check beendet. Nächster Scan in $INTERVAL Sekunden."
|
||||
sleep "$INTERVAL"
|
||||
done
|
||||
@@ -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"
|
||||
}
|
||||
Reference in New Issue
Block a user