Zadzwoń, wyślij powiadomienie z reguły udev

13

Używam Linux Mint 13 MATE i próbuję skonfigurować powiadomienia, kiedy podłączam / odłączam urządzenia.

Po pierwsze znalazłem pakiet udev-powiadomienie , ale niestety prawie dla mnie nie działa: działa przez bardzo krótki czas (1-2 minuty), a następnie, jeśli podłączę / odłączę dowolne urządzenie, ulega awarii:

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

Nie znalazłem żadnego rozwiązania, więc musiałem je usunąć. ( również zgłosił błąd )

O dziwo, do tej pory nie znalazłem podobnych narzędzi. Następnie próbowałem napisać reguły udev, które powinny pasować do wszystkich urządzeń. Dodałem nowy plik /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"

I dwa skrypty:

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 &

Działa, ale działa bardzo głupio. Moje pytania to:

  1. Jak uzyskać rzeczywisty tytuł podłączonego urządzenia, taki sam, jaki widzę na lsusbwyjściu? Obecnie dostaję powiadomienia typu „podłączono” i „odłączono” i nie mogę znaleźć sposobu, w jaki mogę odzyskać nazwę urządzenia w mojej regule udev (jeśli mogę, przekazałbym to do mojego skryptu jako parametr)
  2. Obecnie aktywowanych jest zbyt wiele powiadomień. Powiedzmy, że kiedy podłączam pamięć USB, dostaję około 15 powiadomień! Ale jeśli uruchomię lsusb, podłączona pamięć USB jest wyświetlana jako pojedyncze urządzenie. Wygląda na to, że powinienem dodać więcej argumentów do filtru reguł, ale nie mogę tego znaleźć.
  3. Prawdopodobnie jest jakieś lepsze rozwiązanie dla powiadomień o podłączeniu / odłączeniu urządzenia? Proszę zasugerować, jeśli coś wiesz.
Dmitry Frank
źródło

Odpowiedzi:

9

Cóż, po wielu godzinach googlingu i zadawania pytań na forach, działam (wydaje się). Każdy, kto chce uzyskać ładne wizualne i / lub dźwiękowe powiadomienie, gdy jakieś urządzenie USB jest podłączone / odłączone, może zainstalować mój skrypt, zobacz szczegóły instalacji poniżej.

Przede wszystkim odpowiedzi na moje własne pytania.

1. Jak uzyskać rzeczywisty tytuł podłączonego urządzenia, taki sam, jaki widzę w lsusbdanych wyjściowych?

W jądrze nie ma takich tytułów (w powszechnym przypadku). Istnieje plik bazy danych z tytułami dla wielu par vendor_id:product_id, zwykle jest to /usr/share/hwdata/usb.idsplik. Ta baza danych może być aktualizowana przez /usr/sbin/update-usbids.sh. Podziękowania dla facetów z linux.org.ru za te informacje.

Nie wiem, czy istnieje jakieś specjalne narzędzie do uzyskiwania tytułu urządzenia przez parę vendor_id:product_id, więc musiałem trochę zhakować lsusbi grep: na przykładlsusb | grep '0458:003a'

2. Obecnie aktywowanych jest zbyt wiele powiadomień. Powiedzmy, że kiedy podłączam pamięć USB, dostaję około 15 powiadomień!

Muszę przyznać, że nie wymyśliłem, jak napisać w tym celu regułę, ale znalazłem inny sposób, aby to przefiltrować.

udevpozwala nam korzystać z niektórych zastępstw dla RUN+="..."say możemy dostać autobusem numer oraz numer urządzenia przez $attr{busnum}i $attr{devnum}odpowiednio. Po pierwsze, w moim skrypcie przechowuję listę podłączonych urządzeń w specjalnym pliku, więc jeśli skrypt otrzyma nowe zdarzenie „plug”, a busnum i devnum tego urządzenia są już zapisane w naszym pliku, powiadomienie nie zostanie wygenerowane. Po drugie, te zamiany $attr{busnum}i $attr{devnum}są zwykle dostępne tylko dla jednego urządzenia z „serii” zdarzeń. W każdym razie wyjaśniony algorytm powinien go rozwiązać.


