[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: