Llamar a notificar-enviar desde una regla udev

13

Uso Linux Mint 13 MATE, y estoy tratando de configurar notificaciones cuando conecto / desconecto dispositivos.

En primer lugar, encontré el paquete udev-notify , pero desafortunadamente casi no funciona para mí: funciona por muy poco tiempo (1-2 minutos), y luego, si conecto / desconecto algún dispositivo, se bloquea:

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

No he encontrado ninguna solución, así que tuve que eliminarla. ( informe de errores archivado también)

Sorprendentemente, no hay utilidades similares que he encontrado hasta ahora. Luego intenté escribir reglas de udev que deberían coincidir con todos los dispositivos. He agregado un nuevo archivo /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"

Y dos guiones:

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 &

Funciona, pero funciona muy tonto. Mis preguntas son:

  1. ¿Cómo obtener el título real del dispositivo conectado, lo mismo que puedo ver en la lsusbsalida? Actualmente, acabo de recibir notificaciones como "enchufado" y "desenchufado", y no puedo encontrar cómo puedo recuperar el nombre del dispositivo en mi regla udev (si puedo, lo pasaría a mi script como parámetro)
  2. Actualmente, se activan demasiadas notificaciones. Digamos, cuando conecto mi memoria USB, ¡recibí unas 15 notificaciones! Pero, si ejecuto lsusb, la memoria USB conectada se muestra como un solo dispositivo. Entonces, parece que debería agregar más argumentos al filtro de reglas, pero no puedo descubrirlo.
  3. ¿Probablemente haya alguna solución mejor para las notificaciones de enchufar / desconectar el dispositivo? Por favor sugiera si sabe algo.
Dmitry Frank
fuente

Respuestas:

9

Bueno, después de muchas horas de buscar en Google y preguntar en los foros, lo conseguí funcionando (parece). Cualquiera que quiera recibir una buena notificación visual y / o de audio cuando algún dispositivo USB está enchufado / desenchufado puede instalar mi script, vea los detalles de instalación a continuación.

En primer lugar, respuestas a mis propias preguntas.

1. ¿Cómo obtener el título real del dispositivo conectado, lo mismo que puedo ver en la lsusbsalida?

No hay tales títulos en el núcleo (en el caso común). Hay un archivo de base de datos con títulos para muchos pares vendor_id:product_id, generalmente es un /usr/share/hwdata/usb.idsarchivo. Esta base de datos puede ser actualizada por /usr/sbin/update-usbids.sh. Gracias a los chicos de linux.org.ru por esa información.

No sé si hay alguna herramienta especial para obtener el título del dispositivo por par vendor_id:product_id, así que tuve que hackear un poco lsusby, greppor ejemplo,lsusb | grep '0458:003a'

2. Actualmente, hay demasiadas notificaciones activadas. Digamos, cuando conecto mi memoria USB, ¡recibí unas 15 notificaciones!

Debo admitir que no he descubierto cómo escribir una regla para esto, pero encontré otra forma de filtrarlo.

udevnos permite usar algunas sustituciones para RUN+="...": digamos, podemos obtener el número de bus y el número de dispositivo por $attr{busnum}y $attr{devnum}respectivamente. En primer lugar, en mi script guardo la lista de dispositivos conectados en el archivo especial, de modo que si el script tiene un nuevo evento "plug", y el busnum y devnum de este dispositivo ya están almacenados en nuestro archivo, entonces no se genera notificación. Y en segundo lugar, estas sustituciones $attr{busnum}y $attr{devnum}generalmente están disponibles solo para uno de los dispositivos de la "serie" de eventos. Pero de todos modos, el algoritmo explicado debería resolverlo en cualquier caso.


Página actual del proyecto: my-udev-notify .

Se parece a esto:

ingrese la descripción de la imagen aquí

Detalles de instalación.

Probado en Linux Mint 13, creo que debería funcionar en Ubuntu y otros derivados de Ubuntu, y espero que funcione en cualquier sistema * nix con udev.

  • Vaya a la página del proyecto , obtenga fuentes de allí y colóquelas en algún lugar. Solo hay un script principal: my-udev-notify.shpero el archivo también contiene sonidos para notificaciones de enchufar / desenchufar, además de más información, ver readme.txtpara más detalles.
  • Cree un archivo /etc/udev/rules.d/my-udev-notify.rulescon los siguientes contenidos: (¡no olvide modificar la ruta a su ruta real donde desempacó 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}'"

Después de esto, debería funcionar para dispositivos recién conectados. Es decir, si desconecta algún dispositivo, no recibirá una notificación. Pero cuando lo vuelva a enchufar, lo hará. (sí, para mí funciona sin reiniciar udev. Si no lo hace para usted, intente reiniciar)

Para que funcione para todos los dispositivos, simplemente reinicie su sistema. Tenga en cuenta que puede haber muchas notificaciones durante el primer arranque (consulte los problemas conocidos en el readme.txt). En el segundo arranque, no habrá notificaciones (a menos que conecte un dispositivo nuevo cuando el sistema esté apagado)

Puede personalizarlo (activar / desactivar las notificaciones visuales y sonoras, o cambiar los sonidos), consulte readme.txt en el archivo para obtener más detalles.

Dmitry Frank
fuente
Tal vez debería echar un vistazo a esta pregunta / respuesta: stackoverflow.com/questions/469243/… Se utiliza pyudevpara recibir notificaciones y no requiere scripts adicionales /etc/udev.
Denilson Sá Maia
¿Las notificaciones de conexión / desconexión del dispositivo están ocultas / no están disponibles de forma predeterminada?
gonzobrains
1
@gonzobrains, no, tan pronto como agregue las reglas correctas a /etc/udeve/rules.d, debería funcionar para los dispositivos recién conectados.
Dmitry Frank
@DmitryFrank ¿Qué quise decir es que estas notificaciones se muestran automáticamente de forma predeterminada o tiene que realizar los pasos anteriores para mostrarlas? Para mi proyecto, me gustaría suprimirlos (es decir, no se muestran notificaciones por defecto).
gonzobrains
1
@gonzobrains, si no ha realizado los pasos anteriores y se muestran notificaciones cuando conecta / desconecta cualquier dispositivo, entonces mi script no tiene nada que ver con eso. Algún otro programa hace esto por usted.
Dmitry Frank
0

Agregue las siguientes líneas antes de sus líneas de notificación visual, para darle al script una idea sobre en qué pantalla X debe ejecutar notify-send(o cualquier otra aplicación X):

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

Por supuesto, debe cambiar la segunda línea de acuerdo con su entorno de escritorio (o administrador de pantalla). Esta línea funciona bien para Ubuntu 16.04 que usa unity como escritorio y lightdm como administrador de pantalla.

(de esta publicación )

MortezaE
fuente