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.

Répondre à