Tutoriel à partir de Karmic et améliorations
J'ai enfin fait une page simple pour que la famille puisse répondre à mes notifications. C'est que se connecter en SSH et taper des commandes c'est pas à la portée de ma mère (67 ans)... même si elle se sert parfaitement bien d'Ubuntu par ailleurs.
Donc voici ce que ça donne (envoi et réception regroupées sur la copie d'écran) :
___________________________________________________________________________
Quoi de neuf depuis Karmic.
Désormais les notifications sont affichées par notification-OSD. Deux paramètres ne sont plus pris en compte : la position de la bulle, la durée d'affichage. Eh oui... ça simplifie en quelque sorte les choses, mais ça retire des possibilités.
Notification-OSD a été assez décrié. Le positionnement de la bulle est étrange, et comme on n'y peut rien (il ne tient plus compte des paramètre X,Y) ça restera ainsi pour toute la durée de Karmic. De plus désormais les bulles ne peuvent plus être interactives.
Ca a été pas mal discuté sur les forums Ubuntu, et il y aura certainement encore des modifications avec Lucid.
Alors en réalité il n'y avait rien qui coinçait vraiment pour ces fameuses bulles, c'est juste qu'il faut les envoyer en étant root.
Or, lorsqu'on fait cela à partir de PhP, PhP n'est pas root, il utilise le compte sans privilège : www-data
La solution est donc (en plus de ce qui est indiqué sur les posts précédents) :
sudo visudo
On rajoute les lignes suivantes dans le fichier :
www-data ALL=(root) NOPASSWD: /usr/bin/notify-send
www-data ALL=(root) NOPASSWD: /usr/bin/paplay
www-data ALL=(root) NOPASSWD: /usr/bin/espeak
... ah oui, j'ai rajouté espeak, c'est trop drôle la voix de synthèse !
___________________________________________________________________________
Les fichiers.
Supposons donc que vous vouliez vous en servir avec PhP.
Placez vous sur le PC où vous voulez recevoir les notifications et commencez par installer Apache et PhP (si vous lisez ces lignes vous devriez savoir faire).
Pour faire propre on va créer un répertoire : notify
sudo mkdir /var/www/notify
Ensuite on y place le script pour envoyer les notifications, nommez le simplement :
notify
#! /bin/bash
#####################################
# DESCRIPTION
# This script does several things :
# - send a notification
# - play a sound file
# - say the message of the notification
# It is normally launched by PhP under the www-data user
# Parameters are :
# $1 = Title of the message
# $2 = Text of the message
# $3 = Icon of the message
# $4 = Sound file to play
# $5 = Flag
#
#####################################
# INFO
# Author : Zakhar - eze AT free DOT fr
# Licence : GNU GPL
# Dependency : libnotify-bin (for sending messages)
# History : 2010.01.02 v0.1
# Install
# Put in /var/www (normal use with the PhP script)
# In a console :
# chmod u+x /var/www/notify
#
######################################
# This line for debugging purpose - uncomment if you see fit
# echo Param1=$1,Param2=$2,Param3=$3,Param4=$4,Param5=$5 >>/tmp/notify.log
# If the flag contains the word Notification
# we display the notification
if [ $(echo $5 | grep 'Notification') ];
then
# Here we replace the icon sting with actual path
# to our icons. Put your own here
case $3 in
NoIcon) icon="";;
tv) icon="-i /var/www/notify/icons/tv.png";;
cnx) icon="-i /var/www/notify/icons/network-wired.svg";;
kiss) icon="-i /var/www/notify/icons/face-kiss.svg";;
smile) icon="-i /var/www/notify/icons/face-smile.svg";;
tongue) icon="-i /var/www/notify/icons/face-raspberry.svg";;
esac
export DISPLAY=":0.0"
sudo /usr/bin/notify-send $icon "$1" "$2"
fi
# Here we replace the sound sting with actual path
# to our sounds. Put your own here
case $4 in
NoSound) sound="";;
login) sound="/usr/share/sounds/purple/login.wav";;
esac
# We don't play both a sound + speak, so if a sound is
# specified we play it.
# If not, if the flag contains Speak we say the message
if [ $sound ]; then
sudo /usr/bin/paplay $sound &
elif [ $(echo $5 | grep 'Speak') ]; then
sudo espeak -s 80 -p 15 -v fr "$2" &
fi
N'oubliez pas bien sûr de lui donnez les droits d'exécution :
sudo chmod +x /var/www/notify/notify
Maintenant vous pouvez tester de vous envoyer des messages et des sons.
Attention : adaptez dans le script les chemins pour les sons et les icones.
___________________________________________________________________________
Tester en local :
cd /var/www/notify
./notify Test Message NoIcon NoSound Notification
./notify Test "Ceci est un long message parlé" NoIcon NoSound NotificationSpeak
./notify Test "Message avec son d'alerte" NoIcon login NotificationSpeak
Comme le texte des messages l'indique ces commandes vont :
- afficher un message simple
- afficher un message et dire le texte du message (attention les oreilles, la voix est bien synthétique !)
- afficher un message et jouer un petit son (si vous avez bien le fichier /usr/share/sounds/purple/login.wav sinon changez le chemin dans le script)
Si tout va bien, on peut maintenant passer à l'étape PhP.
C'est pas que vous en avez vraiment besoin vu qu'en Geek parfait que vous êtes la ligne de commande vous convient parfaitement, c'est plutôt pour faciliter la manipulation à ceux qui vont vous envoyer des petits messages.
___________________________________________________________________________
Le code web
Le fichier PhP est un simple "passe-plat" qui lit les paramètres du GET (dans l'URL) et appelle le script ci-dessus.
Créez donc dans votre répertoire le fichier : notify.php
Il contient :
<?php
// This code returns a 1x1 transparent PNG image
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header('Content-type: image/png');
header("Content-Length: 95");
echo chr(137).chr(80).chr(78).chr(71).chr(13).chr(10).chr(26).chr(10).chr(0).chr(0).chr(0).chr(13).chr(73).chr(72).chr(68).chr(82).chr(0).chr(0).chr(0).chr(1).chr(0).chr(0).chr(0).chr(1).chr(1).chr(3).chr(0).chr(0).chr(0).chr(37).chr(219).chr(86).chr(202).chr(0).chr(0).chr(0).chr(3).chr(80).chr(76).chr(84).chr(69).chr(0).chr(0).chr(0).chr(167).chr(122).chr(61).chr(218).chr(0).chr(0).chr(0).chr(1).chr(116).chr(82).chr(78).chr(83).chr(0).chr(64).chr(230).chr(216).chr(102).chr(0).chr(0).chr(0).chr(10).chr(73).chr(68).chr(65).chr(84).chr(8).chr(215).chr(99).chr(96).chr(0).chr(0).chr(0).chr(2).chr(0).chr(1).chr(226).chr(33).chr(188).chr(51).chr(0).chr(0).chr(0).chr(0).chr(73).chr(69).chr(78).chr(68).chr(174).chr(66).chr(96).chr(130);
// And here we handle parameters
$title =stripslashes($_GET['title']);
if ($title == '') $title='Titre';
$message =stripslashes($_GET['message']);
if ($message == '') $message='Message';
$icon =stripslashes($_GET['icon']);
if ($icon == '') $icon='NoIcon';
$sound =stripslashes($_GET['sound']);
if ($sound == '') $sound='NoSound';
$flag =stripslashes($_GET['flag']);
if ($flag == '') $flag='Notification';
exec('/var/www/notify/notify "'.$title.'" "'.$message.'" "'.$icon.'" "'.$sound.'" "'.$flag.'"');
Vous pouvez maintenant tester via votre navigateur avec des adresses du genre :
http://127.0.0.1/notify/notify.php
http://127.0.0.1/notify/notify.php?message=Ceci est le message&flag=Speak
Vous notez que PhP met des valeurs par défaut si on omet des arguments. De la sorte le script a toujours le bon nombre d'arguments.
Ainsi l'appel du php sans arguments met une notification sans icône, sans son, sans vocalisation, le titre est
Titre, le message est
Message !
La deuxième adresse ci-dessus va dire "Ceci et le message". Aucune notification n'est affichée.
Bon, c'est toujours pas simple pour les utilisateurs de votre "messagerie".
Alors maintenant on va leur installer un fichier HTML pour utiliser tout ça.
Créez un fichier
index.html dans votre répertoire
notify et mettez :
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
<link rel="stylesheet" type="text/css" href="notify.css"/>
<title>Envoi de notifications</title>
</head>
<body>
<h2 style="text-align:center">Envoi de notifications</h2>
<form action="notify.php" method="get">
<p>Titre : <input name="title" type="text" maxlength="40" value="Message de " class="right"/></p>
<p>Message : <textarea name="message" rows="4" type="text" maxlength="160" class="right"></textarea></p>
<fieldset>
<legend>Icône</legend>
<p><input name="icon" type="radio" value="NoIcon" checked="checked"/> Aucune</p>
<p><input name="icon" type="radio" value="smile"/> <img src="icons/face-smile.png" alt="Sourire" title="Sourire"/></p>
<p><input name="icon" type="radio" value="tongue"/> <img src="icons/face-raspberry.png" alt="Langue" title="Langue"/></p>
<p><input name="icon" type="radio" value="kiss"/> <img src="icons/face-kiss.png" alt="Bise" title="Bise"/></p>
</fieldset>
<input name="flag" type="hidden" value="Notification"/>
<button name="submit" value="submit" type="submit">Envoyer la notrification</button>
</form>
</body>
</html>
Créez aussi
notify.css
body {margin-left:auto;margin-right:auto;padding:0;width:620px}
p {width: 100%}
.right {float:right;width:40em}
fieldset {clear:right;width:50%;float:left}
button {margin-top:8em;margin-left:4em;}
Créez un répertoire
icons et mettez-y les icônes que vous avez référencées.
En ce qui me concerne il contient :
face-kiss.png
face-kiss.svg
face-raspberry.png
face-raspberry.svg
face-smile.png
face-smile.svg
network-wired.svg
tv.png
Vous trouverez tout plein de belles icônes sous
/usr/share/icons
Et voila c'est fini.
Maintenant votre famille peut vous écrire en tapant dans le navigateur :
http://votre.adresse.ip/notify/
Ils auront la page présentée en haut du post et pourront simplement envoyer une notification.
Notez que le fichier HTML est très basique et ne permet pas toutes les fonctions du script, notamment d'envoyer un son et de vocaliser le message... mais c'est déjà ça de pouvoir envoyer de façon plus simple les notifications.
Vous pouvez tester vous-même à l'adresse :
http://127.0.0.1/notify/
.
___________________________________________________________________________
Autres usages :
-1) si vous hébergez un site sur votre PC (pas super comme idée vu que c'est un PC interactif...) vous pouvez avoir une notification pour chaque page visitée par les utilisateurs. Il suffit, dans le code de votre page, de rajouter une image :
<img src="http://mon.adresse.ip/notify/notify.php?title=Visite&message=Page_Accueil" alt="Notification"/>
Comme vous l'avez noté, le script php rend une image PNG transparente de 1x1. Ca ne devrait donc que très peu modifier la mise en forme de votre page 🙂
Vous pouvez bien sûr adapter le script PhP au passage pour indiquer l'adresse IP du visiteur dans le message, ou toute donnée de votre choix.
Personnellement, comme indiqué au tout début, je me sers de cette fonction lorsque ma mère utilise la "télé à distance" qui tourne sur mon PC. Ca évite que je coupe le PC en plein milieu d'une émission qu'elle serait en train de regarder !.. Bien sûr dans ce cas le script PhP indique des éléments comme
"Diffusion de France 2".
-2) notification dans un script. Je m'en sers pour savoir lorsque ma mère ou ma soeur se connectent à mon VPN. J'utilise OpenVPN, et celui-ci permet de lancer une commande lorsque le VPN se connecte.
Ca se passe dans le fichier de configuration :
/etc/openvpn/client.conf
Rajouter une directive :
route-up "./notify.sh"
Et vous créez alors un fichier
/etc/openvpn/notify.sh ainsi
#!/bin/bash
sleep 45 && wget http://ip.du.VPN.serveur/notify/notify.php?icon=cnx\&title=Connexion\&message=Utilisateur\ est\ en\ ligne\&sound=login -O /dev/null && DISPLAY=:0.0 notify-send -u low -i /usr/share/icons/crystalsvg/32x32/devices/tv.png -h int:x:1212 -h int:y:16 "Connexion" "Connecté au VPN" &
Remplacez bien sûr
ip.du.VPN.serveur par l'IP que vous avez donné à votre VPN dans la commande wget ci-dessus.
Avec cette petite commande l'utilisateur "client" du VPN aura une petit notification qu'il est bien connecté au VPN, et le serveur aura également une notification grâce à notre fichier PhP ci-dessus !
Astuce : remarquez que pour la commande lancée en route-up, on la met en tâche de fond (le & final) avec une temporisation (le sleep initial). En effet, OpenVPN suspend son exécution tant que la commande lancée par le route-up n'a pas rendu la main. Donc si on faisait une commande directe avec un wget, ça échouerait, puisqu'au moment où le route-up est déclenché le VPN n'est pas encore opérationnel, le wget aurait donc une erreur réseau.
Là, le script lancé va rendre la main immédiatement à OpenVPN après avoir mis la commande en tâche de fond.
Au bout du temps indiqué par le sleep, suffisant pour que le VPN s'initialise, le wget et la notification locales sont lancés.
Enjoy !