1219820Sjeff#!/bin/sh
2219820Sjeff
3219820SjeffIBPATH=${IBPATH:-@IBSCRIPTPATH@}
4219820Sjeff
5219820Sjefffunction usage() {
6219820Sjeff	echo Usage: `basename $0` "[-h] [-v] [-N | -nocolor] [-G]" \
7219820Sjeff	   "[-C ca_name] [-P ca_port] [-t(imeout) timeout_ms] <lid|guid> <port>"
8219820Sjeff	exit -1
9219820Sjeff}
10219820Sjeff
11219820Sjefffunction green() {
12219820Sjeff	if [ "$bw" = "yes" ]; then
13219820Sjeff		if [ "$verbose" = "yes" ]; then
14219820Sjeff			echo $1
15219820Sjeff		fi
16219820Sjeff		return
17219820Sjeff	fi
18219820Sjeff	if [ "$verbose" = "yes" ]; then
19219820Sjeff		echo -e "\\033[1;032m" $1 "\\033[0;39m"
20219820Sjeff	fi
21219820Sjeff}
22219820Sjeff
23219820Sjefffunction red() {
24219820Sjeff	if [ "$bw" = "yes" ]; then
25219820Sjeff		echo $1
26219820Sjeff		return
27219820Sjeff	fi
28219820Sjeff	echo -e "\\033[1;031m" $1 "\\033[0;39m"
29219820Sjeff}
30219820Sjeff
31219820Sjeffguid_addr=""
32219820Sjeffbw=""
33219820Sjeffverbose=""
34219820Sjeffca_info=""
35219820Sjeff
36219820Sjeffwhile [ "$1" ]; do
37219820Sjeff	case $1 in
38219820Sjeff	-G)
39219820Sjeff		guid_addr=yes
40219820Sjeff		;;
41219820Sjeff	-nocolor|-N)
42219820Sjeff		bw=yes
43219820Sjeff		;;
44219820Sjeff	-v)
45219820Sjeff		verbose=yes
46219820Sjeff		;;
47219820Sjeff	-P | -C | -t | -timeout)
48219820Sjeff		case $2 in
49219820Sjeff		-*)
50219820Sjeff			usage
51219820Sjeff			;;
52219820Sjeff		esac
53219820Sjeff		if [ x$2 = x ] ; then
54219820Sjeff			usage
55219820Sjeff		fi
56219820Sjeff		ca_info="$ca_info $1 $2"
57219820Sjeff		shift
58219820Sjeff		;;
59219820Sjeff	-*)
60219820Sjeff		usage
61219820Sjeff		;;
62219820Sjeff	*)
63219820Sjeff		break
64219820Sjeff		;;
65219820Sjeff	esac
66219820Sjeff	shift
67219820Sjeffdone
68219820Sjeff
69219820Sjeffif [ $# -lt 2 ]; then
70219820Sjeff	usage
71219820Sjefffi
72219820Sjeff
73219820Sjeffportnum=$2
74219820Sjeff
75219820Sjeffif [ "$guid_addr" ]; then
76219820Sjeff	if ! lid=`$IBPATH/ibaddr $ca_info -G -L $1 | awk '/failed/{exit -1} {print $3}'`; then
77219820Sjeff		echo -n "guid $1 address resolution: "
78219820Sjeff		red "FAILED"
79219820Sjeff		exit -1
80219820Sjeff	fi
81219820Sjeff	guid=$1
82219820Sjeffelse
83219820Sjeff	lid=$1
84219820Sjeff	if ! temp=`$IBPATH/ibaddr $ca_info -L $1 | awk '/failed/{exit -1} {print $1}'`; then
85219820Sjeff		echo -n "lid $1 address resolution: "
86219820Sjeff		red "FAILED"
87219820Sjeff		exit -1
88219820Sjeff	fi
89219820Sjefffi
90219820Sjeff
91219820Sjeff
92219820Sjefftext="`eval $IBPATH/smpquery $ca_info portinfo $lid $portnum`"
93219820Sjeffrv=$?
94219820Sjeffif echo "$text" | awk -v mono=$bw -F '[.:]*' '
95219820Sjefffunction blue(s)
96219820Sjeff{
97219820Sjeff	if (mono)
98219820Sjeff		printf s
99219820Sjeff	else if (!quiet) {
100219820Sjeff		printf "\033[1;034m" s
101219820Sjeff		printf "\033[0;39m"
102219820Sjeff	}
103219820Sjeff}
104219820Sjeff
105219820Sjeff# Only check PortPhysicalState and PortState
106219820Sjeff
107219820Sjeff/^PhysLinkState/{ if ($2 != "LinkUp") {err = err "#error: Physical link state is " $2 "  lid '$lid' port '$portnum'\n"; exit -1}}
108219820Sjeff
109219820Sjeff/^LinkState/{ if ($2 != "Active") warn = warn "#warn: Logical link state is " $2 "  lid '$lid' port '$portnum'\n"}
110219820Sjeff
111219820Sjeff/^ib/	{print $0; next}
112219820Sjeff/ibpanic:/	{print $0}
113219820Sjeff/ibwarn:/	{print $0}
114219820Sjeff/iberror:/	{print $0}
115219820Sjeff
116219820SjeffEND {
117219820Sjeff	if (err != "") {
118219820Sjeff		blue(err)
119219820Sjeff		exit -1
120219820Sjeff	}
121219820Sjeff	if (warn != "") {
122219820Sjeff		blue(warn)
123219820Sjeff		exit -1
124219820Sjeff	}
125219820Sjeff	exit 0
126219820Sjeff}' 2>&1 && test $rv -eq 0 ; then
127219820Sjeff	if [ "$verbose" = "yes" ]; then
128219820Sjeff		echo -n "Port check lid $lid port $portnum: "
129219820Sjeff		green "OK"
130219820Sjeff	fi
131219820Sjeff	exit 0
132219820Sjeffelse
133219820Sjeff	echo -n "Port check lid $lid port $portnum: "
134219820Sjeff	red "FAILED"
135219820Sjeff	exit -1
136219820Sjefffi
137