Les instantanes sont chiffres cote client : ce serveur heberge des octets qu il ne peut pas ouvrir, donc pas juger. La verification suit la cle, et client_backup la fait deja depuis chaque noeud. Ce que la sonde ajoute : elle voit TOUT DE SUITE, et depuis la cause, ce que les clients ne decouvriront qu a leur prochaine execution. Lecture seule apres une erreur disque, volume plein, droits derives — le depot refuse alors tout le monde, et neuf rouges epars ne designent pas une cause commune. Elle ECRIT vraiment, sous l identite qui depose. Un test -w ment sur un montage en lecture seule et sur un quota atteint. Corrige aussi l en-tete de setops-sauvegardes.conf.j2, qui nommait encore backup-01 comme pousseur — retire le 2026-09-02, et c est tout le sujet. Le code avait suivi la decision, l en-tete non. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
50 lines
2.6 KiB
Django/Jinja
50 lines
2.6 KiB
Django/Jinja
#!/bin/bash
|
|
# GENERE par Set-OPS (role serveur_backup). Ne pas editer a la main.
|
|
#
|
|
# SONDE « depot » — le depot accepte-t-il encore qu'on y depose ?
|
|
#
|
|
# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2.
|
|
# Mise en defaut PAR PARAMETRE : `serveur_backup_sonde_racine` (chemin non inscriptible).
|
|
#
|
|
# CE QU'ELLE NE MESURE PAS, ET C'EST LA DOCTRINE LA PLUS STRICTE DE CE DEPOT.
|
|
#
|
|
# Elle ne juge RIEN du contenu. Les instantanes sont chiffres cote client : ce serveur
|
|
# heberge des octets qu'il ne peut pas ouvrir, donc qu'il ne peut pas juger. « Cet
|
|
# instantane est-il recent, complet, restaurable ? » se demande a qui detient la cle, et
|
|
# `client_backup` le fait deja depuis chaque noeud. LA VERIFICATION SUIT LA CLE.
|
|
#
|
|
# CE QU'ELLE MESURE, ET QUE PERSONNE D'AUTRE NE VOIT A TEMPS : que l'endroit accepte une
|
|
# ECRITURE. Un systeme de fichiers remonte en lecture seule apres une erreur disque, un
|
|
# volume plein, des droits qui ont derive — dans les trois cas le depot refuse tout, et
|
|
# les clients ne l'apprennent qu'a leur prochaine execution, chacun de son cote.
|
|
#
|
|
# NEUF ROUGES EPARS NE DESIGNENT PAS UNE CAUSE COMMUNE. C'est la seule raison d'etre de
|
|
# cette sonde : dire UNE fois, ici, ce que neuf machines diront plus tard sans savoir
|
|
# qu'elles disent la meme chose.
|
|
#
|
|
# ON ECRIT VRAIMENT, ET SOUS L'IDENTITE QUI DEPOSE. Un `test -w` ment sur un montage en
|
|
# lecture seule et sur un quota atteint. Seule une ecriture reelle, faite par le compte
|
|
# que les clients empruntent, prouve que le depot prend encore.
|
|
set -uo pipefail
|
|
|
|
RACINE={{ serveur_backup_sonde_racine }}
|
|
UTIL={{ serveur_backup_utilisateur }}
|
|
|
|
[[ -d "${RACINE}" ]] || { echo "Le depot ${RACINE} n'existe pas."; exit 2; }
|
|
|
|
temoin="${RACINE}/.setops-temoin-sonde"
|
|
if ! sudo -u "${UTIL}" install -m 0600 /dev/null "${temoin}" 2>/dev/null; then
|
|
echo "Le depot ${RACINE} refuse l'ecriture pour ${UTIL} — plein, en lecture seule, ou droits derives."
|
|
exit 2
|
|
fi
|
|
sudo -u "${UTIL}" rm -f "${temoin}" 2>/dev/null
|
|
|
|
# CE CHIFFRE EST UN CONSTAT, PAS UN SEUIL. L'occupation appartient a Prometheus ; on la
|
|
# publie ici en donnee de performance pour que le graphe existe, sans jamais en faire un
|
|
# verdict. Icinga repond a une seule question — est-ce casse ?
|
|
lisible=$(df -h --output=avail "${RACINE}" 2>/dev/null | tail -1 | tr -d ' ')
|
|
octets=$(df -B1 --output=avail "${RACINE}" 2>/dev/null | tail -1 | tr -d ' ')
|
|
depots=$(sudo -u "${UTIL}" find "${RACINE}" -maxdepth 1 -mindepth 1 -type d 2>/dev/null | wc -l)
|
|
|
|
echo "Le depot accepte l'ecriture — ${depots} depot(s) heberge(s), ${lisible} libres.|libre=${octets:-0}B depots=${depots}"
|
|
exit 0
|