Archives pour la catégorie Shell

send_smsd ou comment un script devient un daemon

L’envoi de sms pfffff … yaka cliquer !

C’est presque vrai. Mais dès que l’on veut que cela soit fais correctement et proprement cela devient moins simple.

Comme je le disais dans cette précedente page de mon blog. mettre en place un modem GSM c’est facile.

Les scripts d’exemples permettent de rapidement comprendre comment cela fonctionnent, python à d’excellente librairie pour communiquer avec des liaisons série bref que de bonheur.

Non c’est après que viennent ces petites choses qui agacent.

D’abord, une liaison série c’est pas multi-tàche : et pourtant j’en ai bouffé de cette @!$% de liaison RS232 au siècle dernier, mais non avec une liaison série on ne communique qu’avec une seule connexion à la fois.

Comme quoi certain réflexe s’émoussent avec le temps, et comme il est normal que certaines technos disparaissent 🙂

Donc un script qui ouvrent la liaison série pour envoyer les commandes AT, tout seul il marchent, si plusieurs SMS doivent être envoyés et ben il faut le gérer.

Allons y c’est pas sorcier non plus, après tout ne n’ai que 5 SMS à envoyer, on fait un plus gros scripts avec des sleep entre chaque envois, cela marche … presque. En fonction des opérateurs et si votre correspondant est sur le même continent ou non le temps d’envoi est TRES variable.

D’une solution passable, on passe à un solution plus que moyenne bref cela ne me convenait pas du tout.

Et donc naturellement l’idée d’utiliser un fichier FIFO m’est venu. Et donc l’esquisse d’un serveur d’envoi de SMS commençait à poindre le bout de son nez.

Allons y :

un script en shell pour envoyer les infos dans le fifo, ce qu’il y a de bien dans les SMS c’est que c’est court et que cela tient dans une ligne 🙂

un script qui scrutent continuellement le fifo ligne par ligne et qui effectue l’envoi, une ligne = 1 SMS.

Simple, pas tant que cela. Car si pour un raison ou une autre un SMS ne passe pas il faut réessayer un certain nombre de fois avant d’abandonner.

Oui d’accord mais la lecture du fifo est bloquante. Je ne vais pas attendre les n tentatives  pour envoyer les suivants, ou je ne vais pas attendre le prochain SMS pour envoyer ceux qui sont en attente.

faire une boucle qui lit de manière non bloquante le fifo, vérifier que la liste des sms en attente est vide sinon on repart pour un tour.

Heureusement, la communauté python regorge de ressources et d’exemples et après quelques essais la solution est apparu auréolé de lumière quasi divine …

Bref vous trouverez le code complet ici, il n’y a pas encore de procédure d’installation automatique mais bon cela tient en 3 fichiers.

send_sms : le shellscript qui dépose le numéro et le message dans le fifo

send_smsd : le daemon qui lit le fifo et envoi les commandes AT sur le modem (faire un lien avec send_smsd.py)

send_smsd.conf : à configurer en fonction de vos besoins (seul le chapitre MAIN est utilisé, l’autre c’est de la déco)

send_smsd.service : le script init.d spécial SUSE (désolé mais la VM qui en avait besoin était sous SUSE)

Même si je l’utilise en exploitation, je ne le considère pas comme finalisé il reste encore beaucoup de choses à faire. (un seul modem de géré, pas franchement objet etc …)

Mais je me suis bien amusé et cela marche 🙂

A+

chris

Publicités

Surveillance de la Température : le paramétrage du serveur ZABBIX

Nous avions mon collègue et moi mis en œuvre un serveur Zabbix pour tester et appréhender la supervision.

La chose fut simple à mettre en place, il suffit de télécharger une ‘appliance’ (une machine virtuelle déjà paramétré) et de l’incorporer dans notre infra structure VMWARE.

Puis est venu ce mini projet de surveillance de la température de la salle serveur, passons à l’étape suivante avec Zabbix : le paramétrage de quelque chose de spécifique.

Ce que j’aime bien avec zabbix c’est sa simplicité. une fois le serveur en place, il suffit d’installer les clients zabbix sur les serveurs à superviser, après c’est simple.

Parfois sur des machines pas à jour, l’installation du client est un peu difficile mais globalement cela fonctionne.

Petite précision : nous avons démarré avec la version 2.0 de Zabbix

Coté raspberry : le client zabbix

Sur le raspberry : apt-get install zabbix-agent

cela nous donne la version 1.8 mais cela suffit pour ce que l’on veut en faire

il suffit après de modifier le fichier /etc/zabbix/zabbix_agentd.conf pour paramétrer les infos suivantes :

Server :

l’adresse IP du server Zabbix, rajouter aussi 127.0.0.1 cela permet de faire des tests avec zabbix_get.

Hostname:

Le nom du client zabbix, attention il doit être identique avec le nom du hosts paramétré dans le serveur Zabbix

AllowRoot :

Permet de lancer le zabbix_client avec root, ce qui est nécessaire dans notre cas car la plupart des périphériques (1wire, i2c) ne sont accessible que par root.

Timeout:

Par la suite j’ai été obligé de le positionner à 30 secondes (par défaut c’est à 3 secondes) voir les explications plus loin.

UserParameter :

Le plus important, les informations spécifiques que l’on souhaite. Voici la ligne complète

 UserParameter=salle.temp,/home/temperature/bin/get_temp

La syntaxe est simple UserParameter=<clé>,<scripts>

Rien de bien compliqué mais il est possible de faire beaucoup plus plus d’infos ici

