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}"
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 '/^<no value>$/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é"
log "🧾 Log update : $LOG_FILE"
log "🎉 Mise à jour terminée"