#!/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 <device name>" >&2
    exit 1
}

need_config ${CONFIG}

[ -f "${CONFIG}" ] || {
    echo $"$0: configuration for ${1} not found." >&2
    echo $"Usage: ifup <device name>" >&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 0
fi
if [ -n "$IN_HOTPLUG" -a "${HOTPLUG}" = "no" -o "${HOTPLUG}" = "NO" ]
then
    exit 0
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_available ${REALDEVICE} || {
      if [ "$?" = "1" ] ; then
         echo $"$alias device does not seem to be present, delaying ${DEVICE} initialization."
         exit 1
      else
         exit 0
      fi
}
if [ -n "${HWADDR}" ]; then
    FOUNDMACADDR=`LC_ALL= LANG= ip -o link show ${REALDEVICE} | \
	sed 's/.*link\/ether \([[:alnum:]:]*\).*/\1/'`
    if [ "${FOUNDMACADDR}" != "${HWADDR}" ]; then
        NEWCONFIG=`fgrep -l "HWADDR=${HWADDR}" /etc/sysconfig/network-scripts/ifcfg-*`
	if [ -n "${NEWCONFIG}" ]; then
	   exec /sbin/ifup ${NEWCONFIG}
	fi
        NEWCONFIG=`fgrep -l "HWADDR=${HWADDR}" /etc/sysconfig/networking/default/ifcfg-*`
	if [ -n "${NEWCONFIG}" ]; then
	   exec /sbin/ifup ${NEWCONFIG}
	else
	   echo $"Device ${DEVICE} has different MAC address than expected, ignoring."
	   exit 1
	fi
    fi
fi

# is the device wireless? If so, configure wireless device specifics
is_wireless_device ${DEVICE} && . ./ifup-wireless

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
if [ -n "${MTU}" ]; then
   ip link set ${DEVICE} mtu ${MTU}
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=$PUMPARGS
    DHCPCDARGS="$DHCPCDARGS -n"
    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}..."

    # 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 -d 0/0 1025:65535 -p udp -j ACCEPT
	FWHACK=1
    fi
    
    if [ -x /sbin/dhcpcd ] && /sbin/dhcpcd ${DHCPCDARGS} ${DEVICE} ; then
	echo $" done."
    elif [ -z "`pidof -x dhcpcd`" ] && [ -x /sbin/pump ] && /sbin/pump ${PUMPARGS} -i ${DEVICE}; then
	echo $" done."
    else
	echo $" failed."
	[ -n "$FWHACK" ] && ipchains -D input -s 0/0 53 -d 0/0 1025:65535 -p udp -j ACCEPT
	exit 1
    fi

    [ -n "$FWHACK" ] && ipchains -D input -s 0/0 53 -d 0/0 1025:65535 -p udp -j ACCEPT
else 
    if [ -z "${IPADDR}" ]; then
         # enable device without IP, useful for e.g. PPPoE
	 ip link set ${DEVICE} up
	 if [ "${NETWORKING_IPV6}" = "yes" ]; then
	    /etc/sysconfig/network-scripts/ifup-ipv6 ${CONFIG}
	 fi
	 exec /etc/sysconfig/network-scripts/ifup-post ${CONFIG} ${2}
    fi
  
    expand_config
    
    [ -n "${ARP}${PROMISC}${ALLMULTI}" ] && \
	ip link set ${DEVICE} $(toggle_value arp $ARP) \
	   $(toggle_value promisc $PROMISC) \
	   $(toggle_value allmulti $ALLMULTI)
   
    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 [ "${DEVICE}" = "lo" ]; then
    	SCOPE="scope host"
    else
        SCOPE=
    fi

    if ! LC_ALL=C ip addr ls ${REALDEVICE} | grep -q "${IPADDR}/${PREFIX}" ; then
        if [ "$ISALIAS" = "yes" ]; then
	 if ! ip addr add ${IPADDR}/${PREFIX} \
	    brd ${BROADCAST:-+} dev ${REALDEVICE} ${SCOPE} label ${DEVICE}; then
	    echo $"Error adding address ${IPADDR} for ${DEVICE}."
	 fi
	else
	 if ! ip addr add ${IPADDR}/${PREFIX} \
	    brd ${BROADCAST:-+} dev ${REALDEVICE} ${SCOPE} ; then
	    echo $"Error adding address ${IPADDR} for ${DEVICE}."
	 fi
	fi
    fi

    # update ARP cache of neighboring computers
    arping -q -A -c 1 -I ${REALDEVICE} ${IPADDR}
    ( sleep 2;
      arping -q -U -c 1 -I ${REALDEVICE} ${IPADDR} ) > /dev/null 2>&1 < /dev/null &

    # 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
	    ip route add default via ${GATEWAY}
	    DEFGW=${GATEWAY}
	elif [ "${GATEWAYDEV}" = "${DEVICE}" ]; then
	    ip route add default dev ${DEVICE}
	fi
    fi
fi

# IPv6 initialisation?
if [ "${NETWORKING_IPV6}" = "yes" ]; then
    /etc/sysconfig/network-scripts/ifup-ipv6 ${CONFIG}
fi

if [ "${IPX}" = yes ]; then
       /etc/sysconfig/network-scripts/ifup-ipx ${DEVICE}
fi

exec /etc/sysconfig/network-scripts/ifup-post ${CONFIG} ${2}

