#!/usr/bin/env bash set -euo pipefail METHOD="${1:-unknown}" LOG_DIR="/var/log/lxc-updater-TM" LOG_FILE="${LOG_DIR}/lxc-updater-update.log" mkdir -p "$LOG_DIR" : > "$LOG_FILE" log() { echo "$1" echo "$1" >> "$LOG_FILE" } run_cmd() { local msg="$1" shift echo "⏳ $msg..." "$@" >>"$LOG_FILE" 2>&1 echo "✅ $msg terminé" } update_apt() { log "📦 Mise à jour Debian / Ubuntu (APT)" export DEBIAN_FRONTEND=noninteractive run_cmd "Mise à jour des dépôts" apt-get update -y run_cmd "Installation des mises à jour" apt-get upgrade -y systemctl daemon-reload >>"$LOG_FILE" 2>&1 || true } update_apk() { log "📦 Mise à jour Alpine (APK)" run_cmd "Mise à jour des dépôts" apk update run_cmd "Installation des mises à jour" apk upgrade } update_docker() { log "🐳 Mise à jour Docker" if ! docker ps >>"$LOG_FILE" 2>&1; then log "❌ Docker n'est pas accessible" return 1 fi log "🔍 Recherche de projets Docker Compose" mapfile -t dirs < <( docker ps -q | while read -r cid; do docker inspect -f '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}' "$cid" 2>/dev/null || true done | sed '/^$/d;/^$/d' | sort -u ) valid_dirs=() for d in "${dirs[@]}"; do if [[ -d "$d" ]] && { [[ -f "$d/docker-compose.yml" ]] || [[ -f "$d/compose.yml" ]]; }; then valid_dirs+=("$d") else log "⚠️ Dossier Compose ignoré : $d" fi done if (( ${#valid_dirs[@]} > 0 )); then log "📁 Projet(s) Compose détecté(s) : ${#valid_dirs[@]}" for d in "${valid_dirs[@]}"; do log "📂 Projet : $d" if docker compose version >>"$LOG_FILE" 2>&1; then run_cmd "Téléchargement des images" bash -c "cd '$d' && docker compose pull" run_cmd "Redéploiement des services" bash -c "cd '$d' && docker compose up -d" elif command -v docker-compose >>"$LOG_FILE" 2>&1; then run_cmd "Téléchargement des images" bash -c "cd '$d' && docker-compose pull" run_cmd "Redéploiement des services" bash -c "cd '$d' && docker-compose up -d" else log "❌ Docker Compose n'est pas installé" return 2 fi done else log "⚠️ Aucun projet Compose détecté" log "⬇️ Mise à jour des images Docker utilisées" while read -r img; do [[ -n "$img" ]] || continue run_cmd "Téléchargement $img" docker pull "$img" done < <(docker ps --format '{{.Image}}' | sort -u) fi } case "$METHOD" in apt) update_apt ;; apk) update_apk ;; docker) update_docker ;; *) log "❌ Méthode inconnue : $METHOD" exit 1 ;; esac log "🧾 Log update : $LOG_FILE" log "🎉 Mise à jour terminée"