#!/bin/sh
### BEGIN INIT INFO
# Provides:          wifi support
# Required-Start:    --
# Required-Stop:     --
# Should-Start:      ifupdown
# Should-Stop:       ifupdown
# Default-Start:     S
# Default-Stop:      0 6
# Short-Description: Raise network interfaces.
### END INIT INFO


. /etc/barix-wifiman.conf

say()
{
    echo "$1"
    logger -t "wifiman" "$1"
}

uci_get()
{
    uci get -q "$1"
}

WLAN=wlan0

SSID=$(uci_get "network.$WLAN.ssid")
PSK=$(uci_get "network.$WLAN.psk")
SECURITY=$(uci_get "network.$WLAN.security")

if [ -z "$SSID" ]; then
    say "$WLAN is not configured. Exit."
    exit 0
fi
    
if [ "$SECURITY" != "NONE" -a -z "$PSK" ]; then
    say "$WLAN:Security is set to '$SECURITY' but no PSK is set. Aborting."
    exit 1
fi

IF_DIR=/sys/class/net/$WLAN

udevadm trigger --subsystem-match=usb --action=add
udevadm trigger --subsystem-match=net --action=add 
sleep 1

while [ ! -d $IF_DIR ]; do
    sleep 10
done


DRIVER=wext
DRIVER_FILE=/etc/wpa_supplicant/driver.$WLAN
if [ -f $DRIVER_FILE ]; then
    DRIVER_STRING=$(cat $DRIVER_FILE)
    case "$DRIVER_STRING" in
    wext)
        say "Selected driver for $WLAN: wext"
        DRIVER=wext
        ;;
    
    nl80211)
        say "Selected driver for $WLAN: nl80211"
        DRIVER=nl80211
        ;;
    
    "")
        say "No driver set for $WLAN. Using default(wext)"
        DRIVER=wext
        ;;
    *)
        say "Unsupported driver for $WLAN: '$DRIVER_STRING'. Using default (wext)"
        DRIVER=wext
        ;;
    esac
fi
  
WPACONF=$CONF_DIR/$WLAN.conf
echo "ctrl_interface=/var/run/wpa_supplicant" > $WPACONF
echo "ap_scan=1" >> $WPACONF
echo "sched_scan_plans=10" >> $WPACONF
echo "network={" >> $WPACONF
echo "    ssid=\"$SSID\"" >> $WPACONF
case "$SECURITY" in
WPA)
    echo "    key_mgmt=WPA-PSK" >> $WPACONF
    echo "    psk=$PSK" >> $WPACONF
    echo "    bgscan=\"none\"" >> $WPACONF
    ;;
        
NONE)
    echo "    key_mgmt=NONE" >> $WPACONF
    ;;
        
*)
    say "$WLAN: Unknown security mode - '$SECURITY'. Aborting"
    exit 1
esac
    
echo "}" >> $WPACONF

wpa_supplicant -B -i $WLAN -c $WPACONF -P /var/run/wpw_supplicant.$WLAN.pid -D $DRIVER -s


IF_DIR=/sys/class/net/$WLAN

while true; do

    say "Waiting for $WLAN..."

    while [ ! -d $IF_DIR ]; do
        sleep 10
    done
    
    IF_INDEX=$(cat $IF_DIR/ifindex)

    say "$WLAN detected. Bringing up interface"

    CNT=0
    while ! ifup $WLAN && [ "$CNT" -lt "10" ] ; do
        CNT=$((CNT+1))
        say "$WLAN: failed to configure (attempt=$CNT)"
        sleep 5
    done
    
    if [ "$CNT" -lt "10" ]; then
        say "$WLAN: Successfully configured"
    else
        say "$WLAN: failed configuration after $CNT attempts. Giving up."
        exit 1
    fi
    
    while [ "$(cat $IF_DIR/ifindex)" == "$IF_INDEX" ]; do
        if ! wpa_cli status | grep -q '^wpa_state=COMPLETED'; then
	    wpa_cli scan
	fi
        sleep 30
    done
    
    # ifindex changed or the interface was unplugged.
    # Either way, deconfigure the interface. It's unusable now
    say "$WLAN: interface changed or removed. Bringing down..."
    ifdown -f $WLAN
    sleep 5
done
    
        
