Messages de notification

Tux En lisant le billet “Irssi et les messages de notification…”, j’ai eu une idée. Et si je me faisais un système de notifications pour toutes sortes d’informations venant d’un serveur en ligne?

C’est le même principe que Growl avec les applications locales. D’ailleurs, Growl peut recevoir des messages d’applications distantes, mais ce n’est pas dans ce sens que je vais le faire.

Présentation

J’utilise principalement Ubuntu et MacOSX, et ils ont tous les 2 un afficheur de notifications sous forme de bulles qui apparaissent par dessus les applications:

On peut afficher le message qu’on veut à l’aide d’une ligne de commande.

Je vais créer mon système de notifications en 2 étapes:

  1. Création d’un fichier de log sur une machine distante
  2. Récupération en continu des nouvelles entrées du log

Enregistrer les modifications

Je veux centraliser les messages dans un seul fichier, sur mon serveur en ligne, par exemple /home/neolao/notifications.txt. Chaque ligne de ce fichier est une notification. Je décide que le premier mot sera le type et la suite sera le message.

Donc, très simple, si je veux ajouter une nouvelle notification, je fais:

echo "meteo Il fait beau"

Ce qui va d’abord m’intéresser, c’est d’avoir les nouveaux messages qu’on m’envoie sur finch ou irssi. Ca se résume à détecter les modifications du dossier d’archives de ces logiciels.

J’installe donc un utilitaire qui va m’indiquer la modification d’un fichier récursivement dans un dossier que je lui spécifie. La commande est inotifywait qui est dans le paquet inotify-tools. Voici mon script:

#!/bin/bash
inotifywait -rmq --format '%w %f' -e modify /home/neolao/.purple/logs | while read dir file
do
    echo "finch" `tail -n1 $dir$file` >> /home/neolao/notificatons.txt
done

inotifywait me permet de connaître le fichier qui a été modifié. Ensuite, j’écris la dernière ligne de ce fichier dans mes notificatons en préfixant avec le type (ici finch).

Pour irssi, j’ai utilisé fnotify qui remplit un fichier quand je reçois des messages privés et quand on écrit mon nom. Il suffit de modifier un petit peu le script pour qu’il ajoute ce que je veux dans mon fichier /home/neolao/notifications.txt.

Afficher les nouvelles notifications

Maintenant que la machine distante remplit bien le fichier /home/neolao/notifications.txt, il faut que je crée un script sur chacune de mes machines locales.

Notification sur Ubuntu

Sur Ubuntu, j’ai installé le paquet libnotify-bin pour avoir la commande notify-send. Et voici le script que je lance :

#!/bin/bash
ssh mylogin@hostname "tail -f notifications.txt" | while read type message
do
   notify-send -t 5000 -i info -u low "$type" "$message"
done

Notification sur MacOSX

Et le script pour Growl :

#!/bin/bash
ssh mylogin@hostname "tail -f notifications.txt" | while read type message
do
   /usr/local/bin/growlnotify -t "$type" -m "$message"
done

Conclusion

C’est plutôt efficace. J’essaie d’imaginer les notifications que je pourrai avoir besoin et aussi mes filtres. Je pourrai rendre accessible mes notifications par une page web (secrète bien sûr) pour une consultation sur mobile, voire envoyer des mails récapitulatifs sur 15 minutes.

D’ailleurs, avec des API, il y a moyen d’afficher des informations venant de sites web, ma machine distante servant à centraliser tout le bazar qu’une seule fois.

Voilà, c’était un trip rapide :)

Commentaires