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

# part of this fils is from ntpd.init

# ntpd		This shell script takes care of starting and stopping
#		ntpd (NTPv4 daemon).
#
# ntpd is the NTPv4 daemon. \
# The Network Time Protocol (NTP) is used to synchronize the time of \
# a computer client or server to another server or reference time source, \
# such as a radio or satellite receiver or modem.

### BEGIN INIT INFO
# Provides: $network
### END INIT INFO

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

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

# Source networking configuration.
. /etc/sysconfig/network

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

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

ntpconf=/etc/ntp.conf
ntpstep=/etc/ntp/step-tickers

sync_hwclock() {
	ARC=0
	SRM=0
	UTC=0

	if [ -f /etc/sysconfig/clock ]; then
	   . /etc/sysconfig/clock

	   # convert old style clock config to new values
	   if [ "${CLOCKMODE}" = "GMT" ]; then
	      UTC=true
	   elif [ "${CLOCKMODE}" = "ARC" ]; then
	      ARC=true
	   fi
	fi

	CLOCKFLAGS="$CLOCKFLAGS --systohc"

	case "$UTC" in
	    yes|true)	CLOCKFLAGS="$CLOCKFLAGS --utc";;
	    no|false)	CLOCKFLAGS="$CLOCKFLAGS --localtime";;
	esac
	case "$ARC" in
	    yes|true)	CLOCKFLAGS="$CLOCKFLAGS --arc";;
	esac
	case "$SRM" in
	    yes|true)	CLOCKFLAGS="$CLOCKFLAGS --srm";;
	esac

	action $"Syncing hardware clock to system time" /sbin/hwclock $CLOCKFLAGS
}

read_ntp_conf() {
	dostep=''
	dropstr=''
	hasg=''
	OPTIND=1
	while getopts ":46aAbc:dD:f:gi:I:k:l:LmnN:p:P:qr:s:t:u:U:v:V:x" args $OPTIONS;
	do 
	  case "$args" in
	    x) dostep=yes;;
	    c) ntpconf="$OPTARG";;
	    u) dropstr="-U $(echo $OPTARG | sed 's/:.*//')";;
	    g) hasg=yes;;
	  esac
	done

	[ -x /usr/sbin/ntpd -a -f $ntpconf ] || exit 0

	tickers=''
	if [ -s "$ntpstep" ]; then
	    tickers=$(sed 's/#.*//' $ntpstep)
	    echo "$tickers" | grep -qi '[a-z0-9]' && dostep=yes || tickers=''
	fi
	if [ -n "$dostep" -a -z "$tickers" ]; then
	    # -x option is used, but step-tickers doesn't exist or contain
	    # anything useful, use servers from ntp.conf instead
	    tickers=$(awk '$1=="peer"||$1=="server"{print $2}' $ntpconf | \
	        egrep -v '127\.127\.[0-9]+\.[0-9]+')
	fi
}

start_ntp() {
	read_ntp_conf;

	if [ -n "$dostep" ]; then
	    echo -n $"$prog: Synchronizing with time server: "
	    /usr/sbin/ntpdate $dropstr -s -b $NTPDATE_OPTIONS $tickers &>/dev/null
	    RETVAL=$?
	    [ $RETVAL -eq 0 ] && success || failure
	    echo
	    if [ $RETVAL -eq 0 ]; then
	        [ "$SYNC_HWCLOCK" = "yes" ] && sync_hwclock
	    elif [ -z "$hasg" ]; then
	        OPTIONS="$OPTIONS -g"
	    fi
	elif [ -z "$hasg" ]; then
	    # -g can replace the grep for time servers
	    # as it permits ntpd to violate its 1000s limit once.
	    OPTIONS="$OPTIONS -g"
	fi
        # Start daemons.
        echo -n $"Starting $prog: "
        daemon ntpd $OPTIONS
	RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/ntpd
	return $RETVAL
}

stop_ntp() {
        echo -n $"Shutting down $prog: "
	killproc ntpd
	RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/ntpd
	return $RETVAL
}


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

# if the ip configuration utility isn't around we can't function.
[ -x /sbin/ip ] || exit 1

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

