Re: comment migrer des scripts hotplug vers udev ?
Bonjour,
J'ai fini par résoudre mon problème, voici ce que j'ai fait pour
information.
On peut installer des scripts à appeler au branchement/débranchement
d'un appareil à (au moins) 2 niveaux :
- soit par des règles UDEV
- soit par une configuration de HAL
Fe choix entre ces deux solutions dépend du genre d'informations dont
on a besoin dans les scripts appelés (HAL collectionne beaucoup plus de
renseignements sur un périphérique ete ce qui lui est associé) et de la
manière dont le noyau reconnait ce périphérique : je voulais par
exemple associer un script au (dé)branchement d'un appareil photo
numérique quelconque géré par gphoto2, avec UDEV, il aurait fallu
des dizaines de règles car ceux-ci ne sont pas gérés spécialement par
le noyau (voir le fichier /etc/udev/libgphoto2.rules).
1/ Appels des scripts par UDEV :
- il faut des règles dans un fichier dans /etc/udev/rules.d (attention,
l'ordre alphabétique des fichiers est important. Par exemple, j'ai créé
un fichier /etc/udev/rules.d/10-fred.rules dans lequel j'ai mis pour
reconnaître mon scanner :
# scanner Epson :
SUBSYSTEMS=="usb", ATTRS{manufacturer}=="EPSON", ATTRS{product}=="Perfection1240", SYMLINK+="scanner_epson"
J'y ai mis aussi une règle pour appeler un script à chaque
(dé)branchement d'un périphérique USB :
SUBSYSTEMS=="usb_device", ACTION=="add", RUN+="/lib/udev/actions-perso-fred"
SUBSYSTEMS=="usb_device", ACTION=="remove", RUN+="/lib/udev/actions-perso-fred"
Et dans ce script, je fais un « bip » à chaque
branchement/débranchement, et pour mon scanner, je lance xsane :
#!/bin/sh -e
setup_vars() {
# détermine quel est l'utilisateur logué sur la machine
# (pb s'il y en a plusieurs !)
USER=`users| tr ' ' '\n'|sort -u|grep -v root`
# écran X11 sur lequel afficher l'application graphique
# (:0 devrait fonctionner un une machine monoposte).
DISPLAY=:0
# répertoire utilisateur
HOME=/home/${USER}
# commandes utilisées
SU=/bin/su
ENV=/usr/bin/env
}
# ----------------------------------------------------------------------
# Comme udev attend la fin du script pour continuer,
# on le lance en arrière-plan !
(
journal=/tmp/actions-perso-fred
{ echo '' ; date ; env ; } >> $journal
if [ -x /usr/bin/logger ]; then
/usr/bin/logger -t $0 "Action=$ACTION, signal sonore..."
fi
if [ -x /usr/bin/aplay ]; then
/usr/bin/aplay --quiet /usr/share/sounds/email.wav &
fi
#--------------------
# Scanner
if [ "$DEVLINKS" = /dev/scanner_epson ] && [ "$ACTION" = add ]; then
setup_vars
# on ne veut pas lancer ce programme en tant que « root » !
if [ -n "${USER}" ] && [ ${USER} != "root" ] && \
[ $(echo "$USER" | wc -w) = 1 ]; then
# tient compte de la l10n.
. /etc/environment
export LANG
# répertoire d'où on lance le programme
cd /home/commun/images
# Application X11 à lancer :
X11_APP=/usr/bin/xsane
sleep 1
${SU} ${USER} -c "$ENV DISPLAY=$DISPLAY HOME=$HOME ${X11_APP} &"
fi
exit 0
fi
#--------------------
) &
2/ Appel de scripts par HAL :
La doc de HAL est assez succinte, il m'a fallu tatonner, en utilisant
comme référence :
http://gitweb.freedesktop.org/?p=hal.git;a=blob_plain;f=doc/spec/hal-spec.html
2 choses qui facilitent la vie avec HAL :
- la commande lshal qui donne l'état actuel du système vu par HAL (son
travail est simplement de maintenir à jour pour qui veut cette liste).
- rajouter du debug à HAL dans le fichier /etc/default/hal :
# Options pour le debug :
DAEMON_OPTS="--verbose=yes --use-syslog"
(attention, pour relancer HAL, faire /etc/init.d/dbus restart sur une
Debian Etch).
Pour agir lors de l'insertion d'un APN quelconque, j'ai demandé à HAL
d'appeler un script à moi pour tout périphérique reconnu par gphoto2 :
dans /etc/hal/fdi/policy/, j'ai mis le fichier fred.fdi suivant :
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- mode:xml; coding: utf-8 -*- -->
<deviceinfo version="0.2">
<device>
<match key="camera.libgphoto2.support" bool="true">
<append key="info.callouts.add"
type="strlist">ev_hal_apn</append>
<append key="info.callouts.remove"
type="strlist">ev_hal_apn</append>
<append key="info.callouts.preprobe"
type="strlist">ev_hal_apn</append>
</match>
</device>
</deviceinfo>
Ce script (ou un lien) *doit* se trouver dans /usr/lib/hal/ . Dans mon
exemple, il lance gtkam au branchement et un outil maison de tri au
débranchement :
#!/bin/bash
exec >>/tmp/$(basename $0) 2>&1
# debug :
echo ; date ; id ; env
# détermine quel est l'utilisateur logué sur la machine
# (pb s'il y en a plusieurs !)
USER=$(users | tr ' ' '\n' | sort -u | grep -v root)
# Application X11 à lancer :
X11_APP=/usr/bin/gtkam
# écran X11 sur lequel afficher l'application graphique
# (:0 devrait fonctionner un une machine monoposte).
DISPLAY=:0
# répertoire utilisateur
HOME=/home/${USER}
# répertoire d'où on lance le programme
INITDIR=/home/commun/images/photo/APN
# commandes utilisées
SU=/bin/su
ENV=/usr/bin/env
# teste si l'on vient d'insérer la prise USB :
if [ "${HALD_ACTION}" = add ]; then
# on ne veut pas lancer ce programme en tant que « root » !
if [ -z "${USER}" ] || [ ${USER} = root ] || \
[ $(echo "$USER" | wc -w) != 1 ]; then
/usr/bin/logger -t usbcam 'Pas un seul utilisateur...'
exit 0
fi
# ni si un autre programme est déjà lancé :
if pgrep -u ${USER} ${X11_APP} >/dev/null 2>&1 ; then
/usr/bin/logger -t usbcam 'Déjà un outil ${X11_APP} lancé...'
exit 0
fi
# tient compte de la l10n.
. /etc/environment
export LANG
cd $INITDIR
$SU $USER -c "$ENV DISPLAY=$DISPLAY HOME=$HOME ${X11_APP} &"
elif [ "${HALD_ACTION}" = remove ]; then
/usr/bin/logger -t usbcam 'APN retiré, fabrique des vignettes pour les images rangées...'
# tient compte de la l10n.
. /etc/environment
export LANG
cd $INITDIR
nice -20 /usr/bin/triePhotosAPN --syslog &
fi
Voilà, cela marche bien pour moi, j'espère que cela pourra servir à
d'autres...
Fred.
Reply to: