GNU/Linux >> Znalost Linux >  >> Linux

Zavolat upozornit-odeslat z pravidla Udev?

Používám Linux Mint 13 MATE a snažím se nastavit upozornění, když připojím/odpojím zařízení.

Nejprve jsem našel balíček udev-notify, ale bohužel mi téměř nefunguje:funguje velmi krátkou dobu (1-2 minuty) a poté, když připojím/odpojím jakékoli zařízení, spadne:

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

Nenašel jsem žádné řešení, tak jsem ho musel odstranit. (také podaná zpráva o chybě)

Překvapivě neexistují žádné podobné nástroje, které jsem dosud našel. Pak jsem zkusil napsat pravidla udev, která by měla odpovídat všem zařízením. Přidal jsem nový soubor /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"

A dva skripty:

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 &

Funguje to, ale funguje to velmi hloupě. Moje otázky jsou:

  1. Jak získat připojený skutečný název zařízení, stejně jako to vidím v lsusb výstup? V současné době dostávám oznámení jako „plugged“ a „unpugged“ a nemohu najít, jak mohu získat název zařízení v mém pravidle udev (Pokud mohu, pak bych jej předal svému skriptu jako parametr)
  2. V současné době je aktivováno příliš mnoho oznámení. Řekněme, že když připojím USB klíč, dostal jsem asi 15 upozornění! Ale pokud spustím lsusb , připojený USB klíč se zobrazí jako jediné zařízení. Zdá se tedy, že bych měl přidat další argument k filtrování pravidel, ale nemohu to najít.
  3. Pravděpodobně existuje nějaké lepší řešení pro upozornění na připojení/odpojení zařízení? Prosím, navrhněte, pokud něco víte.

Přijatá odpověď:

No, po mnoha hodinách googlování a dotazování na fórech se mi to podařilo (zdá se). Každý, kdo chce získat pěkné vizuální a/nebo zvukové upozornění, když je nějaké USB zařízení připojeno/odpojeno, si může nainstalovat můj skript, viz podrobnosti o instalaci níže.

Nejprve odpovědi na mé vlastní otázky.

1. Jak získat připojený skutečný název zařízení, stejně jako to vidím v lsusb výstup?

V jádře žádné takové názvy nejsou (v běžném případě). Existuje databázový soubor s názvy pro mnoho párů vendor_id:product_id , obvykle je to /usr/share/hwdata/usb.ids soubor. Tuto databázi lze aktualizovat pomocí /usr/sbin/update-usbids.sh . Díky lidem z linux.org.ru za tyto informace.

Nevím, jestli existuje nějaký speciální nástroj pro získání názvu zařízení podle páru vendor_id:product_id , takže jsem musel trochu hacknout pomocí lsusb a grep :například lsusb | grep '0458:003a'

2. Aktuálně je aktivováno příliš mnoho upozornění. Řekněme, že když připojím USB flash disk, dostal jsem asi 15 upozornění!

Musím přiznat, že jsem nepřišel na to, jak pro to napsat pravidlo, ale našel jsem jiný způsob, jak to filtrovat.

udev nám umožňuje používat některé substituce za RUN+="..." :Řekněme, že můžeme získat číslo sběrnice a číslo zařízení pomocí $attr{busnum} a $attr{devnum} resp. Za prvé, ve svém skriptu ukládám seznam připojených zařízení do speciálního souboru, takže pokud skript dostane novou událost „plug“ a busnum a devnum tohoto zařízení jsou již uloženy v našem souboru, oznámení se negeneruje. A za druhé, tyto substituce $attr{busnum} a $attr{devnum} jsou obvykle dostupné pouze pro jedno ze zařízení ze „série“ akcí. Ale každopádně, vysvětlený algoritmus by to měl v každém případě vyřešit.

Související:Debian – Připojit se k internetu na serveru připojeném k VPN bez internetu?

Aktuální stránka projektu:my-udev-notify.

Vypadá to takto:

Podrobnosti o instalaci.

Testováno na Linux Mint 13, věřím, že by to mělo fungovat na Ubuntu a dalších derivátech Ubuntu a doufám, že to bude fungovat na jakémkoli *nix systému s udev .

  • Přejděte na stránku projektu, získejte odtud zdroje a někam je umístěte. Je v něm pouze jeden hlavní skript:my-udev-notify.sh , ale archiv také obsahuje zvuky pro oznámení o připojení/odpojení a další informace, viz readme.txt pro podrobnosti.
  • Vytvořte soubor /etc/udev/rules.d/my-udev-notify.rules s následujícím obsahem:(nezapomeňte upravit cestu ke své skutečné cestě, kde jste rozbalili 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}'"

Poté by měl fungovat pro nově připojená zařízení. To znamená, že pokud odpojíte
nějaké zařízení, neobdržíte oznámení. Ale když to připojíte zpět, budete.
(ano, u mě to funguje bez restartování udev. Pokud ne, zkuste
restartovat)

Aby to fungovalo pro všechna zařízení, stačí restartovat systém. POZNÁMKA, že při prvním spuštění může být
mnoho upozornění (viz známé problémy v readme.txt ). Při druhém
spuštění nebudou žádná oznámení (pokud nepřipojíte nové zařízení, když je
systém vypnutý)

Můžete si jej přizpůsobit (zapnout/vypnout vizuální a zvuková upozornění nebo změnit zvuky), podrobnosti najdete v souboru readme.txt v archivu.


Linux
  1. Ovládejte zařízení Raspberry Pi a IOT z cloudu pomocí Cloud4RPi

  2. Jak provést HTTP-request/call s JSON payloadem z příkazového řádku?

  3. Zavolejte skript Python z bash s argumentem

  1. Volání funkce uživatelského prostoru z modulu jádra Linuxu

  2. Volání funkce C z kódu C++

  3. Pravidlo Udev pro shodu zařízení USB s více uzly

  1. Udev pravidlo, když je USB flash disk odpojen?

  2. Linux – Udev nepřejmenuje zařízení USB Ethernet?

  3. Zavolejte systémové volání Linuxu ze skriptovacího jazyka