#!/bin/bash # Script d'analyse hebdomadaire des éléments obsolètes sur le système # Génère un rapport et l'envoie par email à admin@keller-laurent.org set -euo pipefail REPORT=$(mktemp) trap 'rm -f "$REPORT"' EXIT { echo "═══════════════════════════════════════════════" echo " RAPPORT HEBDOMADAIRE — ÉLÉMENTS OBSOLÈTES" echo " $(date '+%Y-%m-%d %H:%M') — $(hostname)" echo "═══════════════════════════════════════════════" echo "" # ── 1. Paquets orphelins (autoremove) ── echo "── 1. PAQUETS ORPHELINS (autoremove) ──────────" orphans=$(apt-get --just-print autoremove 2>&1 | grep "Remv" | sed 's/Remv //' | sed 's/ \[.*//' || true) orphan_count=$(echo "$orphans" | grep -c . || true) if [ "$orphan_count" -eq 0 ]; then echo " Aucun paquet orphelin." else orphan_size=$(dpkg-query -Wf '${Package}\t${Installed-Size}\n' $orphans 2>/dev/null | awk '{sum+=$2} END {printf "%.0f", sum/1024}') echo " Paquets: $orphan_count | Taille: ${orphan_size:-0} MB" echo "" echo " Top 10 plus gros :" dpkg-query -Wf '${Package}\t${Installed-Size}\n' $orphans 2>/dev/null | sort -t$'\t' -k2 -rn | head -10 | awk '{printf " %-40s %d MB\n", $1, $2/1024}' fi echo "" # ── 2. Anciens noyaux ── echo "── 2. ANCIENS NOYAUX ──────────────────────────" current_kernel=$(uname -r) installed_kernels=$(dpkg -l 'linux-image-*' 2>/dev/null | grep '^ii' | awk '{print $2}' | sort -V || true) old_kernels=$(echo "$installed_kernels" | grep -v "$(echo $current_kernel | sed 's/-[^-]*$//')" || true) old_count=$(echo "$old_kernels" | grep -c . || true) echo " Noyau actif : $current_kernel" if [ "$old_count" -eq 0 ]; then echo " Aucun ancien noyau." else echo " Anciens noyaux installés : $old_count" echo "$old_kernels" | sed 's/^/ /' fi echo "" # ── 3. Cache APT ── echo "── 3. CACHE APT ───────────────────────────────" apt_cache=$(du -sh /var/cache/apt/archives/ 2>/dev/null | awk '{print $1}') echo " Taille : $apt_cache" echo "" # ── 4. Journaux systemd ── echo "── 4. JOURNAUX SYSTEMD ────────────────────────" journal_size=$(journalctl --disk-usage 2>&1 | grep -oP '[\d.]+[GMK]' || echo "?") echo " Taille : $journal_size" echo "" # ── 5. Conteneurs/images Docker inutilisés ── if command -v docker &>/dev/null; then echo "── 5. DOCKER ──────────────────────────────────" unused_containers=$(docker container ls -a --filter status=exited --filter status=created -q 2>/dev/null | wc -l) dangling_images=$(docker images -f dangling=true -q 2>/dev/null | wc -l) unused_volumes=$(docker volume ls -f dangling=true -q 2>/dev/null | wc -l) echo " Conteneurs arrêtés : $unused_containers" echo " Images dangling : $dangling_images" echo " Volumes orphelins : $unused_volumes" echo "" fi # ── 6. Espace disque ── echo "── 6. ESPACE DISQUE ───────────────────────────" df -h / | tail -1 | awk '{printf " Utilisé: %s / %s (%s libre)\n", $3, $2, $4}' echo "" # ── 7. Fichiers temporaires volumineux ── echo "── 7. FICHIERS TEMPORAIRES VOLUMINEUX ─────────" tmp_size=$(du -sh /tmp 2>/dev/null | awk '{print $1}') echo " /tmp : $tmp_size" echo "" echo "═══════════════════════════════════════════════" echo " FIN DU RAPPORT" echo "═══════════════════════════════════════════════" } > "$REPORT" # Output for cron delivery cat "$REPORT"