#!/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

# $Id: network 6327 2005-08-23 16:26:48Z arekm $

PATH=/sbin:/usr/sbin:/bin:/usr/bin

# NLS
NLS_DOMAIN="rc-scripts"

# Source function library.
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network-scripts/functions.network

if [ ! -f /etc/sysconfig/network ]; then
	nls "%s is missing. Can't continue." "/etc/sysconfig/network"
	exit 1
fi

. /etc/sysconfig/network

# Check that networking is up.
is_no "${NETWORKING}" && exit 0

# Will be removed in the future
if is_yes "$NETWORKING" ; then
	if [ -z "$IPV4_NETWORKING" ] ; then
		echo "NETWORKING is set to YES, but IPV4_NETWORKING is empty!"
		echo "Please upgrade your config"
		echo "Assuming you want IPv4 networking"
		IPV4_NETWORKING=yes
	fi
fi

if [ ! -x /sbin/ip ]; then
	nls "%s is missing. Can't continue." "/sbin/ip"
	exit 1
fi

######
# initialize networking:
# - check IPv4, IPv6, IPX can be handled by system
# - setup default IPv{4,6} interfaces policy like:
#   - spoofig protection,
#   - icmp echo ignore broadcasts,
# - setup lo interface
network_init()
{
# Modprobe needed devices
modprobe_net

# Setup interfaces names
[ -x /sbin/nameif -a -f /etc/mactab ] && run_cmd "Setting interfaces names (nameif)" /sbin/nameif

# Kernel network parameters
sysctl -e -p /etc/sysctl.conf > /dev/null 2>&1

# Set UP loopback interface
set_up_loopback

# Setup configuration
setup_nat on
setup_routes on
setup_ip_rules on
# Setup IPX
if is_yes "$IPX"; then
	if [ -n $IPXAUTOPRIMARY ] ; then
		if is_yes "$IPXAUTOPRIMARY"; then
			IPXAUTOPRIMARY="on"
		else
			IPXAUTOPRIMARY="off"
		fi
		/sbin/ipx_configure --auto_primary=$IPXAUTOPRIMARY
	fi
	if [ -n $IPXAUTOFRAME ] ; then
		if is_yes "$IPXAUTOFRAME"; then
			IPXAUTOFRAME="on"
		else
			IPXAUTOFRAME="off"
		fi
		/sbin/ipx_configure --auto_interface=$IPXAUTOFRAME
	fi
	if [ -n "$IPXINTERNALNETNUM" -a "$IPXINTERNALNETNUM" != "0" ]; then
		/sbin/ipx_internal_net add $IPXINTERNALNETNUM $IPXINTERNALNODENUM
	fi
fi
}

network_postinit()
{
# Set static RARP table
static_rarp

# Set static ARP table
static_arp
}

######
# deinitialize networking
# - down lo interface.
network_deinit()
{
setup_routes off
setup_ip_rules off

# Set down NAT rules
setup_nat off
# Set DOWN loopback interface
set_down_loopback
}

# find all the interfaces besides loopback.
# ignore aliases, alternative configurations, and editor backup files
if [ -n "$(grep "^BOOTPRIO=" /etc/sysconfig/interfaces/ifcfg* 2> /dev/null)" ]; then
	interfaces_boot=$(( \
		. /etc/rc.d/init.d/functions; \
		cd /etc/sysconfig/interfaces; \
		egrep 'BOOTPRIO' ifcfg* | sort -t= -n -k2,2 | \
		awk ' { gsub(/:BOOTPRIO.*/,NIL); print $0 } '| egrep -v 'ifcfg-lo' | \
		for i in `cat`; do \
		    ONBOOT=""; . /etc/sysconfig/interfaces/"$i"; is_yes "$ONBOOT" &&
		    echo "$i"; \
		done | \
		awk ' { gsub(/ifcfg-/,NIL); print $0 } ') 2> /dev/null)
