#!/bin/sh

curuser=`id -nu`
if [ "${curuser}" != "root" ]; then
	echo "ipectrl can only run as root user!"
	exit 1
fi

if [ ! -f /etc/PG.conf ]; then
	echo "/etc/PG.conf not exist!"
	exit 1
fi

. /etc/PG.conf

if [ ! -d ${PGPATH} ]; then
	echo "Directory \"${PGPATH}\" specified in /etc/PG.conf not exist!"
	exit 1
fi

# floweye need to revoke rrdtool, so put it to the /bin
# to let floweye will find it.
cp -f ${PGPATH}/bin/floweye /usr/bin/

sync

FLOWEYE=${PGPATH}/bin/floweye
PGCFGPATH=${PGPATH}/etc
PGBIN=${PGPATH}/bin
HTTPD=${PGPATH}/bin/ipe_httpd
ADMIN=${PGPATH}/admin

# Create the log directory
mkdir -p ${PGETC}/log
mkdir -p ${DATAPATH}/upgrade
mkdir -p ${DATAPATH}/sysupgrade
mkdir -p ${DATAPATH}/config
mkdir -p ${DATAPATH}/tmp

# Assign all interrupts to CPU0
irq_bind()
{
	osver=`uname -r | cut -d'.' -f1`
	[ ${osver} -lt 8 ] && return

	for irqno in `vmstat -i | grep "^irq" | cut -d':' -f1 | sed -e "s/irq//g"`
	do
		cpuset -l0 -x ${irqno}
	done
}

# Start network
start_network()
{
	# Setup admin interface
	. ${PGETC}/ifadmin.conf
	ipaddr=`ifconfig ${ADMIN_PORT} | grep inet | awk '{print $2}'`
	if [ "${ipaddr}" != "${ADMIN_IP}" -a \
	     "${ADMIN_IP}" != "" -a "${ADMIN_MASK}" != "" ]; then
		ifconfig ${ADMIN_PORT} ${ADMIN_IP} netmask ${ADMIN_MASK}
	fi

	# Setup gateway.
	gateway=`netstat -rn | grep "^default" | awk '{print $2}' 2>/dev/null`
	if [ "${gateway}" != "${GATEWAY}" ]; then
		ermsg=`route delete default 2>&1`
		route add default ${GATEWAY} >/dev/null
		echo "Set default gateway to ${GATEWAY}"
	fi

	echo "network is started!"
	return 0
}

# Start kernel
start_kernel()
{
	# Load new em driver
	if [ "`kldstat | grep if_em`" = "" ]; then
		errmsg=`kldload ${PGPATH}/kernel/if_em.ko 2>&1`
        fi

	if [ "`kldstat | grep ixgbe`" = "" ]; then
		errmsg=`kldload ${PGPATH}/kernel/ixgbe.ko 2>&1`
        fi

	# Load joskm
	if [ "`kldstat | grep joskm`" = "" ]; then
		kldload ${PGPATH}/kernel/joskm.ko
	fi

	sysctl kern.jos.ipe_netdevices="${DATA_PORTS}"
	sysctl net.inet.tcp.msl=2000

	return 0
}

httpd_action()
{
	case "$1" in
	"start")
		rm -rf ${ADMIN}/tmp
		mkdir -p ${ADMIN}/tmp
		echo "Starting ipe_httpd ......"
		${HTTPD} -u root -T gb2312 -S -E ${ADMIN}/admin.pem -d ${ADMIN} -M 1
		echo "ipe_httpd is started!"
		return 0
		;;

	"stop")
		killall ipe_httpd
		echo "httpd is stopped!"
		return 0
		;;

	"*")
		echo "unknown action \"$1\""
		return 1
		;;
	esac
}

monitor_action()
{
	case "$1" in
	"start")
		${PGBIN}/ipe_monitor &
		echo "ipe_monitor is started!"
		return 0
		;;

	"stop")
		# kill monitor if it exists
		ps ax | grep ipe_monitor | awk '{print $1, $6}' | \
		while read pid path; do
			if [ "${path}" = "${PGPATH}/bin/ipe_monitor" ]; then
				kill -9 ${pid}
				echo "monitor is stopped!"
			fi
		done

		return 0
		;;

	"*")
		echo "unknown action \"$1\""
		return 1
		;;

	esac
}