Il a fallu créer un user température, avec un home directory et un répertoire bin ou j’ai posé le scripts python get_temp. ( source complète => ici )

Note :

Au début, le script interrogeais le périphérique, si le CRC est bon il récupère la température et l’envoi sur la sortie standard. Simple non ?

Mais pas si simple que cela, parfois, et même si depuis cela s’est stabilisé depuis, les valeurs récupérées n’avait rien de cohérent ( -0.625 par exemple). Il a fallu modifier le script pour prendre 10 valeurs, enlever les extrêmes et faire la moyenne du reste.

Mais par contre le script lui est passé de 2 secondes d’exécution à 8 secondes et il a fallu modifier le Timeout coté serveur ET client pour que zabbix continue sa récolte d’informations.

Coté serveur Zabbix

Il faut d’abord créer un hosts dans zabbix (Configuration/Hosts) ce qui consiste a donner un nom, un nom visible, un accès ip ou DNS un port  et à l’inclure dans des groupes.

Pour les templates commencer par mettre le template « zabbix_agent » cela permet de tester si tout se passe bien avec zabbix, basculer aussi le mode automatic pour le ‘Host inventory’.

Ceci fait vous devriez voir dans ‘Monitoring / Lastest Data’ que le raspberry répond au ping ainsi que sa version de zabbix_client.

Le vrai paramétrage commence ici :

D’abord il faut créer un template puis une application puis un item puis des triggers ouf !

Le template regroupe l’application, les items et les triggers

Il est nécessaire de créer l’application puis l’item

ZABBIX_TEMPLATE

Image écran de création de l’item.

L’item a un type (ici zabbix_agent il s’agit d’un UserParameter),  porte un nom, on lui donne la clé des données à stocker (salle.temp cf UserParameter), le type des données, l’unité l’intervalle de récolte le temps de conservation les modifications à apporter etc …

Ceci fait nous pouvons commencer a tester si cela fonctionne

Pour cela depuis le serveur zabbix il suffit de taper :

zabbix_get -s ADR_IP_CLIENT -k "salle.temp"

Et vous devriez avoir une réponse du style => 19.275

C’est ce que va stocker le serveur zabbix.

Au bout de quelques temps vous pouvez même avoir des graphiques :

ZABBIX_GRAPH_TEMPERATURE

C’est d’un intérêt limité mais cela fait son petit effet quand même 🙂

A partir de la on peut avoir des triggers, donc création de 2 triggers : un quand la température est supérieure à 30° et un quand elle est en dessous de 15°. Le niveau d’alerte (severity)  à déclencher est ‘HIGH’ (que l’on traduit par ‘aie’ en français 🙂 )

Maintenant j’ai des données que je sondes régulièrement et des déclencheurs qui lancent des niveau d’alerte.

Il suffit maintenant de paramétrer une action, rien de bien compliqué.  il suffit de copier 🙂

ZABBIX_ACTION1 ZABBIX_ACTION2 ZABBIX_ACTION3

Cette action va donc, si les conditions sont remplis, déclencher une opération de type « Send Message » a un groupe précis d’utilisateurs en utilisant le media « SMS script temperature salle ».

Ce media est à paramétrer dans Administration (et non plus configuration), ce paramétrage consiste a lui donner une description, un type (Script) et un nom de script.

Pour utiliser des scripts avec zabbix : d’abord modifier zabbix_server.conf comme suit :

387 ### Option: AlertScriptsPath
388 #   Full path to location of custom alert scripts.
389 #   Default depends on compilation options.
390 #
391 # Mandatory: no
392 # Default:
393 # AlertScriptsPath=${datadir}/zabbix/alertscripts
394 AlertScriptsPath=/usr/local/zabbix/alertscripts
395
396 ### Option: ExternalScripts
397 #   Full path to location of external scripts.
398 #   Default depends on compilation options.
399 #
400 # Mandatory: no
401 # Default:
402 # ExternalScripts=${datadir}/zabbix/externalscripts
403 ExternalScripts=/usr/local/zabbix/externalscripts

Le script a été copié dans /usr/local/zabbix/alertscripts :


#!/bin/bash
#set -x
to="$1"
subject="$2"
body="$3"
FIC_LOG=/var/log/send_SMS_temp_salle.log
{
## A l'origine
## Mais probleme pour l'envoi de plusieurs SMS
## corrige voir le daemon send_smsd
/usr/local/bin/send_sms "$to" "$subject" 2>&1

## Au cas ou si cela ne fonctionne pas methode brutale
#T=5
## Ce script va envoyer les n SMS
#/usr/local/bin/send_sms 0612345678 "$subject" 2>&1     #User 1
#sleep $T
#/usr/local/bin/send_sms 0612345678 "$subject" 2>&1     #User 2
#sleep $T
#/usr/local/bin/send_sms 0612345678 "$subject" 2>&1     #User 3
#sleep $T
} >> $FIC_LOG

Notez l’importance de TOUT logger si vous voulez comprendre ce qu’il se passe.

Vous remarquerez que ce script utilise sens_sms un autre script que j’ai du écrire pour pouvoir envoyer correctement des SMS avec le daemon send_smsd, que je décrierais bientôt dans un article dédié.

A ce stade des choses se déclenche si la température dérape dans la salle serveur.

Notez que : Je suis tout à fait conscient que tout n’a pas été fait dans les règles de l’art.

Mais cela fonctionne et cela m’a permis de mieux comprendre le fonctionnement de Zabbix. Rien n’est mieux que de se fixer des buts concrets pour appréhender un outil.

La difficulté est souvent de trouver des objectifs réalisables.