Praktycznie każdy router, który znajduje się obecnie na rynku posiada jakieś przyciski. Najczęściej jest to przycisk Reset, ale czasami się też zdarza producenci dodają dodatkowe realizujące z góry przyjęte funkcje np. WPS, SES
W OpenWrt za obsługę przycisków odpowiada pakiet kmod-button-hotplug i przeważnie jest już w obrazie wkompilowany. Oczywiście przyciski które w oficjalnym firmware realizują konkretną funkcję w OpenWrt możemy przypisać całkowicie inną.
Żeby w ogóle przypisać akcje do przycisku trzeba znać jego nazwę. W tym celu trzeba utworzyć prosty skrypcik, który w logu przedstawi nam nazwę przycisku. Tworzymy plik:
mkdir /etc/hotplug.d/button vi /etc/hotplug.d/button/button
o zawartości:
#!/bin/sh logger $BUTTON logger $ACTION
Zapisujemy i przyciskamy przycisk. Efekt:
Nov 28 14:16:25 OpenWrt user.notice root: BTN_0 Nov 28 14:16:25 OpenWrt user.notice root: pressed Nov 28 14:16:26 OpenWrt user.notice root: BTN_0 Nov 28 14:16:26 OpenWrt user.notice root: released
Mamy doczynienia z przyciskiem BTN_0.
W w/w skrypcie wykorzystujemy dwie zmienne zakodowane w środowisku OpenWrt, które to możemy również stosować w swoich skryptach wykrywając akcje($ACTION) i nazwę przycisku($BUTTON).
Możemy też się posłużyć nazwami 'ses', 'wps', 'reset' pod warunkiem że OpenWrt ma już wewnątrz powiązanie z przyciskiem.
UCI jest standardowym narzędziem do konfigurowania OpenWrt, przyciski też nim ustawimy. Jednak najpierw musimy pobrać skrypt parsujący sekcje /etc/config/system z projektu OpenWrt 1)
mkdir /etc/hotplug.d/button wget -O /etc/hotplug.d/button/00-button http://openwrt.pl/dl/scripts/00-button
(Jeżeli dokonywano wykrywania nazwy przycisku, należy skrypt /etc/hotplug.d/button usunąć!)
Pozostaje utworzyć dodatkową sekcję w /etc/config/system. Sprawdźmy testowo przycisk BTN_0(reset), który wypisze w logu(komenda logread) tekst.
uci add system button uci set system.@button[-1].button=BTN_0 uci set system.@button[-1].action=pressed uci set system.@button[-1].handler='logger nacisnieto BTN_0' uci commit system
Wynik:
Nov 28 14:04:44 rspro user.notice root: nacisnieto BTN_0
Jak widać działa
Opcja button określa nazwę przycisku, którą wykryliśmy poprzednio
Opcja action przyjmuje dwie wartośći:
pressed akcja wykonana po przyciśnięciu przyciskureleased po puszczeniu przycisku
Opcja handler określa program, skrypt jaki ma zostać wykonany po przyciśnięciu/puszczeniu przycisku
Przy akcji released możemy dodatkowo zliczać czas trzymania przycisku i wówczas dochodzą jeszcze dwie opcja określające czas podawany w sekundach.
Przykład:
uci add system button uci set system.@button[-1].button=BTN_0 uci set system.@button[-1].action=released uci set system.@button[-1].handler='logger BTN_0 przytrzymany na 3-5s' uci set system.@button[-1].min='3' uci set system.@button[-1].max='5' uci add system button uci set system.@button[-1].button=BTN_0 uci set system.@button[-1].action=released uci set system.@button[-1].handler='logger BTN_0 przytrzymany na 5-10s' uci set system.@button[-1].min='5' uci set system.@button[-1].max='10' uci commit system
Nie wiem czy to widać, ale za pomocą jednego przycisku realizujemy dwa zadania zależne od czasu przetrzymanego przycisku!
Pora na coś praktycznego: przycisk przetrzymany do 5 sek resetuje urządzenie, a dłużej(5-30sek) resetuje ustawienia routera(firstboot)
uci add system button uci set system.@button[-1].button=BTN_0 uci set system.@button[-1].action=released uci set system.@button[-1].handler='logger resetuje router; reboot;' uci set system.@button[-1].min='0' uci set system.@button[-1].max='5' uci add system button uci set system.@button[-1].button=BTN_0 uci set system.@button[-1].action=released uci set system.@button[-1].handler='logger ustawienia domyslne; firstboot;reboot;' uci set system.@button[-1].min='5' uci set system.@button[-1].max='30' uci commit system
