Actualiser update.sh

Signed-off-by: thomas <contact@thomasmlg.fr>
This commit is contained in:
2026-03-05 15:18:51 +01:00
parent 90fc0d99d1
commit cc0b0e07c7

173
update.sh
View File

@@ -3,147 +3,122 @@ set -euo pipefail
METHOD="${1:-unknown}" METHOD="${1:-unknown}"
LOG_DIR="/var/log" LOG_DIR="/var/log/lxc-updater-TM"
TS="$(date +'%Y%m%d-%H%M%S')" LOG_FILE="${LOG_DIR}/lxc-updater-update.log"
LOG_FILE="${LOG_DIR}/lxc-updater.log"
LOG_ARCHIVE="${LOG_DIR}/lxc-updater-${TS}.log"
mkdir -p "$LOG_DIR" mkdir -p "$LOG_DIR"
# On réinitialise le log courant, et on garde une archive
: > "$LOG_FILE" : > "$LOG_FILE"
touch "$LOG_ARCHIVE"
# Tout ce qui est "debug/commande" -> log fichier (mais pas console) log() {
log_file() {
echo "[$(date -Is)] $*" >> "$LOG_FILE"
echo "[$(date -Is)] $*" >> "$LOG_ARCHIVE"
}
# Messages courts console (et aussi dans le fichier)
log_console() {
echo "$1" 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() { run_cmd() {
local title="$1"; shift local msg="$1"
spinner_start "$title" shift
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
}
log_console "🧭 Mode de mise à jour : ${METHOD}" echo "$msg..."
"$@" >>"$LOG_FILE" 2>&1
echo "$msg terminé"
}
update_apt() { update_apt() {
log_console "📦 Mise à jour Debian/Ubuntu (APT)"
log "📦 Mise à jour Debian / Ubuntu (APT)"
export DEBIAN_FRONTEND=noninteractive export DEBIAN_FRONTEND=noninteractive
# Optionnel: rendre apt plus silencieux dans le log (tu peux enlever -qq si tu veux tout) run_cmd "Mise à jour des dépôts" apt-get update -y
run_cmd "Mise à jour de la liste des paquets" apt-get update -y
run_cmd "Installation des mises à jour" apt-get upgrade -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() { 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 "Mise à jour des dépôts" apk update
run_cmd "Installation des mises à jour" apk upgrade run_cmd "Installation des mises à jour" apk upgrade
} }
update_docker() { 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 < <( mapfile -t dirs < <(
docker ps -q | while read -r cid; do 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 docker inspect -f '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}' "$cid" 2>/dev/null || true
done | sed '/^<no value>$/d;/^$/d' | sort -u done | sed '/^<no value>$/d;/^$/d' | sort -u
) )
if (( ${#dirs[@]} > 0 )); then valid_dirs=()
log_console "📁 Projet(s) Compose détecté(s) : ${#dirs[@]}"
for d in "${dirs[@]}"; do for d in "${dirs[@]}"; do
log_console "📂 Projet : $d" if [[ -d "$d" ]] && { [[ -f "$d/docker-compose.yml" ]] || [[ -f "$d/compose.yml" ]]; }; then
# On loggue aussi le cd valid_dirs+=("$d")
log_file "CD: $d" else
cd "$d" log "⚠️ Dossier Compose ignoré : $d"
fi
done
if docker compose version >/dev/null 2>&1; then if (( ${#valid_dirs[@]} > 0 )); then
run_cmd "Compose pull" docker compose pull
run_cmd "Compose up -d" docker compose up -d log "📁 Projet(s) Compose détecté(s) : ${#valid_dirs[@]}"
elif command -v docker-compose >/dev/null 2>&1; then
run_cmd "Compose pull (v1)" docker-compose pull for d in "${valid_dirs[@]}"; do
run_cmd "Compose up -d (v1)" docker-compose up -d
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 else
log_console "❌ Docker Compose n'est pas installé (voir logs)" log "❌ Docker Compose n'est pas installé"
return 2 return 2
fi fi
done done
return 0 else
fi
log_console "⚠️ Aucun Compose détecté → pull des images uniquement (pas de recréation auto)" log "⚠️ Aucun projet Compose détecté"
# Pull images uniques log "⬇️ Mise à jour des images Docker utilisées"
while read -r img; do
[[ -n "$img" ]] || continue while read -r img; do
run_cmd "Pull image: $img" docker pull "$img" [[ -n "$img" ]] || continue
done < <(docker ps --format '{{.Image}}' | sort -u) run_cmd "Téléchargement $img" docker pull "$img"
done < <(docker ps --format '{{.Image}}' | sort -u)
fi
} }
case "$METHOD" in case "$METHOD" in
apt) update_apt ;; apt)
apk) update_apk ;; update_apt
docker) update_docker ;; ;;
apk)
update_apk
;;
docker)
update_docker
;;
*) *)
log_console "❌ Méthode inconnue : $METHOD" log "❌ Méthode inconnue : $METHOD"
exit 2 exit 1
;; ;;
esac esac
log_console "🧾 Log : $LOG_FILE" log "🧾 Log update : $LOG_FILE"
log_console "🗃️ Archive : $LOG_ARCHIVE" log "🎉 Mise à jour terminée"
log_console "🎉 Terminé"