#!/bin/sh

. /etc/PG.conf

interface="NULL"
max_miss=3

laststat="up"
FLOWEYE="/usr/ramdisk/bin/floweye"
CONF="${PGETC}/web/if_link_vrrp.conf"
log_file="${DATAPATH}/if_link_vrrp.log"


set_vrrp_pri()
{
	for name in `${FLOWEYE} nat listproxy type=vrif | cut -d" " -f3`
	do
		${FLOWEYE} nat setvrif name=${name} priority=${1} preempt=1
	done

	for name in `${FLOWEYE} nat listproxy type=vrif6 | cut -d" " -f3`
	do
		${FLOWEYE} nat setvrif name=${name} priority=${1} preempt=1
	done
}


change_log()
{
	row=0
	
	if [ -f "${log_file}" ]; then
		row=`awk 'END{print NR}' ${log_file}`
	fi

	if [ ${row} -gt 500 ]; then
		if [ "`uname`" = "Linux" ]; then
			sed "1d" ${log_file}
		else
			sed -i "" "1d" ${log_file}
		fi
	fi

	now=`date +"%s"`
	echo "${now} $1" >> ${log_file}
}


monitor_interface()
{
	local nic_stat=1
	local nic_cnt=0
	local nic_down=0

	for obj in `echo ${interface} | tr "," " "`
	do
		[ "${obj}" = "" ] && continue
		exist=`${FLOWEYE} if list | grep "${obj} "`
		[ "${exist}" = "" ] && continue

		nic_cnt=$((${nic_cnt} + 1))
		stat=`${FLOWEYE} if get ${obj} | grep link-state | cut -d"=" -f2`

		if [ "${switch_type}" = "all" ]; then
			[ "${stat}" = "down" ] && nic_down=$((${nic_down} + 1))
		else
			[ "${stat}" = "down" ] && nic_down=${nic_cnt} && break
		fi
	done

	[ "${nic_cnt}" != "0" -a "${nic_cnt}" = "${nic_down}" ] && nic_stat=0
	[ "${nic_cnt}" = 0 ] && nic_stat=""

	echo ${nic_stat}
}


monitor_porxy()
{
	local pxy_stat=1
	local pxy_cnt=0
	local pxy_down=0

	for obj in `echo ${proxy} | tr "," " "`
	do
		[ "${obj}" = "" ] && continue
		exist=`${FLOWEYE} nat listproxy | cut -d" " -f2 | grep -E "^${obj}$"`
		[ "${exist}" = "" ] && continue

		pxy_cnt=$((${pxy_cnt} + 1))
		stat=`${FLOWEYE} nat getproxy ${obj} | grep -E ^state= | head -1 | cut -d"=" -f2`

		if [ "${switch_type}" = "all" ]; then
			[ "${stat}" = "0" ] && pxy_down=$((${pxy_down} + 1))
		else
			[ "${stat}" = "0" ] && pxy_down=${pxy_cnt} && break
		fi
	done

	[ "${pxy_cnt}" != "0" -a "${pxy_cnt}" = "${pxy_down}" ] && pxy_stat=0
	[ "${pxy_cnt}" = 0 ] && pxy_stat=""

	echo ${pxy_stat}
}


# У
if [ ! -f "${CONF}" ]; then
	exit 1
fi

. ${CONF}

[ "${monitor_enable}" != "1" ] && exit 0
[ -f "${log_file}" ] && rm -rf ${log_file}
set_vrrp_pri 255

while true
do
	loop=0
	count=0
	do_change=0
	
	while [ $loop -lt ${max_miss} ]; do
		stat="down"

		ifstat=`monitor_interface`
		pxystat=`monitor_porxy`

		if [ "${switch_type}" = "all" ]; then
			# Ϊգʾδκ·/
			[ "${ifstat}"  = "" ] && ifstat=0
			[ "${pxystat}" = "" ] && pxystat=0
			[ "${ifstat}" = "0" -a "${pxystat}" = "0" ] && count=$((${count} + 1))
		else
			[ "${ifstat}" = "0" -o "${pxystat}" = "0" ] && count=$((${count} + 1))
		fi

		loop=$(($loop+1))
		
		sleep 1
	done
	
	[ "${count}" = "${max_miss}" ] && do_change=1
	
	curtime=`date +"%Y-%m-%d %H:%M.%S"`
	
	if [ $do_change -eq 1 ]; then
		#from active_mode goto backup_mode
		if [ "${laststat}" = "up" ]; then
			set_vrrp_pri 1
			laststat="down"
			change_log "down"
		fi
	else
		#from backup_mode goto active mode
		if [ "${laststat}" = "down" ]; then
			set_vrrp_pri 254
			laststat="up"
			change_log "up"
		fi
	fi
done
