1 (edytowany przez sciss 2014-02-24 22:28:57)

Temat: kilka skryptów

Pomyślałem, że podzielę się paroma z nudów naskrobanymi skryptami:

aero-pozostalo
Pokazuje ile pozostało bieżącego połączenia Aero2. Dodatkowo przyspiesza wznawianie połączenia po nominalnych 60 minutach - wcześniej wznawiało coś koło 30s, natomiast z tym skryptem ~ 7-10s.
Powinno działać na standardowych modemach (żadne HiLinki).
(część kodu funkcji conn_time_s ukradziona skądś z Gargoyle)

#!/bin/ash
conn_time_s() {
    CT=$(uci -q get -P /var/state/ network.wan.connect_time)
    UPTIME=$(cut -d. -f1 /proc/uptime)
    if [ -z $CT ]; then
    CT=$(ifstatus wan | awk -F[:,] '/uptime/ {print $2}')
    fi
    if [ ! -z $CT ]; then
    CT=$((UPTIME-CT))
    fi
    if [ "$CT" ]; then
    if [ "$CT" -ge 0 -a "$CT" -lt 86400 ]>/dev/null 2>&1; then
        echo "$CT"
    else
        echo '-1'
    fi
    else
    echo '-1'
    fi
}

t=0
while true; do
    conn_s=$(conn_time_s)
    if [ "$conn_s" -ge 0 ]>/dev/null 2>&1; then
        if [ $t -gt 0 ]; then
        echo
        fi
        t=0
        left_s="$((3600-$conn_s))"
        left_min="$(($left_s/60))"
        mod_s="$(($left_s-$left_min*60))"
        echo -en "\r                                     "
        echo -en "\rPozostalo ${left_min}min ${mod_s}s polaczenia AERO2"
    else
        if [ $t -eq '0' ]; then
        echo
        ifup wan
        fi
        echo -en "\r                             "
        echo -en "\rAERO2: Disconnected ...${t}s"
        t="$(($t+1))"
    fi
    sleep 1
done

wifi-clients
Wyświetla kilka wybranych informacji na temat podłączonych przez wifi klientów: 
czas bezczynności, adres mac, adres IP, siłę sygnału, szybkość połączenia

#!/bin/ash
tarp=$(cat /proc/net/arp)
danewifi=$(iw wlan0 station dump | grep -e Station -e inactive -e signal -e bitrate)
clients=$(echo "$danewifi" | grep 'Station' | awk '{print $2;}')
echo "$danewifi" | while read -r line; do
        mac=''
        if mac=$(echo "$line" | grep -oE '[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}'); then
                ip=$(grep "$mac" /tmp/dhcp.leases | awk '{print $3;}' | tail -n1)
                hostname=$(nslookup "$ip" | sed 's/^.*:\ //g' | tail -n1 )
                echo -e "\n$line $hostname"
        else
                echo "$line"
        fi
done

wifi-toggler
Skrypt do szybkiego przełączania trybów pracy radia wifi (np z n na g) oraz mocy radia (np z min. na max.)
Można zmieniać obie opcje na raz.

Napisany, ponieważ posiadany przez ze mnie ebook nie umie się połączyć do sieci wifi w trybie n, dlatego często zmieniałem tryb oraz moc.

#!/bin/ash
MODE_G='11g'    #nazwy trybow radia w uci
MODE_N='11ng'
UCI_RADIO='radio0'   #nazwa karty wifi w uci

UCI_MODE="wireless.${UCI_RADIO}.hwmode"   #sciezka w uci do trybu radia
UCI_POWER="wireless.${UCI_RADIO}.txpower" #sciezka w uci do mocy radia

POWER_MIN='1'
POWER_MAX=$(iw list | grep dBm | grep "\[`uci show wireless.${UCI_RADIO}.channel | grep -o '=.*$' | tr -d '='`\]" | awk '{print $5;}' | tr -d '(' | sed 's/\..*$//g')

show_status() {
    var=''
    case "$1" in
    'm') var=$(uci show "$UCI_MODE" | sed 's/.*=//g' | tr -d '"' | tr -d "'") ;;
    'p') var=$(uci show "$UCI_POWER" | sed 's/^.*=//g' | tr -d '"' | tr -d "'") ;;
    esac
    if [ "$var" ]; then
    echo "$var" | head -n1
    else
    echo "ERROR: show_status: void!" >&2
    exit 1
    fi
}


commit_changes() {
    status_after="tryb=$(show_status m) moc=$(show_status p) dBm"
    if [ "$status_before" != "$status_after" ]; then
    echo -e "Wprowadzam zmiany...\n"
    uci commit wireless
    wifi
    echo -e "\nPO:\t$status_after\n"
    else
    echo -e "Bez zmian.\n"
    fi
    exit 0
}

