---
aliases: [/fr/sys/openbsd/reed-alert/]
date: 2020-02-24T01:27:09+01:00
description: "Mettre en place simplement du monitoring d'OpenBSD, en mode console/terminal, avec un simple fichier de configuration grâce au projet 'Reed-alert'"
draft: false
include_toc: true
show_comments: false
tags: ['OpenBSD','supervision']
title: "Reed-alert : Monitorer simplement OpenBSD"
---
## 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][1]
- dépôt Git : git://bitreich.org/reed-alert
- [présentation de reed-alert][1] *(en anglais)*
- [constat au bout de cinq ans][2]… *(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 {{< anchor git git >}}
qui corrige quelques détails.
### git
```sh
$ 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 {{< anchor "outil de sortie au format HTML" "sortie-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
{{< note warning >}}
Assurez-vous que la variable d'environnement `PATH` dans votre crontab
comporte aussi le répertoire `/usr/local/bin`.
{{}}
Une fois que vous aurez tout configuré, et {{< anchor vérifiez vérification >}}
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 {{< anchor Documentations documentations >}}*
* `/repertoire-vers/reed-alert/` correspond au répertoire où vous aurez
créé/déposé votre {{< anchor "fichier de configuration" 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 limite
* `file-exists` : qu'un certain fichier existe
* `file-less-than`
* `file-updated` : qu'un certain fichier existe et qu'il a été mis à jour
depuis un temps défini
* `load-average-1` : que la charge moyenne durant la dernière minute
n'excéde pas une certaine limite
* `load-average-5` : que la charge moyenne durant les cinq dernières minutes
n'excéde pas une certaine limite
* `load-average-15` : que la charge moyenne durant les quinze dernières
minutes n'excéde pas une certaine limite
* `number-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ôte
* `ssl-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.
{{< note warning >}}
Évitez d'utiliser ces mots clés dans vos propres variables, vous pourriez
avoir à gérer des {{< anchor erreurs dépannage >}} bien truculentes !
{{< /note >}}
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.
{{< note info >}}
Sachez qu'il est possible de créer des alertes de type SMS, des alertes
qui n'avertissent de rien, ou tout autre sorte d'alerte que vous pourriez
inventer.
{{< /note >}}
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 {{< anchor git 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.
{{< note tip >}}
Configurez votre {{< anchor crontab cron >}} en ajoutant l'outil de sortie
HTML.
{{}}
### 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`
{{< note tip >}}
Pour cibler un serveur délivrant sur le protocole {{< abbr HTTPS "HyperText Transfer Protocol Secure" >}},
il est nécessaire de le cibler en le précédent du schéma suivant :
`https://` suivi du nom de domaine à cibler.
{{}}
⇒ version basique :
{{< code "sys-openbsd-reed-alert-example-curl-basic" LISP >}}
⇒ version élaborée :
{{< code "sys-openbsd-reed-alert-example-curl-loop" LISP >}}
⇒ Exemple de retour :
{{< code "sys-openbsd-reed-alert-example-curl-return" sh >}}
#### Exemple : `disk-usage`
Là, je vous ferais direct la version élaborée :
{{< code "sys-openbsd-reed-alert-example-disk-usage-loop" LISP >}}
**Explication** :
* La boucle appele la commande `mount` qui est "filtrée" par la commande
`awk` afin de ne restituer que le nom des partitions existantes, sur
lesquelles sera appliqué le test de preuve.
⇒ Exemple de retour :
{{< code "sys-openbsd-reed-alert-example-disk-usage-return" sh >}}
#### Exemple : `ping`
⇒ version basique :
{{< code "sys-openbsd-reed-alert-example-ping-basic" LISP >}}
⇒ version élaborée :
{{< code "sys-openbsd-reed-alert-example-ping-loop" LISP >}}
{{< note tip >}}
Vous voulez personnaliser le message avec un texte prédéfini, tel que
`Ping :`, utilisez la fonction `concatenate`, en ajoutant une description
dans la dernière ligne, tel que :
`:desc (concatenate 'string "Ping : " host)`
{{< /note >}}
⇒ Exemple de retour :
{{< code "sys-openbsd-reed-alert-example-ping-return" sh >}}
#### Exemple : `service`
⇒ version basique :
{{< code "sys-openbsd-reed-alert-example-service-basic" LISP >}}
⇒ version élaborée :
{{< code "sys-openbsd-reed-alert-example-service-loop" LISP >}}
⇒ Exemple de retour :
{{< code "sys-openbsd-reed-alert-example-service-return" sh >}}
## 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 à {{< anchor "créer une tâche cron" cron >}} ;-)
## Dépannage
### The character *** is not a valid dispatch macro character.
Exemple :
```sh
An error occurred during initialization:
Reader error in file #, 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 :
```sh
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 {{< anchor "installer le paquet ecl" dépendance >}},
ajoutez dans la variable d'environnement `PATH` de votre crontab le
répertoire `/usr/local/bin`.
### 'name' is not of type FUNCTION..
```sh
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
```sh
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
```sh
An error occurred during initialization:
Unexpected end of file on #.
```
L'erreur ci-dessus est due à une mauvaise écriture dans votre fichier de
configuration !
Donc, {{< color red >}}VÉRIFIEZ, vérifiez ET vérifiez encore, et encore
{{< /color >}} 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` et `example-full.lisp`.
---
* {{< man crontab 5 >}}
## 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
----
[1]: https://dataswamp.org/~solene/2018-01-17-reed-alert.html
[2]: https://dataswamp.org/~solene/2022-02-10-five-years-of-reed-alert.html