home *** CD-ROM | disk | FTP | other *** search
/ ftp.intel.com / 2015-02-03.ftp.intel.com.tar / ftp.intel.com / Pub / sites / FPD / ibsupport / scripts / sma_pmaquery_lids.sh < prev   
Linux/UNIX/POSIX Shell Script  |  2014-06-18  |  6KB  |  190 lines

  1. #!/bin/sh
  2.  
  3. #####################################################################
  4. # This script queries the InfiniBand fabric for all LIDs then
  5. # attempts to test SMA and PMA responses on each LID.  The SMA and
  6. # PMA queries will verify whether all destination LIDs can respond
  7. # to VL0 and VL15 packets.
  8. #####################################################################
  9.  
  10. # Escape hatch in case the ib commands take too long to run
  11. trap cleanexit INT
  12. function cleanexit()
  13. { exit
  14. }
  15.  
  16. Usage()
  17. {
  18.    echo "Usage: $0 [-s] [-t] [-v]"
  19.    echo "           or"
  20.    echo "       $0 [-h | --help]"
  21.    echo "   -h|--help: show usage"
  22.    echo "   -s: queries all switch ports"
  23.    echo "   -t: includes traceroute information on failed ports"
  24.    echo "   -q: quiet, only report failures."
  25.    echo "   -v: verbose, reports all LIDs, not just failures."
  26.    echo "       Verbose wins over quiet."
  27.    echo "This command runs SMA and PMA queries on all LIDs in "
  28.    echo "the fabric.  The -s, -t and -v options expand the "
  29.    echo "queries to include switch ports and tracerouting."
  30.    exit
  31. }
  32.  
  33. QUIET=0            # Set to only report FAILURES
  34. SWITCH=0           # Set to include all switch ports in queries
  35. TRACE=0            # Set to include tracerouting of failed ports
  36. VERBOSE=0          # Set to include verbose reporting of all LIDs
  37.  
  38. ARGC=$#
  39. ARGV="$*"
  40. for i in $(seq 1 $ARGC)
  41. do
  42.    if [ x"$1" = "x--help" -o x"$1" = "x-h" ] 
  43.    then
  44.       Usage
  45.    elif [ x"$1" = "x-q" ] 
  46.    then
  47.       QUIET=1
  48.    elif [ x"$1" = "x-s" ] 
  49.    then
  50.       SWITCH=1
  51.    elif [ x"$1" = "x-t" ] 
  52.    then
  53.       TRACE=1
  54.    elif [ x"$1" = "x-v" ] 
  55.    then
  56.       VERBOSE=1
  57.    fi
  58.    shift
  59. done
  60.  
  61. if [ ! -x /usr/sbin/saquery -o ! -x /usr/sbin/ibportstate -o ! -x /usr/sbin/perfquery ]
  62. then
  63.    echo "This script requires infiniband-diag tools to work properly.  Exiting."
  64.    exit -1
  65. fi
  66.  
  67. LIDNODELIST=$(mktemp); if [ $? -ne 0 ]; then echo "Unable to create temporary file in /tmp.  Check for permissions or disk space."; exit; fi
  68.  
  69. FAILED=0           # Flag set if any SMA/PMA failure
  70. SMAFAILED=0        # Flag set if any SMA failure
  71. PMAFAILED=0        # Flag set if any PMA failure
  72. SWITCHCOUNT=0      # Number of switch ASICs in the fabric
  73. HCACOUNT=0         # Number of HCA ports in the fabric
  74. LIDCOUNT=0         # Count how many LIDs actually checked
  75. PORTCOUNT=0        # Count how many ports actually checked
  76. FAILEDLIDS=""      # list of failed lids to use for tracert
  77. LIDALREADYFAILED=0 # Use flag to avoid adding LID to FAILEDLIDS list if it fails both SMA and PMA queries
  78.  
  79. # lid;nodetype;numports;portnum;nodename
  80. #/usr/sbin/saquery |egrep "lid.|NodeDescription|port_num"|sed -e 's/\t\t//'|
  81. /usr/sbin/saquery |egrep "lid.|node_type|num_ports|port_num|NodeDescription"|sed -e 's/\t\t//'| sed -e :a -e '$!N;s/\nnode_type.............../;/;ta' -e'P;D'| sed -e :a -e '$!N;s/\nnum_ports.............../;/;ta' -e'P;D'| sed -e :a -e '$!N;s/\nport_num................/;/;ta' -e'P;D'| sed -e :a -e '$!N;s/\nNodeDescription........./;/;ta' -e'P;D'| sed -e 's/lid.....................//' > $LIDNODELIST 2> /dev/null
  82.  
  83. LIDLIST=$(cat $LIDNODELIST | cut -d \; -f 1)
  84. SWITCHCOUNT=$(grep Switch $LIDNODELIST|wc -l)
  85. HCACOUNT=$(grep "Channel Adapter" $LIDNODELIST|wc -l)
  86. if [ $VERBOSE -eq 1 -o $QUIET -eq 0 ]
  87. then
  88.    echo "Beginning SMA and PMA queries of $(wc -l $LIDNODELIST|cut -d " " -f 1) LIDs"
  89.    echo "Number of switches: $SWITCHCOUNT"
  90.    echo "Number of HCA ports: $HCACOUNT"
  91. fi
  92.  
  93. MYLID=$(ibaddr -l|cut -d " " -f 5)
  94.  
  95. for LID in $LIDLIST
  96. do
  97.    LIDCOUNT=$((LIDCOUNT+1))
  98.    PORTCOUNT=$((PORTCOUNT+1))
  99.    NODE=$(grep ^$LID\; $LIDNODELIST | cut -d \; -f 5) # was 3
  100.    PORT=$(grep ^$LID\; $LIDNODELIST | cut -d \; -f 4) # was 2
  101.    NPORTS=$(grep ^$LID\; $LIDNODELIST | cut -d \; -f 3)
  102.    TYPE=$(grep ^$LID\; $LIDNODELIST | cut -d \; -f 2)
  103.    if [ "$TYPE" = "Switch" -a $VERBOSE -eq 1 ]
  104.    then
  105.       echo LID=$LID NODE=$NODE PORT=$PORT NPORTS=$NPORTS TYPE=$TYPE
  106.    elif [ $VERBOSE -eq 1 ]
  107.    then
  108.       echo LID=$LID NODE=$NODE PORT=$PORT 
  109.    fi
  110.  
  111. # another SMA command option is smpquery
  112.    /usr/sbin/ibportstate $LID $PORT query > /dev/null 2>&1
  113.    if [ $? -ne 0 ]
  114.    then 
  115.       echo "LID=$LID NODE=$NODE PORT=$PORT failed ibportstate"
  116.       SMAFAILED=$((SMAFAILED+1))
  117.       FAILEDLIDS="$FAILEDLIDS $LID "
  118.       LIDALREADYFAILED=1
  119.       FAILED=1
  120.    fi
  121.    /usr/sbin/perfquery $LID $PORT > /dev/null 2>&1
  122.    if [ $? -ne 0 ]
  123.    then 
  124.       echo "LID=$LID NODE=$NODE PORT=$PORT failed perfquery"
  125.       PMAFAILED=$((PMAFAILED+1))
  126.       FAILED=1
  127.       if [ $LIDALREADYFAILED -eq 0 ]
  128.       then
  129.          FAILEDLIDS="$FAILEDLIDS $LID "
  130.       fi
  131.       LIDALREADYFAILED=0  # Clear flag for the next LID queries
  132.    fi
  133.    if [ "$TYPE" = "Switch" -a $SWITCH -eq 1 ]
  134.    then
  135.       for PORT in $(seq 1 $NPORTS)
  136.       do
  137.          /usr/sbin/ibportstate $LID $PORT query > /dev/null 2>&1
  138.          if [ $? -ne 0 ]
  139.          then 
  140.             echo "LID=$LID NODE=$NODE PORT=$PORT failed ibportstate"
  141.             SMAFAILED=$((SMAFAILED+1))
  142.             FAILED=1
  143.          fi
  144.          /usr/sbin/perfquery $LID $PORT > /dev/null 2>&1
  145.          if [ $? -ne 0 ]
  146.          then 
  147.             echo "LID=$LID NODE=$NODE PORT=$PORT failed perfquery"
  148.             PMAFAILED=$((PMAFAILED+1))
  149.             FAILED=1
  150.          fi
  151.          PORTCOUNT=$((PORTCOUNT+1))
  152.       done
  153.    fi
  154.  
  155. done
  156.  
  157. if [ -f $LIDNODELIST ]; then rm -f $LIDNODELIST ; fi
  158.  
  159. echo -n SMA and PMA queries on $LIDCOUNT LIDs and $PORTCOUNT ports:
  160. if [ $FAILED -eq 1 ]
  161. then 
  162.    echo " $SMAFAILED SMA and $PMAFAILED PMA queries FAILED"
  163.    if [ $TRACE -eq 1 ]
  164.    then
  165.       echo "######################### Trace Route Info ##########################"
  166.       for LID in $FAILEDLIDS
  167.       do
  168.          ibtracert $MYLID $LID
  169.          echo "#####################################################################"
  170.       done
  171.    fi
  172.    exit -1 
  173. else 
  174.    echo " PASSED"
  175.    exit 0
  176. fi
  177.  
  178. #####################################################################
  179. # Revision History
  180. #   Rev 1.00.00 2014/05/05
  181. #       - Initial script after many, many cleanups.
  182. #   Rev 1.00.01 2014/05/06
  183. #       - Added verbose logging and reporting switch and HCA port count
  184. #   Rev 1.00.02 2014/05/19
  185. #       - Added quiet option to only report if failures
  186. #   Rev 1.00.03 2014/06/11
  187. #       - Fixed issue with saquery reporting decimal rather than hex LIDs
  188. #####################################################################
  189.