Set-OPS-Public/roles/common_packages/templates/sonde-correctifs.sh.j2
Daniel Allaire a60b69f072 un fichier vide existe, et une sonde pour les correctifs
LA GARDE FICHIER ENTIER, en deux corrections. Un telechargement
interrompu laisse un fichier de zero octet QUI EXISTE, et toutes les gardes
demandaient seulement s il etait la. infra-mail-01 a garde une cle
smallstep de 0 octet apres l epreuve hors ligne.

La premiere correction n a pas suffi. Ajouter le controle de taille faisait
bien s executer la tache - et le fichier faisait toujours 0 octet au
passage suivant. get_url sur une destination existante emet une requete
CONDITIONNELLE : l amont repond non modifie, le module rend ok, la ruine
reste. Le play etait vert et ne reparait rien. Il faut effacer avant de
redemander.

Controle negatif : 0 -> 1022 octets, 0 erreur apt. Cinq roles.

LA SONDE CORRECTIFS, 23e. Set-OPS desarme unattended-upgrades et applique
les correctifs au deploiement - choix defendable, le verrou dpkg a fait
decrocher une machine d une reconstruction entiere le matin meme. Mais rien
ne disait QUAND le geste etait du : une flotte pouvait deriver des mois en
restant verte.

Elle mesure les paquets de securite en attente ET depuis quand. Elle ne
lance pas apt-get update - une sonde qui rafraichit l index toutes les
quinze minutes deviendrait la cause de la panne qu elle surveille. Et le
seuil de 72 h est un choix d exploitation, pas une derivation : le
mecanisme qui applique les correctifs est un geste humain.

P64 REFUSAIT UNE DECLARATION CORRECTE. serveur_debian et serveur_durci sont
des roles de declaration pure, sans une tache ; le travail est fait par les
roles que leur playbook applique. La preuve exigeait declaration et depot
dans le meme role - vrai des vingt-deux premieres sondes, faux des qu une
sonde appartient au socle. Une garde qui force a contourner ce qu elle
protege est un defaut. Elle suit desormais le playbook du groupe.

Mesure : 21/21 machines vertes, 65 preuves, 23 sondes, 0 echec.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-10 17:26:35 -04:00

62 lines
2.3 KiB
Django/Jinja

#!/bin/bash
# GENERE par Set-OPS (role common_packages). Ne pas editer a la main.
#
# SONDE « correctifs » — des correctifs de securite attendent-ils, et depuis quand ?
#
# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2.
# Mise en defaut PAR PARAMETRE : `common_packages_sonde_seuil_heures` (mettre 0).
set -uo pipefail
ETAT={{ common_packages_sonde_correctifs_etat }}
SEUIL_H={{ common_packages_sonde_seuil_heures }}
# ON NE MET PAS A JOUR L'INDEX ICI, ET C'EST VOULU. Une sonde qui declenche un
# `apt-get update` a chaque passage ferait tourner le reseau et le verrou dpkg toutes les
# quinze minutes — elle deviendrait la cause de la panne qu'elle surveille. L'index est
# rafraichi par le deploiement ; la sonde lit ce que la machine SAIT.
simule=$(LC_ALL=C apt-get -s dist-upgrade 2>/dev/null | grep '^Inst') || true
total=$(printf '%s\n' "${simule}" | grep -c . )
[[ -n "${simule}" ]] || total=0
# UN CORRECTIF DE SECURITE SE RECONNAIT A SON DEPOT D'ORIGINE, pas a son nom. `apt-get -s`
# rend l'origine entre parentheses ; on y cherche le mot que Debian y met.
secu=$(printf '%s\n' "${simule}" | grep -ci 'security' || true)
: "${secu:=0}"
maintenant=$(date +%s)
depuis=0
if [[ -r "${ETAT}" ]]; then
depuis=$(tr -cd '0-9' < "${ETAT}" 2>/dev/null)
fi
: "${depuis:=0}"
perf="en_attente=${total} securite=${secu}"
if (( secu == 0 )); then
# PLUS RIEN EN ATTENTE : on oublie la date, sinon le prochain correctif heriterait de
# l'anciennete du precedent et naitrait deja en retard.
rm -f "${ETAT}" 2>/dev/null || true
if (( total > 0 )); then
echo "Aucun correctif de securite en attente (${total} mise(s) a jour ordinaire(s)). | ${perf}"
exit 0
fi
echo "A jour : aucune mise a jour en attente. | ${perf}"
exit 0
fi
# PREMIERE FOIS QU'ON LES VOIT : on note la date, on ne crie pas encore. Un correctif
# publie il y a trois minutes n'est pas une negligence.
if (( depuis == 0 )); then
printf '%s' "${maintenant}" > "${ETAT}" 2>/dev/null || true
depuis=${maintenant}
fi
age_h=$(( (maintenant - depuis) / 3600 ))
perf="${perf} age_heures=${age_h}"
if (( age_h >= SEUIL_H )); then
echo "CORRECTIFS DE SECURITE EN ATTENTE depuis ${age_h} h : ${secu} paquet(s). Deployer le socle. | ${perf}"
exit 2
fi
echo "${secu} correctif(s) de securite en attente depuis ${age_h} h (seuil ${SEUIL_H} h). | ${perf}"
exit 1