#!/bin/sh
########################################################################
# Begin /sbin/ifdown
#
# Description : Interface Down
#
# Authors     : DJ Lucas - dj@linuxfromscratch.org
#
# Version     : 00.02
#
########################################################################

. /lib/lsb/init-functions

function get_args()
    {
        if test -z "${1}" ; then
            showhelp
            exit 1
        fi

        while test -n "${1}" ; do
            case "${1}" in
                -c | --configfile)
                    check_arg $1 $2
                    CONFIGFILE="${2}"
                    shift 2
                ;;
                -f | --force)
                    FORCE="1"
                    shift 1
                ;;
                eth* | iw* | wlan*)
                     INTERFACE="${1}"
                     shift 1
                ;;
                -h | --help)
                     showhelp
                     exit 0
                ;;
                *)
                   showhelp
                   echo "ERROR: '${1}' unknown argument"
                   echo ""
                   exit 2
                ;;
            esac
        done
    }

function check_arg()
    {
        echo "${2}" | grep -v "^-" > /dev/null
        if [ -z "${?}" -o ! -n "${2}" ]; then
            echo "Error:  ${1} requires a valid argument."
            exit 2
        fi
    }

function showhelp()
    {
        echo ""
        echo "`/usr/bin/basename ${0}` brings down a valid network interface."
        echo ""
        echo "Options:"
        echo "          -c  --configfile    The path to an interface configuration file"
        echo "                              If no configuration file is given, all files"
        echo "                              listed in /etc/network/ifconfig.<int> will"
        echo "                              be processed, regarless of the value of ONBOOT"
        echo "          -f  --force         Flush all IPs and force the interface down."
        echo "          -h  --help          Show this help message and exit."
        echo ""
        echo "Examples:"
        echo "          `/usr/bin/basename ${0}` eth0 -c /run/network/ifconfig.eth0/ipv4"
        echo "          `/usr/bin/basename ${0}` eth0 --force -c /run/network/ifconfig.eth0/ipv4"
        echo "          `/usr/bin/basename ${0}` eth0 --force"
        echo "          `/usr/bin/basename ${0}` eth0"
        echo ""
        echo ""
    }

# Intialize empty variables so that the shell does not polute the script
CONFIGFILE=""
CONFIGDIR=""
INTERFACE=""
FORCE=""
failed=0

# Process command line arguments
get_args ${@}

# Handle common errors - No need to account for bootscripts, this should not
# happen during boot or shutdown.
if [ "${CONFIGFILE}x" != "x" -a ! -f "${CONFIGFILE}" ]; then
    echo "ERROR: ${CONFIGFILE} is not a valid network configuration file."
    echo ""
    exit 2
fi

if [ "${INTERFACE}x" == "x" ]; then
    echo "ERROR: No interface was given"
    echo ""
    exit 2
else
    if ! grep "${INTERFACE}" /proc/net/dev 2>&1 > /dev/null; then
        echo "ERROR: ${INTERFACE} is not a valid network interface."
        echo ""
        exit 2
    fi
fi

# If a configuration file is present, use it
if [ "${CONFIGFILE}x" != "x" ]; then
    . "${CONFIGFILE}"
    if [ -x "/lib/network-services/${SERVICE}" ]; then
        # do the work
        if IFCONFIG=${CONFIGFILE} \
            /lib/network-services/${SERVICE} ${INTERFACE} down; then
            rm "${CONFIGFILE}"
        fi
    else
        echo "ERROR: Service '${SERVICE}' is not a valid service."
        echo ""
        exit 2
    fi
# No interface configuration file was given
else
    # Process all running interface configuration files
    CONFIGDIR="/run/network/ifconfig.${INTERFACE}"
    if [ -d "${CONFIGDIR}" ]; then
        FILES=`ls "${CONFIGDIR}"`
        for CONFIGFILE in ${FILES}
        do
            (
                . "${CONFIGDIR}/${CONFIGFILE}"
                # No error checking necessary if they are in /run
                if IFCONFIG="${CONFIGDIR}/${CONFIGFILE}" \
                    /lib/network-services/${SERVICE} ${INTERFACE} down; then
                    rm "${CONFIGDIR}/${CONFIGFILE}"
                fi
            )
        done
        # all running config files processes, set the link down
        message="Setting interface ${INTERFACE} down..."
        /sbin/ip link set "${INTERFACE}" down
        evaluate_retval standard
    else
        if [ "${FORCE}" != "1" ]; then
            echo "ERROR: No configuration files found for ${INTERFACE}."
            echo ""
            exit 2
        fi
    fi
fi
    
if [ "${FORCE}" == "1" ]; then
    /sbin/ip addr flush dev "${INTERFACE}" 2>&1 > /dev/null || failed=1
    if [ "${failed}" == "1" ]; then
        log_failure_msg "Flushing IP addresses from interface ${INTERFACE}..."
        echo ""
        exit 1
    else
        log_success_msg "Flushing IP addresses from interface ${INTERFACE}..."
    fi
    /sbin/ip link set dev "${INTERFACE}" down 2>&1 > /dev/null || failed=1
    if [ "${failed}" == "1" ]; then
        log_failure_msg "Setting link down for interface ${INTERFACE}..."
        echo ""
        exit 1
    else
        log_success_msg "Setting link down for interface ${INTERFACE}..."
    fi
fi

exit "${failed}"