#!/sbin/runscript

PPP=$(which pppd)
ADICTRL=$(which adictrl)
UMOUNT=$(which umount)
IFCONFIG=$(which ifconfig)
GREP=$(which grep)
LSMOD=$(which lsmod)
MAX_LOOP=60
SHOWSTAT=$(which showstat)
DHCPCD=$(which dhcpcd)
ROUTE=$(which route)

check_pre_run () {
    # Check module is loaded
    (${LSMOD} | ${GREP} -q adiusbadsl); eend $? "Module adiusbadsl is not loaded." || return 1

    # Check for adictrl 
    [ -x ${ADICTRL} ] ; eend $? "Cannot find adictrl" || return 1

    # And showstat
    [ -x ${SHOWSTAT} ] ; eend $? "Cannot find showstat" || return 1    
    
    # Check for presence of firmware
    [ "${FIRMWARE:-set}" != set ] ; eend $? "Please define FIRMWARE in /etc/conf.d/eagle-adsl" || return 1
    [ -f ${FIRMWARE} ]  ; eend $? "Can't find FIRMWARE file ${FIRMWARE}" || return 1

    # And options
    [ "${OPTIONS:-set}" != set ] ; eend $? "Please define OPTIONS in /etc/conf.d/eagle-adsl" || return 1
    [ -f ${OPTIONS} ] ; eend $? "Can't find OPTIONS file ${OPTIONS}" || return 1

    # And DSP
    [ "${DSP:-set}" != set ] ; eend $? "Please define DSP in /etc/conf.d/eagle-adsl" || return 1
    [ -f ${DSP} ] ; eend $? "Can't find DSP file ${DSP}" || return 1

    # And synchro timeout
    [ "${SYNCHRO_TIMEOUT:-set}" != set ] ; eend $? "Please define SYNCHRO_TIMEOUT in /etc/conf.d/eagle-adsl" || return 1

    # Check usbdevfs is up and running
    ( ${MOUNT} | ${GREP} -q usbdevfs) || ${MOUNT} none /proc/bus/usb -t usbdevfs >/dev/null 2>&1

    return 0
}


check_ppp () {

    # Check for PPP
    [ ! -z ${PPP} ] ; eend $? "failed to find ppp" || return 1

    # Check for PEER file
    [ "${PEER:-set}" != set ] ; eend $? "Please define \$PEER in /etc/conf.d/eagle-adsl" || return 1
    [ -f /etc/ppp/peers/${PEER} ]  ; eend $? "Failed to find peer ${PEER} configuration" || return 1

    # Check for IFCONFIG
    [ -x ${IFCONFIG} ]; eend $? "Failed to find 'ifconfig'" || return 1
}

check_dhcpcd () {

    # check for DHCPCD
    [ ! -z ${DHCPCD} ] ; eend $? "failed to find dhcpcd" || return 1
    
    # Check for IFCONFIG
    [ -x ${IFCONFIG} ]; eend $? "Failed to find 'ifconfig'" || return 1

    # Check for ROUTE
    [ -x ${ROUTE} ]; eend $? "Failed to find 'route'" || return 1

}

launch_pppd () {
    local RETURNED=1
    local LOOP=0

    einfo "Launching PPP daemon ..."

    # Get interface
    export EAGLE_IF=`${ADICTRL} -i`

    # Set network interface
    /sbin/ifconfig ${EAGLE_IF} 192.168.60.30 netmask 255.255.255.0 up

    start-stop-daemon --start --exec ${PPP} call ${PEER} >/dev/null 2>&1

    # Wait for connection to be established
    while [ ${RETURNED} -ne 0 ] && [ ${LOOP} -le ${MAX_LOOP} ] ; do
	let LOOP=LOOP+3
	sleep 1
	${IFCONFIG} | grep -q 'ppp'
	RETURNED=$?
    done
    
    if [ ${LOOP} -gt ${MAX_LOOP} ] && [ ${RETURNED} -ne 0 ] ; then
	return 1
    else
	return 0
    fi
}

stop_ppp () {

    if [ -f /var/run/ppp0.pid ]
    then
	start-stop-daemon --stop --pidfile /var/run/ppp0.pid pppd    
	return 0
    else
	return 1
    fi

}


launch_dhcpcd () {
    # Get interface
    export EAGLE_IF=`${ADICTRL} -i`

    # Launch dhcpcd
    start-stop-daemon --start --exec ${DHCPCD} ${EAGLE_IF} >/dev/null 2>&1
    ${ROUTE} add default ${EAGLE_IF}

}


stop_dhcpd () {
    # Get interface
    export EAGLE_IF=`${ADICTRL} -i`

    # Stop dhcpcd
    start-stop-daemon --stop --quiet --pidfile /var/run/dhcpcd-${EAGLE_IF}.pid


}
modem_is_operational () {
    # To be operational, firmware should be loaded. This mean, /proc/driver/adimodem
    # directory is not empty
    if ls /proc/driver/adimodem/* 1>/dev/null 2>&1
    then
	# Check "Modem is operational"
	${SHOWSTAT} | grep -q "Modem is operational"
    else
	return 1
    fi
}
	



load_and_sync () {
    # Load firmware /DSP/ etc only if the modem is not yet operational
    if modem_is_operational 
    then
	einfo "Modem already operational"
    else
	einfo "Loading firmware, DSP and trying to sync ..."
	${ADICTRL} -w -f ${FIRMWARE} -o ${OPTIONS} -d ${DSP} -s ${SYNCHRO_TIMEOUT} 1>/dev/null 2>&1
    fi

    return $?
}

depend () {
    after *
}


start () {
    ebegin "Start Eagle-adsl ..."
    
    # Check everything needed is in place
    check_pre_run ; eend $? "Pre-requesites check failed" || return 1

    # Let's try to upload firmware/dsp and do synchro
    load_and_sync ; eend $? "Failed to load or sync" || return 1

    if [ ${ROUTEDIP} -eq 1 ] ;
    then
	# launching dhcpcd
	launch_dhcpcd ; eend $? "Failed to start dhcpcd daemon." || return 1
    else
        # launching ppp daemon
	launch_pppd ; eend $? "Failed to start pppd daemon." || return 1
    fi

    # Cool .. we're plugged ..
    return 0
}
    
stop () {
    export EAGLE_IF=`${ADICTRL} -i`

    ebegin "Shutting down Eagle-adsl..."

    if [ ${ROUTEDIP} -eq 1 ] ;
    then
	stop_dhcpd ; eend $? "Failed to stop 'dhcpcd'"
    else
	stop_ppp ; eend $? "Failed to stop 'pppd'"
    fi

    ifconfig ${EAGLE_IF} down 1>/dev/null 2>&1


}
    

    
