Portál AbcLinuxu, 29. dubna 2024 14:14

Zabijácký vypínač

10.12.2009 20:57 | Přečteno: 1478× | Linux | Výběrový blog | poslední úprava: 12.12.2009 21:28

Jak jednoduše vypínat, zapínat a přepínat stav bezdrátových zařízení?

No přeci používáním RF Kill Switch! Protože se mi s posledním jádrem začly chovat rozumě, po softwarové blokaci se samovolně neodblokují - například wifi to s oblibou dělala, jsem si napsal malý skript na obsluhu této vymoženosti. Ano existuje utilita rfkill, ale tam jaksi není ono jednoduché překlopení stavu, proto vlastní řešení, podobnost ostatního je čistě náhodná.

#!/bin/bash                                          
SYS_DIR="/sys/class/rfkill"                          
SYS_FILE="index"                                     

Usage()
{      
    echo "usage:" >&2
    echo "${0##*/} list" >&2
    echo "${0##*/} block [index|type]" >&2
    echo "${0##*/} unblock [index|type]" >&2
    echo "${0##*/} toggle [index|type]" >&2 
    echo "type:" >&2                        
    echo "all" >&2                          
    cat "$SYS_DIR"/*/type | sort -u >&2     
    exit 1                                  
}                                           

GetStatusText()
{              
    case "$1" in
        0)      
            echo "soft blocked"
        ;;                     
        1)                     
            echo "unblocked"   
        ;;                     
        2)                     
            echo "hard blocked"
        ;;                     
    esac                       
}                              

List()
{     
    for DIR in "$SYS_DIR"/*; do
        INDEX=$(cat "$DIR"/index)
        NAME=$(cat "$DIR"/name)  
        TYPE=$(cat "$DIR"/type)  
        STATE=$(GetStatusText $(cat "$DIR"/state))
        echo "$INDEX: $NAME: $TYPE: $STATE"       
    done                                          
}                                                 

SetState()
{         
    for DIR in "$SYS_DIR"/*; do
        if [ "$3" = "all" ] || [ "$3" = $(cat "$DIR"/"$2") ]; then
            echo "$1" > $DIR/state || exit 1                      
        fi                                                        
    done                                                          
}                                                                 

Toggle()
{       
    for DIR in "$SYS_DIR/"*; do
        if [ "$2" = "all" ] || [ "$2" = $(cat "$DIR"/"$1") ]; then
            echo "$((! $(cat "$DIR"/state)))" > "$DIR"/state || exit 1
        fi                                                            
    done                                                              
}                                                                     

if ! [ -d "$SYS_DIR" ]; then
    echo "${0##*/}: no RF Kill Switch found!"
    exit 1                                   
fi                                           

if [ "$1" = "list" ]; then
    List                  
    exit 0                
fi                        

if [ -z "$2" ]; then
    Usage           
    exit 1          
fi

if cat "$SYS_DIR"/*/type | grep -q ^"$2"$; then
    SYS_FILE="type"
elif cat "$SYS_DIR"/*/index | grep -q ^"$2"; then
    SYS_FILE="index"
elif [ "$2" != "all" ]; then
    echo "${0##*/}: no such index or type" >&2
    exit 1
fi

case "$1" in
    unblock)
        SetState 1 "$SYS_FILE" $2
    ;;
    block)
        SetState 0 "$SYS_FILE" $2
    ;;
    toggle)
        Toggle "$SYS_FILE" $2
    ;;
    *)
        Usage
    ;;
esac
       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

David Watzke avatar 10.12.2009 22:44 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Zabijácký vypínač
Odpovědět | Sbalit | Link | Blokovat | Admin
    Err "     ${0/*\/} toggle [index|type]"
    Err "type:"
    Err "    all"
    for TYPE in `cat "$SYS_DIR"/*/type | sort | uniq`; do
${0##*/} je lepší než ${0/*\/}, když ti jde o oříznutí řetězce od začátku.

for x in `cat ...` je hrůza. Tohle nejde?
cat "$SYS_DIR"/*/type | sort -u | while read TYPE
Dál jsem to neřešil. Neber to jako buzeraci, jen se snažím pomoct... :-) Jo a ještě přesměrování do stderr je obecnější pomocí tohoto chvatu: >&2.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
vogo avatar 10.12.2009 22:51 vogo | skóre: 34 | blog: "Skládat papír"
Rozbalit Rozbalit vše Re: Zabijácký vypínač
jojo, tu je vidět, že jsem dlouho nic nepsal v bashi, bude to chtít si přelouskat nějakou příručku :)
Nejsem paranoidní, ale to ještě neznamená, že po mě nejdou.
11.12.2009 07:40 CET
Rozbalit Rozbalit vše Re: Zabijácký vypínač
No pozor. Ono for i in ` comman`;do je bohuzel nekdy nutnosti. Min. ve dvou pripadech.

Prvni pripad je, kdyz kod v cykly neco cte ze stdin, potom totiz command | while read a;do command2 "$a" ; done probehne pouze jednou, protoze z nejakyho duvodu sezere ten command2 ze stdin zbytek toho vystupu z command. Uz se mi to parkrat stalo, pokud si vzpominam, tak to bylo se ssh. generate-host-list | while read host; do ssh "$host" remote-cmd ; done bezelo jenom jednou pro prvniho hosta.

Druhy pripad je, kdyz chces v cyklu nastavit nejakou hodnotu, kterou pak pouzijes dal. Pipe totiz vyvola dalsi bash, takze veskere upravy jsou pouze lokalni, cili generate-list | while read item;do if [ $item -gt $max ] ; then max=$item;fi;done ; pracuj-dale-s-max nebude to same jako for item in `generate-list` ; do if [ $item -gt $max ];then max=$item;fi;done;pracuj-dale-s-max
11.12.2009 09:10 mire
Rozbalit Rozbalit vše Re: Zabijácký vypínač
Prvy pripad sa da vyriesit prepinacom "-n" pre ssh, potom ssh necita standardny vstup.
David Watzke avatar 11.12.2009 13:11 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Zabijácký vypínač
To druhý je IMHO blbost... S max dál pracovat nemůžeš ani když tam dáš ten for...
dave@amd64 ~ $ for x in $(echo a b c); do max=$item; done
dave@amd64 ~ $ echo $max

“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
11.12.2009 13:51 maleprase | skóre: 28
Rozbalit Rozbalit vše Re: Zabijácký vypínač
kdyz pouzijes spravnou promennou tak muzes
$ for x in a b c; do max=$x; done
$ echo $max
c
David Watzke avatar 12.12.2009 12:52 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Zabijácký vypínač
Jasně... no jo, jsem tele :-D
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.