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:
- libnotify pour Ubuntu
- Growl pour MacOSX
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:
- Création d'un fichier de log sur une machine distante
- 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.
4. Le mardi, juillet 14 2009, 11:23 par seo
Je pense que cette idée de reproduire une interface web serait intéressant.
5. Le lundi, juillet 20 2009, 01:08 par fneyret
"D'ailleurs, Growl peut recevoir des messages d'applications distantes"
J'utilise déjà cette fonction avec irssi et le script growl-net (trouvable ici axman6.homeip.net/blog/gr...
Saurais-tu comment utiliser le même système avec Finch ?
6. Le lundi, juillet 20 2009, 14:29 par Chester Web Design
Je pense que cette idée de reproduire une interface web serait intéressant.
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 :)