else
	interfaces_boot=$((
		. /etc/rc.d/init.d/functions; \
		cd /etc/sysconfig/interfaces && ls -1 ifcfg* | \
		egrep -v '(ifcfg-lo|ifcfg-sit|ifcfg-atm|ifcfg-lec|ifcfg-nas|ifcfg-br|ifcfg-(.*)\.(.*))' | \
		LC_ALL=C egrep 'ifcfg-[a-z0-9\.]+$' | \
		for i in `cat`; do \
		    ONBOOT=""; . /etc/sysconfig/interfaces/"$i"; is_yes "$ONBOOT" && echo "$i"; \
		done | \
		awk ' { gsub(/ifcfg-/,NIL); print $0 } ') 2> /dev/null)
	interfaces_vlan_boot=$((
		. /etc/rc.d/init.d/functions; \
		cd /etc/sysconfig/interfaces && ls -1 ifcfg* | \
		egrep 'ifcfg-(.*)\.(.*)' | \
		LC_ALL=C egrep 'ifcfg-[a-z0-9\.]+$' | \
		for i in `cat`; do \
		    ONBOOT=""; . /etc/sysconfig/interfaces/"$i"; is_yes "$ONBOOT" && echo "$i"; \
		done | \
		awk ' { gsub(/ifcfg-/,NIL); print $0 } ') 2> /dev/null)
	interfaces_br_boot=$((
		. /etc/rc.d/init.d/functions; \
		cd /etc/sysconfig/interfaces && ls -1 ifcfg-br* | \
		LC_ALL=C egrep 'ifcfg-[a-z0-9\.]+$' | \
		for i in `cat`; do \
		    ONBOOT=""; . /etc/sysconfig/interfaces/"$i"; is_yes "$ONBOOT" && echo "$i"; \
		done | \
		awk ' { gsub(/ifcfg-/,NIL); print $0 } ') 2> /dev/null)
	interfaces_sit_boot=$((
		. /etc/rc.d/init.d/functions; \
		cd /etc/sysconfig/interfaces && ls -1 ifcfg-sit* | \
		LC_ALL=C egrep 'ifcfg-[a-z0-9]+$' | \
		for i in `cat`; do \
		    ONBOOT=""; . /etc/sysconfig/interfaces/"$i"; is_yes "$ONBOOT" && echo "$i"; \
		done | \
		awk ' { gsub(/ifcfg-/,NIL); print $0 } ') 2> /dev/null)
fi
tunnels=$((cd /etc/sysconfig/interfaces && ls -1 tnlcfg-* | \
	xargs egrep -l "ONBOOT=[^n][^o]" | \
	LC_ALL=C egrep 'tnlcfg-[a-z0-9]+$' | \
	awk ' { gsub(/tnlcfg-/,NIL); print $0 } ') 2> /dev/null)

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

	network_init

	for i in $interfaces_boot $interfaces_vlan_boot $interfaces_sit_boot ; do
		run_cmd -a "$(nls 'Bringing up interface %s' "$i")" /sbin/ifup $i boot
	done
	
	for i in $interfaces_br_boot ; do
		run_cmd -a "$(nls 'Bringing up bridge interface %s' "$i")" /sbin/ifup $i boot
	done

	for i in $tunnels; do
		run_cmd -a "$(nls 'Setting tunnel %s' "$i")" /sbin/tnlup $i boot
		run_cmd -a "$(nls 'Bringing up tunnel interface %s' "$i")" /sbin/ifup tnlcfg-$i boot
	done

	network_postinit

        touch /var/lock/subsys/network
        ;;
  stop)
  	# If we go to runlevel 0, 1 or 6 then umount all network fs
	if [ "$RUNLEVEL" = "6" -o "$RUNLEVEL" = "0" -o "$RUNLEVEL" = "1" ]; then
		if [ -x /etc/rc.d/init.d/netfs -a -f /var/lock/subsys/netfs ];
		then
			/etc/rc.d/init.d/netfs stop
		else
			netmtab=$(awk '{ if ($3 ~ /^(nfs|smbfs|ncpfs)$/ ) print $3}' /proc/mounts)
			if (echo "$netmtab" | grep -q nfs); then
			   run_cmd "Unmounting NFS filesystems" umount -fat nfs
			fi
			if (echo "$netmtab" | grep -q smbfs); then
			   run_cmd "Unmounting SMB filesystems" umount -at smbfs
			fi
			if (echo "$netmtab" | grep -q ncpfs); then
			   run_cmd "Unmounting NCP filesystems" umount -at ncpfs
			fi
			if (echo "$netmtab" | grep -q cifs); then
			   run_cmd "Unmounting CIFS filesystems" umount -at cifs
			fi
		fi
	fi

	for i in $tunnels; do
		run_cmd -a "$(nls 'Shutting down tunnel interface %s' "$i")" /sbin/ifdown tnlcfg-$i boot
		run_cmd -a "$(nls 'Removing tunnel %s' "$i")" /sbin/tnldown $i boot
	done

	for i in $interfaces_br_boot ; do
		run_cmd -a "$(nls 'Shutting down bridge interface %s' "$i")" /sbin/ifdown $i boot
	done

	for i in $interfaces_sit_boot $interfaces_vlan_boot $interfaces_boot ; do
		run_cmd -a "$(nls 'Shutting down interface %s' "$i")" /sbin/ifdown $i boot
	done

	network_deinit

        rm -f /var/lock/subsys/network
        ;;
  status)
	nls "Configured devices:"
	echo "lo $interfaces"
	nls "Configured tunnels:"
	echo "$tunnels"
	echo
	nls "Currently inactive devices and tunnels:"
	/sbin/ip link show | awk -F":" '(/^[0-90-90-9]:/) && ! (/UP/) { print $2 }' | xargs
	nls "Currently active devices and tunnels:"
	/sbin/ip link show | awk -F":" ' (/UP/) { print $2 }' | xargs
	;;
  restart)
	$0 stop
	$0 start
	;;
  *)
        echo "Usage: $0 {start|stop|restart|status}"
        exit 1
esac

exit 0

# This must be last line !
# vi:syntax=sh:tw=78:ts=8:sw=4
