#! /bin/sh
#WIFI_2.0 Ian Daniher script extended by Delta on 26feb09

[ "$USER" != "root" ] && echo "Please run this script as ROOT" && exit 1

WIFILE=/home/delta/networks.csv
##ProfileName,ESSID,[WEPKey],[WPAConfLocation],[BSSID],Channel,[IP],[Gateway],[Netmask]
WIFACE=eth2
DNS1="000.00.000.000"
DNS2="000.00.000.001"

IWLIST=$(iwlist $WIFACE scan)

choose_profile(){
    echo -e "\nProfiles:\n---------"; i=1
    for line in $(cat $WIFILE | sed 1d); do
	PROF=$(echo "$line" | awk -F, '{print $1}')
	EID=$(echo "$line" | awk -F, '{print $2}')
	echo -ne "  $i. $PROF"; ((i++)); [ ! -z "$(echo "$IWLIST" | grep "$EID")" ] && echo " *" || echo ""
    done
    echo -e "  $i. OPEN NETWORKS"
    echo -ne "\nConnect to Number = "; read NUMBER
    [ $NUMBER -eq $i ] && PROFILE="OPEN_NETWORKS" || PROFILE=$(cat $WIFILE | sed -n $(( $NUMBER+1 ))p | awk -F, {'print $1'})
    [ "$PROFILE" == "" ] && echo "Invalid Option" && exit 1
}

ip_config(){
    if [ "$IP" == "dhcp" ] || [ "$IP" == "" ]; 
    then
	echo "Configuring with DHCP..."
    	dhclient -r $WIFACE&>/dev/null
    	dhclient $WIFACE&>/dev/null
    else
	ifconfig $WIFACE $IP gateway $GATEWAY netmask $NETMASK
	route add default gw $GATEWAY dev $WIFACE
	echo -e "nameserver $DNS1\nnameserver $DNS2" > /etc/resolv.conf
    fi
}

if [ ! -z "$1" ]; then
    if [ ! -z "$(cat $WIFILE | sed 1d | awk -F, '{print $1}' | grep "$1")" ]; then
	PROFILE=$1
    else
	echo "** The profile \"$1\" is not on the list **" && choose_profile
    fi
else
    choose_profile
fi

if [ "$PROFILE" == "OPEN_NETWORKS" ]; then
    OPEN_NETS_LIST=$(perl -e '
    @iwlist=split(/Cell/, `/sbin/iwlist $ARGV[0] scan`);
    foreach (@iwlist){
	$_=~s/[\n\r]+//g;
	if(/.*Address:\ ([:|\d|A-F]+).*ESSID:\"(.+)\".*\(Channel\ (\d+)\).*key:([a-z]+).*Quality[:|=](\d+)\/100.*/){
	    if($4 eq "off"){
		$essid="$2,$1,$3";
		$eqhash{$essid}=$5;
	    }
	}
    }
    $num=1;
    foreach $key ( sort { $eqhash{$b} <=> $eqhash{$a} } keys(%eqhash) ) {
	print "$num,$key\n"; $num++;
    }' $WIFACE)
    if [ ! -z "$OPEN_NETS_LIST" ]; then
	echo -e "\nOpen Networks ordered by Quality:\n---------------------------------"
	echo "$OPEN_NETS_LIST" | awk -F, {'print "  "$1". "$2'}
	echo -ne "\nConnect to Network Number = "; read NUMBER2
	chosen=$(echo "$OPEN_NETS_LIST" | grep "^${NUMBER2}," | awk -F, '{print $1","$2}')
    else
	echo "No open networks in range" && exit 1
    fi
    if [ ! -z "$chosen" ]; then
	ESSID=$(echo "$OPEN_NETS_LIST"|grep "$chosen" | awk -F, '{print $2}')
	BSSID=$(echo "$OPEN_NETS_LIST"|grep "$chosen" | awk -F, '{print $3}') && [ ! -z $BSSID ] && BSSID="any"
	CHANNEL=$(echo "$OPEN_NETS_LIST"|grep "$chosen" | awk -F, '{print $4}')
        WEP_KEY="off"
	IP="dhcp"
    else
	echo "Invalid Option" && exit 1 
    fi
else
    # Parsing of WIFILE for conf
    eval $(cat $WIFILE|sed 1d|grep $PROFILE|awk -F, '{\
    print "export ESSID=" $2;\
    print "export WEP_KEY=" $3;\
    print "export WPA_FILE=" $4;\
    print "export BSSID=" $5;\
    print "export CHANNEL=" $6;\
    print "export IP=" $7;\
    print "export GATEWAY=" $8;\
    print "export NETMASK=" $9}')
fi

[ -z "$ESSID" ] && echo "Invalid Option" && exit 1

[ -z "$(echo "$IWLIST" | grep "$ESSID")" ] && echo "Network $ESSID is not present" && exit 1
# This test will be completely reliable using $BSSID instead of $ESSID but it will not get on well with multi-ap essids

echo -e "\nConnecting to Network $ESSID..."

if [ ! -z $WEP_KEY ]; then
    iwconfig $WIFACE mode managed essid $ESSID ap any channel $CHANNEL key $WEP_KEY
    ip_config
    CUR_ESSID=$(/sbin/iwconfig $WIFACE|grep ESSID|awk '{print $4}'|sed s/ESSID://)
    LINK_QUAL=`iwconfig $WIFACE|grep Quality|awk '{print $2}'|sed -e "s/.*Quality=//"`
    CUR_IPADR=`/sbin/ifconfig $WIFACE|grep "inet addr"|sed -e "s/.*inet addr://"|sed -e "s/Bcast.*//"`
    echo "Done" 
    echo -e "$WIFACE: $CUR_ESSID $LINK_QUAL $CUR_IPADR\n"
fi

if [ ! -z $WPA_FILE ]; then
    echo $WPA_FILE
    ip_config
    wpa_supplicant -Dwext -i$WIFACE -c$WPA_FILE
fi

exit 0
