Notification d'alertes système avec reed-alert
#1

Bonjour Smile

Je vous présente mon projet "reed-alert"

Site web : https://dataswamp.org/~solene/2018-01-17...alert.html (en) et Présentation à la bitreichCON 2018 (en + audio)

Il s'agit d'un programme permettant de paramétrer des types d'alertes (mails, texte sur irc, sms etc..) en fonction de vérifications sur le système (espace disque dépassé, certificat SSL expiré, nombre de processus, service lancé etc..). Il est fait pour être lancé régulièrement via cron.

Récupérer le projet :
Code :
git clone git://bitreich.org/reed-alert

Configuration d'exemple

Code :
(alert mail "echo 'problem on %hostname%' | mail me@example.com")
(=> mail file-updated :path "/program/file.generated" :limit "10")
(=> mail disk-usage :path "/tmp"  :limit 90)

;; check if :path pid file process is running
(=> mail pid-running  (:path "/home/user/test.pid")) ;; failure

;; check if number of processes on the system is more than :limit
(=> mail number-of-processes (:limit 200))

;; check if :host host is reachable
(=> mail ping (:host "8.8.8.8"      :desc "Google DNS"))

Dépendance : [g]sbcl[/g] ou [g]ecl[/g]

Suffit de lancer la commande

Code :
reed-alert fichier_config.lisp
après avoir fait un "make install" depuis les sources.
Répondre
#2

Bon, alors.

partons du principe que je veux récupérer l'ensemble des points de montage system.

En shell :
Code :
awk '/\// { print $2 }' /etc/fstab

Ce qui pourrait être inclus dans un tableau tel que :
Code :
set -A array $(awk '/\// { print $2 }' /etc/fstab)

Bien, comment appliquer ce principe, pour parcourir l'ensemble de ces points de montage et vérifier les limites espace disque ?!
Sachant qu'il y aurait au moins deux manières différentes de le faire, au-travers de `loop` ou de `while`.

Maintenant je me demandes aussi ce qui serait le mieux :
- utiliser while en bouclant sur le fichier fstab pour récupèrer ensuite les noms des points de montage, ou
- créer une variable, si c'est possible et boucler dessus avec un loop.

quid ?

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#3

tu en as tellement pour avoir besoin de faire une boucle ? En plus, tu veux définir le même seuil de limite pour tous les points de montage ?

sinon c'est juste l'affaire d'un truc comme ça

Code :
(=> mail disk-usage :path "/"  :limit 60)
(=> mail disk-usage :path "/home"  :limit 80)
(=> mail disk-usage :path "/var"  :limit 90)
(=> mail disk-usage :path "/tmp"  :limit 90)
(=> mail disk-usage :path "/usr/local"  :limit 90)
(=> mail disk-usage :path "/usr"  :limit 60)

je peux te donner le code pour la boucle si tu y tiens.
Répondre
#4

ça, j'ai compris le principe Wink
copier-coller, c'est si simple, mais peu élégant.

Et, oui, pour te répondre, j'ai quelques points de montage, du fait d'avoir créer des mfs pour des répertoires de cache et de fichiers de sessions Wink

Au moins, m'aider à comprendre comment récupérer l'info et l'injecter dans la boucle…. le reste, je devrais y arriver !
j'ai dans l'idée d’intégrer aussi une 'escalation'…)

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#5

un truc comme ça

Code :
(loop for element in (uiop:run-program "mount | cut -d ' ' -f 1" :output :lines)
    do
     (=> mail disk-usage :path element :limit 90))

marche sur sbcl
Répondre
#6

Mais comment on sait s'il y a une erreur d'exécution ?!

Pour l'instant, j'ai fait ça:
Code :
# cat reed-alert.lisp                                                                                                                                                      
(alert mail "echo 'problem on %hostname%' | mail user@domain.net")
(loop for element in (uiop:run-program "mount | cut -d ' ' -f 3" :output :lines)
    do
    (=> mail disk-usage :path element :limit 80))

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#7

ah oui mince, il faut utiliser -f2 dans le cut, le path pour disk-usage ça doit être le point de montage et pas le device Smile
Répondre
#8

C'est bon, t'inquiète, j'ai fini par comprendre ; c'est même `-f3` qu'il faut faire !

----

Ok, d'ailleurs j'arrive aussi au même résultat, avec :
Code :
# cat reed-alert.lisp                                                                                                                                                    
(alert mail "echo 'problem on %hostname%' | mail user@domain.net")
(loop for element in (uiop:run-program "mount | awk -v pattern='/' '$0 ~ pattern { print $3 }' " :output :lines)
    do
    (=> mail disk-usage :path element :limit 80))

Ou en interrogeant directement le fichier `fstab` Wink

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#9

