Chamar notificar-enviar de uma regra do udev

12

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

Primeiro de tudo, eu encontrei o pacote udev-notify , mas infelizmente isso 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

Eu não encontrei nenhuma solução, então tive que removê-la. (Arquivado bugreport também)

Surpreendentemente, não há utilitários similares que eu tenha encontrado até agora. Então eu tentei escrever regras do udev que devem corresponder a todos os dispositivos. Eu adicionei o 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 colocar o título real do dispositivo em anexo, o mesmo que posso ver em lsusb output? Atualmente, acabei de receber notificações como "plugged" e "unpugged", e não consigo encontrar como recuperar o nome do dispositivo na minha regra do udev (se puder, passaria isso para o meu script como um parâmetro)
  2. Atualmente, muitas notificações são ativadas. Diga, quando eu prendo meu pen drive, recebi cerca de 15 notificações! Mas, se eu executar lsusb , o pendrive conectado será exibido como apenas um único dispositivo. Então, parece que eu deveria adicionar mais argumentos para o filtro de regras, mas não consigo descobrir.
  3. Provavelmente, há alguma solução melhor para as notificações de plug / desconecte o dispositivo? Por favor, sugira se você souber de alguma coisa.
por Dmitry Frank 23.02.2014 / 14:18

2 respostas

8

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

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

1. Como obter o título real do dispositivo anexado, o mesmo que posso ver em lsusb output?

Não há 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 é /usr/share/hwdata/usb.ids file. Este banco de dados pode ser atualizado por /usr/sbin/update-usbids.sh . Obrigado ao pessoal do linux.org.ru para essa informação.

Eu não sei se existe alguma ferramenta especial para obter o título do dispositivo pelo par vendor_id:product_id , então eu tive que hackear um pouco com lsusb e grep : por exemplo, lsusb | grep '0458:003a'

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

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

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

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

Parece assim:

Detalhesdainstalação.

TestadonoLinuxMint13,acreditoquefuncionenoUbuntueemoutrosderivadosdoUbuntu,eesperoquefuncioneemqualquersistema*nixcomudev.

  • Acessea página do projeto , obtenha fontes de lá e coloque-as em algum lugar. Há apenas um script principal: my-udev-notify.sh , mas o arquivo também contém sons para plug / desconectar notificações, além de mais algumas informações, consulte readme.txt para obter detalhes.
  • Crie o arquivo /etc/udev/rules.d/my-udev-notify.rules com o seguinte conteúdo: (não se esqueça de modificar o caminho para o caminho real no qual 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. Isto é, se você desconectar algum dispositivo, você não receberá uma notificação. Mas quando você liga de volta, você vai. (sim, para mim funciona sem reiniciar o udev. Se não for para você, tente reinicializando)

Para que funcione para todos os dispositivos, basta reiniciar o sistema. NOTA que pode haver muitas notificações durante a primeira inicialização (consulte os problemas conhecidos no readme.txt ). Na segunda inicialização, não haverá notificações (a menos que você conecte um novo dispositivo o sistema está desligado)

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

    
por 24.02.2014 / 22:21
0

Adicione as seguintes linhas antes de suas linhas de notificação visual, para dar ao script uma ideia sobre qual X deve exibir o notify-send (ou qualquer outro aplicativo X):

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

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

(de esta postagem )

    
por 22.04.2018 / 16:03