Set-OPS-Public/roles/serveur_powerdns/templates/sonde-zones.sh.j2
Daniel Allaire ba2020d486 powerdns : une zone plus recente que sa version servie est rechargee ; zones le voit
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>
2026-09-29 05:29:45 -04:00

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;"