GNU/Linux >> Linux Esercitazione >  >> Linux

Chiama notifica-invia da una regola Udev?

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

Prima di tutto ho trovato il pacchetto udev-notify, ma purtroppo quasi non funziona per me:funziona per pochissimo tempo (1-2 minuti), e poi, se collego/scollego qualsiasi dispositivo, va in crash:

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. (anche segnalazione di bug archiviata)

Sorprendentemente, non ci sono utilità simili che ho trovato finora. Quindi ho provato a scrivere regole udev che dovrebbero 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:

dispositivo_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 in lsusb produzione? Attualmente, ho appena ricevuto notifiche come "plugged" e "unpugged" e non riesco a trovare come posso recuperare il nome del dispositivo nella mia regola udev (se possibile, lo passerei al mio script come parametro)
  2. Attualmente sono attivate troppe notifiche. Ad esempio, quando allego la mia chiavetta USB, ho ricevuto circa 15 notifiche! Ma, se eseguo lsusb , la chiavetta USB collegata viene visualizzata come un unico dispositivo. Quindi, sembra che dovrei aggiungere qualche altro argomento al filtro delle regole, ma non riesco a scoprirlo.
  3. Probabilmente esiste una soluzione migliore per le notifiche di collegamento/scollegamento del dispositivo? Per favore suggerisci se sai qualcosa.

Risposta accettata:

Bene, dopo molte ore trascorse a cercare su Google e chiedere 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, le risposte alle mie stesse domande.

1. Come ottenere il titolo effettivo del dispositivo collegato, lo stesso che posso vedere in lsusb uscita?

Non ci sono titoli del genere nel kernel (nel caso comune). C'è un file di database con titoli per molte coppie vendor_id:product_id , di solito è /usr/share/hwdata/usb.ids file. Questo database può essere aggiornato da /usr/sbin/update-usbids.sh . Grazie ai 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 lsusb e grep :ad esempio, lsusb | grep '0458:003a'

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

Devo ammettere che non ho capito come scrivere una regola per questo, ma ho trovato un altro modo per filtrarlo.

udev ci consente di utilizzare alcune sostituzioni per RUN+="..." :diciamo, possiamo ottenere il numero del bus e il numero del dispositivo tramite $attr{busnum} e $attr{devnum} rispettivamente. In primo luogo, 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 $attr{devnum} sono solitamente disponibili solo per uno dei dispositivi della “serie” di eventi. Ma comunque, l'algoritmo spiegato dovrebbe risolverlo in ogni caso.

Correlati:Debian – Connettersi a Internet su un server connesso VPN senza Internet?

Pagina attuale del progetto:my-udev-notify.

Si presenta così:

Dettagli di installazione.

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

  • Vai alla pagina del progetto, prendi le fonti da lì e mettile da qualche parte. C'è solo uno script principale:my-udev-notify.sh , ma l'archivio contiene anche suoni per le notifiche plug/unplug, oltre ad alcune altre informazioni, vedi readme.txt per i dettagli.
  • Crea file /etc/udev/rules.d/my-udev-notify.rules con i seguenti contenuti:(non dimenticare di modificare il percorso del tuo vero percorso 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}'"

Successivamente, dovrebbe funzionare per i dispositivi appena collegati. Cioè, se scolleghi
qualche dispositivo, non riceverai alcuna notifica. Ma quando lo ricollegherai, lo farai.
(sì, per me funziona senza alcun riavvio di udev. Se non funziona per te, prova
a riavviare)

Per farlo funzionare su tutti i dispositivi, riavvia il sistema. NOTA che potrebbero
essere presenti molte notifiche durante il primo avvio (consulta i problemi noti nel readme.txt ). Al secondo
avvio, non ci saranno notifiche (a meno che non colleghi il nuovo dispositivo quando
il sistema è spento)

Puoi personalizzarlo (attivare/disattivare le notifiche visive e sonore o modificare i suoni), controllare readme.txt nell'archivio per i dettagli.


Linux
  1. Controlla i dispositivi Raspberry Pi e IOT dal cloud utilizzando Cloud4RPi

  2. Come eseguire la richiesta/chiamata HTTP con il payload JSON dalla riga di comando?

  3. Driver del dispositivo del kernel Linux a DMA da un dispositivo nella memoria dello spazio utente

  4. Chiama una funzione dello spazio utente dall'interno di un modulo del kernel Linux

  5. Chiama una funzione C dal codice C++

Invia notifiche desktop e promemoria dal terminale Linux

Autenticazione multifattoriale dal Cloud Control Panel

Come inviare notifiche desktop su Ubuntu utilizzando l'invio di notifiche

Dal nome del dispositivo df al nome dell'unità fisica (fornitore/tipo)

Come distinguere l'input da diverse tastiere?

Ci sono alternative all'uso di `udev`?