Messages de notification

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

1. Le dimanche, mai 31 2009, 09:09 par avetis.kazarian

C'est vraiment sympa comme idée.

Et comme tu dis :

"D'ailleurs, avec des API, il y a moyen d'afficher des informations venant de sites web"

Si on pousse la chose un peu plus loin ca pourrait devenir quelque chose de très cool et utile :] (même si ca l'est déjà ^^)

2. Le lundi, juin 1 2009, 23:20 par Daniel

Cette solution est simple et plutôt élégante, mais elle "consomme" une connexion ssh ouverte en permanence, c'est pas bien méchant, mais pas génial non plus...
Laisser tourner un incron sur le serveur, qui se connecterai sur chaque client qui l'aurait demandé serait probablement plus adapté (mais ça suppose que le "client" soit aussi serveur ssh et accepte les connexions, au moins pour un user particulier). Bref, toujours le pattern "laissez-nous vos coordonnées et on vous écrira" ;-)

3. Le lundi, juin 1 2009, 23:59 par neolao

Et surtout qu'il y a l'avantage du tail pour recevoir ce qui est nouveau.

S'il y a une interface web, il faut reproduire le comportement (avec un timestamp gardé en mémoire par exemple).

En fait, je me demandais si l'idée était assez intéressante à développer ou pas.


7. Le mercredi, août 5 2009, 18:10 par fneyret

Plop. Après quelques recherches, je suis arrivé à trouver une méthode assez proche de la tienne pour Finch mais qui envoie directement les messages à growl (pas besoin de lancer de script sur la machine qui doit afficher les notifications).
Lien : neyret.fr/florian/index.p...
Si quelqu'un sait comment améliorer ce 'bidouillage', ça m'intéresse fortement :)