1219820Sjeff#!/bin/sh
2219820Sjeff
3219820SjeffIBPATH=${IBPATH:-@IBSCRIPTPATH@}
4219820Sjeff
5219820Sjefffunction usage() {
6219820Sjeff	echo Usage: `basename $0` "[-h] [-b] [-v] [-G] [-T <threshold_file>]" \
7219820Sjeff	    "[-s(how_thresholds)] [-N \| -nocolor] [-C ca_name] [-P ca_port]" \
8219820Sjeff	    "[-t(imeout) timeout_ms] <lid|guid> [<port>]"
9219820Sjeff	exit -1
10219820Sjeff}
11219820Sjeff
12219820Sjefffunction green() {
13219820Sjeff	if [ "$bw" = "yes" ]; then
14219820Sjeff		if [ "$verbose" = "yes" ]; then
15219820Sjeff			echo $1
16219820Sjeff		fi
17219820Sjeff		return
18219820Sjeff	fi
19219820Sjeff	if [ "$verbose" = "yes" ]; then
20219820Sjeff		echo -e "\\033[1;032m" $1 "\\033[0;39m"
21219820Sjeff	fi
22219820Sjeff}
23219820Sjeff
24219820Sjefffunction red() {
25219820Sjeff	if [ "$bw" = "yes" ]; then
26219820Sjeff		echo $1
27219820Sjeff		return
28219820Sjeff	fi
29219820Sjeff	echo -e "\\033[1;031m" $1 "\\033[0;39m"
30219820Sjeff}
31219820Sjeff
32219820Sjefffunction show_thresholds() {
33219820Sjeff	echo "SymbolErrors=$SymbolErrors"
34219820Sjeff	echo "LinkRecovers=$LinkRecovers"
35219820Sjeff	echo "LinkDowned=$LinkDowned"
36219820Sjeff	echo "RcvErrors=$RcvErrors"
37219820Sjeff	echo "RcvRemotePhysErrors=$RcvRemotePhysErrors"
38219820Sjeff	echo "RcvSwRelayErrors=$RcvSwRelayErrors"
39219820Sjeff	echo "XmtDiscards=$XmtDiscards"
40219820Sjeff	echo "XmtConstraintErrors=$XmtConstraintErrors"
41219820Sjeff	echo "RcvConstraintErrors=$RcvConstraintErrors"
42219820Sjeff	echo "LinkIntegrityErrors=$LinkIntegrityErrors"
43219820Sjeff	echo "ExcBufOverrunErrors=$ExcBufOverrunErrors"
44219820Sjeff	echo "VL15Dropped=$VL15Dropped"
45219820Sjeff}
46219820Sjeff
47219820Sjefffunction get_thresholds() {
48219820Sjeff	. $1
49219820Sjeff}
50219820Sjeff
51219820Sjeff# Default thresholds
52219820SjeffSymbolErrors=10
53219820SjeffLinkRecovers=10
54219820SjeffLinkDowned=10
55219820SjeffRcvErrors=10
56219820SjeffRcvRemotePhysErrors=100
57219820SjeffRcvSwRelayErrors=100
58219820SjeffXmtDiscards=100
59219820SjeffXmtConstraintErrors=100
60219820SjeffRcvConstraintErrors=100
61219820SjeffLinkIntegrityErrors=10
62219820SjeffExcBufOverrunErrors=10
63219820SjeffVL15Dropped=100
64219820Sjeff
65219820Sjeffguid_addr=""
66219820Sjeffbw=""
67219820Sjeffverbose=""
68219820Sjeffbrief=""
69219820Sjeffca_info=""
70219820Sjeff
71219820Sjeffwhile [ "$1" ]; do
72219820Sjeff	case $1 in
73219820Sjeff	-G)
74219820Sjeff		guid_addr=yes
75219820Sjeff		;;
76219820Sjeff	-nocolor|-N)
77219820Sjeff		bw=yes
78219820Sjeff		;;
79219820Sjeff	-v)
80219820Sjeff		verbose=yes
81219820Sjeff		brief=""
82219820Sjeff		;;
83219820Sjeff	-b)
84219820Sjeff		brief=yes
85219820Sjeff		verbose=""
86219820Sjeff		;;
87219820Sjeff	-T)
88219820Sjeff		if ! [ -r $2 ]; then
89219820Sjeff			echo "Can't use threshold file '$2'"
90219820Sjeff			usage
91219820Sjeff		fi
92219820Sjeff		get_thresholds $2
93219820Sjeff		shift
94219820Sjeff		;;
95219820Sjeff	-s)
96219820Sjeff		show_thresholds
97219820Sjeff		exit 0
98219820Sjeff		;;
99219820Sjeff	-P | -C | -t | -timeout)
100219820Sjeff		case $2 in
101219820Sjeff		-*)
102219820Sjeff			usage
103219820Sjeff			;;
104219820Sjeff		esac
105219820Sjeff		if [ x$2 = x ] ; then
106219820Sjeff			usage
107219820Sjeff		fi
108219820Sjeff		ca_info="$ca_info $1 $2"
109219820Sjeff		shift
110219820Sjeff		;;
111219820Sjeff	-*)
112219820Sjeff		usage
113219820Sjeff		;;
114219820Sjeff	*)
115219820Sjeff		break
116219820Sjeff		;;
117219820Sjeff	esac
118219820Sjeff	shift
119219820Sjeffdone
120219820Sjeff
121219820Sjeff#default is all ports
122219820Sjeffportnum=255
123219820Sjeff
124219820Sjeffif [ $# -lt 1 ]; then
125219820Sjeff	usage
126219820Sjefffi
127219820Sjeff
128219820Sjeffif [ "$2" ]; then
129219820Sjeff	portnum=$2
130219820Sjefffi
131219820Sjeff
132219820Sjeffif [ "$portnum" = "255" ]; then
133219820Sjeff	portname="all"
134219820Sjeffelse
135219820Sjeff	portname=$2
136219820Sjefffi
137219820Sjeff
138219820Sjeffif [ "$guid_addr" ]; then
139219820Sjeff	if ! lid=`$IBPATH/ibaddr $ca_info -G -L $1 | awk '/failed/{exit -1} {print $3}'`; then
140219820Sjeff		echo -n "guid $1 address resolution: "
141219820Sjeff		red "FAILED"
142219820Sjeff		exit -1
143219820Sjeff	fi
144219820Sjeff	guid=$1
145219820Sjeffelse
146219820Sjeff	lid=$1
147219820Sjeff	if ! temp=`$IBPATH/ibaddr $ca_info -L $1 | awk '/failed/{exit -1} {print $1}'`; then
148219820Sjeff		echo -n "lid $1 address resolution: "
149219820Sjeff		red "FAILED"
150219820Sjeff		exit -1
151219820Sjeff	fi
152219820Sjefffi
153219820Sjeff
154219820Sjeffnodename=`$IBPATH/smpquery $ca_info nodedesc $lid | sed -e "s/^Node Description:\.*\(.*\)/\1/"`
155219820Sjeff
156219820Sjefftext="`eval $IBPATH/perfquery $ca_info $lid $portnum`"
157219820Sjeffrv=$?
158219820Sjeffif echo "$text" | awk -v mono=$bw -v brief=$brief -F '[.:]*' '
159219820Sjefffunction blue(s)
160219820Sjeff{
161219820Sjeff	if (brief == "yes") {
162219820Sjeff		return
163219820Sjeff	}
164219820Sjeff	if (mono)
165219820Sjeff		printf s
166219820Sjeff	else if (!quiet) {
167219820Sjeff		printf "\033[1;034m" s
168219820Sjeff		printf "\033[0;39m"
169219820Sjeff	}
170219820Sjeff}
171219820Sjeff
172219820SjeffBEGIN {
173219820Sjeff	th["SymbolErrors"] = '$SymbolErrors'
174219820Sjeff	th["LinkRecovers"] = '$LinkRecovers'
175219820Sjeff	th["LinkDowned"] = '$LinkDowned'
176219820Sjeff	th["RcvErrors"] = '$RcvErrors'
177219820Sjeff	th["RcvRemotePhysErrors"] = '$RcvRemotePhysErrors'
178219820Sjeff	th["RcvSwRelayErrors"] = '$RcvSwRelayErrors'
179219820Sjeff	th["XmtDiscards"] = '$XmtDiscards'
180219820Sjeff	th["XmtConstraintErrors"] = '$XmtConstraintErrors'
181219820Sjeff	th["RcvConstraintErrors"] = '$RcvConstraintErrors'
182219820Sjeff	th["LinkIntegrityErrors"] = '$LinkIntegrityErrors'
183219820Sjeff	th["ExcBufOverrunErrors"] = '$ExcBufOverrunErrors'
184219820Sjeff	th["VL15Dropped"] = '$VL15Dropped'
185219820Sjeff}
186219820Sjeff
187219820Sjeff/^CounterSelect/ {next}
188219820Sjeff
189219820Sjeff/AllPortSelect/ {next}
190219820Sjeff
191219820Sjeff/^ib/  {print $0; next}
192219820Sjeff/ibpanic:/     {print $0}
193219820Sjeff/ibwarn:/      {print $0}
194219820Sjeff/iberror:/     {print $0}
195219820Sjeff
196219820Sjeff/^PortSelect/	{ if ($2 != '$portnum') {err = err "error: lid '$lid' port " $2 " does not match query ('$portnum')\n"; exit -1}}
197219820Sjeff
198219820Sjeff$1 ~ "(Xmt|Rcv)(Pkts|Data)" { next }
199219820Sjeff
200219820Sjeff	{ if (th[$1] > 0 && $2 >= th[$1])
201219820Sjeff		warn = warn "#warn: counter " $1 " = " $2 " \t(threshold " th[$1] ") lid '$lid' port '$portnum'\n"
202219820Sjeff	}
203219820SjeffEND {
204219820Sjeff	if (err != "") {
205219820Sjeff		blue(err)
206219820Sjeff		exit -1
207219820Sjeff	}
208219820Sjeff	if (warn != "") {
209219820Sjeff		blue(warn)
210219820Sjeff		exit -1
211219820Sjeff	}
212219820Sjeff	exit 0
213219820Sjeff}' 2>&1 && test $rv -eq 0 ; then
214219820Sjeff	if [ "$verbose" = "yes" ]; then
215219820Sjeff		echo -n "Error check on lid $lid ($nodename) port $portname: "
216219820Sjeff		green OK
217219820Sjeff	fi
218219820Sjeff	exit 0
219219820Sjeffelse
220219820Sjeff	echo -n "Error check on lid $lid ($nodename) port $portname: "
221219820Sjeff	red FAILED
222219820Sjeff	exit -1
223219820Sjefffi
224