# Even if VLAN is configured, without the utility we can't do much
[ ! -x /sbin/vconfig ] && VLAN=

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

. ./network-functions

# find all the interfaces besides loopback.
# ignore aliases, alternative configurations, and editor backup files
interfaces=$(ls ifcfg* | \
	    LANG=C sed -e "$__sed_discard_ignored_files" \
		       -e '/\(ifcfg-lo\|:\|ifcfg-.*-range\)/d' \
		       -e '/ifcfg-[A-Za-z0-9\._-]\+$/ { s/^ifcfg-//g;s/[0-9]/ &/}' | \
	    LANG=C sort -k 1,1 -k 2n | \
	    LANG=C sed 's/ //')

# See how we were called.
case "$1" in
  start)
	# IPv6 hook (pre IPv4 start)
	if [ -x /etc/sysconfig/network-scripts/init.ipv6-global ]; then
		/etc/sysconfig/network-scripts/init.ipv6-global start pre
	fi
  
	sysctl -e -p /etc/sysctl.conf >/dev/null 2>&1

	# bring up loopback interface
	action $"Bringing up loopback interface: " ./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

	case "$VLAN" in
	  yes)
	    if [ -d /proc/net/vlan ] || modprobe 8021q >/dev/null 2>&1 ; then
		test -z "$VLAN_NAME_TYPE" && VLAN_NAME_TYPE=DEV_PLUS_VID_NO_PAD
		action $"Setting 802.1Q VLAN parameters: " /sbin/vconfig set_name_type "$VLAN_NAME_TYPE"
	    else
		echo $"No 802.1Q VLAN support available in kernel."
	    fi
	    ;;
	esac

	vlaninterfaces=""
	cipeinterfaces=""
	xdslinterfaces=""
	bridgeinterfaces=""

	# bring up all other interfaces configured to come up at boot time
	for i in $interfaces; do
		unset DEVICE TYPE SLAVE
		eval $(LANG=C fgrep "DEVICE=" ifcfg-$i)
		eval $(LANG=C fgrep "TYPE=" ifcfg-$i)
		eval $(LANG=C fgrep "SLAVE=" ifcfg-$i)

		if [ -z "$DEVICE" ] ; then DEVICE="$i"; fi

		if [ "${DEVICE##cipcb}" != "$DEVICE" ] ; then
			cipeinterfaces="$cipeinterfaces $i"
			continue
		fi
		if [ "$TYPE" = "xDSL" ]; then
		        xdslinterfaces="$xdslinterfaces $i"
			continue
		fi

		if [ "$TYPE" = "Bridge" ]; then
		        bridgeinterfaces="$bridgeinterfaces $i"
			continue
		fi

		if [ "${DEVICE%%.*}" != "$DEVICE"  -o  "${DEVICE##vlan}" != "$DEVICE" ] ; then
			vlaninterfaces="$vlaninterfaces $i"
			continue
		fi
		
		if [ "$SLAVE" = "yes" ]; then
			continue
		fi

		if LANG=C egrep -L "^ONBOOT=['\"]?[Nn][Oo]['\"]?" ifcfg-$i > /dev/null ; then
		        # this loads the module, to preserve ordering
			is_available $i
			continue
		fi
		# If we're in confirmation mode, get user confirmation.
		if [ -f /var/run/confirm ]; then
			confirm $i
			test $? = 1 && continue
		fi
		(
			action $"Bringing up interface $i: " ./ifup $i boot
			if [ $i == "eth0" ] && ! check_device_down $i ; then start_ntp; fi
		) &
	done
	
	# Bring up xDSL and CIPE interfaces
	for i in $vlaninterfaces $bridgeinterfaces $xdslinterfaces $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.
		if [ -f /var/run/confirm ]; then
			confirm $i
			test $? = 1 && continue
		fi
		action $"Bringing up interface $i: " ./ifup $i boot
	    fi
        done

	# 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 [ -x /etc/sysconfig/network-scripts/init.ipv6-global ]; then
 		/etc/sysconfig/network-scripts/init.ipv6-global start post
 	fi
	# Run this again to catch any interface-specific actions
	sysctl -e -p /etc/sysctl.conf >/dev/null 2>&1
 
        touch /var/lock/subsys/network

	[ -n "${NETWORKDELAY}" ] && /bin/sleep ${NETWORKDELAY}
        ;;
  stop)
  	# Don't shut the network down if root is on NFS or a network
	# block device.
        rootfs=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $3; }}' /etc/mtab)
        rootopts=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $4; }}' /etc/mtab)
	
	if [[ "$rootfs" =~ "^nfs" ]] || [[ "$rootopts" =~ "_netdev" ]] ; then
		exit 1
	fi
  
  	# 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=`LC_ALL=C awk '$3  ~ /^nfs/ { print $2 }' /proc/mounts`
		SMBMTAB=`LC_ALL=C awk '$3 == "smbfs" { print $2 }' /proc/mounts`
		NCPMTAB=`LC_ALL=C awk '$3 == "ncpfs" { print $2 }' /proc/mounts`
		if [ -n "$NFSMTAB" -o -n "$SMBMTAB" -o -n "$NCPMTAB" ] ; then
			/etc/init.d/netfs stop
		fi
	fi
	
 	# IPv6 hook (pre IPv4 stop)
 	if [ -x /etc/sysconfig/network-scripts/init.ipv6-global ]; then
 		/etc/sysconfig/network-scripts/init.ipv6-global stop pre
 	fi
 
	vlaninterfaces=""
	cipeinterfaces=""
	xdslinterfaces=""
	bridgeinterfaces=""
	remaining=""

	# get list of bonding, cipe, and xdsl interfaces
	for i in $interfaces; do
		unset DEVICE TYPE
		eval $(LANG=C fgrep "DEVICE=" ifcfg-$i)
		eval $(LANG=C fgrep "TYPE=" ifcfg-$i)

		if [ -z "$DEVICE" ] ; then DEVICE="$i"; fi

		if [ "${DEVICE##cipcb}" != "$DEVICE" ] ; then
			cipeinterfaces="$cipeinterfaces $i"
			continue
		fi
		if [ "$TYPE" = "Bridge" ]; then
		        bridgeinterfaces="$bridgeinterfaces $i"
		        continue
		fi
		if [ "$TYPE" = "xDSL" ]; then
		        xdslinterfaces="$xdslinterfaces $i"
			continue
		fi

		if [ "${DEVICE%%.*}" != "$DEVICE"  -o  "${DEVICE##vlan}" != "$DEVICE" ] ; then
			vlaninterfaces="$vlaninterfaces $i"
			continue
		fi
		remaining="$remaining $i"
	done
	
	for i in $cipeinterfaces $xdslinterfaces $bridgeinterfaces $vlaninterfaces $remaining; do
		(. ifcfg-$i
		if [ -z "$DEVICE" ] ; then DEVICE="$i"; fi

		if ! check_device_down $DEVICE; then
		   if [ $i == "eth0" ]; then stop_ntp; fi
		   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

	action $"Shutting down loopback interface: " ./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 [ -x /etc/sysconfig/network-scripts/init.ipv6-global ]; then
		/etc/sysconfig/network-scripts/init.ipv6-global stop post
	fi
	
        rm -f /var/lock/subsys/network
        ;;
  status)
	echo $"Configured devices:"
	echo lo $interfaces

	echo $"Currently active devices:"
	echo $(/sbin/ip -o link show up | awk -F ": " '{ print $2 }')
	;;
  restart|reload)
        cd "$CWD"
	$0 stop
	$0 start
	;;
  *)
        echo $"Usage: $0 {start|stop|restart|reload|status}"
        exit 1
esac

exit 0


# See how we were called.
case "$1" in
  start)
	start
        ;;
  stop)
	stop
        ;;
  status)
	status ntpd
	RETVAL=$?
	;;
  restart|reload)
	stop
	start
	RETVAL=$?
	;;
  condrestart)
	if [ -f /var/lock/subsys/ntpd ]; then
	    stop
	    start
	    RETVAL=$?
	fi
	;;
  *)
        echo $"Usage: $0 {start|stop|restart|condrestart|status}"
        exit 1
esac

exit $RETVAL
