aboutsummaryrefslogtreecommitdiffstats
path: root/network-scripts/ifdown-eth
blob: d7ce103aff8c48e87ef2bd30c02757e81b2da90e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
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