#!/bin/sh
#
# $Id: network,v 1.14 2003/05/23 11:01:59 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 || exit 1

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=

LOCKFILE=/var/lock/subsys/network

cd /etc/sysconfig/network-scripts && [ -x /sbin/ifconfig ] || exit 1

# If IPv6 is explicitly configured, make sure it's available.
if is_yes "$NETWORKING_IPV6"; 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

interfaces=
vlan_interfaces=
calc_ifaces()
{
	# 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 -e '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 -e 's/^ifcfg-//g'`
}

ifup_interfaces()
{
	local i
	for i in "$@"; do
		if egrep -Lqs "^ONBOOT=\"?[Nn][Oo]\"?" "ifcfg-$i"; then
			# Probe module to preserve interface ordering
			/sbin/ifconfig "$i" >/dev/null 2>&1
		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()
{
	is_yes "$NETWORKING" || return 0
	calc_ifaces

	# Configure kernel parameters like in rc.sysinit
	action "Configuring kernel parameters:" sysctl -e -p /etc/sysconfig/network-scripts/sysctl.conf

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

	if is_yes "$IPX"; then
		"$IPX_CONFIGURE" --auto_primary="$IPXAUTOPRIMARY" --auto_interface="$IPXAUTOFRAME"
		if [ "$IPXINTERNALNETNUM" != 0 ]; then
			"$IPX_INTERNAL_NET" add "$IPXINTERNALNETNUM" "$IPXINTERNALNODENUM"
		fi
	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 is_yes "$DOT1Q_VLANS" && [ -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

	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

	# 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
		if [ -n "$(grep -v '^#' /proc/mounts | awk '{ if (($3 ~ /^(n|smb|ncp)fs$/) && ($2 != "/")) print $2}')" ]; then
			/sbin/service netfs stop
		fi
	fi

	calc_ifaces
	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
	if is_yes "$IPX"; then
		if [ "$IPXINTERNALNETNUM" != 0 ]; then
			"$IPX_INTERNAL_NET" del
		fi
	fi
	./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
	fi

	rm -f "$LOCKFILE"
}

restart()
{
	stop
	start
}

# See how we were called.
case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	reload|restart)
		restart
		;;
	status)
		calc_ifaces

		echo "Configured devices:"
		echo lo $interfaces

		echo "Currently active devices:"
		echo `/sbin/ifconfig | grep ^[a-z] | awk '{print $1}'`
		;;
	probe)
		;;
	*)
		msg_usage "${0##*/} {start|stop|restart|reload|status}"
		exit 1
esac

exit 0
