GNU/Linux >> Tutoriales Linux >  >> Linux

¿Llamar a notificar-enviar desde una regla de Udev?

Uso Linux Mint 13 MATE e intento 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 cualquier dispositivo, se cuelga:

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 eliminarlo. (informe de error presentado también)

Sorprendentemente, no hay utilidades similares que haya encontrado hasta ahora. Luego traté de escribir reglas 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:

enchufe_dispositivo.sh:

#!/bin/bash

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

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

dispositivo_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 adjunto, el mismo que puedo ver en lsusb ¿producción? Actualmente, acabo de recibir notificaciones como "conectado" y "desconectado", 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 un parámetro)
  2. Actualmente, hay demasiadas notificaciones activadas. Digamos, cuando conecto mi memoria USB, ¡recibí alrededor de 15 notificaciones! Pero, si ejecuto lsusb , la memoria USB adjunta se muestra como un solo dispositivo. Entonces, parece que debería agregar más argumentos al filtro de reglas, pero no puedo encontrarlo.
  3. ¿Probablemente haya alguna solución mejor para las notificaciones de conexión/desconexión de dispositivos? Sugiera si sabe algo.

Respuesta aceptada:

Bueno, después de muchas horas de buscar en Google y preguntar en los foros, lo hice funcionar (al parecer). Cualquier persona que quiera recibir una buena notificación visual y/o de audio cuando algún dispositivo USB esté conectado/desconectado puede instalar mi secuencia de comandos; consulte 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 adjunto, el mismo que puedo ver en lsusb salida?

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 , normalmente es /usr/share/hwdata/usb.ids expediente. Esta base de datos se puede actualizar mediante /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 con lsusb y grep :por ejemplo, lsusb | grep '0458:003a'

2. Actualmente, demasiadas notificaciones están activadas. Digamos, cuando conecto mi memoria USB, ¡recibí alrededor de 15 notificaciones!

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

udev nos permite usar algunas sustituciones para RUN+="..." :por ejemplo, podemos obtener el número de bus y el número de dispositivo mediante $attr{busnum} y $attr{devnum} respectivamente. En primer lugar, en mi secuencia de comandos almaceno una lista de dispositivos adjuntos en el archivo especial, de modo que si la secuencia de comandos obtuvo un nuevo evento de "conexión", y el busnum y devnum de este dispositivo ya están almacenados en nuestro archivo, entonces no se genera la 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.

Relacionado:Debian:¿conectarse a Internet en un servidor conectado a VPN sin Internet?

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

Se ve así:

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 las fuentes de allí y colóquelas en algún lugar. Solo hay una secuencia de comandos principal:my-udev-notify.sh , pero el archivo también contiene sonidos para notificaciones de conexión/desconexión, además de más información, consulte readme.txt para más detalles.
  • Crear archivo /etc/udev/rules.d/my-udev-notify.rules con los siguientes contenidos:(no olvide modificar la ruta a su ruta real donde descomprimió 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á ninguna notificación. Pero cuando lo vuelvas a conectar, lo harás.
(sí, para mí funciona sin ningún reinicio de udev. Si no funciona para ti, intenta
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 nuevo dispositivo cuando
el sistema esté apagado)

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


Linux
  1. Controle los dispositivos Raspberry Pi y IOT desde la nube con Cloud4RPi

  2. Linux:¿Udev no cambia el nombre del dispositivo USB Ethernet?

  3. Autenticación multifactor desde el Portal MyRackspace

  4. ¿Cómo hacer una solicitud/llamada HTTP con la carga JSON desde la línea de comandos?

  5. Del nombre del dispositivo df al nombre de la unidad física (proveedor/tipo)

Envíe notificaciones de escritorio y recordatorios desde la terminal de Linux

¿Regla Udev cuando se desconecta la unidad flash USB?

Autenticación multifactor desde el panel de control en la nube

Cómo enviar notificaciones de escritorio en Ubuntu usando notificar-enviar

¿Existen alternativas al uso de `udev`?

Llame a una llamada al sistema de Linux desde un lenguaje de secuencias de comandos