j'ai pas de machine sous la main pour tester mais

Code :
mount | awk -v pattern='/' '$0 ~ pattern { print $3 }

doit être simplifiable en

Code :
mount | awk '/\// { print $3 }'

il faut mieux utiliser mount plutôt que lire le fstab car ce qui est dans fstab n'est pas forcément monté, et tu peux avoir des montages pas dans fstab.
Répondre
#10

Ta deuxième écriture était ma première écriture, mais ça plantouille !
Code :
# reed-alert reed-alert.lisp  
An error occurred during initialization:
Subprocess with command "mount | awk '/// { print $3 }' "
exited with error code 2.

Donc, j'ai cherché une autre solution, et je suis tombé sur l'astuce d'utiliser une variable, telle qu'écrite Wink
Et, cette écriture, elle fonctionne !

Pour les histoires de montage, dans le fond, tu as raison ; mais dans ce contexte, n'est monté que ce qui est écrit dans fstab, mais ayant eu la même réflexion, c'est pour cela que j'ai fini par m'assurer en `mount | awk` qui est plus consommateur de ressources qu'un awk direct.

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#11

il faudrait que je regarde pourquoi ça fait ça, mais les caractères échappés c'est toujours compliqué Sad
Répondre
#12

C'est pas grave, le tout est de trouver une solution fonctionnelle, et satisfaisante Wink

Question subsidiaire : quelle période vaut-il mieux choisir pour le cron ? 5 minutes, une heure, un jour…. un an ?!

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#13

(30-12-2019, 23:58:30)PengouinBSD a écrit :  C'est pas grave, le tout est de trouver une solution fonctionnelle, et satisfaisante Wink

Question subsidiaire : quelle période vaut-il mieux choisir pour le cron ? 5 minutes, une heure, un jour…. un an ?!

tout dépend de ce que tu mesures, de la notification utilisée et de la criticité de la chose ^^

si c'est un système de fichiers, toutes les 2 heures ça suffit, si c'est pour surveiller qu'un fichier est bien généré toutes les 5 minutes par ton programme, il vaut mieux vérifier toutes les 5 minutes. Sur mon serveur où il y a un peu de tout (surveillances de serveurs http distants, de ping, de fichiers générés, de services lancés etc..), il est lancé toutes les 10 minutes.
Répondre
#14

