Wifiweasel
From Openmoko
script to Auto connect to Open 802.11 wireless AP's
Contents |
wifiweasel
wifiweasel v2 - once run this script takes control of the wireless interface, then detects and connects to strongest open wifi AP in the vicinity. Subsequently it checks the connectivity every X seconds. If the connection fails, the whole process repeats itself; this requires the timeout script below (needs to be tested with multiple AP's - might have an iwconfig essid glitch).
#!/bin/sh ##### WifiWeasel ###### Ver. 2 ########################### 08-07-22 #/var/wifi/hacker/kd8ikt### # OMG i'm programming now!# ########################### ###we.trekbeyond.org####### ##################### #install /usr/bin/wifiweasel # #Variables IFACE=eth0 DHCP_TIMEOUT=3 # requires /usr/bin/timeout CHECK_NET_TIMER=15 #secs TEMPDIR=/mnt/wifiweasel/ # #Functions # #(dont touch unless you #know wtf your doing # #### Scan Funk Func_iwlist_open () { iwlist $IFACE scanning | awk -F '[ :=]+' '/(ESS|Freq|Qual)/{ printf $3" " } /Encr/{ print $4 }' \ | sort -k4 -k3nr |grep -m1 off \ |awk '{print $1}' > /tmp/wifiweasel/scan cat $TEMPDIR/scan |grep '"' -m1 > $TEMPDIR/scan1 sed /\"/s/\"//g $TEMPDIR/scan1 > $TEMPDIR/ESSID echo echo Using ESSID cat $TEMPDIR/ESSID echo } #### interface down Funk Func_ifconfig_down () { killall udhcpc ifconfig $IFACE down } #### iface up Funk Func_ifconfig_up () { iwconfig $IFACE essid `cat $TEMPDIR/ESSID` } #### Connection check Funk Func_chk_net () { echo checking... ping -w 2 -c1 $dns if [ $=0 ];then ERROR=0; echo; echo Online! W00T ; echo ; sleep $CHECK_NET_TIMER ; Func_chk_net ; fi #W00T if [ $=1 ] ; then ERROR=1 ;echo ;echo FAIL!\ ... Searching ; echo ; Func_Main ; fi } #### Main loop Funk Func_MAIN () { while [ ERROR=1 ] ; do Func_ifconfig_down ; Func_iwlist_open Func_ifconfig_up ; timeout $DHCP udhcpc $IFACE ; export dns=`cat /etc/resolv.conf |grep name |awk '{print $2}'` Func_chk_net ; Func_MAIN ; done; } #Prep mkdir $TEMPDIR touch $TEMPDIR/scan touch $TEMPDIR/scan1 touch $TEMPDIR/ESSID # RunProgram Func_ifconfig_down Func_iwlist_open Func_ifconfig_up timeout $DHCP udhcpc $IFACE export dns=`cat /etc/resolv.conf |grep name |awk '{print $2}'` Func_chk_net Func_MAIN echo This is the end, my only friend the end Done; #actually i dont think it ever ends but i'm done writing it #####################EOF#EOF#EOF#EOF#EOF#EOF#EOF#EOF#EOF#########
timeout
Added a timeout script to keep udhcpc from hanging up everything. As we all know, dhcp should not take 60sec; if it's not obtained a reply or a lease within a few seconds, you are likely not going to obtain an IP (perhaps due to range issues, mac filtering, etc).
INSTALL /usr/bin/timeout
#Newsgroups: comp.unix.admin,comp.unix.solaris,comp.unix.shell #From: gwc@root.co.uk (Geoff Clare) #Subject: Re: timeout -t <sec> <unix command> (Re: How to give rsh a shorter timeout?) #Message-ID: <EoBxrs.223@root.co.uk> #Date: Fri, 13 Feb 1998 18:23:52 GMT # # Conversion to bash v2 syntax done by Chet Ramey <chet@po.cwru.edu # UNTESTED # prog=${0##*/} usage="usage: $prog [-signal] [timeout] [:interval] [+delay] [--] <command>" SIG=-TERM # default signal sent to the process when the timer expires timeout=60 # default timeout interval=15 # default interval between checks if the process is still alive delay=2 # default delay between posting the given signal and # destroying the process (kill -KILL) while : do case $1 in --) shift; break ;; -*) SIG=$1 ;; [0-9]*) timeout=$1 ;; :*) EXPR='..\(.*\)' ; interval=`expr x"$1" : "$EXPR"` ;; +*) EXPR='..\(.*\)' ; delay=`expr x"$1" : "$EXPR"` ;; *) break ;; esac shift done case $# in 0) echo "$prog: $usage" >&2 ; exit 2 ;; esac ( for t in $timeout $delay do while (( $t > $interval )) do sleep $interval kill -0 $$ || exit t=$(( $t - $interval )) done sleep $t kill $SIG $$ && kill -0 $$ || exit SIG=-KILL done ) 2> /dev/null & exec "$@"
comments
not sure but i think one has to make the /tmp/ files manually
sandbox
iwscan perl
#!/usr/bin/perl # Tim Osburn - tim@osburn.com # # install perl $iwlist = "/sbin/iwlist eth0 scanning"; open scan, "$iwlist |"; while (<scan>) { if (/^\s+Cell (\S+) - Address: (\S+)/) { $CELL=$1; $ADDRESS=$2; # print "$1 $2"; $INLOOP=1; } if (/^\s+ESSID:(\S+)/) { $ESSID=$1; print " $1"; } if (/^\s+Frequency:\S+ \S+ \(Channel (\S+)\)/) { $CHAN=$1; print " $1"; } if (/^\s+Quality=\S+\s+Signal level=(\S+).*/) { $SIGNAL=$1; print " $1"; } if (/^\s+Encryption key:(\S+)/) { $ENCRYPTION=$1; print " $1\n"; } } close scan;
produces output in the form of "essid" channel signal_strength encryption_status
"ESSID_NAME1" 1 -82 on
"ESSID_NAME2" 1 -49 off