Exécution automatique au démontage d’une clé USB

Venez nous en parler, c'est ici que l'on vous conseillera !

Exécution automatique au démontage d’une clé USB

Messagede juice » Sam 05 Juil 2014, 16:10

Bonjour à tous

J’ai la problématique suivante : ma clé usb en fat32 qui contient ma musique en mp3 et que je lis
sur l’autoradio de ma voiture nécessite l’exécution de fatsort pour que les morceaux soient biens
listés dans l’ordre des noms de fichiers et non selon l’ordre d´écriture sur la partition. J’aimerai exécuter
cette commande automatiquement après le démontage du périphérique mais udev ne détecte pas
l’action de démontage ; chose que udisks sait faire. Inversement je je sais pas si udisks sait
gérer des règles comme udev.

Si quelqu’un à une piste je suis preneur…
juice
 
Messages: 200
Inscription: Dim 29 Juin 2008, 10:06
Localisation: Oberentzen
Distribution: Archlinux
Niveau: à bulle ?

Re: Execution automatique au démontage d’une clé USB

Messagede le Manchot Masqué » Dim 06 Juil 2014, 02:09

Tu es vraiment certain qu'udev ne marche pas ?

Cf. à la fin de http://superuser.com/questions/305723/u ... -insertion, on a bien une action remove qui appelle un script...

Et même sur Arch : cf. https://bbs.archlinux.org/viewtopic.php?id=119111
Avatar de l’utilisateur
le Manchot Masqué
Administrateur du site
 
Messages: 331
Inscription: Lun 26 Mai 2008, 21:05
Localisation: Guebwiller
Distribution: Debian, Ubuntu
Niveau: Moitié plein !

Re: Execution automatique au démontage d’une clé USB

Messagede juice » Dim 06 Juil 2014, 17:11

Voici ce que je tente pour le moment :

Code: Select All Code
ACTION=="remove", SUBSYSTEMS=="usb" ATTRS{idProduct}=="168a", RUN+="/usr/bin/fatsort -f /dev/disk/by-label/JCC_MUSIC"

Selon moi ça ne marchera pas car le RUN+="…" est exécuté après le remove ce qui est quelque peu problématique. :mrgreen:
Je n’ai pas trouvé comment voir avec udevadm si la commande avait réusssie ou échouée.
juice
 
Messages: 200
Inscription: Dim 29 Juin 2008, 10:06
Localisation: Oberentzen
Distribution: Archlinux
Niveau: à bulle ?

Re: Execution automatique au démontage d’une clé USB

Messagede le Manchot Masqué » Lun 07 Juil 2014, 00:03

Alors j'ai commencé par un petit script bidon,
Code: Select All Code
$ cat /home/monuser/coucou.sh
#!/bin/bash

/usr/bin/logger COUCOU!
/usr/bin/sort -u /media/macle/aa -o /media/macle/bb
# resultat de la dernière commande (doit être égal à 0 si ok)
/usr/bin/logger $?

avec le fichier /media/macle/aa qui contient 3 lignes à trier:
Code: Select All Code
aa
cc
bb

En lançant /media/macle/aa en ligne de commande, pas de problème : j'ai bien un fichier bb trié à partir de mon fichier source aa !
Ma clé USB étant montée chez moi en /dev/sde, j'ai repéré son idVendor via la commande lsusb.
J'ai ensuite rajouté la règle udev suivante et relancer udev:
Code: Select All Code
$ cat /etc/udev/rules.d/macle.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="048d", MODE="0666", GROUP="plugdev"
KERNEL=="sde1", SUBSYSTEM=="block", ACTION=="remove", RUN+="/home/monuser/coucou.sh"

A noter ici que je ne fais aucune vérification de l'identité de ma clé au niveau du démontage, ce qui est évidemment à proscrire dans une version finale.
J'ai ensuite laissé udev faire son boulot au démontage, via nautilus. Mes logs apparaissent bien dans les journaux système, mais le code de retour de la commande sort (2) laisse à penser que le périphérique est effectivement déjà démonté...
J'ai donc voulu tester un peu plus loin. J'ai commencé par
Code: Select All Code
udevadm info -a -p /sys/block/sde

qui n'était pas assez précis : l'action doit être appelée au niveau de la partition /dev/sde1, et non au niveau du périphérique de bloc /dev/sde. Je suis donc passé à :
Code: Select All Code
udevadm info -a -n /dev/sde1

pour repérer l'arborescence complète de ma clé USB sous la forme "/devices/pci...sde1"
Puis j'ai testé avec :
Code: Select All Code
udevadm test --action=remove /devices/pci0000:00/0000:00:1d.7/usb4/4-3/4-3.4/4-3.4:1.0/host263/target263:0:0/263:0:0:0/block/sde/sde1

et là effectivement, les lignes
Code: Select All Code
...
udev_node_remove: keeping device node of existing device'/dev/sde1'
...
udevadm_test: run: '/home/monuser/coucou.sh'
...

laisse à penser qu'udev vire les liens existants avant d'appeler le script.
Bref, à moins d'intercepter les événements au niveau noyau avant udev, cette méthode me semble sérieusement compromise. De toute évidence, udev fait bien son boulot, mais il n'a apparemment pas été prévu pour écrire sur une clé en cours de démontage...
Au final, par rapport à ton problème bien spécifique, je crois qu'un petit script maison, avec une petite icône sympa sur le bureau, qui appellerait ta commande de tri et démonterait ensuite la clé, serait beaucoup moins casse-tête.
Avatar de l’utilisateur
le Manchot Masqué
Administrateur du site
 
Messages: 331
Inscription: Lun 26 Mai 2008, 21:05
Localisation: Guebwiller
Distribution: Debian, Ubuntu
Niveau: Moitié plein !

Re: Execution automatique au démontage d’une clé USB

Messagede juice » Mer 09 Juil 2014, 21:38

Je croit bien que ça finira en quelque chose du genre…
juice
 
Messages: 200
Inscription: Dim 29 Juin 2008, 10:06
Localisation: Oberentzen
Distribution: Archlinux
Niveau: à bulle ?

Re: Exécution automatique au démontage d’une clé USB

Messagede le Manchot Masqué » Sam 09 Déc 2017, 00:39

Je complète un peu avec les infos suivantes :

Pour avoir toutes les combinaisons possibles d'un appareil (ex : /dev/sdg) :
Code: Select All Code
udevadm info -a -p $(udevadm info -q path -n /dev/sdg)


Et à chaque modification/test dans /etc/udev/monfichier.rules, on recharge les règles UDEV :
Code: Select All Code
udevadm hwdb --update
udevadm control --reload-rules
udevadm trigger
Avatar de l’utilisateur
le Manchot Masqué
Administrateur du site
 
Messages: 331
Inscription: Lun 26 Mai 2008, 21:05
Localisation: Guebwiller
Distribution: Debian, Ubuntu
Niveau: Moitié plein !


Retourner vers Un problème ?

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron