173
update.sh
173
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 '/^<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"
|
||||
Reference in New Issue
Block a user