OpenWrt - Przyciski
Obsługa przycisków w OpenWrtOstatnia zmiana: 2011-09-17 12:37
1. Nazwy przycisków
2. Skrypt do obsługi przycisków
3. Obsługa przycisków przy pomocy UCI
Większość ruterów posiada jakieś przyciski. Zwykle jest dostępny "Reset" (lub "Restore"), czasami także pojawia się przycisk oznaczony WPS, SES czy QSS. Ze względów oszczędnościowo-praktycznych, fizycznie taki przycisk zwykle jest bezpośrednio podłączony pod jedną z linii wejściowych CPU rutera (zwanych GPIO) i tym samym jest dostępny do programowego obsłużenia. Ponieważ zwykle OpenWrt zawiera obsługę przycisków dla danej platformy, możemy to wykorzystać do własnych celów np. odmontowania dysku USB, zatrzymania pracy programu do pobierania torrentów, wyłączenie/przełączenia wifi, resetu (!) czy setki innych pomysłów które chcemy zrealizować.
Nazwy przycisków
Same moduły do obsługi powinny być już zawarte w systemie (najczęściej jest to realizowane przez pakiet kmod-button-hotplug) więc nie ma już potrzeby ich instalacji. Sama obsługa jest zrealizowana przez podsystem hotplug - czyli jeżeli naciśniemy przycisk to zostaną wykonane wszystkie programy zawarte w pewnym katalogu; w przypadku OpenWrt jest to /etc/hotplug.d/button. Zostaną one uruchomione zarówno po naciśnięciu jak i zwolnieniu przycisków. Do skryptów przekazywane są zmienne środowiskowe zawierające informacje o nazwie wciśniętego przycisku (zmienna $BUTTON), akcji (zmienna $ACTION) oraz czasie od ostatniego naciśnięcia przycisku (zmienna $SEEN). Ponieważ w zależności od typu rutera przyciski mogą się różnie nazywać, najpierw należy sprawdzić pod jak nazwą są widoczne. Najprościej umieścić w w/w katalogu prosty skrypt który wypisze nam to samodzielnie:
# mkdir -p /etc/hotplug.d/button
# vi /etc/hotplug.d/button/przyciski
#!/bin/sh
logger $BUTTON
logger $ACTION
Jan 1 00:01:15 OpenWrt user.notice root: BTN_1
Jan 1 00:01:15 OpenWrt user.notice root: pressed
Jan 1 00:01:16 OpenWrt user.notice root: BTN_1
Jan 1 00:01:16 OpenWrt user.notice root: released
Skrypt do obsługi przycisków
Skoro wiemy już jak się nazywa dany przycisk - obsługa sprowadza się do napisania odpowiedniego skryptu. Czyli w katalogu /etc/hotplug.d/button należy utworzyć plik o dowolnej nazwie, np. 00-button
# mkdir -p /etc/hotplug.d/button
# cd /etc/hotplug.d/button
# touch 00-button
if [ "$ACTION" = "pressed" ]; then
if [ "$BUTTON" = "BTN_0" ]; then
polecenia do wykonania po naciśnięciu przyciku BTN_0
elif [ "$BUTTON" = "BTN_1" ]; then
polecenia do wykonania po naciśnięciu przyciku BTN_1
fi
fi
Obsługa przycisków przy pomocy UCI
Każdorazowe modyfikowanie skryptu może być uciążliwe. Można zrobić uniwersalną obsługę przycisków przy pomocy standardu w OpenWrt - UCI, definiując odpowiednią sekcję w plikach konfiguracyjnych. Taki skrypt jest gotowy i wystarczy go pobrać od deweloperów OpenWrt:
# mkdir -p /etc/hotplug.d/button
# wget -O /etc/hotplug.d/button/00-button http://dev.openwrt.org/export/21216/trunk/target/linux/atheros/base-files/etc/hotplug.d/button/00-button
Cała obsługa przycisków sprowadza się do umieszczenia odpowiedniej sekcji w pliku /etc/config/system. W przykładzie - wyłączenie wifi (tylko wyłączenie) po naciśnięciu przycisku "WPS"
# uci add system button
# uci set system.@button[-1].button=wps
# uci set system.@button[-1].action=pressed
# uci set system.@button[-1].handler='uci set wireless.@wifi-device[0].disabled=1 && wifi'
# uci commit system
- button - nazwa przycisku
- action - pressed lub released, czyli akcja będzie wykonana po wciśnięciu lub puszczeniu przycisku
- handler - nazwa skryptu/polecenie do wykonania
# uci add system button
# uci set system.@button[-1].button=BTN_1
# uci set system.@button[-1].action=released
# uci set system.@button[-1].handler='logger czas nacisniecia: 0-3s'
# uci set system.@button[-1].min=0
# uci set system.@button[-1].max=3
# uci add system button
# uci set system.@button[-1].button=BTN_1
# uci set system.@button[-1].action=released
# uci set system.@button[-1].handler='logger czas nacisniecia: 8-10s'
# uci set system.@button[-1].min=8
# uci set system.@button[-1].max=10
# uci commit system
Dzięki temu można zrealizować różną funkcjonalność obsługiwaną przez jednej przycisk = np. trzymamy do 2s - wyłącza się wifi, trzymamy do 10s - odmontowywuje dyski, powyżej 30s - robi reset systemu.
Przykład: odmontowanie dysków po naciśnięciu przycisku
# uci add system button
# uci set system.@button[-1].button=BTN_1
# uci set system.@button[-1].action=released
# uci set system.@button[-1].handler='for i in $(mount | awk '/dev\/sd[a-z]/ { print $1}'); do umount $i; done'
# uci set system.@button[-1].min=5
# uci set system.@button[-1].max=10
# uci commit system