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 if (system("'$IBPATH'/ibcheckerrs '"$ca_info"' '$gflags' '$verbose' '$brief' " lid " " port)) 89219820Sjeff return 2; 90219820Sjeff return 0; 91219820Sjeff} 92219820Sjeff 93219820Sjeff/^Ca/ || /^Switch/ || /^Rt/ { 94219820Sjeff nnodes++ 95219820Sjeff ntype=$1; nodeguid=substr($3, 4, 16); ports=$2 96219820Sjeff if ('$v') 97219820Sjeff print "\n# Checking " ntype ": nodeguid 0x" nodeguid 98219820Sjeff 99219820Sjeff err = 0; 100219820Sjeff if (ntype != "Switch") 101219820Sjeff next 102219820Sjeff 103219820Sjeff lid = substr($0, index($0, "port 0 lid ") + 11) 104219820Sjeff lid = substr(lid, 1, index(lid, " ") - 1) 105219820Sjeff err = check_node(lid, 255) 106219820Sjeff } 107219820Sjeff/^\[/ { 108219820Sjeff nports++ 109219820Sjeff port = $1 110219820Sjeff sub("\\(.*\\)", "", port) 111219820Sjeff gsub("[\\[\\]]", "", port) 112219820Sjeff if (ntype != "Switch") { 113219820Sjeff lid = substr($0, index($0, " lid ") + 5) 114219820Sjeff lid = substr(lid, 1, index(lid, " ") - 1) 115219820Sjeff if (check_node(lid, port) == 2) 116219820Sjeff pcnterr++; 117219820Sjeff } else if (err && 118219820Sjeff system("'$IBPATH'/ibcheckerrs '"$ca_info"' '$gflags' '$verbose' '$brief' " lid " " port)) 119219820Sjeff pcnterr++; 120219820Sjeff} 121219820Sjeff 122219820Sjeff/^ib/ {print $0; next} 123219820Sjeff/ibpanic:/ {print $0} 124219820Sjeff/ibwarn:/ {print $0} 125219820Sjeff/iberror:/ {print $0} 126219820Sjeff 127219820SjeffEND { 128219820Sjeff printf "\n## Summary: %d nodes checked, %d bad nodes found\n", nnodes, ne 129219820Sjeff printf "## %d ports checked, %d ports have errors beyond threshold\n", nports, pcnterr 130219820Sjeff exit (ne + pcnterr) 131219820Sjeff} 132219820Sjeff' 133219820Sjeffexit $rv 134