#! /bin/bash
#
# 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/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=

# If IPv6 is explicitly configured, make sure it's available.
if [ "$NETWORKING_IPV6" = "yes" ]; then
	alias=`modprobe -c | awk '/^alias net-pf-10 / { print $3 }'`
	if [ "$alias" != "ipv6" -a ! -f /proc/net/if_inet6 ]; then
		echo "alias net-pf-10 ipv6" >> /etc/modules.conf
	fi
fi

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

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

# See how we were called.
case "$1" in
  start)
	# IPv6 hook (pre IPv4 start)
	if [ "$NETWORKING_IPV6" = "yes" ]; then
		if [ -x /etc/sysconfig/network-scripts/init.ipv6-global ]; then
			/etc/sysconfig/network-scripts/init.ipv6-global start pre
		fi
	fi
  
  	action $"Setting network parameters: " sysctl -e -p /etc/sysctl.conf

	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" ]; then
	       /sbin/ipx_internal_net add $IPXINTERNALNETNUM $IPXINTERNALNODENUM
	    fi
	    ;;
	esac

	oldhotplug=`sysctl kernel.hotplug  2>/dev/null| awk '{ print $3 }' 2>/dev/null`
	sysctl -w kernel.hotplug="/bin/true" > /dev/null 2>&1

	for i in $interfaces; do
		if LANG=C egrep -L "^ONBOOT=\"?[Nn][Oo]\"?" ifcfg-$i >/dev/null 2>&1 ; then
		        if [ "${i##eth}" != "$i" ]; then
			  # Probe module to preserve interface ordering
			  if [ -n "`modprobe -vn $i | grep -v Note:`" ]; then
			     /sbin/ifconfig $i >/dev/null 2>&1
			  fi
			fi
		else
					# If we're in confirmation mode, get user confirmation
		    [ -n "$CONFIRM" ]  && 
			{ 
			    confirm $i
			    case $? in
				0)
				    :
				;;
				2)
				    CONFIRM=
				;;
				*)
				    continue
				;;
			    esac 
			}

			action $"Bringing up interface $i: " ./ifup $i boot
		fi
	done
	
	# add cipe here.
	cipeinterfaces=`ls ifcfg* | LANG=C egrep -v '(ifcfg-lo|:|rpmsave|rpmorig|rpmnew)' | \
	    LANG=C egrep -v '(~|\.bak)$' | \
	    LANG=C egrep 'ifcfg-cipcb[0-9]+$' | \
            sed 's/^ifcfg-//g'`
	for i in $cipeinterfaces ; do 
            if ! LANG=C egrep -L "^ONBOOT=\"?[Nn][Oo]\"?" ifcfg-$i >/dev/null 2>&1 ; then
		# If we're in confirmation mode, get user confirmation
		[ -n "$CONFIRM" ]  && 
		{ 
			confirm $i
			case $? in
				0)
				    :
				;;
				2)
				    CONFIRM=
				;;
				*)
				    continue
				;;
			esac 
		}
		action $"Bringing up interface $i: " ./ifup $i boot
	    fi
        done

	sysctl -w kernel.hotplug=$oldhotplug > /dev/null 2>&1
	
	# Add non interface-specific static-routes.
	if [ -f /etc/sysconfig/static-routes ]; then
	   grep "^any" /etc/sysconfig/static-routes | while read ignore args ; do
              /sbin/route add -$args
	   done
	fi    

 	# IPv6 hook (post IPv4 start)
 	if [ "$NETWORKING_IPV6" = "yes" ]; then
 		if [ -x /etc/sysconfig/network-scripts/init.ipv6-global ]; then
 			/etc/sysconfig/network-scripts/init.ipv6-global start post
 		fi
 	fi
 
        touch /var/lock/subsys/network
        ;;
  stop)
  	# If this is a final shutdown/halt, check for network FS,
	# and unmount them even if the user didn't turn on netfs
	
	if [ "$RUNLEVEL" = "6" -o "$RUNLEVEL" = "0" -o "$RUNLEVEL" = "1" ]; then
		NFSMTAB=`grep -v '^#' /proc/mounts | awk '{ if ($3 ~ /^nfs$/ ) print $2}'`
		SMBMTAB=`grep -v '^#' /proc/mounts | awk '{ if ($3 ~ /^smbfs$/ ) print $2}'`
		NCPMTAB=`grep -v '^#' /proc/mounts | awk '{ if ($3 ~ /^ncpfs$/ ) print $2}'`
		if [ -n "$NFSMTAB" -o -n "$SMBMTAB" -o -n "$NCPMTAB" ] ; then
			/etc/init.d/netfs stop
		fi
	fi
	
 	# IPv6 hook (pre IPv4 stop)
 	if [ "$NETWORKING_IPV6" = "yes" ]; then
 		if [ -x /etc/sysconfig/network-scripts/init.ipv6-global ]; then
 			/etc/sysconfig/network-scripts/init.ipv6-global stop pre
 		fi
 	fi
 
	for i in $interfaces ; do
	        if LC_ALL= LANG= ifconfig $i 2>/dev/null | grep -q " UP " >/dev/null 2>&1 ; then
		   action $"Shutting down interface $i: " ./ifdown $i boot
		fi
	done
	case "$IPX" in
	  yes|true)
	    if [ "$IPXINTERNALNETNUM" != "0" ]; then
	       /sbin/ipx_internal_net del
	    fi
	    ;;
	esac
	./ifdown ifcfg-lo
	if [ -d /proc/sys/net/ipv4 ]; then
	  if [ -f /proc/sys/net/ipv4/ip_forward ]; then
		if [ `cat /proc/sys/net/ipv4/ip_forward` != 0 ]; then
			action $"Disabling IPv4 packet forwarding: " sysctl -w net.ipv4.ip_forward=0
		fi
	  fi
	  if [ -f /proc/sys/net/ipv4/ip_always_defrag ]; then
	        if [ `cat /proc/sys/net/ipv4/ip_always_defrag` != 0 ]; then
		        action $"Disabling IPv4 automatic defragmentation: " sysctl -w net.ipv4.ip_always_defrag=0
		fi
	  fi
	fi

	# IPv6 hook (post IPv4 stop)
	if [ "$NETWORKING_IPV6" = "yes" ]; then
		if [ -x /etc/sysconfig/network-scripts/init.ipv6-global ]; then
			/etc/sysconfig/network-scripts/init.ipv6-global stop post
		fi
	fi
	
        rm -f /var/lock/subsys/network
        ;;
  status)
	echo $"Configured devices:"
	echo lo $interfaces

	if [ -x /sbin/linuxconf ] ; then
		eval `/sbin/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 /sbin/linuxconf ] ; then
		eval `/sbin/linuxconf --hint netdev`
		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 $"Bringing 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 /sbin/linuxconf ] ; then
		eval `/sbin/linuxconf --hint netdev`
		[ -n "$DEV_UP$DEV_DOWN$DEV_RECONF$DEV_RECONF_ALIASES" -o \
		  -n "$DEV_RECONF_ROUTES$IPXINTERNALNET" ] && \
			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: $0 {start|stop|restart|reload|status|probe}"
        exit 1
esac

exit 0