OpenWrt - Przydatne skrypty
Różne małe ale czasami przydatne skrypty
Ostatnia zmiana: 2013-03-18 11:20

1. Włącz/wyłącz wifi pod przyciskiem
2. Wyłączenie wifi w nocy
3. Włączenie/wyłączenie połączenia z internetem przez przycisk
4. Lista połączonych klientów do AP
 4.1. mac80211
 4.2. Atheros (madwifi)
 4.3. Broadcom (brcm)
5. Restart połączenia w przypadku braku internetu
6. Skrypt uruchamiany przy starcie systemu
7. Skrypt pokazujący status połączenia
8. Blokowanie użytkowników nie płacących
9. Uruchomienie polecenia z opóźnieniem
10. Uruchomienie procesu po zamontowaniu nośnika


Włącz/wyłącz wifi pod przyciskiem

    # mkdir -p /etc/hotplug.d/button
    # touch /etc/hotplug.d/button/01-wifitoggle
    # chmod 755 /etc/hotplug.d/button/01-wifitoggle

A w tym pliku:

    if [ "$BUTTON" = "wps" ] ; then
        if [ "$ACTION" = "pressed" ] ; then
            SW=`uci -q get wireless.@wifi-device[0].disabled`
            if [ $SW == '1' ]; then
                uci set wireless.@wifi-device[0].disabled=0
            else
                uci set wireless.@wifi-device[0].disabled=1
            fi
            wifi
        fi
    fi

Zakładając że przycisk nazywa się 'wps'. Patrz poradnik o przyciskach.
Wyłączenie wifi w nocy
Do tego celu można użyć crona. Wyłączamy np. o 23.00 a włączamy o 7 rano (do wykonania są poniższe polecenia):

    # echo "0 23 * * * uci set wireless.@wifi-device[0].disabled=1; wifi" >> /etc/crontabs/root
    # echo "0 7 * * * uci set wireless.@wifi-device[0].disabled=0; wifi" >> /etc/crontabs/root
    # /etc/init.d/cron restart

Włączenie/wyłączenie połączenia z internetem przez przycisk
Tworzymy skrypt o nazwie polacz.sh

    # touch /bin/polacz.sh
    # chmod 755 /bin/polacz.sh

o następującej zawartości

    #!/bin/sh
    UP=$(uci get -P /var/state/ network.wan.up)
    if [ "x$UP" = "x1" ]; then
        ifdown wan
    else
        ifup wan
    fi

A następnie jego wywołanie dodajemy do przycisku - patrz poradnik o przyciskach. Jeżeli używasz moich obrazów to w /etc/config/system wystarczy wykonać następujące polecenia:

    # uci add system button
    # uci set system.@button[-1].button=wps
    # uci set system.@button[-1].action=pressed
    # uci set system.@button[-1].handler='/bin/polacz.sh'
    # uci commit system

Lista połączonych klientów do AP
Polecenie zależy od używanego sterownika do karty radiowej
mac80211

    # iw dev wlan0 station dump

Atheros (madwifi)

    # wlanconfig ath0 list sta

Broadcom (brcm)

    # wl assoclist

Restart połączenia w przypadku braku internetu
Tworzymy skrypt o nazwie tester.sh

    # touch /bin/tester.sh
    # chmod 755 /bin/tester.sh

o następującej zawartości

    #!/bin/sh
    if ! ping -q -c 5 -W 10 google.com > /dev/null; then
            (ifup wan) &
    fi

Skrypt pinguje google - jeżeli nie dostanie odpowiedzi przez 5s to wznawia połączenie na interfejsie wan.
Następnie można dodać wywołanie tego skryptu do crona i uruchamiamy go:

    # /etc/init.d/cron stop
    # echo "*/10 * * * * /bin/tester.sh" >> /etc/crontabs/root
    # /etc/init.d/cron enable
    # /etc/init.d/cron start

Od tej pory co 10 minut nastąpi wywołanie skryptu.
Skrypt uruchamiany przy starcie systemu
Wystarczy dodać skrypty do /etc/rc.local, który wykonuje się po starcie systemu. Ostatnie polecenie w tym pliku musi być exit 0, wszystko po nim nie zostanie wykonane.
Skrypt pokazujący status połączenia
Przeniesiony do osobnego dokumentu.
Blokowanie użytkowników nie płacących
Przeniesiony do osobnego dokumentu.
Uruchomienie polecenia z opóźnieniem
Jeżeli interesuje nas uruchomienie polecenia np. z opóźnieniem 20s po starcie systemu, wystarczy do pliku /etc/rc.local dodać jako pierwszą linię (w przykładzie uruchomienie transmission):

    (sleep 20; /etc/init.d/transmission start) &

Uruchomienie procesu po zamontowaniu nośnika
Wkładamy pendrive i po jego zamontowaniu ma się uruchomić jakiś proces, np. transmission lub minidlna.
Tworzymy skrypt o nazwie np. 99-mount w katalogu /etc/hotplug.d/block o następującej zawartości:

    #!/bin/sh

    case $ACTION in
        add)
            grep -q /dev/$DEVICENAME /proc/mounts || exit 0

            DIR=$(awk '/^\/dev\/'$DEVICENAME'/ {print $2}' /proc/mounts) 
            logger "/dev/$DEVICENAME zmontowano w $DIR"
            ;;
        remove)
            logger "Odlaczono /dev/$DEVICENAME"
            ;;
    esac

W zmiennych mamy informacje o zamontowanej partycji w danym katalogu. Przykład - po włożeniu nośnika ma się na nim uruchomić minidlna (dane są ustawiane dynamicznie bez zapisu do konfiguracji):

    #!/bin/sh

    case $ACTION in
        add)
            grep -q /dev/$DEVICENAME /proc/mounts || exit 0
        
            DIR=$(awk '/^\/dev\/'$DEVICENAME'/ {print $2}' /proc/mounts) 
            /etc/init.d/minidlna stop
            uci set minidlna.@minidlna[0].enabled=1
            uci add_list minidlna.@minidlna[0].media_dir="$DIR"
            uci set minidlna.@minidlna[0].db_dir="$DIR/_minidlna"
            uci set minidlna.@minidlna[0].log_dir="$DIR/_minidlna"
            /etc/init.d/minidlna start
            uci revert minidlna
            ;;
        remove)
            /etc/init.d/minidlna stop
            ;;
    esac