aboutsummaryrefslogtreecommitdiffstats
path: root/network-scripts/ifdown-eth
diff options
context:
space:
mode:
Diffstat (limited to 'network-scripts/ifdown-eth')
-rwxr-xr-xnetwork-scripts/ifdown-eth218
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