Set-OPS-Public/roles/serveur_web_dorsal/templates/sonde-sites-servis.sh.j2
Daniel Allaire 3fe7e3cea3 web frontal = reverse proxy + WAF ; le dorsal porte les sites
Le frontal derive ses vhosts des expositions publiques (meme derivation que l edge),
filtre par ModSecurity v3 + OWASP CRS (DetectionOnly d abord, eprouve), refuse les noms
inconnus, et ne sert plus rien lui-meme. Les sites statiques passent au dorsal, relaye
par l edge et par le frontal. Sondes : frontal (nouvelle), sites-servis suit le dorsal.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 16:48:42 -04:00

57 lines
2.5 KiB
Django/Jinja

#jinja2: comment_start_string:'{=#', comment_end_string:'#=}'
#!/bin/bash
# (Le gabarit redefinit le delimiteur de commentaire Jinja : `${#tableau[@]}` contient
# la sequence `{#`, que Jinja lirait comme un debut de commentaire. Le shell en a
# besoin ; c'est donc Jinja qui cede. Meme geste que `client_sante/setops-sante.sh.j2`
# et `serveur_nginx/sonde-edge.sh.j2`.)
# GENERE par Set-OPS (role serveur_web_dorsal). Ne pas editer a la main.
#
# SONDE « sites-servis » — chacun des sites declares se sert-il encore ?
#
# UNE BOUCLE AUTOUR D'UN GREFFON, PAS UN GREFFON REECRIT. Chaque site est mesure par
# `check_http` — qui gere les delais, les redirections et vingt ans de cas limites. Ce que
# la boucle ajoute est la seule chose que le greffon ne sait pas : la LISTE des sites que
# cet hebergeur doit servir, qui vient du plan.
#
# `-H <server_name> -I 127.0.0.1` : on frappe la machine en boucle locale, mais avec
# l'en-tete `Host` du site. C'est ainsi que nginx choisit son vhost — sans cet en-tete on
# mesurerait le serveur par defaut, c'est-a-dire n'importe quoi d'autre.
set -uo pipefail
PORT={{ serveur_web_dorsal_sites_port }}
noms=({% for s in serveur_web_dorsal_sites | default([]) %}'{{ s.server_name }}' {% endfor %})
etiquettes=({% for s in serveur_web_dorsal_sites | default([]) %}'{{ s.nom }}' {% endfor %})
if (( ${#noms[@]} == 0 )); then
# PAS UN VERT MUET. Un hebergeur sans site declare est un etat legitime — le dire vaut
# mieux que rendre un succes qui laisserait croire qu'on a verifie quelque chose.
echo "Aucun site declare sur cet hebergeur : rien a servir, rien a verifier."
exit 0
fi
muets=()
for i in "${!noms[@]}"; do
nom=${noms[$i]}
etiquette=${etiquettes[$i]}
sortie=$(/usr/lib/nagios/plugins/check_http -H "${nom}" -I 127.0.0.1 -p "${PORT}" -u / -t 10 2>&1)
code=$?
# LE GREFFON REND PARFOIS DEUX LIGNES — la cause, puis son verdict. Icinga ne
# garde que la premiere pour resume : sans repliage, la moitie du message
# disparait de la vue qu'on regarde en premier.
resume=${sortie%%|*}
resume=${resume//$'\n'/ }
if (( code != 0 )); then
# LE MESSAGE DU GREFFON EST CONSERVE, pas resume. C'est lui qui distingue un 404 d'un
# delai depasse ou d'un socket ferme — et ces trois-la n'appellent pas le meme geste.
muets+=("${etiquette} (${nom}) : ${resume}")
fi
done
if (( ${#muets[@]} > 0 )); then
liste=$(printf '%s; ' "${muets[@]}"); liste=${liste%; }
echo "Site(s) qui ne se servent plus — ${liste}"
exit 2
fi
echo "Sites statiques : ${#noms[@]} servi(s) — ${etiquettes[*]}."
exit 0