#!/bin/sh
#
# $Id: network,v 1.11 2002/11/30 12:00:26 ldv Exp $
#
# 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

# Source networking configuration.
# Check that networking is up.
SourceIfNotEmpty /etc/sysconfig/network && [ "$NETWORKING" != no ] && [ -x /sbin/ifconfig ] || exit 0

SourceIfNotEmpty /etc/sysconfig/pcmcia

# Even if IPX is configured, without the utilities we can't do much
IPX_INTERNAL_NET=/sbin/ipx_internal_net
IPX_CONFIGURE=/sbin/ipx_configure
[ -x "$IPX_INTERNAL_NET" -a -x "$IPX_CONFIGURE" ] || IPX=

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

LINUXCONF=/bin/linuxconf

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|:|\.rpm)' | \
	egrep -v 'ifcfg-[a-z0-9]+\.[0-9]+$|ifcfg-vlan[0-9]*$' | \
	egrep -v '(~|\.bak)$' | \
	egrep 'ifcfg-[a-z0-9]+$' | \
	sed 's/^ifcfg-//g'`

vlan_interfaces=`ls ifcfg* | \
	egrep -v '(ifcfg-lo|:|\.rpm)' | \
	egrep -v '(~|\.bak)$' | \
	egrep 'ifcfg-[a-z0-9]+\.[0-9]{1,4}$|ifcfg-vlan[0-9]{1,4}$' | \
	sed 's/^ifcfg-//g'`

LOCKFILE=/var/lock/subsys/network

ifup_interfaces()
{
	local i
	for i in "$@"; do
		if egrep -L "^ONBOOT=\"?[Nn][Oo]\"?" "ifcfg-$i" &>/dev/null; then
			# Probe module to preserve interface ordering
			/sbin/ifconfig "$i" &>/dev/null
		else
			# If we're in confirmation mode, get user confirmation
			if [ -n "$CONFIRM" ]; then
				confirm "$i"
				case $? in
					0)
						:
						;;
					2)
						CONFIRM=
						;;
					*)
						continue
						;;
				esac
			fi
			action "Bringing up interface $i:" ./ifup "$i" boot
		fi
	done
}

start()
{
	action "Setting network parameters:" sysctl -e -p /etc/sysctl.conf
	action "Bringing up interface lo:" ./ifup ifcfg-lo

	case "$IPX" in
		yes|true)
			"$IPX_CONFIGURE" --auto_primary="$IPXAUTOPRIMARY" --auto_interface="$IPXAUTOFRAME"
			if [ "$IPXINTERNALNETNUM" != 0 ]; then
				"$IPX_INTERNAL_NET" add "$IPXINTERNALNETNUM" "$IPXINTERNALNODENUM"
			fi
			;;
	esac

	# depreciated but we still use it.
	if [ "$FORWARD_IPV4" = yes -o "$FORWARD_IPV4" = true ] && [ -f /proc/sys/net/ipv4/ip_forward ]; then
		action "Enabling IPv4 packet forwarding" sysctl -w net.ipv4.ip_forward=1
	fi

	# Fireup VLAN subsystem.
	SourceIfNotEmpty /etc/sysconfig/vlan
	BIN_VCONFIG=/usr/bin/vconfig
	PROC_VLAN_CONFIG=/proc/net/vlan/config

	# Turn ON vlan subsystem and set vlans naming schema.
	if [ "$DOT1Q_VLANS" = yes -a -x "$BIN_VCONFIG" ]; then
		if [ ! -e "$PROC_VLAN_CONFIG" ]; then
			# No vlan support in the kernel, trying modprobe.
			action "Loading VLAN module:" modprobe vlan_module
		fi

		if [ -e "$PROC_VLAN_CONFIG" ]; then
			"$BIN_VCONFIG" set_name_type $VLAN_NAMING >/dev/null 2>&1
		fi
	fi

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

	ifup_interfaces $interfaces
	
	# Fireup VLAN interfaces.
	# It must be started up AFTER all REAL real interfaces.
	# Otherwise vlans won't work.
	ifup_interfaces $vlan_interfaces

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

	touch "$LOCKFILE"
}

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

	for i in $interfaces; do
		if LC_ALL= LANG= ifconfig "$i" 2>/dev/null |fgrep -qs ' UP '; then
		   action "Shutting down interface $i:" ./ifdown "$i" boot
		fi
	done
	case "$IPX" in
		yes|true)
			if [ "$IPXINTERNALNETNUM" != 0 ]; then
				"$IPX_INTERNAL_NET" del
			fi
			;;
	esac
	./ifdown ifcfg-lo

	if [ -d /proc/sys/net/ipv4 ]; then
		if [ -f /proc/sys/net/ipv4/ip_forward ] && [ "`cat /proc/sys/net/ipv4/ip_forward`" != 0 ]; then
			action "Disabling IPv4 packet forwarding:" sysctl -w net.ipv4.ip_forward=0
		fi
		if [ -f /proc/sys/net/ipv4/tcp_syncookies ] && [ "`cat /proc/sys/net/ipv4/tcp_syncookies`" != 0 ]; then
			sysctl -w net.ipv4.tcp_syncookies=0
		fi
	fi

	rm -f "$LOCKFILE"
}

restart()
{
	stop
	start
}

# See how we were called.
case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	restart)
		restart
		;;
	status)
		echo "Configured devices:"
		echo lo $interfaces

		if [ -x "$LINUXCONF" ]; then
			eval `"$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
		;;
	reload)
		if [ -x "$LINUXCONF" ]; then
			eval `"$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 "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:" "$IPX_INTERNAL_NET" del
					action "Adding internal IPX network $IPXINTERNALNETNUM $IPXINTERNALNODENUM:" \
						"$IPX_INTERNAL_NET" add "$IPXINTERNALNETNUM" "$IPXINTERNALNODENUM"
					;;
			    add)
					action "Adding internal IPX network $IPXINTERNALNETNUM $IPXINTERNALNODENUM:" \
						"$IPX_INTERNAL_NET" add "$IPXINTERNALNETNUM" "$IPXINTERNALNODENUM"
					;;
			    del)
					action "Deleting internal IPX network:" "$IPX_INTERNAL_NET" del
					;;
				esac
				;;
			esac
		else
			restart
		fi
		;;
	probe)
		if [ -x "$LINUXCONF" ]; then
			eval `"$LINUXCONF" --hint netdev`
			if [ -n "$DEV_UP$DEV_DOWN$DEV_RECONF$DEV_RECONF_ALIASES" -o -n "$DEV_RECONF_ROUTES$IPXINTERNALNET" ]; then
				echo reload
			fi
			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
