# ! /bin/sh
# write by w

TOPDIR=/ubi/local/apps/network
TMPDIR=/run/network

[ -f $TOPDIR/network_functions ] && . $TOPDIR/network_functions

if [ ! $# ]; then
    echo "Please specify a configuration file...\n"
    exit 1
fi

if [ -f $1 ]; then
    . $1 
else
    echo "$1 file does not exists...\n"
    exit 1
fi

if [ -z $DEVICE ]; then
    echo "DEV not exists...\n"
    exit 1
fi

remove_all_network()
{
    wpa_cli -i${DEVICE} disconnect
    for i in `wpa_cli list_networks | grep ^[0-9] | cut -f 1`; do wpa_cli -i${DEVICE} remove_network $i; done
}

wifi_connect()
{
    remove_all_network
    wpa_cli -i${DEVICE} add_network
    echo "STA_MODE SSID=$WIFI_SSID ENCRYPT_TYPE=$ENCRYPT_TYPE PSW=$WIFI_PASSWD"
    case $ENCRYPT_TYPE in  
    OPEN)
        wpa_cli -i${DEVICE} set_network 0 auth_alg OPEN
        wpa_cli -i${DEVICE} set_network 0 key_mgmt NONE
    ;;
    WEP)
        wpa_cli -i${DEVICE} set_network 0 auth_alg OPEN
        wpa_cli -i${DEVICE} set_network 0 key_mgmt NONE
        wpa_cli -i${DEVICE} set_network 0 wep_key0 $WIFI_PASSWD 
    ;;
        WPA-PSK)
            wpa_cli -i${DEVICE} set_network 0 auth_alg OPEN
            wpa_cli -i${DEVICE} set_network 0 key_mgmt WPA-PSK
            if [ ${#WIFI_PASSWD} == 64 ]; then
                wpa_cli -i${DEVICE} set_network 0 psk $WIFI_PASSWD
            else
                wpa_cli -i${DEVICE} set_network 0 psk '"'$WIFI_PASSWD'"'
            fi
            wpa_cli -i${DEVICE} set_network 0 pairwise CCMP TKIP
            wpa_cli -i${DEVICE} set_network 0 group CCMP TKIP
        ;;  
        WPA2-PSK)
            wpa_cli -i${DEVICE} set_network 0 auth_alg OPEN
            wpa_cli -i${DEVICE} set_network 0 key_mgmt WPA-PSK
            if [ ${#WIFI_PASSWD} == 64 ]; then
                wpa_cli -i${DEVICE} set_network 0 psk $WIFI_PASSWD
            else
                wpa_cli -i${DEVICE} set_network 0 psk '"'$WIFI_PASSWD'"'
            fi
            wpa_cli -i${DEVICE} set_network 0 proto RSN  
        ;;  
        *)
        exit 1 ;;
    esac

    wpa_cli -i${DEVICE} set_network 0 mode 0
    wpa_cli -i${DEVICE} set_network 0 ssid '"'${WIFI_SSID}'"'

    wpa_cli -i${DEVICE} select_network 0
    wpa_cli -i${DEVICE} enable_network 0
    wpa_cli -i${DEVICE} reassociate
    wpa_cli -i${DEVICE} status
    iw ${DEVICE} link
}

load_wifi_module()
{
    local hostap_pid  wifi_file 

    kill_process "hostapd"
    kill_process "wpa_supplicant"
    ifconfig ${DEVICE} down

#    insmod /opt/brcmutil.ko
#    insmod /opt/brcmfmac.ko

    if [ $ENABLE != true ]; then
        echo "wlan is disabled!"
        exit 1
    fi

    sleep 2 
    ifconfig ${DEVICE} up
    wifi_file="$TMPDIR/ifcfg-${DEVICE}-wireless"
    wifi_conf="$TMPDIR/hostapd-${DEVICE}.conf"

    if [ -f $TOPDIR/hostapd.conf ]; then
        . $wifi_file

        if $(echo "$WIFI_MODE" | fgrep -wq -e "AP" -e "STA") ; then 
            echo wifimode $WIFI_MODE
        fi

        if [ ${WIFI_MODE} = "AP" ] ; then
            cp $TOPDIR/hostapd.conf $wifi_conf
            sed -i "s/^ssid[ \t]*=.*/ssid=${WIFI_SSID}/g" $wifi_conf
            sed -i "s/^channel]*=.*/channel=${CHANNEL}/g" $wifi_conf

            # 根据加密方式选择不同的配置
            case ${ENCRYPT_TYPE} in  
            OPEN)
                ;;  
            WEP)
                echo "wep_default_key=0" >> $wifi_conf
                echo "wep_key0=${WIFI_PASSWD}" >> $wifi_conf
                ;;
                WPA-PSK)
                    echo "wpa=1" >> $wifi_conf
                    echo "wpa_key_mgmt=WPA-PSK" >> $wifi_conf
                    echo "wpa_pairwise=TKIP CCMP" >> $wifi_conf
                    if [ ${#WIFI_PASSWD} == 64 ]; then
                        echo "wpa_psk=${WIFI_PASSWD}" >> $wifi_conf
                    else
                        echo "wpa_passphrase=${WIFI_PASSWD}" >> $wifi_conf
                    fi
                    ;;
                WPA2-PSK)
                    echo "wpa=2" >> $wifi_conf
                    echo "wpa_key_mgmt=WPA-PSK" >> $wifi_conf
                    echo "wpa_pairwise=TKIP CCMP" >> $wifi_conf
                    if [ ${#WIFI_PASSWD} == 64 ]; then
                        echo "wpa_psk=${WIFI_PASSWD}" >> $wifi_conf
                    else
                        echo "wpa_passphrase=${WIFI_PASSWD}" >> $wifi_conf
                    fi
                    ;;
                *) 
                echo "Encrypt type not support! Type = ${ENCRYPT_TYPE}"
                exit 1 ;;
            esac
            hostapd $wifi_conf &
        elif [ ${WIFI_MODE} = "STA" ] ; then
            wpa_supplicant -Dnl80211 -iwlan0 -c /etc/wpa_supplicant.conf -B
            wifi_connect
        else
            exit 1
        fi
    fi
}

load()
{
    load_wifi_module
    sleep 5
	if [ -z "$(ps | grep "wifi_fix.sh" | grep -v grep)" ]
	then
		$TOPDIR/wifi_fix.sh &
	fi
}

unload()
{
    kill_process "hostapd"
    kill_process "wpa_supplicant"
    ifconfig $DEVICE down
}

case $2 in  
    start)
        load
    ;;
    stop)
        unload
    ;;
    restart)
        unload
        load
    ;;
    *)
    echo "Usage: /etc/init.d/ifup.sh {start|stop|restart}"  
    exit 1 ;;
esac
