#!/bin/bash # GENERE par Set-OPS (role client_sante). Ne pas editer a la main. # # SONDE « disque » — reste-t-il de la place, et des inodes, sur chaque systeme de fichiers ? # # Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Seuils : `client_sante_disque_avert` / `client_sante_disque_crit` (pourcentage utilise), # les memes pour l'espace et pour les inodes. # # POURQUOI ELLE MANQUAIT (2026-09-28). Seuls les volumes du cache apt et des depots de # sauvegarde etaient surveilles. Rien ne regardait le disque de la base, des boites, de # Nextcloud, ni de Loki qui grossit chaque jour. Prometheus collecte bien l'occupation, # mais aucune regle n'en fait une alerte : un disque plein arretait la base ou le courriel # sans rien dire avant. Les INODES aussi : une file de courriel ou un cache de petits # fichiers les epuise avec la moitie de l'espace libre, et le message d'erreur parle alors # d'un disque « plein » qu'un `df` dit a moitie vide. set -uo pipefail AVERT={{ client_sante_disque_avert }} CRIT={{ client_sante_disque_crit }} # Pas les pseudo-systemes : ils se remplissent et se vident par nature. EXCLUS=(-x tmpfs -x devtmpfs -x squashfs -x overlay -x efivarfs) pire=0; pire_quoi=""; perf="" lire() { # $1 = espace|inodes, puis la sortie de df -P[i] local genre=$1 ligne pct mp while read -r ligne; do pct=$(awk '{print $5}' <<<"${ligne}" | tr -d '%') mp=$(awk '{print $6}' <<<"${ligne}") [[ "${pct}" =~ ^[0-9]+$ ]] || continue # `-` : pas d'inodes sur ce type local etiq=${mp#/}; etiq=${etiq//\//_}; etiq=${etiq:-racine} perf+="${genre}_${etiq}=${pct}%;${AVERT};${CRIT};0;100 " if (( pct > pire )); then pire=${pct}; pire_quoi="${mp} (${genre}) a ${pct} %"; fi done } lire espace < <(df -P "${EXCLUS[@]}" 2>/dev/null | tail -n +2) lire inodes < <(df -Pi "${EXCLUS[@]}" 2>/dev/null | tail -n +2) if [[ -z "${pire_quoi}" ]]; then echo "Aucun systeme de fichiers lisible par df." exit 3 fi if (( pire >= CRIT )); then echo "DISQUE CRITIQUE : ${pire_quoi} (seuil ${CRIT} %). | ${perf}" exit 2 fi if (( pire >= AVERT )); then echo "Disque en tension : ${pire_quoi} (seuil ${AVERT} %). | ${perf}" exit 1 fi echo "Place suffisante : le plus rempli est ${pire_quoi}. | ${perf}" exit 0