#!/bin/sh
# Start the network interfaces

source /etc/sysconfig/config;
source /etc/sysconfig/helpers/functions

IS_ON=/bin/chkconfig
CONFIG=/var/config

DHCP_PID_FILE="/var/run/udhcpc.pid"
LO_NAME="lo";
LO_IP="127.0.0.1";
INET_IF="eth0";
FAILED=0;

# network services
# to add a network service do two things
# 1) add the name to this list
# 2) create a function called service_<service_name>, that contains a
#    start and stop definition
# note, stop will kill the services in the reverse order that they are started
services="ntp ftp lighttpd"

service_ntp()
{
	case "$1" in 
		"start")
			if $IS_ON ntp
			then
				if [ -x "/usr/bin/ntpdate" ]
				then
					echo -ne "Setting time and date ..."
					/usr/bin/ntpdate 0.pool.ntp.org> /dev/null 2>&1
					if [ "X$?" != "X0" ]
					then 
						echo -ne "\nERROR: Failed to run ntpdate.\n"
						FAILED=1
					else
						echo "done"
						
						if [ -x "/usr/bin/ntpd" ]
						then
							echo -ne "Starting NTP daemon ... "
							/usr/bin/ntpd
							if [ "X$?" != "X0" ]
							then 
								echo -ne "\nERROR: Failed to start ntpd.\n"
								FAILED=1
							else
								echo "done"
							fi
						else
							echo -ne "\nERROR: ntpd not found."
							FAILED=1
						fi
					fi
				else
					echo -ne "\nERROR: ntpdate not found."
					FAILED=1
				fi
			fi
			;;
		"stop")
			/usr/bin/killall ntpd
			;;
	esac
}

service_ftp()
{
	case "$1" in 
		"start")
			if $IS_ON ftp
			then
				if [ -x "/usr/sbin/betaftpd" ]
				then
					echo -ne "Starting BetaFTPd FTP server ... "
					# We hide betaftpd output because logger doesn't like it
					/usr/sbin/betaftpd > /dev/null 2>&1
					if [ "X$?" != "X0" ]
					then 
						echo -ne "\nERROR: Failed to start BetaFTPd.\n"
						FAILED=1
					else
						echo "done"
					fi
				else
					echo -ne "\nERROR: BetaFTPd not found."
					FAILED=1
				fi
			fi
			;;
		"stop")
			/usr/bin/killall betaftpd
			;;
	esac
}

service_lighttpd()
{
	case "$1" in 
		"start")
			if $IS_ON lighttpd
			then
				if [ -x "/usr/sbin/lighttpd" ]
				then
					echo -ne "Starting  lighttpd  server ... "
					# We hide betaftpd output because logger doesn't like it
					mkdir -p /var/log/lighttpd
					/usr/sbin/lighttpd \
						-f /etc/lighttpd/lighttpd.conf \
							> /dev/null 2>&1
					if [ "X$?" != "X0" ]
					then 
						echo -ne "\nERROR: Failed to start lighttpd.\n"
						FAILED=1
					else
						echo "done"
					fi
				else
					echo -ne "\nERROR: lighttpd not found."
					FAILED=1
				fi
			else 
				echo "lighttpd is already running ..."	
			fi
			;;
		"stop")
			/usr/bin/killall lighttpd
			;;
	esac
}

service_appweb()
{
	case "$1" in 
		"start")
			if $IS_ON appweb
			then
				if [ -x "/usr/sbin/appWeb" ]
				then
					echo -ne "Starting HTTP server ... "
					# We hide appWeb output because logger doesn't like it
					/usr/sbin/appWeb -r /etc/appWeb -f appWeb.conf -b > /dev/null 2>&1
# Ignore: appWeb return a non-0 value
#				if [ "X$?" != "X0" ]
#				then 
#					echo -ne "\nERROR: Failed to start AppWeb."
#					FAILED=1
#				else
						echo "done"
#				fi
				else
					echo -ne "\nERROR: AppWeb not found."
					FAILED=1
				fi
			fi	
			;;
		"stop")
			/usr/bin/killall appWeb
			;;
	esac
}

