#!/bin/bash
#
#  Called whenever wpa_supplicant connects or disconnects from an access point.
#  This script is responsible for setting up the IP networking for the interface
#  on connect and for shutting it down on disconnect.
#

INTRF="$1"
ACTION="$2"
LOCKFILE="/var/lock/${INTRF}.lock"
NETCONFIG="/etc/network/${INTRF}/ip.${WPA_ID_STR}"

DHCPCCMD="/sbin/dhcpcd"
PIDFILE="/var/run/dhcpcd-${INTRF}.pid"

source "/usr/lib/platinum/net_quickstatus.sh"



dhcp_client_running() {
    local pid=""

    [ -r "${PIDFILE}" ] && pid=$(< "${PIDFILE}")
    [ -z "$pid" ] && return 1
    [ "$(readlink "/proc/$pid/exe")" == "${DHCPCCMD}" ]
}



start_dhcpcd() {
    if dhcp_client_running
    then
        # Just tell the existing client to rebind the lease
        ${DHCPCCMD} -n ${INTRF}
    else
        # Create the lease storage dir if missing
        mkdir -p /var/lib/dhcpcd

        # run dhcpcd, which will create its own PID file and background itself
        ${DHCPCCMD} --quiet --background ${dhcpcd_args} ${INTRF}
    fi

    # check for the PID file
    if dhcp_client_running
    then
        : All okay
    else
        logger -s -t "${INTRF}" "dhcpcd for ${INTRF} not running"
    fi
}



wlan_start() {
    local route_args i x

    if [ ! -f "${NETCONFIG}" ]
    then
        logger -s -t "${INTRF}" "Unable to find config file."
        return 1
    fi

    source "${NETCONFIG}"

    [ -n "${mtu}" ] && ip link set mtu "${mtu}"

    # bring device up but don't assign an address
    if [ "${bootproto}" == "enabled" ]
    then
        ip link set up dev "${INTRF}"
        return $?

    # run DHCP
    elif [ "${bootproto}" == "dhcp" ]
    then
        start_dhcpcd

    # static addressing
    elif [ "${bootproto}" == "static" ]
    then
        if [ -z "${default_address_ip}" ]
        then
            logger -s -t "${INTRF}" "No address associated with device ${INTRF} in static mode."
            return 1
        fi

        # Set address
        cfg="add ${default_address_ip} dev ${INTRF} ${default_address_args}"
        [ -n "${default_address_broadcast}" ] && cfg="${cfg} broadcast ${default_address_broadcast}"
        ip addr ${cfg}

        # Set nameservers
        if [ -n "${default_nameserver0}" -o -n "${default_nameserver1}" ]
        then
            echo "# Generated by initscript for $INTRF" > "/etc/resolv.conf"
            [ -n "${default_nameserver0}" ] && echo "nameserver ${default_nameserver0}" >> "/etc/resolv.conf"
            [ -n "${default_nameserver1}" ] && echo "nameserver ${default_nameserver1}" >> "/etc/resolv.conf"
        fi
    fi

    # Add IP aliases
    i=0
    while true
    do
        cfg=""
        eval ADDR=\$alias_address_ip${i}
        [ -z "${ADDR}" ] && break

        eval BCAST=\$alias_address_broadcast${i}
        eval ARGS=\$alias_address_args${i}
        cfg="add ${ADDR} dev ${INTRF} ${ARGS}"
        [ -n "${BCAST}" ] && cfg="${cfg} broadcast ${BCAST}"

        ip addr ${cfg}
        ((++i))
    done

    # Set default route, if provided
    if [ "${bootproto}" == "static" -a -n "${default_route_via}" ]
    then
        cfg="add default via ${default_route_via} ${default_route_args}"
        ip route ${cfg}
    fi

    # Add other routes
    i=0
    while true
    do
        cfg=""
        eval DESTN=\$route_destn${i}
        [ -z "${DESTN}" ] && break

        eval TYPE=\$route_type${i}
        eval VIA=\$route_via${i}
        eval ARGS=\$route_args${i}
        cfg="add ${TYPE} ${DESTN} ${ARGS}"
        [ -n "${VIA}" ] && cfg="${cfg} via ${VIA}"

        ip route ${cfg}
        ((++i))
    done
}



if [ "${ACTION}" == "CONNECTED" ]
then
    timeout="xxxxxx"
    while [ -e "${LOCKFILE}" ]
    do
        timeout="${timeout/x}"
        if [ -z "${timeout}" ]
        then
            echo "Timeout waiting for lock, proceeding anyway"
            rm -f "${LOCKFILE}"
            break
        fi
        echo "Waiting for lock ${LOCKFILE}..."
        sleep 1
    done
    wlan_start
    net_quickstatus_start "${INTRF}"

elif [ "${ACTION}" == "DISCONNECTED" ]
then
    touch "${LOCKFILE}"
    rm -f "${LOCKFILE}"
    net_quickstatus_stop "${INTRF}"
fi


# vim: ts=4:sw=4:expandtab:syntax=sh
