1

Temat: WDR3600 i przełącznik WiFi

Jak uruchomić taki skrypcik:

#!/bin/sh
  while true
  do
    WIFI=$(if grep -qe "RFKILL.*in  hi" /sys/kernel/debug/gpio; then echo 1; el$
    WFSTAT=$(uci get wireless.@wifi-device[0].disabled)
    if [ "$WIFI" = "0" ]; then
        if [ "$WFSTAT" = "1" ]; then
                # WiFi: on
                uci set wireless.@wifi-device[0].disabled=0; wifi;
        fi
    else
        if [ "$WFSTAT" = "0" ]; then
                # WiFI: off
                uci set wireless.@wifi-device[0].disabled=1; wifi;
        fi
    fi
  done

aby działał od uruchomienia systemu?
W sumie to nieskończona pętla, a więc proste dodanie do init.d raczej odpada.

Wally

2

Odp: WDR3600 i przełącznik WiFi

Zapisać to do pliku i uruchomić z & na końcu. Wtedy poleceni w tło.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3 (edytowany przez Wally 2013-01-27 17:31:52)

Odp: WDR3600 i przełącznik WiFi

Mam w pliku, powiedzmy /bin/Moj_skrypt.sh. Jak to wywołać przy bootowaniu/starcie? Gdzie dodać ten skrypt, aby był wykonywany z automatu?

Wally

4

Odp: WDR3600 i przełącznik WiFi

/etc/rc.local

A wołasz tak:

/bin/Moj_skrypt.sh &

I ile faktycznie masz taką nazwą skryptu i ma on prawa do wykonania.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5

Odp: WDR3600 i przełącznik WiFi

Tyle już doczytałem smile ma 755. Dzięki!

Wally

6 (edytowany przez doman18 2013-06-08 18:19:34)

Odp: WDR3600 i przełącznik WiFi

Ja się podkleję bo mam pytanie do tego skryptu.

Wszystkie warunki zostały wrzucone w nieskończoną pętlę która cały czas działa i cały czas sprawdza prawdziwość tych warunków i cały czas zapisuje do plików 0 lub gdy zmieni się pozycję przycisku cały czas pętla będzie dopisywała 1. Dobrze rozumiem?

Ja natomiast chciałbym żeby instrukcja wykonywała się raz, a nie nieskończenie wiele razy dopóki nie zmieni się pozycja przycisku. Czyli dopiero wtedy gdy zmieniam pozycję przycisku dopiero wtedy zachodzi sprawdzenie wszystkich warunków i po takim sprawdzeniu skrypt się zakończy lub po prostu samo sprawdzanie się zakończy.

Żeby jeszcze bardziej wyjaśnić o co mi chodzi dodam że chciałbym ten przycisk wykorzystać do montowania dysku. Gdy włączę go na off, skrypt wyłącza transmission, odmontowuje /dev/sdb1 (punkt i parametry są już w fstabie) oraz włącza tp-link:blue:qss. Wtedy bym go sobie na luzie odpinał, zrzucał ściągnięte torrenty a później podpinał i przełączał przycisk wifi na on. I wtedy znów odpalają się warunki, /dev/sdb1 jest montowany, transmission odpalone a na końcu dioda tp-link:blue:qss jest wyłączana (echo "0" > /sys/devices/platform/leds-gpio/leds/tp-link:blue:qss/brightness).

Skrypcik taki jest bardzo łatwo zrobić ale jak zrobić to żeby wykonywał się jednorazowo?Chyba najprościej można by było wrzucić w pętlę nieskończoną i dać w niej warunek nie na stan ale zmianę stanu. Czyli akcje byłyby dopiero wtedy uruchamiane gdyby różnica między zmienną sprawdzającą z poprzedniego stanu i aktualnego byłaby różna od 0 (przy założeniu że stany opiszemy w liczbach np 1 i 2.
Ale może da się to bardziej klarownie zrobić?

7

Odp: WDR3600 i przełącznik WiFi

Gdyby to był zwykły przycisk to tak to działa - wywołuje się skrypt na hotplugu  raz i jest. Ale to jest przełącznik, nie jest w openwrt obsługiwany jako przycisk tylko jako przełącznik właśnie. Więc nie zachodzi zdarzenie hotpluga więc potrzebujesz coś co lata w koło i sprawdza status.

Rozwiązaniem tego jest np. przekompilowanie kodu żeby to był traktowany jako przycisk. Ale to ma drugie dno - nie jest buforowany, a z okazji "drgań styków" to zdarzenie może zajść nie raz a kilka razy, więc programowo musiał byś to obsłużyć jakoś.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

8 (edytowany przez doman18 2013-06-08 20:19:40)

Odp: WDR3600 i przełącznik WiFi

Dobra, tak na szybko zmontowałem takie coś

#!/bin/sh
WIFIsprawdz=$(if grep -qe "RFKILL.*in  hi" /sys/kernel/debug/gpio; then echo 1; else echo 0; fi)
while true
do
  WIFI=$(if grep -qe "RFKILL.*in  hi" /sys/kernel/debug/gpio; then echo 1; else echo 0; fi)
  if [ "$WIFI" != "$WIFIsprawdz" ]; then  
    if [ "$WIFI" = "0" ]; then 
        /etc/init.d/transmission stop;
        umount /dev/sdb1;
        echo "1" > /sys/devices/platform/leds-gpio/leds/tp-link:blue:qss/brightness;
    else
        mount /dev/sdb1;
        /etc/init.d/transmission start;
        echo "0" > /sys/devices/platform/leds-gpio/leds/tp-link:blue:qss/brightness;
    fi
  fi
  WIFIsprawdz=$WIFI
done

Pewnie jeszcze będę musiał dodać jakieś pauzy pomiędzy poleceniami żeby dać czas systemowi na wykonanie poszczególnych poleceń ale to już drobiazgi. Ważne jest czy takie coś w teorii zadziała czy coś pokiereszowałem?

9

Odp: WDR3600 i przełącznik WiFi

mount się nie zgadza. mount -t coś tam /dev/sdb1 /mnt/sdb1

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

10

Odp: WDR3600 i przełącznik WiFi

Ale punkt montowania jest ustalony w fstabie już.

config mount
        option target '/mnt/torrenty'
        option device '/dev/sdb1'
        option fstype 'ntfs-3g'
        option options 'rw,noatime'
        option enabled '1'
        option enabled_fsck '0'

11

Odp: WDR3600 i przełącznik WiFi

No chyba że tak.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

12 (edytowany przez doman18 2013-06-08 20:17:50)

Odp: WDR3600 i przełącznik WiFi

Po starcie skryptu mam tylko coś takiego

/bin/mojskrypt.sh: line 18: [0: not found

Z tym że 0 zmienia się na 1 w zależności od przełączania się przyciskiem. Naturalnie żadna z komend w warunkach się nie uruchamia.

PS. Tam w warunkach nie powinno być znaku podwójnego == ?

//EDIT
Oczywiście banalny błąd - brak spacji po [ i przed ] w warunku.
Działa ale nie tak jak chciałem. Cały czas chce montować lub odmontowywać urządzenie w zależności od położenia przełącznika. Np podczas podłączenia pluje errorami

Mount is denied because the NTFS volume is already exclusively opened.
The volume may be already mounted, or another software may use it which
could be identified for example by the help of the 'fuser' command.
mount: mounting /dev/sdb1 on /mnt/torrenty failed: No such device

A podczas odłączenia że nie może znaleźć urządzenia /dev/sdb1 do odmontowania

//EDIT2
Oczywiście kolejny głupi błąd. W ostatniej linijce powinnien być $ przy wartości wczytywanej z innej zmiennej.


Wszystkie zmiany już zaaplikowałem w kodzie z poprzedniego postu.