#!/sbin/svc
# 
#  Copyright: ©2011–2015, Güralp Systems Ltd.
#  Author: Laurence Withers <lwithers@guralp.com>
#  License: GPLv3
#

INTRF=xxx

# get configuration file
CFGFILE="/etc/network/${INTRF}"
if [ ! -r "${CFGFILE}" ]
then
    rc_error "Cannot find configuration file for interface ${INTRF}"
    exit 1
fi
. "${CFGFILE}"

MYLISTING="${desc}"
CONTROL_GROUP="netconf"
MYVERSION="1.4"

. "/usr/lib/platinum/net_quickstatus.sh"
DHCPCCMD="/sbin/dhcpcd"



set_media() {
    # CMG-EAM: allow override via EEPROM
    if [ -e "/etc/conf.local/ethernet" ]
    then
        local v
        v="`varfget "/etc/conf.local/ethernet" "FORCE_SPEED_${INTRF}"`"
        if [ -n "${v}" -a "${v}" != "none" ]
        then
            media="${v}"
            logger -t "net.${INTRF}" "Speed override in EEPROM: ${media}"
        fi
    fi

    case "${media}" in
    Auto | None)
        ;;

    10baseT-FD)
        ethtool -s "${device}" speed 10 duplex full
        sleep 5
        ;;

    Auto10 | 10baseT-HD)
        ethtool -s "${device}" speed 10 duplex half
        sleep 5
        ;;

    100baseTx-FD)
        ethtool -s "${device}" speed 100 duplex full
        sleep 5
        ;;

    100baseTx-HD)
        ethtool -s "${device}" speed 100 duplex half
        sleep 5
        ;;

    *)
        rc_error "Warning: ignoring unknown media type $media"
        ;;
    esac
}



stop_interface() {
    # stop an interface no matter what -- kill dhcpcd, even if it's not
    # running, and forcefully flush routes and addresses
    ${DHCPCCMD} -k "${device}" > /dev/null 2>&1
    # Busybox's "ip route flush dev" has a bug and flushes all routes, so we
    # perform our own filter.
    #ip route flush dev "${device}"
    ip route list | sed -n -e "/dev ${device}/s/^/ip route delete /p" | sh
    ip addr flush dev "${device}"

    # clear any nameservers bound to this interface
    resolvconf -f -d "${device}"

    [ "${device::4}" = "vlan" ] && vconfig rem "${device}" > /dev/null 2>&1
}



start_dhcpcd() {
    local dhcpcd_pid="/var/run/dhcpcd-${device}.pid"

    # Create the lease storage dir if missing
    mkdir -p /var/lib/dhcpcd

    # run dhcpcd, which will create its own PID file and background itself
    rm -f "${dhcpcd_pid}"
    ${DHCPCCMD} --quiet --background ${dhcpcd_args} ${device}

    # check for the PID file
    if [ ! -e "${dhcpcd_pid}" ]
    then
        rc_error "dhcpcd for ${device} not running"
        return 1
    fi

    # copy across the PID file for svc_monitor
    cp "${dhcpcd_pid}" "/var/run/svc/net_${device}.pid"
    rm -f "/var/run/svc/net_${device}.nopid"
    return 0
}



start() {
    local route_args
    local i
    local x

    RETVAL=0

    # force shutdown of whatever was configured on interface before.
    # Lose complaints from ip about missing devices (we do it here rather than
    # in stop_interface as they may be useful when shutting down what should be
    # a running interface).
    stop_interface > /dev/null 2>&1

    # deal with disabled interfaces at this point
    if [ "${bootproto}" == "disabled" ]
    then
        ip link set down dev "${device}"
        return $?
    fi

    # if this is a VLAN attach it to the host interface
    [ "${device::4}" = "vlan" ] && vconfig add "${vlanhost}" "${vlantag}"

    # possibly set up the link
    # mii-tool requires the interface to be up, and DHCP might override the MTU
    ip link set up dev "${device}"
    sleep 1

    if [ -n "${mtu}" ]
    then
        ip link set mtu "${mtu}" dev "${device}"
        [ $? -eq 0 ] || RETVAL=$?
    fi

    case "$device" in
    eth*) set_media ;;
    *) ;;
    esac

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

    # run DHCP
    elif [ "${bootproto}" == "dhcp" ]
    then
        start_dhcpcd
        RETVAL=$?
    
    # static addressing
    elif [ "${bootproto}" == "static" ]
    then
        if [ -z "${default_address_ip}" ]
        then
            rc_error "No address associated with device ${device}, in static mode."
            return 1
        fi

        # Set address
        cfg="add ${default_address_ip} dev ${device} ${default_address_args}"
        [ -n "${default_address_broadcast}" ] && cfg="${cfg} broadcast ${default_address_broadcast}"
        ip addr ${cfg}
        [ $? -eq 0 ] || RETVAL=$?

        # Set nameservers
        if [ -n "${default_nameserver0}" -o -n "${default_nameserver1}" ]
        then
            new_resolv="`mktemp`"
            echo "# Generated by initscript for ${INTRF}" > "${new_resolv}"
            [ -n "${default_nameserver0}" ] && echo "nameserver ${default_nameserver0}" >> "${new_resolv}"
            [ -n "${default_nameserver1}" ] && echo "nameserver ${default_nameserver1}" >> "${new_resolv}"
            resolvconf -a "${INTRF}" < "${new_resolv}"
            rm "${new_resolv}"
        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 ${device} ${ARGS}"
	[ -n "${BCAST}" ] && cfg="${cfg} broadcast ${BCAST}"

	ip addr ${cfg}
	[ $? -eq 0 ] || RETVAL=$?

	i="$(expr "${i}" + 1)"
    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}
	[ $? -eq 0 ] || RETVAL=$?

	i="$(expr "${i}" + 1)"
    done

    net_quickstatus_start "${INTRF}"

    return $RETVAL
}



stop() {
    stop_interface
    ip link set down dev "${device}"
    net_quickstatus_stop "${INTRF}"
}



# If it looks like we crashed delete the suspect lease file just in case
stopped() {
    svc_stop

    rm -f "/var/lib/dhcpcd-$device.info"
    rm -f "/var/lib/dhcpcd/dhcpcd-$device.lease"

    svc_start
}



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