#!/bin/sh

cnt=$1
verify=${2:-0}

if [ "$cnt" = "" ]; then
	echo
	echo "Usage: $0 <number of d100 cards> <1 = verify_only>"
	echo
	exit 1
fi

fmver=$(/usr/local/nsc/bin/sngtc_tool -firmware_version | grep Vocallo | awk {'print $5'})
NOHUP=

echo > /etc/udev/rules.d/70-persistent-net.rules

logit()
{
	local data=$1

	echo "$data" | grep -i error > /dev/null
	if [ $? -eq 0 ]; then
		echo -e "\e[00;31m$data\e[00m";
		echo -en '\e[00m'
		return 0
	fi
	echo "$data" | grep -i fail > /dev/null
	if [ $? -eq 0 ]; then
		echo -e "\e[00;31m$data\e[00m";
		echo -en '\e[00m'
		return 0
	fi
	echo "$data" | grep -i skipping > /dev/null
	if [ $? -eq 0 ]; then
		echo -e "\e[01;31m$data\e[00m";
		echo -en '\e[00m'
		return 0
	fi
	echo "$data" | grep -i pass > /dev/null
	if [ $? -eq 0 ]; then
		echo -e "\e[00;32m$data\e[00m";
		echo -en '\e[00m'
		return 0
	fi
	echo -e "$data";
}

function check_up_devices()
{

	d100_up_dev=
	up_timeout=0
	logit "Checking up devices ... "
	for eth in $d100_dev_list
	do
		eval "ifconfig $eth | grep RUNNING -c > /dev/null"
		if [ $? -ne 0 ]; then
			logit "Device $eth down";
			ifconfig $eth down
			up_timeout=1
		else
			d100_up_dev="$d100_up_dev $eth"
		fi
	done

}

function dsp_prod_test()
{
	local dsp_dev=$1
	local eth=$dsp_dev
	local TMP_FILE="/tmp/output.$dsp_dev"
	local ucnt=0
	local dsp_found=0
	local fw_skipped=0

	#echo "Running dsp_prod_test in $$  output in $TMP_FILE" 
	touch /tmp/eol_running.$dsp_dev

	for ((x=0;x<3;x++))
	do
		echo > $TMP_FILE 
		#echo "/usr/local/nsc/bin/sngtc_tool -dev $dsp_dev -list_modules >>$TMP_FILE 2>> $TMP_FILE"
		eval "/usr/local/nsc/bin/sngtc_tool -dev $dsp_dev -list_modules >>$TMP_FILE 2>> $TMP_FILE"
		ucnt=$(grep $fmver $TMP_FILE -c) 
		dsp_cnt=$(grep MAC $TMP_FILE -c) 

		if [ $dsp_cnt -eq 0 ]; then
			sleep 5
			continue
		fi

		dsp_found=1

		if [ $ucnt -ne $dsp_cnt ]; then
			logit "\tRunning firmware update for $dsp_dev"
			eval "$NOHUP /usr/local/nsc/bin/sngtc_tool -dev $dsp_dev -firmware -silenti > /dev/null"
		else
			logit "\tSkipping fw update for $dsp_dev"
			fw_skipped=1
		fi
		break
	done

	if [ $dsp_found -eq  0 ]; then
		logit "\tFAIL: No DSP found on $dsp_dev"

	else
		logit "\tRunning license update for $dsp_dev"
		eval "$NOHUP /usr/local/nsc/bin/sngtc_tool -dev $dsp_dev -license -silent > /dev/null"

		
		if [ $fw_skipped = 0 ]; then	
			logit "\tRunning reset 1.4 for $dsp_dev"
			eval "$NOHUP sngtc_tool -dev $eth -reset -silent > /dev/null 2> /dev/null"

			sleep 10
		fi

		logit "\tRunning reset for $dsp_dev"
		eval "$NOHUP /usr/local/nsc/bin/sngtc_tool -dev $eth -reset -silent > /dev/null 2> /dev/null"
		
		sleep 10

		logit "\tUpdate done for $dsp_dev"

		logit "\tVerifying firmware on $dsp_dev"
		for ((x=0;x<5;x++))
		do
			echo > $TMP_FILE 
			#echo "/usr/local/nsc/bin/sngtc_tool -dev $dsp_dev -list_modules >>$TMP_FILE 2>> $TMP_FILE"
			eval "/usr/local/nsc/bin/sngtc_tool -dev $dsp_dev -list_modules >>$TMP_FILE 2>> $TMP_FILE"
			ucnt=$(grep $fmver $TMP_FILE -c) 
			dsp_cnt=$(grep MAC $TMP_FILE -c) 

			if [ $dsp_cnt -eq 0 ]; then
				logit "Retry verify $dsp_dev"
				sleep 5
				continue
			fi

			dsp_found=1

			if [ $ucnt -ne $dsp_cnt ]; then
				logit "\tFirmware upgrade failed for $dsp_dev"
			else
				logit "\tFirmware upgrade passed for $dsp_dev"
			fi
			break
		done

		ip="192.100.${dsp_dev: -1}.1";
		vip="192.100.${dsp_dev: -1}.2";
		logit "\tRunning Bert Test for 20sec: $dsp_dev $ip $vip"
		eval "/usr/local/nsc/bin/sngtc_client -bindip $ip -vocalloip $vip -ethdev $dsp_dev -sessions 10 -bert -bert_silent -linger -timeout 20"
		if [ $? -eq 0 ]; then
			logit "PASS: Media test OK for $dsp_dev"
		else
			logit "FAIL: Media test failed for $dsp_dev"
		fi	
		
	fi
	
	rm -f /tmp/eol_running.$dsp_dev

}

