fix: improve logging + docker handling

This commit is contained in:
kai
2026-04-21 14:24:08 +00:00
parent 64da3d7c6b
commit 5d3bb91440
+36 -68
View File
@@ -4,49 +4,31 @@ set -Eeuo pipefail
HOST="$(hostname)" HOST="$(hostname)"
LOG="/opt/pingu/logs/update.log" LOG="/opt/pingu/logs/update.log"
TELEGRAM_TOKEN="${TELEGRAM_TOKEN:-8101319618:AAHboFVVgmLPccJB0MDr_R2g0K90hkGqkRw}" TELEGRAM_TOKEN="${TELEGRAM_TOKEN:-<PUT_TOKEN_HERE>}"
TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-581059353}" TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-<PUT_CHAT_ID_HERE>}"
REBOOT=0 REBOOT=0
DOCKER_UPDATES=0 DOCKER_UPDATES=0
DOCKER_UPDATE_LIST="" DOCKER_UPDATE_LIST=""
log() { log() {
local msg="$1" echo "[$(date '+%F %T')] $1" | tee -a "$LOG"
echo "[$(date '+%F %T')] $msg" | tee -a "$LOG"
} }
send_telegram() { send_telegram() {
local text="$1" local text="$1"
local http_code
http_code="$(curl -sS --show-error \ curl -sS -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \
-o /tmp/pingu-telegram-response.txt \
-w '%{http_code}' \
-X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \
--data-urlencode "chat_id=${TELEGRAM_CHAT_ID}" \ --data-urlencode "chat_id=${TELEGRAM_CHAT_ID}" \
--data-urlencode "text=${text}")" --data-urlencode "text=${text}" \
>> "$LOG" 2>&1 || true
cat /tmp/pingu-telegram-response.txt >> "$LOG"
echo >> "$LOG"
if [ "$http_code" -ne 200 ]; then
log "Telegram-API Fehler, HTTP ${http_code}"
return 1
fi
} }
cleanup_on_error() { cleanup_on_error() {
local exit_code=$? local exit_code=$?
local line_no="${1:-unknown}" log "❌ Fehler in Zeile ${1:-unknown} (Exit ${exit_code})"
log "FEHLER in Zeile ${line_no}, Exit-Code ${exit_code}"
curl -sS -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \
--data-urlencode "chat_id=${TELEGRAM_CHAT_ID}" \
--data-urlencode "text=❌ ${HOST}: Update-Script fehlgeschlagen in Zeile ${line_no} (Exit ${exit_code})." \
>> "$LOG" 2>&1 || true
send_telegram "${HOST}: Update fehlgeschlagen (Zeile ${1:-?}, Exit ${exit_code})"
exit "$exit_code" exit "$exit_code"
} }
@@ -54,95 +36,81 @@ trap 'cleanup_on_error ${LINENO}' ERR
check_docker_updates() { check_docker_updates() {
if ! command -v docker >/dev/null 2>&1; then if ! command -v docker >/dev/null 2>&1; then
log "Docker nicht installiert - überspringe Container-Prüfung" log "Docker nicht installiert"
return 0 return
fi fi
if ! docker info >/dev/null 2>&1; then if ! docker info >/dev/null 2>&1; then
log "Docker-Daemon nicht erreichbar - überspringe Container-Prüfung" log "Docker Daemon nicht erreichbar"
return 0 return
fi fi
local container_ids local containers
mapfile -t container_ids < <(docker ps -q) mapfile -t containers < <(docker ps -q)
if [ "${#container_ids[@]}" -eq 0 ]; then log "Prüfe ${#containers[@]} Container"
log "Keine laufenden Docker-Container gefunden"
return 0
fi
log "Prüfe ${#container_ids[@]} laufende Docker-Container auf Image-Updates" for cid in "${containers[@]}"; do
local name image running_id latest_id
local cid name image running_id latest_id pull_output
for cid in "${container_ids[@]}"; do
name="$(docker inspect --format '{{.Name}}' "$cid" | sed 's#^/##')" name="$(docker inspect --format '{{.Name}}' "$cid" | sed 's#^/##')"
image="$(docker inspect --format '{{.Config.Image}}' "$cid")" image="$(docker inspect --format '{{.Config.Image}}' "$cid")"
running_id="$(docker inspect --format '{{.Image}}' "$cid")" running_id="$(docker inspect --format '{{.Image}}' "$cid")"
log "Prüfe Container ${name} mit Image ${image}" docker pull "$image" >/dev/null 2>&1 || continue
latest_id="$(docker image inspect --format '{{.Id}}' "$image" 2>/dev/null || true)"
if pull_output="$(docker pull "$image" 2>&1)"; then if [[ -n "$latest_id" && "$running_id" != "$latest_id" ]]; then
latest_id="$(docker image inspect --format '{{.Id}}' "$image")"
if [ "$running_id" != "$latest_id" ]; then
DOCKER_UPDATES=$((DOCKER_UPDATES + 1)) DOCKER_UPDATES=$((DOCKER_UPDATES + 1))
DOCKER_UPDATE_LIST+=$'\n'"🐳 ${name} (${image})" DOCKER_UPDATE_LIST+=$'\n'"🐳 $name ($image)"
log "Update verfügbar für ${name}" log "Update verfügbar: $name"
else
log "Kein Update für ${name}"
fi
else
log "Konnte Image ${image} für ${name} nicht prüfen: ${pull_output}"
fi fi
done done
} }
main() { main() {
mkdir -p "$(dirname "$LOG")"
touch "$LOG" touch "$LOG"
chmod 600 "$LOG"
log "=== Update Start ${HOST} ===" log "=== Update Start ${HOST} ==="
export DEBIAN_FRONTEND=noninteractive export DEBIAN_FRONTEND=noninteractive
log "Starte apt-get update" log "APT Update"
apt-get update >> "$LOG" 2>&1 apt-get update 2>&1 | tee -a "$LOG"
log "Starte apt-get upgrade" log "APT Upgrade"
apt-get -y upgrade >> "$LOG" 2>&1 apt-get -y upgrade 2>&1 | tee -a "$LOG"
if [ -f /var/run/reboot-required ]; then if [ -f /var/run/reboot-required ]; then
REBOOT=1 REBOOT=1
log "Reboot erforderlich" log "Reboot erforderlich"
else
log "Kein Reboot erforderlich"
fi fi
check_docker_updates check_docker_updates
local msg="🐧 ${HOST}: Updates installiert." local msg="🐧 ${HOST}: Update abgeschlossen"
if [ "$REBOOT" -eq 1 ]; then if [ "$REBOOT" -eq 1 ]; then
msg="${msg} REBOOT erforderlich." msg+="\n🔄 Reboot erforderlich"
else else
msg="${msg} Kein Reboot nötig." msg+="\n✔ Kein Reboot nötig"
fi fi
if [ "$DOCKER_UPDATES" -gt 0 ]; then if [ "$DOCKER_UPDATES" -gt 0 ]; then
msg+=$'\n\n'"🐳 Docker-Updates verfügbar: ${DOCKER_UPDATES}${DOCKER_UPDATE_LIST}" msg+="\n\n🐳 Docker Updates:${DOCKER_UPDATE_LIST}"
else else
msg+=$'\n\n'"🐳 Docker-Container aktuell." msg+="\n\n🐳 Docker aktuell"
fi fi
log "Sende Telegram-Nachricht" log "Sende Telegram"
send_telegram "$msg" send_telegram "$msg"
log "$msg" log "=== Update Ende ==="
log "=== Update Ende ${HOST} ==="
if [ "$REBOOT" -eq 1 ]; then if [ "$REBOOT" -eq 1 ]; then
log "System wird neu gestartet"
reboot reboot
fi fi
} }
#test telegram
main "$@" main "$@"