GNU/Linux >> Tutoriels Linux >  >> Linux

Appeler Notify-send à partir d'une règle Udev ?

J'utilise Linux Mint 13 MATE et j'essaie de configurer des notifications lorsque je branche/débranche des appareils.

Tout d'abord, j'ai trouvé le paquet udev-notify, mais malheureusement ça ne marche presque pas pour moi :ça marche très peu de temps (1-2 minutes), et puis, si je connecte/déconnecte n'importe quel appareil, ça plante :

Traceback (most recent call last):
  File "./udev-notify.py", line 319, in <module>
    notification.show()
glib.GError: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name :1.1061 was not provided by any .service files

Je n'ai trouvé aucune solution, j'ai donc dû l'enlever. (rapport de bogue déposé également)

Étonnamment, il n'y a pas d'utilitaires similaires que j'ai trouvés jusqu'à présent. Ensuite, j'ai essayé d'écrire des règles udev qui devraient correspondre à tous les appareils. J'ai ajouté un nouveau fichier /etc/udev/rules.d/notify.rules :

ACTION=="add",    RUN+="/bin/bash /home/dimon/tmp/device_plug.sh"
ACTION=="remove", RUN+="/bin/bash /home/dimon/tmp/device_unplug.sh"

Et deux scripts :

device_plug.sh :

#!/bin/bash

export DISPLAY=":0"
notify-send "device plugged"

/usr/bin/play -q /path/to/plug_sound.wav &

device_unplug.sh :

#!/bin/bash

export DISPLAY=":0"
notify-send "device unplugged"

/usr/bin/play -q /path/to/unplug_sound.wav &

Ça marche, mais ça marche très bêtement. Mes questions sont :

  1. Comment obtenir le titre réel de l'appareil attaché, comme je peux le voir dans lsusb production? Actuellement, je viens de recevoir des notifications comme "plugged" et "unpugged", et je ne trouve pas comment puis-je récupérer le nom de l'appareil dans ma règle udev (si je peux, je le passerais à mon script en tant que paramètre)
  2. Actuellement, trop de notifications sont activées. Dites, lorsque je connecte ma clé USB, j'ai reçu environ 15 notifications ! Mais, si je lance lsusb , la clé USB connectée est affichée comme un seul appareil. Donc, il semble que je devrais ajouter un argument supplémentaire au filtre de règle, mais je ne le trouve pas.
  3. Il existe probablement une meilleure solution pour les notifications de branchement/débranchement d'appareil ? S'il vous plaît suggérer si vous savez quelque chose.

Réponse acceptée :

Eh bien, après de nombreuses heures de recherche sur Google et de questions sur les forums, je l'ai fait fonctionner (il semble). Quiconque souhaite recevoir une notification visuelle et/ou audio agréable lorsqu'un périphérique USB est branché/débranché peut installer mon script, voir les détails d'installation ci-dessous.

Tout d'abord, des réponses à mes propres questions.

1. Comment obtenir le titre réel de l'appareil attaché, le même que celui que je peux voir dans lsusb sortie ?

Il n'y a pas de tels titres dans le noyau (dans le cas courant). Il existe un fichier de base de données avec des titres pour de nombreuses paires vendor_id:product_id , il s'agit généralement de /usr/share/hwdata/usb.ids dossier. Cette base de données peut être mise à jour par /usr/sbin/update-usbids.sh . Merci aux gars de linux.org.ru pour cette info.

Je ne sais pas s'il existe un outil spécial pour obtenir le titre de l'appareil par paire vendor_id:product_id , j'ai donc dû bidouiller un peu avec lsusb et grep :par exemple, lsusb | grep '0458:003a'

2. Actuellement, trop de notifications sont activées. Dites, lorsque j'attache ma clé USB, j'ai reçu environ 15 notifications !

Je dois admettre que je n'ai pas compris comment écrire une règle pour cela, mais j'ai trouvé un autre moyen de le filtrer.

udev nous permet d'utiliser des substitutions pour RUN+="..."  :disons, nous pouvons obtenir le numéro de bus et le numéro de périphérique par $attr{busnum} et $attr{devnum} respectivement. Tout d'abord, dans mon script, je stocke la liste des périphériques connectés dans le fichier spécial, de sorte que si le script reçoit un nouvel événement "plug", et que les busnum et devnum de ce périphérique sont déjà stockés dans notre fichier, la notification n'est pas générée. Et deuxièmement, ces substitutions $attr{busnum} et $attr{devnum} ne sont généralement disponibles que pour l'un des appareils de la "série" d'événements. Mais de toute façon, l'algorithme expliqué devrait régler le problème dans tous les cas.

Connexe :Debian – Se connecter à Internet sur un serveur connecté VPN sans Internet ?

Page du projet en cours :my-udev-notify.

Il ressemble à ceci :

Détails de l'installation.

Testé sur Linux Mint 13, je pense que cela devrait fonctionner sur Ubuntu et d'autres dérivés d'Ubuntu, et j'espère qu'il fonctionnera sur n'importe quel système *nix avec udev .

  • Allez à la page du projet, récupérez les sources à partir de là et placez-les quelque part. Il n'y a qu'un seul script principal :my-udev-notify.sh , mais l'archive contient également des sons pour les notifications de branchement/débranchement, ainsi que quelques informations supplémentaires, voir readme.txt pour plus de détails.
  • Créer le fichier /etc/udev/rules.d/my-udev-notify.rules avec le contenu suivant :(n'oubliez pas de modifier le chemin vers votre chemin réel où vous avez décompressé my-udev-notify.sh !)
 ACTION=="add",    RUN+="/bin/bash /path/to/my-udev-notify.sh -a add    -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"
 ACTION=="remove", RUN+="/bin/bash /path/to/my-udev-notify.sh -a remove -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"

Après cela, cela devrait fonctionner pour les appareils nouvellement connectés. Autrement dit, si vous débranchez
un appareil, vous ne recevrez pas de notification. Mais quand vous le rebrancherez, vous le ferez.
(oui, pour moi, cela fonctionne sans aucun redémarrage d'udev. Si ce n'est pas le cas pour vous, essayez
de redémarrer)

Pour le faire fonctionner pour tous les appareils, redémarrez simplement votre système. REMARQUE qu'il peut
y avoir de nombreuses notifications lors du premier démarrage (voir les problèmes connus dans le readme.txt ). Au deuxième
démarrage, il n'y aura aucune notification (sauf si vous branchez un nouvel appareil lorsque
le système est éteint)

Vous pouvez le personnaliser (activer/désactiver les notifications visuelles et sonores, ou modifier les sons), consultez le fichier readme.txt dans l'archive pour plus de détails.


Linux
  1. Comment appeler Wine dll depuis python sous Linux ?

  2. Pilote de périphérique du noyau Linux vers DMA à partir d'un périphérique dans la mémoire de l'espace utilisateur

  3. Appelez le script Python à partir de bash avec un argument

  4. Appeler une fonction de l'espace utilisateur à partir d'un module du noyau Linux

  5. Comment distinguer l'entrée de différents claviers ?

Envoyer des notifications et des rappels de bureau à partir du terminal Linux

Authentification multifacteur depuis le panneau de configuration du cloud

Comment envoyer des notifications de bureau sur Ubuntu à l'aide de notify-send

Du nom du périphérique df au nom du lecteur physique (fournisseur / type)

Règle Udev pour correspondre à un périphérique USB à plusieurs nœuds

Appeler un appel système Linux à partir d'un langage de script