case "$1" in
	"start")
		# This part always has to be done wether network is enabled or not
		echo -ne "Starting network subsystem ... ";
		ERR=0;
		if [ ! -r /proc/net/unix ]; then 
			load_module unix
			if [ "X$?" != "X0" ]; then 
				echo "\nERROR: Failed to load unix module.";
				ERR=1; 
			fi
		fi
		if [ ! -r /proc/net/af_packet ]; then 
			load_module af_packet
			if [ "X$?" != "X0" ]; then 
				echo "\nERROR: Failed to load af_packet module.";
				ERR=2; 
			fi
		fi
		HOSTNAME="$(/etc/sysconfig/helpers/boardcfg hostname)";
		if [ $? -ne 0 ]; then
			echo -ne "\nERROR: Failed to get host name.";
			ERR=3;
		fi
		/bin/hostname ${HOSTNAME};
		if [ "X$?" != "X0" ]; then 
			echo -ne "\nERROR: Could not register host name ${HOSTNAME}.";
			ERR=5; 
		fi
		/sbin/ifconfig ${LO_NAME} ${LO_IP} up;
		if [ "X$?" != "X0" ]; then 
			echo -ne "\nERROR: Unable to register local loopback interface.";
			ERR=6; 
		fi
		if [ $((ERR)) -eq 0 ]; then
			echo "done";
		else
			echo
			FAILED=1;
			ERR=0;
		fi

		if ! $IS_ON network
		then
			echo "done"
			exit 0
		fi

		# these will be initialized if it exist in options file
		MODPARAMS=
		IFCONFIG_OPTS=
		if [ -e ${CONFIG}/network.options ]
		then
			source ${CONFIG}/network.options
		fi

		if [ "X${CONFIG_NETWORK_ENABLE}" == "Xy" ]; then
			echo -ne "Starting network interface ... ";
			ERR=0;
			# Retrieve MAC address
			MAC_ADDR="$(/etc/sysconfig/helpers/boardcfg ethaddr)";
			if [ $? -ne 0 ]; then
				echo -ne "\nERROR: Failed to get MAC address for interface.";
				ERR=1;
			fi
			if [ -z "${MAC_ADDR}" ]; then
				echo -ne "\nERROR: MAC address not found.";
				ERR=2;
			else
				load_module dw_stmmac ${MODPARAMS}
				if [ $? -ne 0 ]; then
					echo -ne "\nERROR: Failed to start network driver.";
					ERR=3;
				fi
				ifconfig eth0 hw ether ${MAC_ADDR} 
			fi
			if [ $((ERR)) -eq 0 ] && [ "X${CONFIG_NETWORK_IPADDR_DYNAMIC}" == "Xy" ] \
						&& [ $(ps aux | grep -v grep | grep -c /sbin/udhcpc) -eq 0 ]; then

				DHCPC_ARGS="--interface=${INET_IF} --pidfile=${DHCP_PID_FILE} --background";
				if [ -n "${HOSTNAME}" ]; then
					DHCPC_ARGS="${DHCPC_ARGS} -h ${HOSTNAME}";
				fi
				/sbin/udhcpc ${DHCPC_ARGS};
				if [ "X$?" != "X0" ]; then 
					echo -ne "\nERROR: Failed to start DHCP client.";
					ERR=4;
				fi
			elif [ $((ERR)) -eq 0 ]
			then
				IP_ADDR="$(/etc/sysconfig/helpers/boardcfg ipaddr)";
				/sbin/ifconfig ${INET_IF} ${IP_ADDR} ${IFCONFIG_OPTS} up 
				if [ "X$?" != "X0" ]; then 
					echo -ne "\nERROR: Failed to start the network on ${INET_IF} using IP ${IPADDR}"; 
					ERR=6;
				fi
			fi
			if [ "X${CONFIG_NETWORK_GATEWAY_IPADDR}" != "X" ]
			then
				/sbin/route add default gw ${CONFIG_NETWORK_GATEWAY_IPADDR}
			fi

			if [ $((ERR)) -eq 0 ]
			then
				echo "done";
			else
				echo
				FAILED=1;
				ERR=0;
			fi
			if [ -x "/usr/sbin/inetd" ]
			then
				echo -ne "Starting super server (inetd) ... ";
				/usr/sbin/inetd;
				if [ "X$?" != "X0" ]
				then 
					echo -ne "\nERROR: Failed to start the super server daemon (inetd)."; 
					FAILED=1;
				else
					echo "done";
				fi
			fi

			for service in $services
			do
				service_${service} start
			done

		fi
		;;
	"stop")
		echo -ne "Stopping network ... ";

		echo ${services} | awk '{ for (i=NF;i>0;i--) print $i }' | \
		while read service
		do
			service_${service} stop
		done

		/usr/bin/killall inetd;

		if [ -r ${DHCP_PID_FILE} ]
		then
			/bin/kill $(cat ${DHCP_PID_FILE})
			if [ "X$?" != "X0" ]
			then 
				ERR=8
			fi
		fi
		/sbin/ifconfig ${INET_IF} down
		/sbin/ifconfig ${LO_NAME} down
		echo "done"
		;;
	*)
		echo "Syntax is $0 start | stop"
		exit 255
esac

if [ "X${FAILED}" != "X0" ]
then
	echo "failed"
	exit 1
else 
	echo "done"
	exit 0
fi
