1#!/bin/sh
2
3IBPATH=${IBPATH:-@IBSCRIPTPATH@}
4
5function usage() {
6	echo Usage: `basename $0` "[-h] [-v] [-N | -nocolor]" \
7	    "[<topology-file> | -C ca_name -P ca_port -t(imeout) timeout_ms]"
8	exit -1
9}
10
11function user_abort() {
12	echo "Aborted"
13	exit 1
14}
15
16trap user_abort SIGINT
17
18gflags=""
19verbose=""
20v=0
21oldlid=""
22topofile=""
23ca_info=""
24
25while [ "$1" ]; do
26	case $1 in
27	-h)
28		usage
29		;;
30	-N|-nocolor)
31		gflags=-N
32		;;
33	-v)
34		verbose=-v
35		v=0
36		;;
37	-P | -C | -t | -timeout)
38		case $2 in
39		-*)
40			usage
41			;;
42		esac
43		if [ x$2 = x ] ; then
44			usage
45		fi
46		ca_info="$ca_info $1 $2"
47		shift
48		;;
49	-*)
50		usage
51		;;
52	*)
53		if [ "$topofile" ]; then
54			usage
55		fi
56		topofile="$1"
57		;;
58	esac
59	shift
60done
61
62if [ "$topofile" ]; then
63	netcmd="cat $topofile"
64else
65	netcmd="$IBPATH/ibnetdiscover $ca_info"
66fi
67
68text="`eval $netcmd`"
69rv=$?
70echo "$text" | awk '
71BEGIN {
72	ne=0
73	pe=0
74}
75function check_node(lid, port)
76{
77	if (system("'$IBPATH'/ibchecknode '"$ca_info"' '$gflags' '$verbose' " lid)) {
78		ne++
79		print "\n# " ntype ": nodeguid 0x" nodeguid " failed"
80		return 1;
81	}
82	if (system("'$IBPATH'/ibcheckerrs '"$ca_info"' '$gflags' '$verbose' '$brief' " lid " " port))
83		return  2;
84	return 0;
85}
86
87/^Ca/ || /^Switch/ || /^Rt/ {
88			nnodes++
89			ntype=$1; nodeguid=substr($3, 4, 16); ports=$2
90			if ('$v' || ntype != "Switch")
91				print "\n# Checking " ntype ": nodeguid 0x" nodeguid
92
93			err = 0;
94			if (ntype != "Switch")
95				next
96
97			lid = substr($0, index($0, "port 0 lid ") + 11)
98			lid = substr(lid, 1, index(lid, " ") - 1)
99			err = check_node(lid, 255)
100		}
101/^\[/	{
102		nports++
103		port = $1
104		sub("\\(.*\\)", "", port)
105		gsub("[\\[\\]]", "", port)
106		if (ntype != "Switch") {
107			lid = substr($0, index($0, " lid ") + 5)
108			lid = substr(lid, 1, index(lid, " ") - 1)
109			if (check_node(lid, port) == 2)
110  				pcnterr++;
111		} else if (err &&
112			   system("'$IBPATH'/ibcheckerrs '"$ca_info"' '$gflags' '$verbose' '$brief' " lid " " port))
113			pcnterr++;
114		if (system("'$IBPATH'/ibcheckport'"$ca_info"' '$gflags' '$verbose' " lid " " port)) {
115			if (!'$v' && oldlid != lid) {
116				print "# Checked " ntype ": nodeguid 0x" nodeguid " with failure"
117				oldlid = lid
118			}
119			pe++;
120		}
121}
122
123/^ib/	{print $0; next}
124/ibpanic:/	{print $0}
125/ibwarn:/	{print $0}
126/iberror:/	{print $0}
127
128END {
129	printf "\n## Summary: %d nodes checked, %d bad nodes found\n", nnodes, ne
130	printf "##          %d ports checked, %d bad ports found\n", nports, pe
131	printf "##          %d ports have errors beyond threshold\n", pcnterr
132	exit (ne + pe + pcnterr)
133}
134'
135av=$?
136if [ $av -ne 0 ] ; then
137	exit $av
138else
139	exit $rv
140fi
141