#!/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. 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}"