PowerDNS servait chez les deux locataires une zone anterieure a son fichier (console absente) : le handler de rechargement avait ete abandonne. Reconciliation a chaque passage (bind-reload-now) et controle dans la sonde zones. Plancher /etc/hosts rejoue sur les deux locataires ; console se resout depuis les edges. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
42 lines
2.4 KiB
Django/Jinja
42 lines
2.4 KiB
Django/Jinja
#!/bin/bash
|
|
# GENERE par Set-OPS (role serveur_powerdns). Ne pas editer a la main.
|
|
#
|
|
# SONDE « zones » — l'autoritatif repond et sert ses zones
|
|
#
|
|
# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2.
|
|
# Mise en defaut PAR PARAMETRE : `serveur_powerdns_sonde_minimum` (seuil impossible).
|
|
set -uo pipefail
|
|
|
|
MINIMUM={{ serveur_powerdns_sonde_minimum }}
|
|
TOLERANCE={{ serveur_powerdns_sonde_tolerance }}
|
|
|
|
systemctl is-active --quiet pdns || { echo "L'autoritatif (pdns) n'est pas actif."; exit 2; }
|
|
[[ "$(pdns_control rping 2>&1 | head -1)" == "PONG" ]] \
|
|
|| { echo "L'autoritatif ne repond pas a son propre controle."; exit 2; }
|
|
|
|
# LES ZONES, PAS SEULEMENT LE DEMON. Un PowerDNS sans zone repond NXDOMAIN a tout, ce qui
|
|
# se lit exactement comme « ce nom n'existe pas » — la panne la plus trompeuse du DNS.
|
|
n=$(pdnsutil list-all-zones 2>/dev/null | grep -vc '^All zonecount')
|
|
[[ "${n}" =~ ^[0-9]+$ ]] || { echo "Impossible de lister les zones."; exit 2; }
|
|
if (( n < MINIMUM )); then
|
|
echo "L'autoritatif ne sert que ${n} zone(s), moins que ${MINIMUM} — la resolution interne repondra NXDOMAIN.|zones=${n};${MINIMUM};;0;"
|
|
exit 2
|
|
fi
|
|
# LA ZONE SERVIE EST-ELLE CELLE DU DISQUE ? (2026-09-29) Compter les zones ne dit pas
|
|
# lesquelles sont a jour : chez les deux locataires, PowerDNS a servi pendant treize jours
|
|
# une zone anterieure a son fichier — `console` y manquait — et cette sonde restait verte.
|
|
# `bind-domain-status` donne l'heure de chargement ; on la compare a celle du fichier.
|
|
retard=()
|
|
for f in {{ serveur_powerdns_zone_directory }}/*.zone; do
|
|
[[ -e "${f}" ]] || continue
|
|
z=$(basename "${f}" .zone)
|
|
charge=$(pdns_control bind-domain-status "${z}" 2>/dev/null | grep -oP 'parsed into memory at \K.*')
|
|
if [[ -z "${charge}" ]]; then retard+=("${z}=jamais chargee"); continue; fi
|
|
ecart=$(( $(date -r "${f}" +%s) - $(date -d "${charge}" +%s) ))
|
|
(( ecart > TOLERANCE )) && retard+=("${z}=fichier plus recent de $(( ecart / 3600 )) h")
|
|
done
|
|
if [[ -n "${retard[*]}" ]]; then # (le compteur de tableau de bash ouvrirait un commentaire Jinja)
|
|
echo "L'autoritatif sert ${n} zone(s), mais PAS celles du disque : ${retard[*]} — les noms ajoutes depuis repondent NXDOMAIN. Redeployer serveur_powerdns.|zones=${n};${MINIMUM};;0;"
|
|
exit 2
|
|
fi
|
|
echo "Autoritatif : ${n} zone(s) servie(s), chacune conforme a son fichier.|zones=${n};${MINIMUM};;0;"
|