#!/bin/sh

IBPATH=${IBPATH:-@IBSCRIPTPATH@}

usage() {
	echo Usage: `basename $0` "[-h] [-v] [-N | -nocolor] [-G]" \
	   "[-C ca_name] [-P ca_port] [-t(imeout) timeout_ms] <lid|guid> <port>"
	exit 255
}

green() {
	if [ "$bw" = "yes" ]; then
		if [ "$verbose" = "yes" ]; then
			echo $1
		fi
		return
	fi
	if [ "$verbose" = "yes" ]; then
		echo -e "\\033[1;032m" $1 "\\033[0;39m"
	fi
}

red() {
	if [ "$bw" = "yes" ]; then
		echo $1
		return
	fi
	echo -e "\\033[1;031m" $1 "\\033[0;39m"
}

guid_addr=""
bw=""
verbose=""
ca_info=""
suppress_deprecated="no"

while [ "$1" ]; do
	case $1 in
	-G)
		guid_addr=yes
		;;
	-nocolor|-N)
		bw=yes
		;;
	-v)
		verbose=yes
		;;
	-P | -C | -t | -timeout)
		case $2 in
		-*)
			usage
			;;
		esac
		if [ x$2 = x ] ; then
			usage
		fi
		ca_info="$ca_info $1 $2"
		shift
		;;
	-S)
		suppress_deprecated="yes"
		;;
	-*)
		usage
		;;
	*)
		break
		;;
	esac
	shift
done

if [ $# -lt 2 ]; then
	usage
fi

portnum=$2

if [ "$suppress_deprecated" = "no" ]; then
/usr/bin/echo -e "*** WARNING ***: this command is deprecated\n\n" 1>&2
fi

if [ "$guid_addr" ]; then
	if ! lid=`$IBPATH/ibaddr $ca_info -G -L $1 | awk '/failed/{exit 255} {print $3}'`; then
		echo -n "guid $1 address resolution: "
		red "FAILED"
		exit 255
	fi
	guid=$1
else
	lid=$1
	if ! temp=`$IBPATH/ibaddr $ca_info -L $1 | awk '/failed/{exit 255} {print $1}'`; then
		echo -n "lid $1 address resolution: "
		red "FAILED"
		exit 255
	fi
fi

is_switch=`$IBPATH/smpquery $ca_info nodeinfo $lid $portnum | awk -F '[.:]*' '/^NodeType/{ if ($2 == "Switch") {print 1}}'`

if [ "$is_switch" -a "$portnum" == "0" ]; then
	ignore_check=true
fi

text="`eval $IBPATH/smpquery $ca_info portinfo $lid $portnum`"
rv=$?
if echo "$text" | awk -v ignore_check=$ignore_check -v mono=$bw -F '[.:]*' '
function blue(s)
{
	if (mono)
		printf s
	else if (!quiet) {
		printf "\033[1;034m" s
		printf "\033[0;39m"
	}
}

# Checks

/^PhysLinkState/{ if ($2 != "LinkUp") {err = err "#error: Physical link state is " $2 "  lid '$lid' port '$portnum'\n"; exit 255}}

/^LinkState/{ if ($2 != "Active") warn = warn "#warn: Logical link state is " $2 "  lid '$lid' port '$portnum'\n"}

/^LinkWidthActive/{ if ($2 == "1X") warn = warn "#warn: Link configured as 1X  lid '$lid' port '$portnum'\n"}

/^Lid/{ if (ignore_check == "0" && $2 == "0") warn = warn "#warn: Lid is not configured lid '$lid' port '$portnum'\n"}

/^SMLid/{ if (ignore_check == "0" && $2 == "0") warn = warn "#warn: SM Lid is not configured\n"}

#/^LocalPort/	{ if ($2 != '$portnum') {err = err "#error: port " $2 " does not match query ('$portnum')\n"; exit 255}}

/^ib/	{print $0; next}
/ibpanic:/	{print $0}
/ibwarn:/	{print $0}
/iberror:/	{print $0}

END {
	if (err != "") {
		blue(err)
		exit 255
	}
	if (warn != "") {
		blue(warn)
		exit 255
	}
	exit 0
}' 2>&1 && test $rv -eq 0 ; then
	if [ "$verbose" = "yes" ]; then
		echo -n "Port check lid $lid port $portnum: "
		green "OK"
	fi
	exit 0
else
	echo -n "Port check lid $lid port $portnum: "
	red "FAILED"
	exit 255
fi
