Chiama notification-send da una regola udev


13

Uso Linux Mint 13 MATE e sto cercando di impostare notifiche quando collego / scollego i dispositivi.

Prima di tutto, ho trovato il pacchetto udev-notification , ma sfortunatamente quasi non funziona per me: funziona per pochissimo tempo (1-2 minuti), quindi, se collego / disconnetto qualsiasi dispositivo, si arresta in modo anomalo:

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

Non ho trovato alcuna soluzione, quindi ho dovuto rimuoverlo. ( segnalato anche bugreport )

Sorprendentemente, non ci sono utilità simili che ho trovato finora. Quindi ho provato a scrivere regole udev che dovessero corrispondere a tutti i dispositivi. Ho aggiunto un nuovo file /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 due script:

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 &

Funziona, ma funziona molto stupido. Le mie domande sono:

  1. Come ottenere il titolo effettivo del dispositivo collegato, lo stesso che posso vedere lsusbnell'output? Al momento, ho appena ricevuto notifiche come "collegato" e "non collegato" e non riesco a trovare come posso recuperare il nome del dispositivo nella mia regola udev (se posso, lo passerei al mio script come un parametro)
  2. Attualmente sono attivate troppe notifiche. Ad esempio, quando collego la mia chiavetta USB, ho ricevuto circa 15 notifiche! Ma, se corro lsusb, la chiavetta USB collegata viene visualizzata come un singolo dispositivo. Quindi, sembra che dovrei aggiungere qualche argomento in più al filtro delle regole, ma non riesco a scoprirlo.
  3. Probabilmente esiste una soluzione migliore per le notifiche di connessione / disconnessione del dispositivo? Per favore, suggerisci se sai qualcosa.

Risposte:


9

Bene, dopo molte ore di ricerche su Google e nei forum, l'ho fatto funzionare (sembra). Chiunque desideri ricevere una bella notifica visiva e / o audio quando un dispositivo USB è collegato / scollegato può installare il mio script, vedere i dettagli di installazione di seguito.

Prima di tutto, risposte alle mie domande.

1. Come ottenere il titolo effettivo del dispositivo collegato, lo stesso che posso vedere lsusbnell'output?

Non ci sono tali titoli nel kernel (nel caso comune). Esiste un file di database con titoli per molte coppie vendor_id:product_id, di solito è un /usr/share/hwdata/usb.idsfile. Questo database può essere aggiornato da /usr/sbin/update-usbids.sh. Grazie a ragazzi di linux.org.ru per queste informazioni.

Non so se esiste uno strumento speciale per ottenere il titolo del dispositivo per coppia vendor_id:product_id, quindi ho dovuto hackerare un po 'con lsusbe grep: ad esempio,lsusb | grep '0458:003a'

2. Attualmente sono attivate troppe notifiche. Ad esempio, quando collego la mia chiavetta USB, ho ricevuto circa 15 notifiche!

Devo ammettere di non aver capito come scrivere la regola per questo, ma ho trovato un altro modo per filtrarlo.

udevci consente di utilizzare alcune sostituzioni per RUN+="...": diciamo, possiamo ottenere il numero del bus e il numero del dispositivo rispettivamente $attr{busnum}e $attr{devnum}. Innanzitutto, nel mio script memorizzo l'elenco dei dispositivi collegati nel file speciale, in modo che se lo script ha un nuovo evento "plug" e il busnum e il devnum di questo dispositivo sono già memorizzati nel nostro file, la notifica non viene generata. E in secondo luogo, queste sostituzioni $attr{busnum}e di $attr{devnum}solito sono disponibili solo per uno dei dispositivi della "serie" di eventi. Comunque, l'algoritmo spiegato dovrebbe risolverlo in ogni caso.


Pagina corrente del progetto: my-udev-notification .

Sembra così:

inserisci qui la descrizione dell'immagine

Dettagli di installazione

Testato su Linux Mint 13, credo che dovrebbe funzionare su Ubuntu e altri derivati ​​di Ubuntu, e spero che funzionerà su qualsiasi sistema * nix con udev.

  • Vai alla pagina del progetto , ottieni fonti da lì e mettile da qualche parte. C'è solo uno script principale in esso my-udev-notify.sh:, ma l'archivio contiene anche suoni per le notifiche di plug / scollegamento, oltre ad alcune altre informazioni, vedere readme.txtper i dettagli.
  • Crea un file /etc/udev/rules.d/my-udev-notify.rulescon i seguenti contenuti: (non dimenticare di modificare il percorso del percorso reale in cui hai decompresso 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}'"

Dopodiché, dovrebbe funzionare per i dispositivi appena collegati. Cioè, se si scollega un dispositivo, non si riceverà alcuna notifica. Ma quando lo ricollegherai, lo farai. (sì, per me funziona senza alcun riavvio di udev. Se non lo fa per te, prova a riavviare)

Per farlo funzionare su tutti i dispositivi, basta riavviare il sistema. NOTA che potrebbero esserci molte notifiche durante il primo avvio (vedi problemi noti nella readme.txt). Al secondo avvio, non ci saranno notifiche (a meno che non si colleghi un nuovo dispositivo quando il sistema è spento)

Puoi personalizzarlo (attiva / disattiva le notifiche visive e sonore o cambia i suoni), controlla readme.txt nell'archivio per i dettagli.


Forse dovresti dare un'occhiata a questa domanda / risposta: stackoverflow.com/questions/469243/… Utilizza pyudevper ricevere notifiche e non richiede script aggiuntivi /etc/udev.
Denilson Sá Maia,

Le notifiche di collegamento / scollegamento del dispositivo sono nascoste / non disponibili per impostazione predefinita?
gonzobrains,

1
@gonzobrains, no, non appena hai aggiunto le regole corrette a /etc/udeve/rules.d, dovrebbe funzionare per i dispositivi appena collegati.
Dmitry Frank,

@DmitryFrank Cosa intendevo dire sono queste notifiche mostrate automaticamente per impostazione predefinita o devi eseguire i passaggi sopra per mostrarle? Per il mio progetto, vorrei sopprimerli (ovvero, non avere notifiche mostrate per impostazione predefinita).
gonzobrains,

1
@gonzobrains, se non hai eseguito i passaggi precedenti e hai notifiche visualizzate quando colleghi / scolleghi qualsiasi dispositivo, il mio script non ha nulla a che fare con esso. Qualche altro programma fa questo per te.
Dmitry Frank,

0

Aggiungi le seguenti righe prima delle righe di notifica visiva, per dare allo script un'idea su quale X display dovrebbe eseguire notify-send(o qualsiasi altra applicazione X):

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

Ovviamente, devi cambiare la seconda riga in base al tuo ambiente desktop (o display manager). Questa linea funziona bene per Ubuntu 16.04 che utilizza l'unità come desktop e lightdm come display manager.

(da questo post )

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.