63 lines
2.3 KiB
Text
63 lines
2.3 KiB
Text
|
|
#!/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
|