Bon, pour l'instant étant donné que je n'ai QUE cela de configurer, je l'ai positionné à une heure.
(mais vu qu'on peut créer différents fichiers de configuration, on peut exécuter différents cron pour différents fichiers...)

Et, concernant la passerelle SMS ? qui ? quoi ?!

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#15

(31-12-2019, 00:04:50)PengouinBSD a écrit :  Bon, pour l'instant étant donné que je n'ai QUE cela de configurer, je l'ai positionné à une heure.
(mais vu qu'on peut créer différents fichiers de configuration, on peut exécuter différents cron pour différents fichiers...)

Et, concernant la passerelle SMS ? qui ? quoi ?!

Tu as plusieurs moyens d'envoyer des sms. Soit avoir un téléphone en réseau local avec le serveur et utiliser kdeconnect pour envoyer des SMS (ou faire un VPN entre un téléphone android et le serveur pour que ça marche mais c'est bien complexe Angel ) ou utiliser un service d'envoi de SMS via une API mais c'est payant.

si tu trouves un service permettant d'envoyer des sms gratuitement, je prends Heart
Répondre
#16

Ok! Compris :p

Bon, alors, comme dit précédemment je l'ai programmé pour s'exécuter toutes les heures.
Par contre, je n'ai pas du comprendre un détail, il m'envoie toutes les heures le résultat.
Ce n'est pas ce dont j'ai besoin. je pensais qu'il m'avertirait si une limite en question était atteinte - heureusement, que je l'ai programmé que pour une heure, parce que si je l'avais fait pour toutes les 5 minutes; me retrouvait avec autant de mails... déjà que ça m'agace d'en recevoir un toutes les heures, alors que tout va bien…
J'espère que tu comprends ce que je veux dire ! ?

J'ai vraiment compris que tu étais alerté que si telle condition était remplie ; je me trompe ?!

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#17

c'est juste que tu n'as pas mis MAILTO="" dans ton crontab, et que du coup cron t'envoies par mail la sortie de chaque script exécuté Smile
Répondre
#18

OK, en effet, ajouté !
Merci. On verra dans quelques minutes, si je ne reçois plus l'avis d'exécution Wink

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#19

Bon, si ça peut en intéresser certains, voici mon fichier de config sur mon NAS :

Code :
(alert mail "echo -n '[%state%] Problem with %function% %date% %params%' | mail -s '[%state%] alarm' email@domain.tld")

(=> 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)

(loop for element in (uiop:run-program "mount | awk -v pattern='/' '$0 ~ pattern { print $3 }' " :output :lines)
    do
        (=> mail disk-usage :path element :limit 80))

(=> mail ping :host "192.168.***" !desc "Ping server")
(=> 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")

(=> mail service :name "ntpd")
(=> mail service :name "pflogd")
(=> mail service :name "smbd")
(=> mail service :name "smtpd")
(=> mail service :name "sshd")
(=> mail service :name "syslogd")

Et la version "abrégée" :
Code :
(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))

(loop for element in (uiop:run-program "mount | awk -v pattern='/' '$0 ~ pattern { print $3 }' " :output :lines)
    do
        (=> mail disk-usage :path element :limit 80))

(loop for host in (list "192.168.247.3" "huc.fr.eu.org" "openbsd.fr.eu.org" "blog.openbsd.fr.eu.org")
    do
        (=> mail ping :host host))

(loop for name in (list "ntpd" "pflogd" "smbd" "sshd" "syslogd")
    do
        (=> mail service :name name))

----

Bon, après il y a certainement d'autres choses/services à surveiller, mais c'est un premier jet bien utile :p

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#20

Des remarques quant à la documentation ou la prise en main ?
Répondre
#21

Dans l'immédiat, pas pour l'instant.

Pour info : https://doc.huc.fr.eu.org/fr/sys/openbsd/reed-alert/
:p

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#22

PengouinBSD, ahh oui, le projet reed-alert de Solene, discuté hier sur irc, du coup c'est plus clair Smile

Merci pour le up ^^ Le sujet m'interresse ^^ (mon projet domotique, restera sur Node-RED) Smile

Pourquoi pas ultérieurement lorsque je maitriserai mieux, m'affranchir de la couche node.js / node-red.
Interfacer reed-alert, via APIs / Mqtt aux objets de la maison... Ca doit être réalisable.

Ne me pousser pas trop papi hors sa zone de confort, il est vieux !!!

Pour ma part, j'ai un dongle 4G huawei 3372. j'attends la réception de la carte SIM free, gratuite si freebox ou 2€ / mois sinon, pour envoyer les sms.

Code :
dmsg
(...)
umsm0 at uhub1 port 1 configuration 1 interface 0 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
umsm0 detached
umsm0 at uhub1 port 1 configuration 1 interface 0 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
ucom0 at umsm0
umsm1 at uhub1 port 1 configuration 1 interface 1 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr

Pour le moment, je sais que c'est réalisable. A ce jour, je ne me suis pas penché sur le moyen technique d'envoyer des sms.

Il semble que le package Gammu réponde au besoin.

Oliv,

Calme, en avant, Droit  - Général Alexis L'hotte
________________________________________________________
OpenBSD : @online.net, @amd64, @RockPro64, @BBB
Répondre
#23

(22-04-2020, 13:01:05)Oliv a écrit :  PengouinBSD, ahh oui, le projet reed-alert de Solene, discuté hier sur irc, du coup c'est plus clair Smile

Merci pour le up ^^ Le sujet m'interresse ^^ (mon projet domotique, restera sur Node-RED) Smile

Pourquoi pas ultérieurement lorsque je maitriserai mieux, m'affranchir de la couche node.js / node-red.
Interfacer reed-alert, via APIs / Mqtt aux objets de la maison... Ca doit être réalisable.

Ne me pousser pas trop papi hors sa zone de confort, il est vieux !!!

Pour ma part, j'ai un dongle 4G huawei 3372. j'attends la réception de la carte SIM free, gratuite si freebox ou 2€ / mois sinon, pour envoyer les sms.

Code :
dmsg
(...)
umsm0 at uhub1 port 1 configuration 1 interface 0 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
umsm0 detached
umsm0 at uhub1 port 1 configuration 1 interface 0 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr 2
ucom0 at umsm0
umsm1 at uhub1 port 1 configuration 1 interface 1 "HUAWEI_MOBILE HUAWEI_MOBILE" rev 2.10/1.02 addr

Pour le moment, je sais que c'est réalisable. A ce jour, je ne me suis pas penché sur le moyen technique d'envoyer des sms.

Il semble que le package Gammu réponde au besoin.

Comme je l'ai dit sur IRC, Reed-alert c'est au total dans les 300 lignes de code. Je pense qu'il serait mieux que tu développes quelque chose de comparable qui s'intègre parfaitement à ce que tu veux faire. Le plus long c'était d'avoir les idées, pas de faire le code Wink
Répondre
#24

Oui Smile disons qu'il faut que je comence petit. ^^

Oliv,

Calme, en avant, Droit  - Général Alexis L'hotte
________________________________________________________
OpenBSD : @online.net, @amd64, @RockPro64, @BBB
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)