summaryrefslogtreecommitdiffstats
path: root/usr/bin/autowifi
blob: fcb5b59c93160e063770d818116db1a851396885 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/bin/sh -x
wifi=wlan0
iface=@wifi-iface[0]
radio=$(uci get wireless.${iface}.device)
connect_wifi(){
    # channel ssid encryption key
    uci set wireless.${iface}.mode=sta

    ifconfig $wifi up
    uci set wireless.${radio}.channel=$1
    uci set "wireless.${iface}.ssid=$2"
    if [ $3 == "none" ] ; then
        uci set wireless.${iface}.encryption=none
        uci -q delete wireless.${iface}.key
    else
        uci set "wireless.${iface}.key=$4"
        uci set wireless.${iface}.encryption=$3
    fi 
    uci commit wireless
    wifi up
}

print_iwlist_env(){
    # takes environment:
    #   count
    #   MAC
    #   CHANNEL
    #   QUALITY
    #   ENCRYPTION
    #   ESSID
    #   WPA
    #   WPA2
    for i in ESSID MAC CHANNEL QUALITY ENCRYPTION WPA WPA2;do
        eval echo ${i}_${count}=\$${i}
    done
}

iwlist_scan(){
    ifconfig $wifi up

    count=0
    
    iwlist scan ${1:-} 2>/dev/null | ( while read line;
    do
        case "$line" in
            *"Cell "*)
                [ $count -eq  0 ] || print_iwlist_env
                WPA=0
                WPA2=0
                : $((count+=1))
                MAC="${line#*Address: }"
                ;;
            *Channel:*)
                CHANNEL="${line#*:}"
                ;;
            *Quality=*)
                QUALITY="`printf '%s' ${line#*Quality=} | cut -d/  -f 1`"
                ;;
            *"Encryption key:"*)
                ENCRYPTION="${line#*key:}"
                ;;
            *ESSID:*)
                ESSID="${line#*ESSID:}"
                ;;
            *"IE: IEEE 802.11i/WPA2"*)
                WPA2=1
                ;;
            *"IE: WPA Version 1"*)
                WPA=1
                ;;
            *);;
        esac
    done; print_iwlist_env ;echo WIFI_COUNT=$count)
}
crack_wifi(){
    if [ "$4" == off ];then
        encr=open
    elif [ "$5" -eq 1 ]; then
        encr=psk
    elif [ "$6" -eq 1 ]; then
        encr=psk2
    elif [ "$4" == on ]; then
        encr=wep
    fi
    for hack in $(find /usr/lib/autowifi/ -type f); do
        key=$($hack "$@");
        ret=$?
        if [ $ret -eq 0 ];then
            connect_wifi "$3" "$1" $encr "$key"
            sleep 20
            if check_gateway; then
                (cat /etc/autowifi/wifi_keys | grep -v "$1|$2|" ; echo "$1|$2|$key" ) | sort | uniq  > /etc/autowifi/wifi_keys2
                mv /etc/autowifi/wifi_keys2 /etc/autowifi/wifi_keys
                echo "yay gateway"
                check_internet && return 0
            fi
        fi
    done
}
check_gateway(){
    ping -c 1 -w 5 $(ip route | awk '/default/{print $3}')
}
check_internet(){
    wget -O- --spider http://google.de/index.html
}
loop_over_networks(){
    . /tmp/${wifi}.scan
    for i in `seq 1 $WIFI_COUNT`; do
        eval grep -q \${MAC_${i}} /etc/autowifi/blacklist && continue
        eval crack_wifi "\${ESSID_${i}}" \${MAC_${i}} \${CHANNEL_${i}} \${ENCRYPTION_${i}} \${WPA_${i}} \${WPA2_${i}}
    done
}

iwlist_scan > /tmp/${wifi}.scan
loop_over_networks

while sleep 60; do
    if ! check_internet; then
        iwlist_scan > /tmp/${wifi}.scan
        loop_over_networks
    fi
done