#!/bin/bash set -Eeuo pipefail HOST="$(hostname)" LOG="/opt/pingu/logs/update.log" TELEGRAM_TOKEN="${TELEGRAM_TOKEN:-}" TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-}" REBOOT=0 DOCKER_UPDATES=0 DOCKER_UPDATE_LIST="" log() { echo "[$(date '+%F %T')] $1" | tee -a "$LOG" } send_telegram() { local text="$1" curl -sS -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \ --data-urlencode "chat_id=${TELEGRAM_CHAT_ID}" \ --data-urlencode "text=${text}" \ >> "$LOG" 2>&1 || true } cleanup_on_error() { local exit_code=$? log "❌ Fehler in Zeile ${1:-unknown} (Exit ${exit_code})" send_telegram "❌ ${HOST}: Update fehlgeschlagen (Zeile ${1:-?}, Exit ${exit_code})" exit "$exit_code" } trap 'cleanup_on_error ${LINENO}' ERR check_docker_updates() { if ! command -v docker >/dev/null 2>&1; then log "Docker nicht installiert" return fi if ! docker info >/dev/null 2>&1; then log "Docker Daemon nicht erreichbar" return fi local containers mapfile -t containers < <(docker ps -q) log "Prüfe ${#containers[@]} Container" for cid in "${containers[@]}"; do local name image running_id latest_id name="$(docker inspect --format '{{.Name}}' "$cid" | sed 's#^/##')" image="$(docker inspect --format '{{.Config.Image}}' "$cid")" running_id="$(docker inspect --format '{{.Image}}' "$cid")" docker pull "$image" >/dev/null 2>&1 || continue latest_id="$(docker image inspect --format '{{.Id}}' "$image" 2>/dev/null || true)" if [[ -n "$latest_id" && "$running_id" != "$latest_id" ]]; then DOCKER_UPDATES=$((DOCKER_UPDATES + 1)) DOCKER_UPDATE_LIST+=$'\n'"🐳 $name ($image)" log "Update verfügbar: $name" fi done } main() { mkdir -p "$(dirname "$LOG")" touch "$LOG" log "=== Update Start ${HOST} ===" export DEBIAN_FRONTEND=noninteractive log "APT Update" apt-get update 2>&1 | tee -a "$LOG" log "APT Upgrade" apt-get -y upgrade 2>&1 | tee -a "$LOG" if [ -f /var/run/reboot-required ]; then REBOOT=1 log "Reboot erforderlich" fi check_docker_updates local msg="🐧 ${HOST}: Update abgeschlossen" if [ "$REBOOT" -eq 1 ]; then msg+="\n🔄 Reboot erforderlich" else msg+="\n✔ Kein Reboot nötig" fi if [ "$DOCKER_UPDATES" -gt 0 ]; then msg+="\n\n🐳 Docker Updates:${DOCKER_UPDATE_LIST}" else msg+="\n\n🐳 Docker aktuell" fi log "Sende Telegram" send_telegram "$msg" log "=== Update Ende ===" if [ "$REBOOT" -eq 1 ]; then reboot fi } main "$@"