#!/bin/sh
#
# network       Bring up/down networking
#
# chkconfig: 2345 10 90
# description: Activates/Deactivates all network interfaces configured to \
#              start at boot time.
# probe: true

# Source function library.
. /etc/rc.d/init.d/functions

if [ ! -f /etc/sysconfig/network ]; then
    exit 0
fi

. /etc/sysconfig/network

if [ -f /etc/sysconfig/pcmcia ]; then
	. /etc/sysconfig/pcmcia
fi


# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

[ -x /sbin/ifconfig ] || exit 0

# Even if IPX is configured, without the utilities we can't do much
[ ! -x /sbin/ipx_internal_net -o ! -x /sbin/ipx_configure ] && IPX=

CWD=`pwd`
cd /etc/sysconfig/network-scripts

# find all the interfaces besides loopback.
# ignore aliases, alternative configurations, and editor backup files
interfaces=`ls ifcfg* | egrep -v '(ifcfg-lo|:)' | egrep 'ifcfg-[a-z0-9]+$' | \
            sed 's/^ifcfg-//g'`
interfaces_boot=

for inter in `ls ifcfg* | egrep -v '(ifcfg-lo|:)' | egrep 'ifcfg-[a-z0-9]+$'`; do
      int=`egrep -l "ONBOOT=[^n][^o]" $inter | sed 's/^ifcfg-//g'`
      [ -n "$int" ] && interfaces_boot="$interfaces_boot $int"
done

ipv4_forward_set ()
{
	# Turn IP forwarding on or off. We do this before bringing up the
	# interfaces to make sure we don't forward when we shouldn't, and
	# we do it even if networking isn't configured (why not?).
	if [ -d /proc/sys/net/ipv4 ]; then
	    # people could have left this out of their kernel, which isn't
	    # exactly an error
	    if [ ! -f /proc/sys/net/ipv4/ip_forward ] ; then
		echo "/proc/sys/net/ipv4/ip_forward is missing --" \
			"cannot control IP forwarding" >&2
	    else
		if [ "$FORWARD_IPV4" = "no" -o "$FORWARD_IPV4" = "false" ]; then
		    value=0
		    message="Disabling IPv4 packet forwarding"
		else
		    value=1
		    message="Enabling IPv4 packet forwarding"
		fi

		if [ $value != `cat /proc/sys/net/ipv4/ip_forward` ]; then
		    action "$message"  /bin/true
		    echo "$value" > /proc/sys/net/ipv4/ip_forward
		fi
	    fi
	fi
}


# See how we were called.
case "$1" in
  start)
	ipv4_forward_set

	action "Bringing up interface lo" ./ifup ifcfg-lo

	case "$IPX" in
	  yes|true)
	    /sbin/ipx_configure --auto_primary=$IPXAUTOPRIMARY \
				   --auto_interface=$IPXAUTOFRAME
	    if [ "$IPXINTERNALNETNUM" != "0" -o "$IPXINTERNALNODENUM" != "0" ]; then
	       /sbin/ipx_internal_net add $IPXINTERNALNETNUM $IPXINTERNALNODENUM
	    fi
	    ;;
	esac

	for i in $interfaces_boot; do
		action "Bringing up interface $i" ./ifup $i boot
	done

        touch /var/lock/subsys/network
        ;;
  stop)
	for i in $interfaces_boot; do
		action "Shutting down interface $i" ./ifdown $i boot
	done
	case "$IPX" in
	  yes|true)
	    /sbin/ipx_internal_net del
	    ;;
	esac
	./ifdown ifcfg-lo
	action "Disabling IPv4 packet forwarding" /bin/true
	echo 0 > /proc/sys/net/ipv4/ip_forward
        rm -f /var/lock/subsys/network
        ;;
  status)
	echo "Configured devices:"
	echo lo $interfaces

	if [ -x /bin/linuxconf ] ; then
		eval `/bin/linuxconf --hint netdev`
		echo "Devices that are down:"
		echo $DEV_UP
		echo "Devices with modified configuration:"
		echo $DEV_RECONF
	else
		echo "Currently active devices:"
		echo `/sbin/ifconfig | grep ^[a-z] | awk '{print $1}'`
	fi
	;;
  restart)
        cd $CWD
	$0 stop
	$0 start
	;;
  reload)
	if [ -x /bin/linuxconf ] ; then
		eval `/bin/linuxconf --hint netdev`
		if [ "$RECONF_IPV4ROUTING" = "yes" ] ; then
			ipv4_forward_set
		fi
		for device in $DEV_UP ; do
			action "Bringing up device $device" ./ifup $device
		done
		for device in $DEV_DOWN ; do
			action "Shutting down device $device" ./ifdown $device
		done
		for device in $DEV_RECONF ; do
			action "Shutting down device $device" ./ifdown $device
			action "Bringing up device $device" ./ifup $device
		done
		for device in $DEV_RECONF_ALIASES ; do
			action "Briging up alias $device" /etc/sysconfig/network-scripts/ifup-aliases $device
		done
		for device in $DEV_RECONF_ROUTES ; do
			action "Bringing up route $device" /etc/sysconfig/network-scripts/ifup-routes $device
		done
		case $IPX in yes|true)
		  case $IPXINTERNALNET in
		    reconf)
			action "Deleting internal IPX network" /sbin/ipx_internal_net del
			action "Adding internal IPX network $IPXINTERNALNETNUM $IPXINTERNALNODENUM" /sbin/ipx_internal_net add $IPXINTERNALNETNUM \
						      $IPXINTERNALNODENUM
			;;
		    add)
			action "Adding internal IPX network $IPXINTERNALNETNUM $IPXINTERNALNODENUM"/sbin/ipx_internal_net add $IPXINTERNALNETNUM \
						      $IPXINTERNALNODENUM
			;;
		    del)
			action "Deleting internal IPX network" /sbin/ipx_internal_net del
			;;
		  esac
		  ;;
		esac
	else
	        cd $CWD
		$0 restart
	fi
	;;
  probe)
	if [ -x /bin/linuxconf ] ; then
		eval `/bin/linuxconf --hint netdev`
		[ -n "$DEV_UP$DEV_DOWN$DEV_RECONF$DEV_RECONF_ALIASES" -o \
		  -n "$DEV_RECONF_ROUTES$IPXINTERNALNET" -o \
		  "$RECONF_IPV4ROUTING" = yes ] && \
			echo reload
		exit 0
	else
		# if linuxconf isn't around to figure stuff out for us,
		# we punt.  Probably better than completely reloading
		# networking if user isn't sure which to do.  If user
		# is sure, they would run restart or reload, not probe.
		exit 0
	fi
	;;
  *)
        echo "Usage: network {start|stop|restart|reload|status|probe}"
        exit 1
esac

exit 0