set_wifi() {
    if ! echo -e "$POWER_MIN\n$POWER_MAX\n$MODE_G\n$MODE_N" | grep "$1" >/dev/null; then
    echo "ERROR: set_wifi: wrong parameter! '$1'" >&2
    exit 1
    elif echo "$1" | grep -E '[a-zA-Z]' >/dev/null; then    
    echo -n "TRYB: $(show_status m) => "
    uci set "$UCI_MODE"="$1"
    show_status m
    echo
    elif ! echo "$1" | grep -E '[a-zA-Z]' >/dev/null; then
    echo -n "MOC: $(show_status p)dBm => "
    uci set "$UCI_POWER"="$1"        
    echo "$(show_status p)dBm"
    echo
    else
    echo "ERROR: set_wifi: '$1' won't fit!" >&2
    exit 1
    fi
}


show_help() {
    echo -e "\tWIFI ZMIENIACZ"
    echo -e "\tuzycie: $(basename $0) PAR1 [PAR2]"
    echo
    echo -e " PARAMETRY:"
    echo -e "\ttryb radia:"
    echo "  t               - zamienia tryb pomiedzy n i g"
    echo "  n               - uruchamia tryb n"
    echo "  g               - uruchamia tryb g"
    echo -e "\tmoc radia:"
    echo "  T               - zamienia moc pomiedzy $POWER_MINdBm a $POWER_MAXdBm"
    echo "  m               - ustawia moc na ${POWER_MIN} dBm"
    echo "  M               - ustawia moc na ${POWER_MAX} dBm"
    echo
    echo "  s status        - wyswietla aktualny tryb"
    echo "  h help          - pokazuje dostepne parametry"
    echo
    commit_changes
    exit 0
}


var=''
status_before="tryb=$(show_status m) moc=$(show_status p) dBm"
echo -e "PRZED:\t$status_before\n"
if [ $# -eq 0 ]; then
    show_help
else
    for k in "$@"; do
    case "$k" in
        t)
        if [ `show_status m` = "$MODE_N" ]; then
            var="$MODE_G"
        elif [ `show_status m` = "$MODE_G" ]; then
                var="$MODE_N"
        else
                echo "Bład: Nieznany tryb WIFI"
                exit 1
        fi
        set_wifi "$var"
        ;;
        T)
        if [ `show_status p` = "$POWER_MAX" ]; then
            var="$POWER_MIN"
        elif [ `show_status p` = "$POWER_MIN" ]; then
                var="$POWER_MAX"
        else
                echo "Bład: Nieznana moc WIFI"
                exit 1
        fi
        set_wifi "$var"
        ;;
        n|g|m|M)
        case "$k" in
            n) var="$MODE_N" ;;
            g) var="$MODE_G" ;;
            m) var="$POWER_MIN" ;;
            M) var="$POWER_MAX" ;;
        esac
        set_wifi "$var"
        ;;
        s|status)
        echo -e "Tryb=`show_status m`\nMoc=`show_status p`\n"
        commit_changes
        ;;
        h|help)
        show_help
        ;;
        *)
        echo "Nieprawidlowy argument! Sprobuj h"
        commit_changes
    esac
    done
    commit_changes
fi

download_speed_meter
Mierzy szybkość pobierania pliku o adresie podanym w parametrze. Bez parametru pobiera http://noc.gts.pl/1mb.gts
Działa na domyślnym wget z Openwrt

#!/bin/ash
n=2 #liczba dziesietnych
uerel="http://noc.gts.pl/1mb.gts" #domyslny plik testowy do sciagniecia

time2ms() {
while IFS= read -r line ; do
    if echo "$line" | grep real > /dev/null 2>&1 ; then
        string=$(echo "$line" | cut -c 9- | tr " " "\n")
               string_h=$(echo "$string" | grep 'h' | tr -d 'h')
               string_m=$(echo "$string" | grep 'm' | tr -d 'm')
               string_ss=$(echo "$string" | grep 's' | tr -d 's|.')  #setne sekundy
               string_ms="${string_ss}0"
               time_ms=$((string_ms+60*1000*(string_m+60*string_h) ))
               echo $time_ms
               exit 0
        else
            exit 1
        fi
done
}

get_size() {
#zwraca wielkosc w kB
#na wejsciu oczekuje wartosci w postaci xk xM lub xG
while IFS= read -r line ; do
    linijka=$(echo "$line" | egrep -o '[0-9]+[kMG]' | tail -n 1 2>&1)
    if [ "$linijka" ]; then
    przedrostek=`echo "$linijka" | egrep -o '[kMG]'`
    liczba=`echo "$linijka" | grep -o '[0-9]*'`
    case "$przedrostek" in
        "k")
        wynik=$(($liczba))
        ;;
        "M")
        wynik=$(($liczba*10**3))
        ;;
        "G")
        wynik=$(($liczba*10**6))
        ;;
    esac
    echo "$wynik"
    fi
