Update-All — Mise à jour système complète
Met à jour l'intégralité des paquets installés, nettoie les résidus et génère un rapport de ce qui a changé.
Ce que fait le script :
apt-get update+upgrade+dist-upgrade- Supprime les paquets orphelins (
autoremove) - Nettoie le cache apt (
autoclean) - Affiche la liste des paquets mis à jour
- Sauvegarde le rapport dans
/var/log/update-all/ - Indique si un redémarrage est nécessaire
bash
#!/bin/bash
set -euo pipefail
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
info() { echo -e "${GREEN}[INFO]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
error() { echo -e "${RED}[ERR]${NC} $*"; exit 1; }
[[ $EUID -ne 0 ]] && error "Ce script doit être exécuté en root."
export DEBIAN_FRONTEND=noninteractive
LOG_DIR="/var/log/update-all"
LOG_FILE="$LOG_DIR/$(date +%Y%m%d_%H%M%S).log"
mkdir -p "$LOG_DIR"
log() { echo "$*" | tee -a "$LOG_FILE"; }
log "============================================================"
log " Update-All — $(hostname) — $(date '+%d/%m/%Y %H:%M:%S')"
log "============================================================"
log ""
# ── Snapshot avant mise à jour ────────────────────────────────────────────────
info "=== Étape 1/5 — Snapshot des versions actuelles ==="
dpkg -l | awk '/^ii/{print $2, $3}' > /tmp/pkg_before.txt
log "Paquets avant : $(wc -l < /tmp/pkg_before.txt)"
# ── apt update ───────────────────────────────────────────────────────────────
info "=== Étape 2/5 — Mise à jour des sources ==="
apt-get update -y 2>&1 | tee -a "$LOG_FILE"
# ── Liste des mises à jour disponibles ────────────────────────────────────────
UPGRADABLE=$(apt list --upgradable 2>/dev/null | grep -v "Listing" | wc -l)
info "$UPGRADABLE paquet(s) à mettre à jour"
log ""
apt list --upgradable 2>/dev/null | grep -v "Listing" | tee -a "$LOG_FILE" || true
log ""
# ── Mise à jour ───────────────────────────────────────────────────────────────
info "=== Étape 3/5 — Mise à jour des paquets ==="
apt-get upgrade -y 2>&1 | tee -a "$LOG_FILE"
apt-get dist-upgrade -y 2>&1 | tee -a "$LOG_FILE"
# ── Nettoyage ─────────────────────────────────────────────────────────────────
info "=== Étape 4/5 — Nettoyage ==="
REMOVED=$(apt-get autoremove -y 2>&1 | tee -a "$LOG_FILE" | grep -c 'Removing' || true)
apt-get autoclean -y 2>&1 | tee -a "$LOG_FILE"
info "$REMOVED paquet(s) orphelins supprimés"
# ── Rapport de ce qui a changé ────────────────────────────────────────────────
info "=== Étape 5/5 — Rapport ==="
dpkg -l | awk '/^ii/{print $2, $3}' > /tmp/pkg_after.txt
UPDATED=$(diff /tmp/pkg_before.txt /tmp/pkg_after.txt \
| grep '^[<>]' \
| awk '{print $2, $3}' \
| paste - - 2>/dev/null \
| awk '{printf " %-40s %s → %s\n", $1, $2, $4}' \
| grep -v '→ $' || true)
log ""
log "── Paquets mis à jour ──────────────────────────────────────"
if [[ -n "$UPDATED" ]]; then
echo "$UPDATED" | tee -a "$LOG_FILE"
else
log " Aucun changement de version détecté."
fi
log ""
# ── Redémarrage nécessaire ? ──────────────────────────────────────────────────
REBOOT_NEEDED=false
if [[ -f /var/run/reboot-required ]]; then
REBOOT_NEEDED=true
REBOOT_PKGS=$(cat /var/run/reboot-required.pkgs 2>/dev/null | tr '\n' ' ' || echo "")
fi
rm -f /tmp/pkg_before.txt /tmp/pkg_after.txt
echo ""
info "=== Mise à jour terminée ==="
echo ""
echo " Paquets avant mise à jour : $(wc -l < <(grep '' "$LOG_FILE" | grep "Paquets avant") || echo "?")"
echo " Paquets mis à jour : $(echo "$UPDATED" | grep -c '→' || echo 0)"
echo " Log sauvegardé : $LOG_FILE"
echo ""
if $REBOOT_NEEDED; then
warn "REDÉMARRAGE REQUIS (${REBOOT_PKGS})"
warn "Lance : reboot"
else
info "Aucun redémarrage nécessaire."
fi
echo ""