1219820Sjeff#!/bin/sh
2219820Sjeff
3219820SjeffIBPATH=${IBPATH:-@IBSCRIPTPATH@}
4219820Sjeff
5219820Sjefffunction usage() {
6219820Sjeff	echo Usage: `basename $0` "[-h] [-b] [-v] [-N | -nocolor]" \
7219820Sjeff	    "[<topology-file> \| -C ca_name -P ca_port -t(imeout) timeout_ms]"
8219820Sjeff	exit -1
9219820Sjeff}
10219820Sjeff
11219820Sjefffunction user_abort() {
12219820Sjeff	echo "Aborted"
13219820Sjeff	exit 1
14219820Sjeff}
15219820Sjeff
16219820Sjefftrap user_abort SIGINT
17219820Sjeff
18219820Sjeffgflags=""
19219820Sjeffverbose=""
20219820Sjeffbrief=""
21219820Sjeffv=0
22219820Sjeffntype=""
23219820Sjeffnodeguid=""
24219820Sjefftopofile=""
25219820Sjeffca_info=""
26219820Sjeff
27219820Sjeffwhile [ "$1" ]; do
28219820Sjeff	case $1 in
29219820Sjeff	-h)
30219820Sjeff		usage
31219820Sjeff		;;
32219820Sjeff	-N|-nocolor)
33219820Sjeff		gflags=-N
34219820Sjeff		;;
35219820Sjeff	-v)
36219820Sjeff		verbose=-v
37219820Sjeff		brief=""
38219820Sjeff		v=1
39219820Sjeff		;;
40219820Sjeff	-b)
41219820Sjeff		brief=-b
42219820Sjeff		verbose=""
43219820Sjeff		;;
44219820Sjeff	-P | -C | -t | -timeout)
45219820Sjeff		case $2 in
46219820Sjeff		-*)
47219820Sjeff			usage
48219820Sjeff			;;
49219820Sjeff		esac
50219820Sjeff		if [ x$2 = x ] ; then
51219820Sjeff			usage
52219820Sjeff		fi
53219820Sjeff		ca_info="$ca_info $1 $2"
54219820Sjeff		shift
55219820Sjeff		;;
56219820Sjeff	-*)
57219820Sjeff		usage
58219820Sjeff		;;
59219820Sjeff	*)
60219820Sjeff		if [ "$topofile" ]; then
61219820Sjeff			usage
62219820Sjeff		fi
63219820Sjeff		topofile="$1"
64219820Sjeff		;;
65219820Sjeff	esac
66219820Sjeff	shift
67219820Sjeffdone
68219820Sjeff
69219820Sjeffif [ "$topofile" ]; then
70219820Sjeff	netcmd="cat $topofile"
71219820Sjeffelse
72219820Sjeff	netcmd="$IBPATH/ibnetdiscover $ca_info"
73219820Sjefffi
74219820Sjeff
75219820Sjefftext="`eval $netcmd`"
76219820Sjeffrv=$?
77219820Sjeffecho "$text" | awk '
78219820SjeffBEGIN {
79219820Sjeff	ne=0
80219820Sjeff}
81219820Sjefffunction check_node(lid, port)
82219820Sjeff{
83219820Sjeff	if (system("'$IBPATH'/ibchecknode '"$ca_info"' '$gflags' '$verbose' " lid)) {
84219820Sjeff		ne++
85219820Sjeff		print "\n# " ntype ": nodeguid 0x" nodeguid " failed"
86219820Sjeff		return 1;
87219820Sjeff	}
88219820Sjeff	return system("'$IBPATH'/ibcheckerrs '"$ca_info"' '$gflags' '$verbose' '$brief' " lid " " port);
89219820Sjeff}
90219820Sjeff
91219820Sjeff/^Ca/ || /^Switch/ || /^Rt/ {
92219820Sjeff			nnodes++
93219820Sjeff			ntype=$1; nodeguid=substr($3, 4, 16); ports=$2
94219820Sjeff			if ('$v')
95219820Sjeff				print "\n# Checking " ntype ": nodeguid 0x" nodeguid
96219820Sjeff
97219820Sjeff			err = 0;
98219820Sjeff			if (ntype != "Switch")
99219820Sjeff				next
100219820Sjeff
101219820Sjeff			lid = substr($0, index($0, "port 0 lid ") + 11)
102219820Sjeff			lid = substr(lid, 1, index(lid, " ") - 1)
103219820Sjeff			err = check_node(lid, 255)
104219820Sjeff		}
105219820Sjeff/^\[/	{
106219820Sjeff		nports++
107219820Sjeff		port = $1
108219820Sjeff		sub("\\(.*\\)", "", port)
109219820Sjeff		gsub("[\\[\\]]", "", port)
110219820Sjeff		if (ntype != "Switch") {
111219820Sjeff			lid = substr($0, index($0, " lid ") + 5)
112219820Sjeff			lid = substr(lid, 1, index(lid, " ") - 1)
113219820Sjeff			check_node(lid, port)
114219820Sjeff		} else if (err)
115219820Sjeff			system("'$IBPATH'/ibdatacounts '"$ca_info"' '$gflags' '$verbose' '$brief' " lid " " port);
116219820Sjeff}
117219820Sjeff
118219820Sjeff/^ib/	{print $0; next}
119219820Sjeff/ibpanic:/	{print $0}
120219820Sjeff/ibwarn:/	{print $0}
121219820Sjeff/iberror:/	{print $0}
122219820Sjeff
123219820SjeffEND {
124219820Sjeff	printf "\n## Summary: %d nodes checked, %d bad nodes found\n", nnodes, ne
125219820Sjeff	printf "##          %d ports checked\n", nports
126219820Sjeff	exit (ne )
127219820Sjeff}
128219820Sjeff'
129219820Sjeffexit $rv
130