diff options
Diffstat (limited to 'network-scripts/ifdown-eth')
-rwxr-xr-x | network-scripts/ifdown-eth | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/network-scripts/ifdown-eth b/network-scripts/ifdown-eth new file mode 100755 index 00000000..d7ce103a --- /dev/null +++ b/network-scripts/ifdown-eth @@ -0,0 +1,218 @@ +#!/bin/bash +# Network Interface Configuration System +# Copyright (c) 1996-2009 Red Hat, Inc. all rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License, version 2, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +. /etc/init.d/functions + +cd /etc/sysconfig/network-scripts +. ./network-functions + +[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network + +CONFIG=${1} +boot=$2 +daemon= +[ "foo${boot}" = "fooboot" -o "foo${boot}" = "foodaemon" ] && daemon=1 + +source_config + +. /etc/sysconfig/network + +# Check to make sure the device is actually up +check_device_down ${DEVICE} && [ "$BOOTPROTO" != "dhcp" -a "$BOOTPROTO" != "bootp" ] && [ -n "$VLAN" ] && ! is_true "$VLAN" && exit 0 + +if [ -n "${TEAM_MASTER}" ] && [ ! "${DEVICETYPE}" = "TeamPort" ] && [ -x ./ifdown-TeamPort ]; then + ./ifdown-TeamPort ${CONFIG} $2 +fi + +if ! is_true "${SLAVE}" || [ -z "${MASTER}" ]; then + if [ -n "${HWADDR}" -a -z "${MACADDR}" ]; then + FOUNDMACADDR=$(get_hwaddr ${REALDEVICE}) + if [ -n "${FOUNDMACADDR}" -a "${FOUNDMACADDR}" != "${HWADDR}" ]; then + NEWCONFIG=$(get_config_by_hwaddr ${FOUNDMACADDR}) + if [ -n "${NEWCONFIG}" ]; then + eval $(LANG=C grep -F "DEVICE=" $NEWCONFIG) + else + net_log $"Device ${DEVICE} has MAC address ${FOUNDMACADDR}, instead of configured address ${HWADDR}. Ignoring." + exit 1 + fi + if [ -n "${NEWCONFIG}" -a "${NEWCONFIG##*/}" != "${CONFIG##*/}" -a "${DEVICE}" = "${REALDEVICE}" ]; then + exec /sbin/ifdown ${NEWCONFIG} + else + net_log $"Device ${DEVICE} has MAC address ${FOUNDMACADDR}, instead of configured address ${HWADDR}. Ignoring." + exit 1 + fi + fi + fi +fi + +if is_bonding_device ${DEVICE} ; then + for device in $(LANG=C grep -l "^[[:space:]]*MASTER=['\"]\?${DEVICE}['\"]\?\([[:space:]#]\|$\)" /etc/sysconfig/network-scripts/ifcfg-*) ; do + is_ignored_file "$device" && continue + /sbin/ifdown ${device##*/} + done + for arg in $BONDING_OPTS ; do + key=${arg%%=*}; + [[ "${key}" != "arp_ip_target" ]] && continue + value=${arg##*=}; + if [ "${value:0:1}" != "" ]; then + OLDIFS=$IFS; + IFS=','; + for arp_ip in $value; do + if grep -q $arp_ip /sys/class/net/${DEVICE}/bonding/arp_ip_target; then + echo "-$arp_ip" > /sys/class/net/${DEVICE}/bonding/arp_ip_target + fi + done + IFS=$OLDIFS; + else + value=${value#+}; + if grep -q $value /sys/class/net/${DEVICE}/bonding/arp_ip_target; then + echo "-$value" > /sys/class/net/${DEVICE}/bonding/arp_ip_target + fi + fi + done +fi + +/etc/sysconfig/network-scripts/ifdown-ipv6 ${CONFIG} +if [[ "${DHCPV6C}" = [Yy1]* ]] && [ -f /var/run/dhcp6c_${DEVICE}.pid ]; then + kill $(cat /var/run/dhcp6c_${DEVICE}.pid); + rm -f /var/run/dhcp6c_${DEVICE}.pid; +fi + +retcode=0 + +for VER in "" 6 ; do + if [ -f "/run/dhclient$VER-${DEVICE}.pid" ]; then + dhcpid=$(cat /run/dhclient$VER-${DEVICE}.pid) + generate_lease_file_name $VER + if is_true "$DHCPRELEASE"; then + /sbin/dhclient -r -lf ${LEASEFILE} -pf /run/dhclient$VER-${DEVICE}.pid ${DEVICE} >/dev/null 2>&1 + retcode=$? + else + kill $dhcpid >/dev/null 2>&1 + retcode=$? + reason=STOP$VER interface=${DEVICE} /sbin/dhclient-script + fi + if [ -f "/run/dhclient$VER-${DEVICE}.pid" ]; then + rm -f /run/dhclient$VER-${DEVICE}.pid + kill $dhcpid >/dev/null 2>&1 + fi + fi +done + +# Kill running dhcp client if present (supports more clients than the above) +dhcp_client_pids() { + CLIENTS='dhcpcd|pump|dhcpxd|dhclient|zcip' + [ -n "${daemon}" -o "$MII_NOT_SUPPORTED" = "yes" ] && CLIENTS="${CLIENTS}|wpa_supplicant" + ps xw | egrep "${CLIENTS}" | grep ${DEVICE} | awk '{print $1;}' +} + +if [ -n "${daemon}" -a "$MII_NOT_SUPPORTED" != "yes" ]; then + # use ifplugd -k -W to wait for it to be killed + /sbin/ifplugd -k -W -i ${DEVICE} +fi + +pids=`dhcp_client_pids` +if [ -n "$pids" ]; then + kill $pids + retcode=$? + waited=0 + while ! dhcp_client_pids > /dev/null && [ "$waited" -lt 50 ] ; do + usleep 10000 + waited=$(($waited+1)) + done +fi + +# we can't just delete the configured address because that address +# may have been changed in the config file since the device was +# brought up. Flush all addresses associated with this +# instance instead. +if [ -d "/sys/class/net/${REALDEVICE}" ]; then + LABEL= + if [ "${REALDEVICE}" != "${DEVICE}" ]; then + LABEL="label ${DEVICE}" + fi + if [ "${REALDEVICE}" = "lo" ]; then + TIMEOUT="" + [ -x /usr/bin/timeout ] && TIMEOUT="/usr/bin/timeout --signal=SIGQUIT 4" + $TIMEOUT ip addr flush dev ${REALDEVICE} ${LABEL} scope global 2>/dev/null + $TIMEOUT ip addr flush dev ${REALDEVICE} ${LABEL} scope host 2>/dev/null + else + ip addr flush dev ${REALDEVICE} ${LABEL} scope global 2>/dev/null + ip -4 addr flush dev ${REALDEVICE} ${LABEL} scope host 2>/dev/null + fi + + if is_true "${SLAVE}" && [ -n "${MASTER}" ]; then + echo "-${DEVICE}" > /sys/class/net/${MASTER}/bonding/slaves 2>/dev/null + fi + + # Remove ip addresses from kernel + for ip in `ip addr show | egrep ${DEVICE}\$ | grep inet | awk '{print $2;}'`; do + ip addr del $ip dev ${DEVICE} + done + + if [ "${REALDEVICE}" = "${DEVICE}" ]; then + ip link set dev ${DEVICE} down 2>/dev/null + fi +fi +[ "$retcode" = "0" ] && retcode=$? + +if [ -n "${BRIDGE}" ]; then + ip link set dev ${DEVICE} nomaster down + # Upon removing a device from a bridge, + # it's necessary to make radvd reload its config + [ -r /run/radvd/radvd.pid ] && kill -HUP $(cat /run/radvd/radvd.pid) + if [ -d /sys/class/net/${BRIDGE}/brif ] && [ $(ls -1 /sys/class/net/${BRIDGE}/brif | wc -l) -eq 0 ]; then + ip link del ${BRIDGE} + fi +fi + +if [ "${TYPE}" = "Tap" ]; then + TUNMODE="mode tap" + [[ ${DEVICE} == tun* ]] && TUNMODE="mode tun" + ip tuntap del ${TUNMODE} dev ${DEVICE} >/dev/null +fi + +if [ -n "${TEAM_CONFIG}" ] && [ ! "${DEVICETYPE}" = "Team" ] && [ -x ./ifdown-Team ]; then + ./ifdown-Team ${CONFIG} $2 +fi + +# wait up to 5 seconds for device to actually come down... +waited=0 +while ! check_device_down ${DEVICE} && [ "$waited" -lt 50 ] ; do + sleep 0.01 + waited=$(($waited+1)) +done + +# don't leave an outdated key sitting around +if [ -z "$IN_HOTPLUG" ] && [ -n "${WIRELESS_ENC_KEY}" ] && [ -x /sbin/iwconfig ]; then + /sbin/iwconfig ${DEVICE} enc 0 >/dev/null 2>&1 +fi + +if [ "$retcode" = "0" ]; then + /etc/sysconfig/network-scripts/ifdown-post $CONFIG + # do NOT use $? because ifdown should return whether or not + # the interface went down. +fi + +if [ -n "$VLAN" ]; then + # 802.1q VLAN + if [ -f /proc/net/vlan/${DEVICE} ]; then + ip link delete ${DEVICE} type vlan + fi +fi + +exit $retcode |