Description
Reed-alert est un projet de monitoring simple sous OpenBSD, il n’enregistre aucune donnée ni ne produit des graphes de visualisation.
À partir d’un fichier de configuration, il vérifie plusieurs états et si ceux-ci échouent alors il sera envoyé une alerte. Le langage utilisée est le Lisp.
-
Auteure : Solène Rapenne
-
dépôt Git : git://bitreich.org/reed-alert
-
présentation de reed-alert (en anglais)
-
constat au bout de cinq ans… (en anglais)
Installation
Paquet
L’installation est très simple en soit : # pkg_add reed-alert
- OpenBSD : 6.6 → 7.2
- Version : 1.05
Vous pouvez préférer le code sur le dépôt git qui corrige quelques détails.
git
$ git clone git://bitreich.org/reed-alert
$ cd reed-alert
$ make
sed 's,REEDDIR=,&/usr/local/share/reed-alert/,' reed-alert.in > reed-alert
$ doas make install
mkdir -p /usr/local/share/reed-alert/
mkdir -p /usr/local/bin
install -o root -g bin -m 755 reed-alert /usr/local/bin/reed-alert
install -o root -g wheel -m 644 probes.lisp functions.lisp /usr/local/share/reed-alert//
L’avantage du dépôt est qu’il fourni le fichier README très explicatif, ainsi que des fichiers d’exemples, ainsi qu’un outil de sortie au format HTML .
Dépendance
- le paquet ecl :
# pkg_add ecl
— qui est normalement installé en dépendance du paquet reed-alert.
Configuration
Le fichier README
vous informe que vous pouvez copier l’un des deux
fichiers exemples en fichier de configuration.
Faisons simple, en admettons que nous soyons dans le répertoire de reed-alert :
$ touch config.lisp
.
Il vous faudra ensuite l’éditer avec votre éditeur de texte favori.
cron
PATH
dans votre crontab
comporte aussi le répertoire /usr/local/bin
.Une fois que vous aurez tout configuré, et vérifiez
que votre configuration soit sans erreur, n’hésitez pas à ouvrir la table
de cron de l’utilisateur root
pour y ajouter un job de surveillance,
tel que :
*/5 * * * * -ns reed-alert /repertoire-vers/reed-alert/config.lisp
où :
- les deux options
-ns
sont spécifiques à la gestion cron - cf la partie Documentations /repertoire-vers/reed-alert/
correspond au répertoire où vous aurez créé/déposé votre fichier de configuration- cette tâche s’exécutera toutes les 5 minutes ; à vous de voir, si cette période vous est utile/nécessaire, et de la modifier en conséquence.
Langage
C’est du Common LISP !
Hormis les variables et les preuves déjà prédéfinies, il est possible d’utiliser des concepts de condition, de boucles, d’imbriquer des dépendances, des niveaux d’échelles d’alertes, d’étendre/créer vos propres preuves. Tout cela est expliqué clairement dans le fichier README.
Variables prédéfinies
Il existe des variables prédéfinies, elles sont entourées du symbole modulo
%
et peuvent être utilisées partout dans votre fichier de configuration.
Voici leurs noms et leur définition :
%function%
: le nom de la fonction qui sert de preuve%date%
: la date actuelle au format YYYY/MM/DD hh:mm:ss%params%
: les paramètres utilisés dans le contexte de la preuve%hostname%
: le nom d’hôte%result%
: l’erreur retournée (tel que la valeur excédant la limite, un fichier non trouvé, etc… )%desc%
: une description arbitraire nommant une vérification ; par défaut, est une chaîne vide%level%
: le type de la notification utilisé%os%
: le système d’exploitation utilisé (FreeBSD/Linux/OpenBSD)%newline%
: le caractère de nouvelle ligne%state%
: les états “start” / “end” lorsqu’un problème est levé ou résolu.
Preuve
La preuve est en fait un type de vérification à effectuer. C’est un test !
Par défaut, il est possible de vérifier :
command
: exécute une commande arbitraire, désirée par l’administrateur, et qui déclenchera une alerte si le code d’erreur est supérieur à zéro.curl-http-status
: exécute une requête HTTP et lève une alerte si le code de retour est différent de ‘OK’ (code 200)disk-usage
: que la taille d’une partition n’excéde pas une certaine limitefile-exists
: qu’un certain fichier existefile-less-than
file-updated
: qu’un certain fichier existe et qu’il a été mis à jour depuis un temps définiload-average-1
: que la charge moyenne durant la dernière minute n’excéde pas une certaine limiteload-average-5
: que la charge moyenne durant les cinq dernières minutes n’excéde pas une certaine limiteload-average-15
: que la charge moyenne durant les quinze dernières minutes n’excéde pas une certaine limitenumber-of-processes
: le nombre de processus n’excède pas une certaine limite.pid-running
: le processus en question soit vivant, en spécifiant le fichier d’identifiant de processus.ping
: que l’hôte distant répond à deux ping.service
: qu’un service soit actif sur le système hôtessl-expiration
: qu’un certificat SSL expire dans une période donnée en nombre de secondes.write-to-file
: permet d’écrire du contenu dans un fichier ; le créera s’il n’existe pas localement.
Je vous renvoie à la lecture du fichier README pour en savoir plus sur chacune de ces preuves.
Ajout de l’alerte
La première chose à faire est d’ajouter une alerte - pour nous faciliter le propos, nous créerons une alerte mail.
Ajoutez basiquement :
(alert mail "echo 'problem on %hostname%' | mail mail@domain.tld")
Une version plus élaborée :
(alert mail "echo -n '[%state%] Problem with %function% %date% %params%' | mail -s '[%state%] alarm on %hostname%' mail@domain.tld")
Sortie HTML
La version du dépôt git
fournit un outil de sortie au
format HTML que l’on trouve dans le répertoire enfant extras/output2html.sh
.
Voici comment l’utiliser :
$ reed-alert config.lisp | extras/output2html.sh > alert.html
Il ne vous reste plus qu’à mettre/fournir ce fichier html sur un espace web pour obtenir la lecture de celui-ci.
Exemples
Pour rappel, allez lire les deux fichiers d’exemples fournis par le projet. Ils sont instructifs.
Ci-dessous, retrouvez des exemples de mon cru.
Exemple : curl-http-status
https://
suivi du nom de domaine à cibler.⇒ version basique :
Code : LISP
(=> mail curl-http-status :url "huc.fr.eu.org" :timeout 3)
(=> mail curl-http-status :url "openbsd.fr.eu.org" :timout 3)
(=> mail curl-http-status :url "blog.openbsd.fr.eu.org" :timeout 3)
⇒ version élaborée :
Code : LISP
(loop for host in (list "huc.fr.eu.org" "openbsd.fr.eu.org" "blog.openbsd.fr.eu.org")
do
(=> mail curl-http-status :url host :timeout 3))
⇒ Exemple de retour :
Code : sh
MAIL CURL-HTTP-STATUS URL https://huc.fr.eu.org TIMEOUT 3 SUCCESS SUCCESS NO 0
MAIL CURL-HTTP-STATUS URL https://openbsd.fr.eu.org TIMEOUT 3 SUCCESS SUCCESS NO 0
MAIL CURL-HTTP-STATUS URL https://blog.openbsd.fr.eu.org TIMEOUT 3 SUCCESS SUCCESS NO 0
Exemple : disk-usage
Là, je vous ferais direct la version élaborée :
Code : LISP
(loop for path in (uiop:run-program "mount | awk -v pattern='/' '$0 ~ pattern { print $3 }' " :output :lines)
do
(=> mail disk-usage :path path :limit 80))
Explication :
- La boucle appele la commande
mount
qui est “filtrée” par la commandeawk
afin de ne restituer que le nom des partitions existantes, sur lesquelles sera appliqué le test de preuve.
⇒ Exemple de retour :
Code : sh
MAIL DISK-USAGE PATH / LIMIT 80 SUCCESS SUCCESS NO 0
MAIL DISK-USAGE PATH /home LIMIT 80 SUCCESS SUCCESS NO 0
MAIL DISK-USAGE PATH /tmp LIMIT 80 SUCCESS SUCCESS NO 0
MAIL DISK-USAGE PATH /usr LIMIT 80 SUCCESS SUCCESS NO 0
MAIL DISK-USAGE PATH /usr/X11R6 LIMIT 80 SUCCESS SUCCESS NO 0
MAIL DISK-USAGE PATH /usr/local LIMIT 80 SUCCESS SUCCESS NO 0
MAIL DISK-USAGE PATH /usr/obj LIMIT 80 SUCCESS SUCCESS NO 0
MAIL DISK-USAGE PATH /usr/src LIMIT 80 SUCCESS SUCCESS NO 0
MAIL DISK-USAGE PATH /var LIMIT 80 SUCCESS SUCCESS NO 0
Exemple : ping
⇒ version basique :
Code : LISP
(=> mail ping :host "192.168.1.1" :desc "Ping 192.168.1.1")
(=> mail ping :host "huc.fr.eu.org" :desc "Ping huc.fr.eu.org")
(=> mail ping :host "openbsd.fr.eu.org" :desc "Ping openbsd.fr.eu.org")
(=> mail ping :host "blog.openbsd.fr.eu.org" :desc "Ping blog.openbsd.fr.eu.org")
⇒ version élaborée :
Code : LISP
(loop for host in (list "192.168.1.1" "huc.fr.eu.org" "openbsd.fr.eu.org" "blog.openbsd.fr.eu.org")
do
(=> mail ping :host host))
Ping :
, utilisez la fonction concatenate
, en ajoutant une description
dans la dernière ligne, tel que :
:desc (concatenate 'string "Ping : " host)
⇒ Exemple de retour :
Code : sh
MAIL PING HOST 192.168.1.1 Ping : 192.168.1.1 SUCCESS SUCCESS NO 0
MAIL PING HOST huc.fr.eu.org Ping : huc.fr.eu.org SUCCESS SUCCESS NO 0
MAIL PING HOST openbsd.fr.eu.org Ping : openbsd.fr.eu.org SUCCESS SUCCESS NO 0
MAIL PING HOST blog.openbsd.fr.eu.org Ping : blog.openbsd.fr.eu.org SUCCESS SUCCESS NO 0
Exemple : service
⇒ version basique :
Code : LISP
(=> mail service :name "ntpd")
(=> mail service :name "pflogd")
(=> mail service :name "smbd")
(=> mail service :name "smtpd")
(=> mail service :name "sshd")
(=> mail service :name "syslogd")
⇒ version élaborée :
Code : LISP
(loop for name in (list "ntpd" "pflogd" "smbd" "sshd" "syslogd")
do
(=> mail service :name name))
⇒ Exemple de retour :
Code : sh
MAIL SERVICE NAME ntpd SUCCESS SUCCESS NO 0
MAIL SERVICE NAME pflogd SUCCESS SUCCESS NO 0
MAIL SERVICE NAME smbd SUCCESS SUCCESS NO 0
MAIL SERVICE NAME sshd SUCCESS SUCCESS NO 0
MAIL SERVICE NAME syslogd SUCCESS SUCCESS NO 0
Vérification
Pour vérifier l’écriture de votre fichier de configuration, une fois que
celle est terminée/modifiée, exécutez simplement en console :
$ reed-alert /repertoire-vers/reed-alert/config.lisp
Une fois que votre vérification est faite, pensez à créer une tâche cron ;-)
Dépannage
The character *** is not a valid dispatch macro character.
Exemple :
An error occurred during initialization:
Reader error in file #<input stream #P/path/reed-alert/config.lisp" 0xa5b677d1960>, position 173:
The character Space is not a valid dispatch macro character.
Vérifiez vos écritures. Vous avez certainement fait une erreur typographique…
ecl or sbcl not found in PATH.
Vous avez le message suivant :
ecl or sbcl not found in PATH.
you need at least one of them to use reed-alert
Après vous être assuré d’avoir au moins installer le paquet ecl
,
ajoutez dans la variable d’environnement PATH
de votre crontab le
répertoire /usr/local/bin
.
’name’ is not of type FUNCTION..
An error occurred during initialization:
"name" is not of type FUNCTION.
Vous utilisez une boucle ? Il y a de forte probabilité que vous ayez utilisé un nom de variable similaire à celui d’une fonction !
Not a valid property list
An error occurred during initialization:
Not a valid property list (HOST Ping 192.168.1.3).
Vous utilisez une boucle ? Vérifiez l’écriture de votre boucle, une des propriétés n’est pas correcte.
Unexpected end of file on
An error occurred during initialization:
Unexpected end of file on #<input stream #P"/path/reed-alert/config.lisp">.
L’erreur ci-dessus est due à une mauvaise écriture dans votre fichier de configuration ! Donc, VÉRIFIEZ, vérifiez ET vérifiez encore, et encore ce que vous avez écrit : un simple oubli d’une parenthèse fermante, d’un apostrophe/guillemet peut en être la cause.
Documentations
La copie du dépôt vous permettra de lire les fichiers suivants :
README
: À lire, très complet, il fournit en anglais, les différentes étapes d’installation, de paramétrage, et autres exemples.- les fichiers d’exemple :
example-simple.lisp
etexample-full.lisp
.
Remerciements
- Solène Rapenne fait partie de l’équipe des développeurs d’OpenBSD. Informaticienne, elle développe dans plusieurs langages, dont le Lisp qui est la base du code de reed-alert, et à ses heures perdues professionnellement parlant absolument la fonction d’administrateur réseaux/système! :p