Appelez notifier-envoyer à partir d'une règle udev

13

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, cela ne fonctionne presque pas pour moi: cela fonctionne très peu de temps (1-2 minutes), puis, si je connecte / déconnecte un appareil, il se bloque:

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û la supprimer. ( rapport de bug déposé également)

Étonnamment, il n'y a aucun utilitaire similaire que j'ai trouvé 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 &

Cela fonctionne, mais cela fonctionne très bêtement. Mes questions sont:

  1. Comment obtenir le titre réel de l'appareil attaché, le même que je peux voir en lsusbsortie? Actuellement, je viens de recevoir des notifications comme "branché" et "non branché", et je ne trouve pas comment puis-je récupérer le nom du périphérique dans ma règle udev (si je le peux, je le transmettrais à mon script en tant que paramètre)
  2. Actuellement, trop de notifications sont activées. Dis, quand je connecte ma clé USB, j'ai reçu environ 15 notifications! Mais, si je lance lsusb, la clé USB connectée s'affiche comme un seul appareil. Il semble donc que je devrais ajouter un argument supplémentaire au filtre de règles, mais je ne peux pas le découvrir.
  3. Il existe probablement une meilleure solution pour les notifications de connexion / déconnexion de l'appareil? Veuillez suggérer si vous savez quelque chose.
Dmitry Frank
la source

Réponses:

9

Eh bien, après plusieurs heures de recherche et de recherche sur les forums, je l'ai fait fonctionner (il semble). Quiconque souhaite obtenir une belle notification visuelle et / ou audio 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, réponses à mes propres questions.

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

Il n'y a pas de tels titres dans le noyau (dans le cas commun). 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 d'un /usr/share/hwdata/usb.idsfichier. 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 du périphérique par paire vendor_id:product_id, j'ai donc dû pirater un peu avec lsusbet grep: par exemple,lsusb | grep '0458:003a'

2. Actuellement, trop de notifications sont activées. Dis, quand je connecte 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.

udevnous permet d'utiliser certaines substitutions pour RUN+="...": disons, nous pouvons obtenir le numéro de bus et le numéro de périphérique respectivement $attr{busnum}et $attr{devnum}. Premièrement, dans mon script, je stocke la liste des périphériques attachés dans le fichier spécial, de sorte que si le script a un nouvel événement "plug" et que le busnum et le devnum de ce périphérique sont déjà stockés dans notre fichier, aucune notification n'est générée. Et deuxièmement, ces substitutions $attr{busnum}et ne $attr{devnum}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 le trier dans tous les cas.


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

Cela ressemble à ceci:

entrez la description de l'image ici

Détails d'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 que cela fonctionnera sur n'importe quel système * nix avec udev.

  • Allez sur la page du projet , obtenez des sources à partir de là et mettez-les quelque part. Il n'y a qu'un seul script principal:, my-udev-notify.shmais l'archive contient également des sons pour les notifications de branchement / débranchement, ainsi que d'autres informations, voir readme.txtpour plus de détails.
  • Créez un fichier /etc/udev/rules.d/my-udev-notify.rulesavec le contenu suivant: (n'oubliez pas de modifier le chemin vers votre vrai chemin où vous avez déballé 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 lorsque vous le rebranchez, vous le ferez. (oui, pour moi, cela fonctionne sans redémarrage 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: 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 pas de notifications (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 readme.txt dans l'archive pour plus de détails.

Dmitry Frank
la source
Vous devriez peut-être jeter un œil à cette question / réponse: stackoverflow.com/questions/469243/… Il utilise pyudevpour être notifié et ne nécessite pas de scripts supplémentaires /etc/udev.
Denilson Sá Maia
Les notifications de connexion / déconnexion de l'appareil sont-elles masquées / indisponibles par défaut?
gonzobrains
1
@gonzobrains, non, dès que vous avez ajouté des règles correctes à /etc/udeve/rules.d, cela devrait fonctionner pour les nouveaux appareils connectés.
Dmitry Frank
@DmitryFrank Ce que je voulais dire, c'est que ces notifications s'affichent automatiquement par défaut ou devez-vous effectuer les étapes ci-dessus pour les afficher? Pour mon projet, je voudrais les supprimer (c'est-à-dire n'avoir aucune notification affichée par défaut).
gonzobrains
1
@gonzobrains, si vous n'avez pas effectué les étapes ci-dessus et que des notifications s'affichent lorsque vous branchez / débranchez un appareil, mon script n'a rien à voir avec cela. Un autre programme le fait pour vous.
Dmitry Frank
0

Ajoutez les lignes suivantes avant vos lignes de notification visuelles, pour donner au script une idée sur quel affichage X il doit exécuter notify-send(ou toute autre application X):

export DISPLAY=:0
export XAUTHORITY=/var/lib/lightdm/.Xauthority

Bien sûr, vous devez modifier la deuxième ligne en fonction de votre environnement de bureau (ou gestionnaire d'affichage). Cette ligne fonctionne bien pour Ubuntu 16.04 qui utilise l'unité comme bureau et lightdm comme gestionnaire d'affichage.

(de ce post )

MortezaE
la source