#!/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