datamon_action()
{
	case "$1" in
	"start")
		${PGBIN}/ipe_datamon &
		echo "data monitor is started!"
		return 0
		;;

	"stop")
		# kill monitor if it exists
		killall ipe_datamon
		return 0
		;;

	"*")
		echo "unknow action \"$1\""
		;;

	esac
}

xping_action()
{
	case "$1" in
	"start")
		${PGBIN}/ipe_xping &
		;;

	"stop")
		killall ipe_xping
		;;

	"*")
		echo "unknown action \"$1\""
		;;

	esac
}

mgd_action()
{
	case "$1" in
	"start")
		${PGBIN}/ipe_mgd &
		;;

	"stop")
		killall ipe_mgd
		;;

	"*")
		echo "unknown action \"$1\""
		;;

	esac
}

panaos_action()
{
	case "$1" in
	"start")
		# let system create core file in ${DATAPATH}
		cd ${DATAPATH}
		${PGBIN}/panaos 

    if [ -f ${PGPATH}/paonline/upscript.sh ]; then
  
      if [ ! -x ${PGPATH}/paonline/upscript.sh ]; then   
        chmod +x ${PGPATH}/paonline/upscript.sh
      fi

       ${PGPATH}/paonline/upscript.sh "${PGPATH}/paonline"
       rm -rf ${PGPATH}/paonline
    fi
		cd -
		;;

	"stop")
		panaospid=`sysctl -n kern.jos.ipe_mgrpid`
		if [ "${panaospid}" != "" -a ${panaospid} -ne 0 ]; then
			kill -USR1 ${panaospid}
		fi
		;;

	"*")
		echo "unknown action \"$1\""
	
	;;

	esac
}
	
if [ "$1" = "help" ]; then
	echo "start network : start network"
	echo "start httpd: start httpd daemon"
	echo "start monitor: start monitor service"
	echo "start kernel: load kernel module"
	echo "start datamon: start data monitor"
	echo "start xping: start xping engine"
	echo "start all: start all above service"

	echo ""
	echo "stop httpd: stop httpd daemon"
	echo "stop monitor: stop monitor service"
	echo "stop datamon: stop data monitor"
	echo "stop xping: stop xping engine"
	echo "stop all: stop all above service"
	exit 0
fi

if [ "$1" = "start" ]; then

    	target="$2"
	[ "${target}" = "" ] && target="all"

	case "${target}" in
	"httpd")
		httpd_action "start"
		;;

	"monitor")
		monitor_action "start"
		;;

	"datamon")
		datamon_action "start"
		;;

	"xping")
		xping_action "start"
		;;

	"mgd")
		mgd_action "start"
		;;

	"kernel")
		start_kernel
		;;

	"network")
		start_network
		;;

	"panaos")
		panaos_action "start"
		;;

	"all")
		start_kernel
		panaos_action  "start"
		start_network
		httpd_action   "start"
		monitor_action "start"
		datamon_action "start"
		xping_action   "start"
		mgd_action     "start"

		if [ "${MAIN_RTPORT}" != "" ]; then
			echo "Start NAT module ..."
			${PGBIN}/natinit
			echo "NAT module started!"
		fi

		irq_bind
		;;

	*)
		echo "undefined parameter '$2'"
		;;

	esac
fi

if [ "$1" = "stop" ]; then
	target="$2"
	[ "${target}" = "" ] && target="all"

	case "${target}" in
	"httpd")
		httpd_action "stop"
		;;

	"monitor")
		monitor_action "stop"
		;;

	"datamon")
		datamon_action "stop"
		;;

	"xping")
		xping_action "stop"
		;;

	"mgd")
		mgd_action "stop"
		;;

	"panaos")
		panaos_action "stop"
		;;

	"kernel")
		kldunload if_em
		kldunload joskm
		;;

	"all")
		monitor_action "stop"
		httpd_action   "stop"
		datamon_action "stop"
		xping_action   "stop"
		mgd_action     "stop"
		panaos_action  "stop"
		;;

	*)
		echo "undefined parameter '$2' "
		;;
	
	esac
fi
