Seuls le cache apt et les depots de sauvegarde etaient surveilles. Declaree par serveur_debian, posee par client_sante (pas par common_packages, qui ferait un upgrade full de la flotte pour deposer un script). Seuils 80/90 pourcent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
52 lines
2.2 KiB
Django/Jinja
52 lines
2.2 KiB
Django/Jinja
#!/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
|