#!/bin/bash # Network Interface Configuration System # Copyright (c) 1996-2001 Red Hat, Inc. all rights reserved. # # This software may be freely redistributed under the terms of the GNU # public license. # # 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., 675 Mass Ave, Cambridge, MA 02139, USA. PATH=/sbin:/usr/sbin:/bin:/usr/bin TEXTDOMAIN=initscripts cd /etc/sysconfig/network-scripts . network-functions . /etc/rc.d/init.d/functions [ -f ../network ] && . ../network [ -f ../networking/network ] && . ../networking/network need_hostname CONFIG=${1} [ -z "${CONFIG}" ] && { echo $"Usage: ifup " >&2 exit 1 } [ -f "${CONFIG}" ] || \ CONFIG=../networking/`current_profile`/${1} [ -f "${CONFIG}" ] || \ CONFIG=../networking/`current_profile`/"ifcfg-${1}" [ -f "${CONFIG}" ] || \ CONFIG="ifcfg-${1}" [ -f "${CONFIG}" ] || { echo $"$0: configuration for \"${1}\" not found." >&2 echo $"Usage: ifup " >&2 exit 1 } if [ ${UID} != 0 ]; then if [ -x /usr/sbin/usernetctl ]; then if /usr/sbin/usernetctl ${CONFIG} report ; then exec /usr/sbin/usernetctl ${CONFIG} up fi fi echo $"Users cannot control this device." >&2 exit 1 fi source_config if [ "foo$2" = "fooboot" -a "${ONBOOT}" = "no" -o "${ONBOOT}" = "NO" ] then exit fi # figure out more about what we are dealing with DEVICETYPE=`echo ${DEVICE} | sed "s/[0-9]*$//"` REALDEVICE=`echo ${DEVICE} | sed 's/:.*//g'` if echo ${DEVICE} | grep -q ':' ; then ISALIAS=yes else ISALIAS=no fi # Old BOOTP variable if [ "${BOOTP}" = "yes" ]; then BOOTPROTO=bootp fi if [ "${BOOTPROTO}" = bootp -o "${BOOTPROTO}" = dhcp ]; then DYNCONFIG=true fi if [ -x /sbin/ifup-pre-local ]; then /sbin/ifup-pre-local ${DEVICE} fi OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-${DEVICETYPE}" if [ -x ${OTHERSCRIPT} ]; then exec ${OTHERSCRIPT} ${CONFIG} $2 fi # is this device available? (this catches PCMCIA devices for us) LC_ALL= LANG= ip -o link | grep -q ${REALDEVICE} if [ "$?" = "1" ]; then echo $"Device does not seem to be present, delaying ${DEVICE} initialization." exit 1 fi if [ -n "${MACADDR}" ]; then FOUNDMACADDR=`LC_ALL= LANG= ip -o link show ${REALDEVICE} | \ sed 's/.*link\/ether \([[:alnum:]:]*\).*/\1/'` if [ "${FOUNDMACADDR}" != "${MACADDR}" ]; then echo $"Device ${DEVICE} has different MAC address than expected, ignoring." exit 1 fi fi # is the device wireless? If so, configure wireless device specifics is_wireless_device ${DEVICE} && ./ifup-wireless ${CONFIG} if [ "${SLAVE}" = yes -a "${ISALIAS}" = no -a "${MASTER}" != "" -a \ -x /sbin/ifenslave ]; then RFLAG="" ; [ "${RECEIVEONLY}" = yes ] && RFLAG="-r" ifconfig ${DEVICE} down echo $"Enslaving ${DEVICE} to ${MASTER}" ifenslave ${RFLAG} "${MASTER}" "${DEVICE}" exit 0 fi # this isn't the same as the MAC in the configuration filename. It is # available as a configuration option in the config file, forcing the kernel # to think an ethernet card has a different MAC address than it really has. if [ -n "${MACADDR}" ]; then ip link set ${DEVICE} address ${MACADDR} fi # Is there a firewall running, and does it look like one we configured? FWACTIVE= if [ -f /etc/sysconfig/ipchains -a \ "`ipchains -L input -n 2>&1 | \ awk 'END { print NR }'`" -gt 1 ]; then FWACTIVE=1 export FWACTIVE fi if [ -n "${DYNCONFIG}" ]; then PUMPARGS= DHCPCDARGS= if [ -n "${DHCP_HOSTNAME}" ]; then PUMPARGS="-h ${DHCP_HOSTNAME}" DHCPCDARGS="-h ${DHCP_HOSTNAME}" fi if [ -n "${NEEDHOSTNAME}" ]; then PUMPARGS="${PUMPARGS} --lookup-hostname" DHCPCDARGS="${DHCPCDARGS} -H" fi if [ "${PEERDNS}" = "no" ]; then PUMPARGS="${PUMPARGS} -d" DHCPCDARGS="${DHCPCDARGS} -R" fi echo -n $"Determining IP information for ${DEVICE}..." if check_link_down ${DEVICE}; then echo " failed; no link present. Check cable?" exit 1 fi # DHCP clients need DNS to be available, and we don't know # what DNS server they're using until they are done. FWHACK= if [ -n "$FWACTIVE" -a "$FIREWALL_MODS" != "no" ]; then ipchains -I input -s 0/0 53 -p udp -j ACCEPT FWHACK=1 fi if [ -x /sbin/pump ] && /sbin/pump ${PUMPARGS} -i ${DEVICE} ; then echo $" done." elif [ -x /sbin/dhcpcd ] && /sbin/dhcpcd ${DHCPCDARGS} ${DEVICE} ; then echo $" done." else echo $" failed." [ -n "$FWHACK" ] && ipchains -D input -s 0/0 53 -p udp -j ACCEPT exit 1 fi [ -n "$FWHACK" ] && ipchains -D input -s 0/0 53 -p udp -j ACCEPT else if [ -z "${IPADDR}" ]; then # enable device without IP, useful for e.g. PPPoE ip link set ${DEVICE} up ${MTU:+mtu $MTU} exec /etc/sysconfig/network-scripts/ifup-post ${CONFIG} ${2} fi if [ -z "${NETMASK}" ]; then eval `/bin/ipcalc --prefix ${IPADDR}` fi if [ -z "${PREFIX}" ]; then eval `/bin/ipcalc --prefix ${NETMASK}` fi if [ -z "${BROADCAST}" ]; then eval `/bin/ipcalc --broadcast ${IPADDR} ${NETMASK}` fi if [ -z "${NETWORK}" ]; then eval `/bin/ipcalc --network ${IPADDR} ${NETMASK}` fi [ -n "${ARP}" ] && \ ip link set ${DEVICE} $(toggle_value arp $ARP) if ! ip link set ${DEVICE} up ; then echo $"Failed to bring up ${DEVICE}." exit 1 fi if ! arping -q -c 2 -w 3 -D -I ${DEVICE} ${IPADDR} ; then echo $"Error, some other host already uses address ${IPADDR}." exit 1 fi if ! ip addr ls ${DEVICE} | grep -q "${IPADDR}/${PREFIX}" ; then if ! ip addr add ${IPADDR}/${PREFIX} \ brd ${BROADCAST:-+} dev ${DEVICE} ; then echo $"Error adding address ${IPADDR} for ${DEVICE}." fi fi # update ARP cache of neighboring computers arping -q -A -c 1 -I ${DEVICE} ${IPADDR} ( sleep 2; arping -q -U -c 1 -I ${DEVICE} ${IPADDR} ) >& /dev/null < /dev/null & ip route add unreachable 224.0.0.0/24 >& /dev/null ip route add unreachable 255.255.255.255 >& /dev/null # if the device is multicast enabled, add a default multicast route if [ `ip link ls ${DEVICE} | grep -c MULTICAST` -ge 1 ]; then ip route add 224.0.0.0/4 dev ${DEVICE} scope global >& /dev/null fi # Add a route for the subnet. Replace any existing route. if [ "${ISALIAS}" = no ]; then ip route replace ${NETWORK}/${PREFIX} dev ${DEVICE} fi # Set a default route. if [ -z "${GATEWAYDEV}" -o "${GATEWAYDEV}" = "${DEVICE}" ]; then # set up default gateway if [ -n "${GATEWAY}" -a "`ipcalc --network ${GATEWAY} ${NETMASK} 2>/dev/null`" = "NETWORK=${NETWORK}" ]; then route add default gw ${GATEWAY} ${DEVICE} DEFGW=${GATEWAY} elif [ "${GATEWAYDEV}" = "${DEVICE}" ]; then route add default ${DEVICE} fi fi fi # IPv6 initialisation? if [ "${NETWORKING_IPV6}" = "yes" ]; then /etc/sysconfig/network-scripts/ifup-ipv6 $DEVICE fi exec /etc/sysconfig/network-scripts/ifup-post ${CONFIG} ${2}