Jedna reguła udev'a realizująca dwa zadania

Spis treści

Jakiś czas temu opisywałem jak podejść do pisania reguł dla udev'a . W tamtym przypadku wykorzystywana reguła składała się tak naprawdę z dwóch mniejszych, z których jedna miała ustawioną zmienną ACTION na add , z kolei zaś druga na remove i w ten oto sposób pierwsza z nich była aplikowana podczas podłączania określonego urządzenia do komputera, a druga przy jego odłączaniu. Okazuje się jednak, że dwie reguły nie są konieczne w przypadku gdy mają one dotyczyć tego samego sprzętu i możemy zamiast nich stworzyć jedną regułę, która będzie stosowana zarówno przy podłączaniu jak i odłączeniu danego urządzenia.

Reguła 2 w 1

Weźmy poniższy przykład reguł udev'a, które mają za zadanie włączać/wyłączać touchpad w zależności od tego czy zewnętrzna mysz USB zostanie podpięta do laptopa:

ACTION=="add", SUBSYSTEM=="input", KERNEL=="mouse[0-9]*", SUBSYSTEMS=="usb", \
      ENV{DISPLAY}=":0", \
      ENV{XAUTHORITY}="/home/morfik/.Xauthority", \
      RUN+="/usr/bin/synclient TouchpadOff=1"

ACTION=="remove", SUBSYSTEM=="input", KERNEL=="mouse[0-9]*", SUBSYSTEMS=="usb", \
      ENV{DISPLAY}=":0", \
      ENV{XAUTHORITY}="/home/morfik/.Xauthority", \
      RUN+="/usr/bin/synclient TouchpadOff=0"

Jeśli akcja pod kątem danego urządzenia ma być przeprowadzana zarówno przy podłączaniu jak i odłączaniu go, to lepszym wyjściem jest skorzystanie ze zmiennej ENV{REMOVE_CMD} . Dzięki takiemu rozwiązaniu ilość kodu zmniejszy się prawie dwukrotnie przy zachowaniu dokładnie takiej samej funkcjonalności. Jak zatem powinien wyglądać odpowiednik tych dwóch powyższych reguł? Odpowiedź jest poniżęj:

ACTION=="add", SUBSYSTEM=="input", ENV{ID_INPUT_MOUSE}=="1", SUBSYSTEMS=="usb", \
    ENV{XAUTHORITY}="/home/morfik/.Xauthority", \
    ENV{DISPLAY}=":0", \
    ENV{REMOVE_CMD}="/usr/bin/synclient TouchpadOff=0", \
    RUN+="/usr/bin/synclient TouchpadOff=1"

I to wszystko. Jedna reguła realizująca dwa zadania.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.