diff --git a/update.sh b/update.sh index 530faf1..c4b54ad 100644 --- a/update.sh +++ b/update.sh @@ -3,147 +3,122 @@ set -euo pipefail METHOD="${1:-unknown}" -LOG_DIR="/var/log" -TS="$(date +'%Y%m%d-%H%M%S')" -LOG_FILE="${LOG_DIR}/lxc-updater.log" -LOG_ARCHIVE="${LOG_DIR}/lxc-updater-${TS}.log" +LOG_DIR="/var/log/lxc-updater-TM" +LOG_FILE="${LOG_DIR}/lxc-updater-update.log" mkdir -p "$LOG_DIR" - -# On réinitialise le log courant, et on garde une archive : > "$LOG_FILE" -touch "$LOG_ARCHIVE" -# Tout ce qui est "debug/commande" -> log fichier (mais pas console) -log_file() { - echo "[$(date -Is)] $*" >> "$LOG_FILE" - echo "[$(date -Is)] $*" >> "$LOG_ARCHIVE" -} - -# Messages courts console (et aussi dans le fichier) -log_console() { +log() { echo "$1" - log_file "$1" + echo "$1" >> "$LOG_FILE" } -# Spinner simple (points qui bougent) -spinner_start() { - # $1 = message console - local msg="$1" - printf "%s" "$msg" - ( - while true; do - printf "." - sleep 0.35 - done - ) & - SPINNER_PID=$! -} - -spinner_stop_ok() { - local rc="${1:-0}" - if [[ -n "${SPINNER_PID:-}" ]]; then - kill "$SPINNER_PID" >/dev/null 2>&1 || true - wait "$SPINNER_PID" 2>/dev/null || true - unset SPINNER_PID - fi - if [[ "$rc" -eq 0 ]]; then - echo " ✅" - else - echo " ❌" - fi -} - -# Exécute une commande en envoyant toute sa sortie dans le log run_cmd() { - local title="$1"; shift - spinner_start "⏳ $title" - log_file "----- $title -----" - log_file "CMD: $*" - set +e - "$@" >>"$LOG_FILE" 2>&1 - local rc=$? - set -e - spinner_stop_ok "$rc" - if [[ $rc -ne 0 ]]; then - log_file "ERREUR (code=$rc) sur: $title" - return $rc - fi - return 0 -} + local msg="$1" + shift -log_console "🧭 Mode de mise à jour : ${METHOD}" + echo "⏳ $msg..." + "$@" >>"$LOG_FILE" 2>&1 + echo "✅ $msg terminé" +} update_apt() { - log_console "📦 Mise à jour Debian/Ubuntu (APT)" + + log "📦 Mise à jour Debian / Ubuntu (APT)" + export DEBIAN_FRONTEND=noninteractive - # Optionnel: rendre apt plus silencieux dans le log (tu peux enlever -qq si tu veux tout) - run_cmd "Mise à jour de la liste des paquets" apt-get update -y + run_cmd "Mise à jour des dépôts" apt-get update -y run_cmd "Installation des mises à jour" apt-get upgrade -y - run_cmd "Rechargement systemd (si nécessaire)" systemctl daemon-reload + + systemctl daemon-reload >>"$LOG_FILE" 2>&1 || true } update_apk() { - log_console "📦 Mise à jour Alpine (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_console "🐳 Mise à jour Docker" - run_cmd "Vérification Docker" docker ps + 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" - log_console "🔍 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 ) - if (( ${#dirs[@]} > 0 )); then - log_console "📁 Projet(s) Compose détecté(s) : ${#dirs[@]}" + valid_dirs=() - for d in "${dirs[@]}"; do - log_console "📂 Projet : $d" - # On loggue aussi le cd - log_file "CD: $d" - cd "$d" + 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 docker compose version >/dev/null 2>&1; then - run_cmd "Compose pull" docker compose pull - run_cmd "Compose up -d" docker compose up -d - elif command -v docker-compose >/dev/null 2>&1; then - run_cmd "Compose pull (v1)" docker-compose pull - run_cmd "Compose up -d (v1)" docker-compose up -d + 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_console "❌ Docker Compose n'est pas installé (voir logs)" + log "❌ Docker Compose n'est pas installé" return 2 fi + done - return 0 - fi + else - log_console "⚠️ Aucun Compose détecté → pull des images uniquement (pas de recréation auto)" - # Pull images uniques - while read -r img; do - [[ -n "$img" ]] || continue - run_cmd "Pull image: $img" docker pull "$img" - done < <(docker ps --format '{{.Image}}' | sort -u) + 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 ;; + apt) + update_apt + ;; + apk) + update_apk + ;; + docker) + update_docker + ;; *) - log_console "❌ Méthode inconnue : $METHOD" - exit 2 + log "❌ Méthode inconnue : $METHOD" + exit 1 ;; esac -log_console "🧾 Log : $LOG_FILE" -log_console "🗃️ Archive : $LOG_ARCHIVE" -log_console "🎉 Terminé" \ No newline at end of file +log "🧾 Log update : $LOG_FILE" +log "🎉 Mise à jour terminée" \ No newline at end of file