#!/bin/sh

DPILINK=/usr/ramdisk/bin/padpi.so

# This script is the Policy scheduler, it is a
# very important script.
# This script has implement a simple framework
# for you to add handler for new defined events.

# Log event to the log file
# args: "event msg"
log_event()
{
	echo "`date "+%y/%m/%d %H:%M:%S"` $1" 
}

# restart the whole system
# this is usually used by sig db upgrade
upgrade_sigdb()
{
	local count
	local exited
	local cursec

	newdpiso=${SYSPKGROOT}/upgrade/dpi.so
	[ ! -f ${newdpiso} ] && return 1

	# stop datamon
	exited=0
	for loop in 1 2; do
		# stop datamon 
		errmsg=`/usr/ramdisk/bin/ipectrl stop datamon`
		# wait datamon to exit
		count=20
		while [ ${count} -gt 0 ]; do
			sleep .5
			datamon=`ps ax | grep ipe_datamon | grep -v grep`
			if [ "${datamon}" = "" ]; then
				exited=1
				break
			fi
			count=$((${count} - 1))
		done
	
		[ ${exited} -eq 1 ] && break
	done

	mkdir -p ${SYSPKGROOT}/tmp
	if [ ${exited} -eq 0 ]; then
		echo "ݲɼ޷ر" > ${SYSPKGROOT}/tmp/dpiupresult
		rm -Rf ${SYSPKGROOT}/upgrade/*
		return
	fi

	newdpiso=${SYSPKGROOT}/upgrade/dpi.so
	errmsg=`${FLOWEYE} ipe set path=${newdpiso}`
	if [ "$?" != "0" ]; then
		echo "${errmsg}" > ${SYSPKGROOT}/tmp/dpiupresult
		errmsg=`${RAMDISK}/bin/ipectrl start datamon`
		rm -Rf ${SYSPKGROOT}/upgrade/*
		return
	fi

	cp -f ${SYSPKGROOT}/upgrade/dict.so ${RAMDISK}/bin/
	cp -f ${RAMDISK}/bin/dict.so ${PGPATH}/bin/
	cp -f ${newdpiso} ${RAMDISK}/bin/
	cp -f ${RAMDISK}/bin/dpi.so ${PGPATH}/bin/
	sync

	#reload it from /usr/ramdisk/bin/dpi.so again!
	errmsg=`${FLOWEYE} ipe set path=${RAMDISK}/bin/dpi.so`
	
	sleep .5

	# restart datamon service
	${RAMDISK}/bin/ipectrl start datamon

	rm -Rf ${SYSPKGROOT}/upgrade/*
	echo "SUCCESS" > ${SYSPKGROOT}/tmp/dpiupresult
	sync
}

import_config()
{
	# stop panaos
	count=6
	exited=0
	while [ ${count} -gt 0 ]; do
		# stop panaos
		errmsg=`/usr/ramdisk/bin/ipectrl stop panaos`
		sleep 1
		panaos=`ps ax | grep panaos | grep -v grep`
		[ "${panaos}" = "" ] && exited=1

		[ ${exited} -eq 1 ] && break
		count=$((${count} - 1))
	done

	# upgrade config
	cp -f ${DATAPATH}/config/panabit.conf ${PGETC}/

	# start panaos
	${PGPATH}/bin/ipectrl start panaos

	rm -f ${DATAPATH}/config/panabit.conf

	sync
}

autosync_action()
{
	[ ! -e ${RAMDISK}/bin/cfg_autosync ] && return 1

	case "$1" in
	"start")
		${RAMDISK}/bin/cfg_autosync &
		echo "cfg_autosync is started!"
		return 0
		;;

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

		return 0
		;;

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

# update the whole system
upgrade_system()
{
	local count
	local exited

	autosync_action stop

	exited=0
	for loop in 1 2; do
		# stop datamon 
		errmsg=`${PGPATH}/bin/ipectrl stop datamon`
		# wait datamon to exit
		count=20
		while [ ${count} -gt 0 ]; do
			sleep .5
			datamon=`ps ax | awk '{print $5}' | grep ipe_datamon`
			if [ "${datamon}" = "" ]; then
				exited=1
				break
			fi
			count=$((${count} - 1))
		done
	
		[ ${exited} -eq 1 ] && break
	done

	. /etc/PG.conf
	if [ "${NTM}" = "1" ]; then
		errmsg=`${PGPATH}/bin/ipectrl stop ntmlogd`
	fi

	errmsg=`${PGPATH}/bin/ipectrl stop mgd`
	errmsg=`${PGPATH}/bin/ipectrl stop xping`
	errmsg=`${PGPATH}/bin/ipectrl stop httpd`
	errmsg=`${PGPATH}/bin/ipectrl stop newweb`
	errmsg=`${PGPATH}/bin/ipectrl stop iked`
	errmsg=`${PGPATH}/bin/appctrl stop all`

	# Waiting panaos exit
	count=25
	while [ ${count} -gt 0 ]; do
		errmsg=`${PGPATH}/bin/ipectrl stop panaos 2>&1`
		sleep .2
		panaos=`ps ax | awk '{print $5}' | grep panaos`
		[ "${panaos}" = "" ] && break
		count=$((${count} - 1))
	done

	# restart the whole system
	sleep .1
	# Step 5: restart the whole system
	if [ -f ${PGPATH}/bin/dpi.so.new ]; then
		cp -f ${PGPATH}/bin/dpi.so.new ${RAMDISK}/bin/dpi.so
		mv ${PGPATH}/bin/dpi.so.new ${PGPATH}/bin/dpi.so
		sync
	fi
	
	${PGPATH}/bin/ipectrl start
	sleep .1
	
	# notify the browser the success flag.
	mkdir -p ${SYSPKGROOT}/tmp
	touch ${SYSPKGROOT}/tmp/sys_up_success

	# exit this monitor as the new monitor has 
	# been running
	echo "Upgrade ok, monitor exit!"
	exit 0
}

# handle all events
handle_events()
{
	local evtfile=$1
	local event
	local arg1
	local arg2

	exec 0<${evtfile}
	while read event arg1 arg2
	do
		case ${event} in
		"upgrade_sigdb")
			upgrade_sigdb
			;;

		"upgrade_system")
			upgrade_system
			;;

		"import_config")
			import_config
			;;

		"start_autosync")
			autosync_action start
			;;

		"stop_autosync")
			autosync_action stop
			;;

		"start_datamon")
			${PGPATH}/bin/ipectrl start datamon
			;;

		*)
			log_event "WARNNING Unknown event \"${event}\"!"
			;;
		esac
	done
}


# 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_nz0()
{
        # Setup admin interface
        . ${PGETC}/ifadmin.conf
	ifconfig ${ADMIN_PORT} ${ADMIN_IP} netmask ${ADMIN_MASK}

        # 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
}

authcode_clean()
{
	local curtime=`date +%s`
        local codedir=/usr/ramdisk/authcode
        if [ -d "${codedir}" ]; then
                filelist=`ls ${codedir}`
                for codefile in ${filelist}
                do
                        st_mtime=`${STAT} -f %m ${codedir}/${codefile}`
                        st_mtime=$((${st_mtime} + 60))
                        [ ${curtime} -gt ${st_mtime} ] && rm -f ${codedir}/${codefile}
               done
        fi
}

# Check logins
weblogin_clean()
{
	local filelist
	local loginfile
	local curtime

	authcode_clean

	filelist=`ls /usr/ramdisk/weblogin/paonline_* 2>/dev/null`
	[ "$?" != "0" ] && return

	curtime=`date +%s`
	for loginfile in ${filelist}
	do
  		st_mtime=`${STAT} -f %m ${loginfile}`
		st_mtime=$((${st_mtime} + ${webexit}))
		[ ${curtime} -gt ${st_mtime} ] && rm -f ${loginfile}
	done
}

# Check log
logfile_clean()
{
	local logfile
	local minsec 
	local filesec
	local filelist

	minsec=`date +%s`
	minsec=$((${minsec} - 14 * 86400))

	cd ${DATAPATH}
	filelist=`ls web_*.log 2>/dev/null`
	for logfile in ${filelist}
	do
		filesec=`${STAT} -f %c ${logfile}`
		[ ${filesec} -le ${minsec} ] && rm -f ${logfile}
	done

	filelist=`ls web_*.log 2>/dev/null`
	for logfile in ${filelist}
	do
		filesec=`${STAT} -f %c ${logfile}`
		[ ${filesec} -le ${minsec} ] && rm -f ${logfile}
	done

	if [ -e /usr/ramdisk/datalog/keepme ]; then
		cd /usr/ramdisk/datalog

		filelist=`ls web_*.log 2>/dev/null`
		for logfile in ${filelist}
		do
			filesec=`${STAT} -f %c ${logfile}`
			[ ${filesec} -le ${minsec} ] && rm -f ${logfile}
		done

		filelist=`ls web_*.log 2>/dev/null`
		for logfile in ${filelist}
		do
			filesec=`${STAT} -f %c ${logfile}`
			[ ${filesec} -le ${minsec} ] && rm -f ${logfile}
		done
	fi
}

. /etc/PG.conf

if [ -f "${PGETC}/httpd.conf" ]; then
	monitor_port=`grep "^port=" ${PGETC}/httpd.conf | cut -d"=" -f2`
fi

[ "${HTTPS_PORT}" != "" ] && monitor_port=${HTTPS_PORT}
[ "${monitor_port}" = "" ] && monitor_port=443

webexit=1800
[ -f ${PGETC}/webexit.conf ] && . ${PGETC}/webexit.conf 

pending_event_file=${PGETC}/log/pending_events
current_event_file=${PGETC}/log/current_events
irqbind_count=0
canbindirq=0
osver=`uname -r | cut -d'.' -f1`
[ ${osver} -ge 8 ] && canbindirq=1
lastntptime=`date +%s`
STAT=${PGPATH}/bin/stat
RAMDISK=/usr/ramdisk
SYSPKGROOT="${RAMDISK}"
HTTPD="${RAMDISK}/bin/ipe_httpd"
IKED="${RAMDISK}/bin/iked"
NTMLOGD="${RAMDISK}/bin/ntmlogd"
CERFILE="${RAMDISK}/admin/admin.pem"
ADMIN="${RAMDISK}/admin"
DDNS="${RAMDISK}/app/ddns/ipe_ddns"
PPPOE_PLAN="${RAMDISK}/bin/ipe_pppoeplan"
AIDE_REMARKMAN="${RAMDISK}/admin/cgi-bin/common/aide_remarkman"
aide_time=`date +%s`
FLOWEYE=/usr/ramdisk/bin/floweye
if [ -e /usr/ramdisk/bin/sockstat ]; then
	SOCKSTAT=/usr/ramdisk/bin/sockstat
else
	SOCKSTAT=sockstat
fi

# Rename to wahttpd for killall
cp -f ${RAMDISK}/bin/ipe_httpd ${RAMDISK}/bin/wahttpd
WAHTTPD=${RAMDISK}/bin/wahttpd

# Start cfg_autosync
# autosync_action start

timecnt=0
while true; do
	sleep 1

	# Process pending events
	if [ -f ${pending_event_file} ]; then
		mv ${pending_event_file} ${current_event_file}
		handle_events ${current_event_file}
		rm -f ${current_event_file}
	fi

	if [ ${canbindirq} -ne 0 -a ${irqbind_count} -le 5 ]; then
		irq_bind
		irqbind_count=$((${irqbind_count} + 1))
	fi

	if [ "${ADMIN_PORT}" = "nz0" ]; then
		ipaddr=`ifconfig nz0 inet | grep inet | awk '{print $2}'`
		[ "${ipaddr}" = "" -o "${ipaddr}" = "0.0.0.0" ] && start_nz0
	fi

	weblogin_clean

	timecnt=$((${timecnt} + 1))
	if [ ${timecnt} -ge 30 ]; then
		logfile_clean
		timecnt=0
	fi

	# check healthy of httpd
	httpd_status=0
	webauth_status=0
	for port in `${SOCKSTAT} -l4 -P tcp -p ${monitor_port},8010 | awk '{ print $6}' | cut -d':' -f2`
	do
		if [ "${port}" = "${monitor_port}" ]; then
			httpd_status=1
		elif [ "${port}" = "8010" ]; then
			webauth_status=1
		fi
	done

	if [ ${httpd_status} -eq 0 ]; then
		${HTTPD} -C "${PGETC}/httpd.conf"
	fi

	if [ ${webauth_status} -eq 0 ]; then
		webauth_enable=`${FLOWEYE} webauth stat | grep "webauth_enable" | cut -d'=' -f2`
		[ "${webauth_enable}" = "1" ] && ${WAHTTPD} -noauth -u root -T gb2312 -p 8010 -d ${RAMDISK}/login -M 1
	else
		webauth_enable=`${FLOWEYE} webauth stat | grep "webauth_enable" | cut -d'=' -f2`
		[ "${webauth_enable}" = "0" ] && killall wahttpd
	fi

	if [ -e ${IKED} ]; then
		iked_status=`ps auxwww | grep iked | grep -v grep`
		if [ "X$iked_status" = "X" ]; then
			${IKED} &
		fi
	fi

	if [ -e ${NTMLOGD} ]; then
		ntmlogd_status=`ps auxwww | grep ntmlogd | grep -v grep`
		if [ "X$ntmlogd_status" = "X" ]; then
			/usr/ramdisk/bin/ipectrl start ntmlogd
		fi
	fi

	# ntpdate
	cursecs=`date +%s`
	elapse=$((${cursecs} - ${lastntptime}))
	if [ ${elapse} -ge 3600 ]; then
		lastntptime="${cursecs}"
		if [ -f ${PGETC}/ntp.conf ]; then
			. ${PGETC}/ntp.conf
			[ "${ntpserver_ip}" != "0.0.0.0" ] && ntpdate -t 20 ${ntpserver_ip}
		fi
	fi

	# clean invalid remark on 1 day
	if [ $((`date +%s` - ${aide_time})) -gt 86400 ]; then
		aide_time=`date +%s`
		${AIDE_REMARKMAN} -r
	fi
done