done
}

speed_check() {
#PARAMETR: url pliku
    if ! time_wget=`time wget "$1" -O /dev/null 2>&1 `; then
    echo "Err: Nie moge pobrac $1!"
    exit 1
    fi
    down_time=`echo "$time_wget" | grep '^real' | time2ms)` 
    size=`echo "$time_wget" | grep ETA | get_size`
    x=$((($size*10**(3+$n))/$down_time))
    d=$(($size*1000*10**$n/$down_time))
    down_speed_int=$(echo -n "$x" | cut -c 0-$(expr ${#d} - $n))             
    down_speed_frac=$(echo -n "$x" | tail -c $n)
    down_speed=$(echo "${down_speed_int}.${down_speed_frac}")                
    down_time=$((down_time/1000))                                            
    echo "${size}kBytes downloaded in ${down_time}s."                        
    echo "DOWNLOAD SPEED = ${down_speed}kB/s"                                
}

if [ $# -gt 0 ]; then
    uerel="$1"
fi

speed_check "$uerel"

2 (edytowany przez Skajper4 2014-02-22 20:59:10)

Odp: kilka skryptów

#wskazówka
Moc radia (obecną, i w większości przypadków maksymalną) możesz wyciąć z iwconfig. Może dojdę do tego skąd luCI bierze maksymalną moc radia i tu napiszę.
Co do przełączania 11gn, może spróbuj przełączania poprzez wykrywanie mac? Np. Jeśli się urządzenie o adresie mac A podłączy, sieć zmienia się na 11g. Jeśli się odłączy, zmienia na 11n. Informacje takie da się chyba nawet z logread -r wyciąć.

3

Odp: kilka skryptów

Z iw list bierze.

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

4

Odp: kilka skryptów

Skajper4 napisał/a:

Moc radia (obecną, i w większości przypadków maksymalną) możesz wyciąć z iwconfig. Może dojdę do tego skąd luCI bierze maksymalną moc radia i tu napiszę.

U mnie nic konkretnego nie widać:

#iwconfig
(...)
wlan0     IEEE 802.11bgn  Mode:Master  Tx-Power=17 dBm   
          RTS thr:off   Fragment thr:off
          Power Management:off

Po prostu pokazuje aktualną moc radia - minimalnej czy maksymalnej nie ma.

Skajper4 napisał/a:

Co do przełączania 11gn, może spróbuj przełączania poprzez wykrywanie mac? Np. Jeśli się urządzenie o adresie mac A podłączy, sieć zmienia się na 11g. Jeśli się odłączy, zmienia na 11n. Informacje takie da się chyba nawet z logread -r wyciąć.

Faktycznie z tym wykrywaniem MACów to bardzo dobry pomysł. Co prawda na n-ce nie chce się łączyć, ale w logread widać że się dobija, więc powinno dać się to jakoś zautomatyzować. Ale to żeby zbytnio nie mieszać to już może w innym skrypcie, który będzie korzystał z tego togglera. Dzięki za sugestię.

5

Odp: kilka skryptów

Cezary napisał/a:

Z iw list bierze.

Ok, poprawiłem skrypt żeby moc maksymalną wyciągał przy pomocy iw list.

6

Odp: kilka skryptów

Dodaj zmienną $radio ponieważ niektórzy użytkownicy mają np. dwie karty wifi (w tym ja) i muszą przerabiać pół kodu smile

7

Odp: kilka skryptów

Wszystkim nie dogodzę, ale niech będzie smile

8

Odp: kilka skryptów

Po pierwsze - wielkie dzięki za skrypty, zwłaszcza "aero-pozostalo".

Mam takie pytanie (może wydawać się głupie): Jak uruchamiać ten skrypt? W sensie, żeby automatycznie rozłączało? Wiem, że można używać "Monitor połączenia", ale Twój skrypt wydaje się wygodniejszy. Czy jak wywołam ten skrypt w "rc.local", to będzie cały czas działać w tle? Jeśli tak, to jak go potem zatrzymać? (Często używam na zmianę Aero2 i Internetu Orange) i nie chciałbym, aby co godzinę rozłączało mi potem połączenie Orange.

9

Odp: kilka skryptów

Uruchomiasz w tle a jak chcesz go zatrzymasz to go po prostu ubij (kill pid_procesu)

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

10

Odp: kilka skryptów

Dzięki Cezary, czyli w pliku zmieniającym połączenie na Orange dodałem:

getprocess=`ps |grep {aero2pozostalo.}`
#echo $getprocess
set $getprocess 
pid=$1
echo $pid
kill -9 $pid

Gdzie "aero2pozostalo" to nazwa pliku .sh smile

11

Odp: kilka skryptów

akurat kilować możesz po nazwie (killall...) lub znaleźć pid przez pidof

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