Chamar a notificação de envio de uma regra do udev

13

Uso o Linux Mint 13 MATE e estou tentando configurar notificações ao conectar / desconectar dispositivos.

Primeiro, encontrei o pacote udev-notify , mas infelizmente ele quase não funciona para mim: funciona por muito pouco tempo (1-2 minutos) e, em seguida, se eu conectar / desconectar qualquer dispositivo, ele trava:

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

Não encontrei nenhuma solução, então tive que removê-la. ( relatório de bug arquivado também)

Surpreendentemente, não há utilitários semelhantes que encontrei até agora. Então tentei escrever regras do udev que deveriam corresponder a todos os dispositivos. Eu adicionei um novo arquivo /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"

E dois 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 &

Funciona, mas funciona muito burro. Minhas perguntas são:

  1. Como obter o título real do dispositivo conectado, o mesmo que posso ver na lsusbsaída? No momento, recebi notificações como "plugado" e "não conectado" e não consigo encontrar como recuperar o nome do dispositivo na minha regra do udev (se eu puder, o passaria para o meu script como um parâmetro)
  2. Atualmente, muitas notificações estão ativadas. Digamos, quando eu conecto meu pendrive, recebo cerca de 15 notificações! Mas, se eu executar lsusb, o pendrive USB é exibido como apenas um dispositivo. Então, parece que devo adicionar mais algum argumento ao filtro de regras, mas não consigo descobrir.
  3. Provavelmente, existe alguma solução melhor para notificações de plugues / desconectados de dispositivos? Por favor, sugira se você souber alguma coisa.
Dmitry Frank
fonte

Respostas:

9

Bem, depois de muitas horas pesquisando e perguntando nos fóruns, consegui funcionar (ao que parece). Qualquer pessoa que queira obter uma boa notificação visual e / ou de áudio quando algum dispositivo USB estiver conectado / desconectado pode instalar meu script, consulte os detalhes da instalação abaixo.

Primeiro de tudo, respostas para minhas próprias perguntas.

1. Como obter o título real do dispositivo conectado, o mesmo que posso ver na lsusbsaída?

Não existem tais títulos no kernel (no caso comum). Existe um arquivo de banco de dados com títulos para muitos pares vendor_id:product_id, geralmente é um /usr/share/hwdata/usb.idsarquivo. Este banco de dados pode ser atualizado por /usr/sbin/update-usbids.sh. Obrigado a todos do linux.org.ru por essa informação.

Não sei se existe alguma ferramenta especial para obter o título do dispositivo por par vendor_id:product_id, então tive que cortar um pouco com lsusbe grep: por exemplo,lsusb | grep '0458:003a'

2. Atualmente, muitas notificações estão ativadas. Digamos, quando eu conecto meu pendrive, recebo cerca de 15 notificações!

Devo admitir que não descobri como escrever uma regra para isso, mas encontrei outra maneira de filtrá-la.

udevpermite usar algumas substituições para RUN+="...": digamos, podemos obter o número do barramento e o número do dispositivo por $attr{busnum}e $attr{devnum}respectivamente. Primeiramente, no meu script eu armazeno a lista de dispositivos conectados no arquivo especial, para que, se o script obtiver um novo evento "plug", e o busnum e devnum desse dispositivo já estejam armazenados em nosso arquivo, a notificação não será gerada. E segundo, essas substituições $attr{busnum}e $attr{devnum}geralmente estão disponíveis apenas para um dos dispositivos da "série" de eventos. Mas de qualquer maneira, o algoritmo explicado deve resolvê-lo em qualquer caso.


Página atual do projeto: my-udev-notify .

Se parece com isso:

insira a descrição da imagem aqui

Detalhes da instalação.

Testado no Linux Mint 13, acredito que ele funcione no Ubuntu e em outros derivados do Ubuntu, e espero que funcione em qualquer sistema * nix udev.

  • Vá para a página do projeto , obtenha fontes de lá e coloque-as em algum lugar. Há apenas um script principal:, my-udev-notify.shmas o arquivo morto também contém sons para notificações de plug / desconectado, além de mais algumas informações, consulte readme.txtpara obter detalhes.
  • Crie um arquivo /etc/udev/rules.d/my-udev-notify.rulescom o seguinte conteúdo: (não se esqueça de modificar o caminho para o caminho real onde você descompactou 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}'"

Depois disso, ele deve funcionar para dispositivos recém-conectados. Ou seja, se você desconectar algum dispositivo, não receberá uma notificação. Mas quando você conectá-lo de volta, você o fará. (sim, para mim funciona sem reiniciar o udev. Se não funcionar, tente reiniciar)

Para fazê-lo funcionar em todos os dispositivos, basta reiniciar o sistema. Observe que pode haver muitas notificações durante a primeira inicialização (consulte problemas conhecidos no readme.txt). Na segunda inicialização, não haverá notificações (a menos que você conecte um novo dispositivo quando o sistema estiver desligado)

Você pode personalizá-lo (ativar / desativar as notificações visuais e sonoras ou alterar sons), verifique o arquivo readme.txt no arquivo para obter detalhes.

Dmitry Frank
fonte
Talvez você deva dar uma olhada nesta pergunta / resposta: stackoverflow.com/questions/469243/… Usada pyudevpara ser notificado e não requer scripts extras /etc/udev.
Denilson Sá Maia
As notificações de plugue / desconectado do dispositivo estão ocultas / indisponíveis por padrão?
precisa saber é o seguinte
1
@gonzobrains, não, assim que você adicionou regras corretas ao /etc/udeve/rules.d, ele deve funcionar para dispositivos recém-conectados.
Dmitry Frank
@DmitryFrank O que eu quis dizer foi que essas notificações são automaticamente mostradas por padrão ou você precisa executar as etapas acima para mostrá-las? Para o meu projeto, gostaria de suprimi-los (ou seja, não há notificações mostradas por padrão).
gonzobrains
1
@gonzobrains, se você não executou as etapas acima e tem notificações exibidas ao conectar / desconectar qualquer dispositivo, meu script não tem nada a ver com isso. Algum outro programa faz isso por você.
Dmitry Frank
0

Adicione as seguintes linhas antes das suas linhas de notificação visual, para dar ao script uma idéia sobre em qual tela X ele deve executar o notify-send(ou qualquer outro aplicativo X):

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

Obviamente, você deve alterar a segunda linha de acordo com o ambiente da área de trabalho (ou gerenciador de exibição). Essa linha funciona bem para o Ubuntu 16.04 que usa a unidade como desktop e o lightdm como gerenciador de exibição.

( deste post )

MortezaE
fonte