lfs/lsb-bootscripts/sbin/ifdown

177 lines
5.2 KiB
Bash

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