#!/bin/bash IWCONF=/sbin/iwconfig IWLIST=/sbin/iwlist CONFDIR=/etc/network/autowifi function apply () { echo "$IWCONF" "$@"; "$IWCONF" "$@" } function reset_ipw2200 () { # the ipw2200 scanning for open networks doesn't work properly # if the _wep module is loaded. actually, the ipw2200 is flaky # generally so whack it upside the head once or twice before we # start: It needs a bit of abuse to work right. echo "removing ipw2200 modules (if any)"; (rmmod ipw2200 2> /dev/null || true); (rmmod iee80211_crypt_wep 2> /dev/null || true); (rmmod iee80211_crypt 2> /dev/null || true); (rmmod iee80211 2> /dev/null || true); echo "reloading ipw200"; modprobe ipw2200 antenna=2 hwcrypto=0; echo -n "ACPI suspending $IFACE ."; echo -n 3 > /sys/class/net/$IFACE/device/power/state echo -n "."; sleep 1; echo -n ". resuming ." echo -n 0 > /sys/class/net/$IFACE/device/power/state echo -n "."; sleep 3; echo ". Up and Running"; } if [ "x$IFACE" = "xeth1" ]; then echo "processing eth1"; else exit 0; fi; reset_ipw2200; ifconfig eth1 up; $IWCONF $IFACE ap any; $IWCONF $IFACE essid any; $IWCONF $IFACE key off; $IWCONF $IFACE channel 0; CONFIGURED=""; FIRST_MAC=""; FIRST_ESS=""; PREV_MAC=""; PREV_ESS=""; while read; do SETTING=$( echo -n "$REPLY" | sed -e 's/^\(\(.* - \)\|^ \+\)\([^:]\+\).*/\3/; ' ); VALUE=$(echo -n "$REPLY"|sed -e 's/^[^:]\+: *//; s/ *$//; s/"\(.*\)"/\1/'); if [ "x$SETTING" = "xEncryption key" ]; then echo "$SETTING:'$VALUE'"; if [ "x$VALUE" = "xoff" ]; then echo "hm... key is off. checking $PREV_MAC"; if [ "x$PREV_ESS" = "x" ]; then echo "Open network $PREV_MAC has a hidden ESSID, skipping..." else FIRST_MAC=${FIRST_MAC:-$PREV_MAC} FIRST_ESS=${FIRST_ESS:-$PREV_ESS} fi; fi; fi; if [ "x$SETTING" = "xAddress" ]; then PREV_MAC="$VALUE" SPEC="$CONFDIR/MAC:$VALUE"; elif [ "x$SETTING" = "xESSID" ]; then PREV_ESS="$VALUE"; SPEC="$CONFDIR/ESSID:$VALUE"; else SPEC="" continue; fi; echo "checking for $SPEC"; if [ -r "$SPEC" ]; then CONFIGURED=1; apply $IFACE essid any; apply $IFACE ap any; apply $IFACE channel 0; apply $IFACE key off; FILE=${SPEC##*/}; TYPE=${FILE%:*}; WHAT=${FILE#*:}; echo "Reading $TYPE config ($WHAT)"; if [ "x$TYPE" = "xESSID" ]; then apply $IFACE essid "$WHAT"; fi; if [ "x$TYPE" = "xMAC" ]; then apply $IFACE ap "$WHAT"; fi; egrep -v '^#' "$SPEC" | while read option value; do apply $IFACE $option $value done; break; fi; done < <($IWLIST $IFACE scan | grep :) if [ "x$CONFIGURED" = "x" ]; then if [ "x$FIRST_ESS" = "x" ]; then echo "no config and no open networks - wild stab in the dark time"; apply $IFACE essid any; apply $IFACE ap any; apply $IFACE channel 0; apply $IFACE key off; if [ -r "$CONFDIR/default" ]; then egrep -v '^#' "$CONFDIR/default" | while read option value; do apply $IFACE $option $value done; fi; else echo "no config, using open network $FIRST_ESS"; apply $IFACE essid "$FIRST_ESS"; apply $IFACE ap "$FIRST_MAC"; apply $IFACE channel 0; apply $IFACE key off; fi; fi;