#Number of times to sleep
BOOT_TIMEOUT="20";

#Username/password for for ssh to FSP machines
SSHUSER=${FSPSSHUSER:-}
SSHPASS=${FSPSSHPASS:-}

if [ -z $SSHUSER ] || [ -z $SSHPASS ] ; then
	msg "Set FSPSSHUSER and FSPSSHPASS in ENV or ~/.skiboot_boot_tests"
	exit 1;
fi

export SSHUSER SSHPASS

#IPMI
IPMI_AUTH="-P ${IPMI_PASS:-foo}";

# Strip control characters from IPMI before grepping?
STRIP_CONTROL=1

# How do we SSH in, cp files across?
SSHCMD="sshpass -e ssh -l $SSHUSER -o LogLevel=quiet -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $target";
REMOTECPCMD="sshpass -e scp -o User=$SSHUSER -o LogLevel=quiet -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ";

GET_PROFILE='. /etc/profile; test -e /home/dev/.profile && . /home/dev/.profile';

function is_off {
    state=$($SSHCMD "$GET_PROFILE; smgr mfgState");
    return $([ "$state" = "standby" ]);
}

function poweroff {
    i=0;
    state=$($SSHCMD "$GET_PROFILE; smgr mfgState");
    if [ "$state" = "standby" ]; then
	# already off
	return 0
    fi
    $SSHCMD "$GET_PROFILE; panlexec -f 8";
    msg "Waiting 30 seconds..."
    sleep 30
    state=$($SSHCMD "$GET_PROFILE; smgr mfgState");
    while [ "$state" != "standby" -a "$i" -lt "$BOOT_TIMEOUT" ] ; do
	msg "Waiting $BOOT_SLEEP_PERIOD more seconds..."
	sleep $BOOT_SLEEP_PERIOD;
	i=$(expr $i + 1);
	state=$($SSHCMD "$GET_PROFILE; smgr mfgState");
    done;
    # sleep a little bit longer --- p81 was getting a bit confused.
    sleep 10
    msg "Finishing with state '$state'."
}

function force_primary_side {
    return 0
}

function flash {
	#Make a backup of the current lids
	$REMOTECPCMD $target:/opt/extucode/80f00100.lid 80f00100.lid.bak &&
	$REMOTECPCMD $target:/opt/extucode/80f00101.lid 80f00101.lid.bak &&
	$REMOTECPCMD $target:/opt/extucode/80f00102.lid 80f00102.lid.bak;
	if [ $? -ne 0 ] ; then
		error "Couldn't make backup of currently installed lids";
	fi

	if [ "${LID[0]}" != "" ]; then
	    $REMOTECPCMD ${LID[0]} $target:/opt/extucode/80f00100.lid ||
		error "Error copying lid ${LID[0]}";
	    sum=$(md5sum ${LID[0]} | cut -f 1 -d ' ');
	    $SSHCMD "$GET_PROFILE;
		sumr=\$(md5sum /opt/extucode/80f00100.lid | cut -f 1 -d ' ');
		if [ \"$sum\" != \"\$sumr\" ] ; then
			exit 1;
		fi;" || error "MD5sum doesn't match for ${LID[0]}"

	fi

	if [ "${LID[1]}" != "" ]; then
	    $REMOTECPCMD ${LID[1]} $target:/opt/extucode/80f00101.lid ||
		error "Error copying lid";
	    sum=$(md5sum ${LID[1]} | cut -f 1 -d ' ');
	    $SSHCMD "$GET_PROFILE;
		sumr=\$(md5sum /opt/extucode/80f00101.lid | cut -f 1 -d ' ');
		if [ \"$sum\" != \"\$sumr\" ] ; then
			exit 1;
		fi;" || error "MD5sum doesn't match for ${LID[1]}"
	fi

	if [ "${LID[2]}" != "" ]; then
	    $REMOTECPCMD ${LID[2]} $target:/opt/extucode/80f00102.lid ||
		error "Error copying lid";
	    sum=$(md5sum ${LID[2]} | cut -f 1 -d ' ');
	    $SSHCMD "$GET_PROFILE;
		sumr=\$(md5sum /opt/extucode/80f00102.lid | cut -f 1 -d ' ');
		if [ \"$sum\" != \"\$sumr\" ] ; then
			exit 1;
		fi;" || error "MD5sum doesn't match for ${LID[2]}"
	fi


	$SSHCMD "$GET_PROFILE;
	if [ \$(smgr mfgState) != 'standby' ] ; then
		exit 1;
	fi
	cupdmfg -opt | grep '80f0010'";
	if [ $? -ne 0 ] ; then
		error "Could not install lids on the FSP";
	fi

	sleep 2; #Don't rush the fsp
}

function boot_firmware {
	ISTEP_LOG=$(mktemp --tmpdir builder-1.XXXXXX);
	$SSHCMD "$GET_PROFILE; istep" &> $ISTEP_LOG &
	msg "Waiting 90 seconds for $target to boot";
	sleep 90;
	i=0;
	state=$($SSHCMD "$GET_PROFILE; smgr mfgState");
	while [ \( "$state" != "runtime" \) -a \( "$i" -lt "$BOOT_TIMEOUT" \) ] ; do
		msg "Waiting $BOOT_SLEEP_PERIOD more seconds (istep: `grep iStep $ISTEP_LOG|tail -n 1`)";
		sleep "$BOOT_SLEEP_PERIOD";
		i=$(expr $i + 1);
		state=$($SSHCMD "$GET_PROFILE; smgr mfgState");
	done;

	if [ "$i" -eq "$BOOT_TIMEOUT" ] ; then
		state=$($SSHCMD "$GET_PROFILE; smgr mfgState");
		case "$state" in
			"ipling")
				echo "$target: still hasn't come up but firmware hasn't specifically crashed";
				;;
			"dumping")
				echo "$target: has crashed";
				;;
			"runtime")
				echo "$target: Oops, looks like system has managed to come up...";
				;;
			"standby")
				echo "$target: System is powered off? How can this be?";
				;;
			*)
				echo "$target: is an unknown state '$state'";
				;;
		esac
		echo "$target: istep log";
		cat $ISTEP_LOG;
		rm -rf $ISTEP_LOG
		error "Boot test on $target failed";
	fi
	rm -rf $ISTEP_LOG;
}

function machine_sanity_test {
    $SSHCMD "$GET_PROFILE; test -d /nfs/bin"
    if [ $? -ne 0 ]; then
	echo "$target: Failed to read /nfs/bin"
	error "Is /nfs mounted on the FSP?"
    fi

    $SSHCMD "$GET_PROFILE; which md5sum > /dev/null && which cupdmfg > /dev/null"
        if [ $? -ne 0 ]; then
	echo "$target: Missing md5sum or cupdmfg on the FSP?"
	error "Is /nfs mounted on the FSP?"
    fi
}