Strona bieżącego projektu: my-udev-powiadom .

To wygląda tak:

wprowadź opis zdjęcia tutaj

Szczegóły instalacji

Testowany na Linux Mint 13, uważam, że powinien on działać na Ubuntu i innych pochodnych Ubuntu i mam nadzieję, że będzie działał na każdym systemie * nix udev.

  • Przejdź do strony projektu , stamtąd zdobądź źródła i umieść je gdzieś. Jest w nim tylko jeden główny skrypt: my-udev-notify.shale archiwum zawiera również dźwięki powiadomień typu plug / unplug oraz dodatkowe informacje, zobacz readme.txtszczegóły.
  • Utwórz plik /etc/udev/rules.d/my-udev-notify.rulesz następującą zawartością: (nie zapomnij zmodyfikować ścieżki do swojej prawdziwej ścieżki, w której rozpakowałeś 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}'"

Następnie powinno działać dla nowo podłączonych urządzeń. Oznacza to, że jeśli odłączysz jakieś urządzenie, nie otrzymasz powiadomienia. Ale kiedy ponownie go włączysz, zrobisz to. (tak, dla mnie działa bez restartowania udev. Jeśli nie, spróbuj ponownie uruchomić komputer)

Aby działał na wszystkich urządzeniach, wystarczy ponownie uruchomić system. UWAGA: podczas pierwszego rozruchu może być wiele powiadomień (zobacz znane problemy w readme.txt). Przy drugim uruchomieniu nie będzie żadnych powiadomień (chyba że podłączysz nowe urządzenie, gdy system jest wyłączony)

Możesz go dostosować (włączyć / wyłączyć powiadomienia wizualne i dźwiękowe lub zmienić dźwięki), sprawdź szczegóły readme.txt w archiwum.

Dmitry Frank
źródło
Być może powinieneś rzucić okiem na to pytanie / odpowiedź: stackoverflow.com/questions/469243/... Służy pyudevdo otrzymywania powiadomień i nie wymaga dodatkowych skryptów /etc/udev.
Denilson Sá Maia
Czy powiadomienia o podłączeniu / odłączeniu urządzenia są domyślnie ukryte / niedostępne?
gonzobrains
1
@ gonzobrains, nie, jak tylko dodasz poprawne reguły do ​​/etc/udeve/rules.d, powinno działać dla nowo podłączonych urządzeń.
Dmitry Frank
@DmitryFrank Miałem na myśli to, czy te powiadomienia są domyślnie wyświetlane automatycznie, czy musisz wykonać powyższe kroki, aby je wyświetlić? W moim projekcie chciałbym je ukryć (tzn. Nie wyświetlać domyślnie żadnych powiadomień).
gonzobrains
1
@ gonzobrains, jeśli nie wykonałeś powyższych kroków i wyświetlasz powiadomienia po podłączeniu / odłączeniu dowolnego urządzenia, mój skrypt nie ma z tym nic wspólnego. Inny program robi to za Ciebie.
Dmitry Frank
0

Dodaj następujące wiersze przed liniami powiadomień wizualnych, aby dać skryptowi wyobrażenie, na którym ekranie X powinien uruchomić notify-send(lub inną aplikację X):

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

Oczywiście musisz zmienić drugą linię zgodnie ze środowiskiem pulpitu (lub menedżerem wyświetlania). Ta linia działa dobrze dla Ubuntu 16.04, który używa unity jako pulpitu i lightdm jako menedżera wyświetlania.

(z tego postu )

MortezaE
źródło
0
sudo -u X_user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/X_userid/bus notify-send 'Hello world!' 

Gdzie X_user to użytkownik, którego chcesz uruchomić, a X_userid to identyfikator grupy użytkownika

przykład bigbird i 1000

Don Giovanni
źródło