function dsp_upgrade_firmware()
{
	for eth in $d100_up_dev
	do
		logit "Updating firmware on $eth ..."
		eval "$NOHUP /usr/local/nsc/bin/sngtc_tool -dev $eth -firmware -silent &"
	done

	while [ 1 ]; do
		eval "ps fax > /tmp/ps.$$"
		eval "grep sngtc_tool /tmp/ps.$$ -c > /dev/null"
		if [ $? -ne 0 ]; then
			break
		fi
		sleep 5
		echo "Waiting for firmware"
	done
}

function dsp_upgrade_license()
{

	for eth in $d100_up_dev
	do
		logit "Updating license on $eth ..."
		eval "$NOHUP /usr/local/nsc/bin/sngtc_tool -dev $eth -license -silent &"
	done

	while [ 1 ]; do
		eval "ps fax > /tmp/ps.$$"
		eval "grep sngtc_tool /tmp/ps.$$ -c > /dev/null"
		if [ $? -ne 0 ]; then
			break
		fi
		sleep 5
		echo "Waiting for license"
	done

}

function dsp_reset_14()
{
	for eth in $d100_up_dev
	do
		logit "Resetting 1.4 on $eth ..."
		eval "$NOHUP sngtc_tool -dev $eth -reset -silent &"
	done

	while [ 1 ]; do
		eval "ps fax > /tmp/ps.$$"
		eval "grep sngtc_tool /tmp/ps.$$ -c > /dev/null"
		if [ $? -ne 0 ]; then
			break
		fi
		sleep 5
		echo "Waiting for reset 1.4"
	done
}

function dsp_reset()
{
	for eth in $d100_up_dev
	do
		logit "Resetting on $eth ..."
		eval "$NOHUP /usr/local/nsc/bin/sngtc_tool -dev $eth -reset -silent &"
	done

	while [ 1 ]; do
		eval "ps fax > /tmp/ps.$$"
		eval "grep sngtc_tool /tmp/ps.$$ -c > /dev/null"
		if [ $? -ne 0 ]; then
			break
		fi
		sleep 5
		echo "Waiting for reset"
	done
}

d100_dev_list=""
dev_cnt=0
dev_list=`cat /proc/net/dev | awk '{print $1}' | grep -e eth -e sng | cut -d':' -f1`
for eth in $dev_list
do
    eval "ifconfig $eth | grep HWaddr | grep '02:19:23' > /dev/null"
    if [ $? -eq 0 ]; then
        eval "ethtool -i $eth | grep 'driver:.*tg3' > /dev/null "
        if [ $? -eq 0 ]; then
			logit "DSP device $eth  "
            dev=$eth
			dev_cnt=$((dev_cnt+1))
			ip="192.100.${eth: -1}.1";
			#logit "Setting ip $eth $ip $vip"
			eval "ifconfig $dev $ip/24 up"
			d100_dev_list="$d100_dev_list $dev"
        fi
    else
        rc=0
    fi
done

timeout=0
up_timeout=0
echo "Waiting for $d100_dev_list to come up..."
for ((x=0;x<10;x++))
do
	all_up=1
	for eth in $d100_dev_list
	do
		eval "ifconfig $eth | grep RUNNING -c > /dev/null"
		if [ $? -ne 0 ]; then
			all_up=0
			break;
		fi
	done
	if [ $all_up -eq 1 ]; then
		break
	fi
	echo "Sleeping..."
	sleep 2
done

check_up_devices
if [ 1 -eq 1 ]; then
	if [ $up_timeout -ne 0 ]; then
		logit
		logit "FAIL: d100 devices did not come up"
		logit 
		exit 1
	else
		logit "PASS: All DSP interfaces $dev_cnt are up"
	fi
fi

if [ $dev_cnt -ne $cnt ]; then
	logit
	logit "FAIL: Detected $dev_cnt d100 expected $cnt"
	logit
	exit 1
fi

if [ 0 -eq $verify ]; then

	for eth in $d100_up_dev
	do
		dsp_prod_test $eth & 
	done

	sleep 10

	while [ 1 ]; do
		wait_for_prod=0
		for eth in $d100_up_dev
		do
			if [ -e /tmp/eol_running.$eth ]; then
				wait_for_prod=1
			fi
		done

		if [ $wait_for_prod -eq 0 ]; then
			echo "Prod test done"
			break
		fi	

		echo "Waiting on prod test"
		sleep 10
	done

else 

	echo > /tmp/output
	echo "Checking devices"

	for eth in $d100_up_dev
	do
		echo > /tmp/output.$eth
		eval "/usr/local/nsc/bin/sngtc_tool -dev $eth -list_modules >>/tmp/output.$eth 2>>/tmp/output.$eth &"
	done

	while [ 1 ]; do
		eval "ps fax > /tmp/ps.$$"
		eval "grep sngtc_tool /tmp/ps.$$ -c > /dev/null"
		if [ $? -ne 0 ]; then
			break
		fi
		sleep 5
		echo "Waiting for status"
	done

fi

update_cnt=0
for eth in $d100_up_dev
do
	echo "Device $eth"
	cat /tmp/output.$eth | grep MAC
	ucnt=$(grep $fmver /tmp/output.$eth -c) 
	update_cnt=$((update_cnt+ucnt))
done


if [ $update_cnt -eq $dev_cnt  ]; then
	logit "PASS: Programmed $update_cnt/$dev_cnt d100"
else
	logit "FAIL: Programmed $update_cnt/$dev_cnt d100"
fi

exit 0

