Set-OPS-Public/roles/serveur_backup/templates/sonde-depot.sh.j2
Daniel Allaire 7348eb93d1 serveur_backup : ce qu un depot peut affirmer sans pouvoir lire
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
2026-09-14 09:58:54 -04:00

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