|
Packit |
857059 |
#!/bin/bash
|
|
Packit |
857059 |
# BEGIN_ICS_COPYRIGHT8 ****************************************
|
|
Packit Service |
3f7ca0 |
#
|
|
Packit Service |
3f7ca0 |
# Copyright (c) 2015-2020, Intel Corporation
|
|
Packit Service |
3f7ca0 |
#
|
|
Packit |
857059 |
# Redistribution and use in source and binary forms, with or without
|
|
Packit |
857059 |
# modification, are permitted provided that the following conditions are met:
|
|
Packit Service |
3f7ca0 |
#
|
|
Packit |
857059 |
# * Redistributions of source code must retain the above copyright notice,
|
|
Packit |
857059 |
# this list of conditions and the following disclaimer.
|
|
Packit |
857059 |
# * Redistributions in binary form must reproduce the above copyright
|
|
Packit |
857059 |
# notice, this list of conditions and the following disclaimer in the
|
|
Packit |
857059 |
# documentation and/or other materials provided with the distribution.
|
|
Packit |
857059 |
# * Neither the name of Intel Corporation nor the names of its contributors
|
|
Packit |
857059 |
# may be used to endorse or promote products derived from this software
|
|
Packit |
857059 |
# without specific prior written permission.
|
|
Packit Service |
3f7ca0 |
#
|
|
Packit |
857059 |
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
Packit |
857059 |
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit |
857059 |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
Packit |
857059 |
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
|
Packit |
857059 |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
Packit |
857059 |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
Packit |
857059 |
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
Packit |
857059 |
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
Packit |
857059 |
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
Packit |
857059 |
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Packit Service |
3f7ca0 |
#
|
|
Packit |
857059 |
# END_ICS_COPYRIGHT8 ****************************************
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# [ICS VERSION STRING: unknown]
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# Run opareport -o errors with topology XML, then:
|
|
Packit |
857059 |
# Extract values (including port statistics) for both ports of each link
|
|
Packit |
857059 |
# Remove redundant information for each link and combine link port information
|
|
Packit |
857059 |
|
|
Packit |
857059 |
## Local functions:
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# Usage()
|
|
Packit |
857059 |
#
|
|
Packit |
857059 |
# Description:
|
|
Packit |
857059 |
# Output information about program usage and parameters
|
|
Packit |
857059 |
#
|
|
Packit |
857059 |
# Inputs:
|
|
Packit |
857059 |
# none
|
|
Packit |
857059 |
#
|
|
Packit |
857059 |
# Outputs:
|
|
Packit |
857059 |
# Information about program usage and parameters
|
|
Packit |
857059 |
|
|
Packit |
857059 |
|
|
Packit |
857059 |
|
|
Packit |
857059 |
usage()
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
echo "Usage: ${cmd} topology_file [opareport options]" >&2
|
|
Packit |
857059 |
echo " or ${cmd} --help" >&2
|
|
Packit |
857059 |
echo " --help - produce full help text" >&2
|
|
Packit |
857059 |
echo " [opareport options] - options will be passed to opareport." >&2
|
|
Packit |
857059 |
echo >&2
|
|
Packit |
857059 |
exit 2
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
Usage_full()
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
echo "Usage: ${cmd} topology_file [opareport options]" >&2
|
|
Packit |
857059 |
echo " or ${cmd} --help" >&2
|
|
Packit |
857059 |
echo " --help - produce full help text" >&2
|
|
Packit |
857059 |
echo " [opareport options] - options will be passed to opareport." >&2
|
|
Packit |
857059 |
echo >&2
|
|
Packit |
857059 |
echo "${cmd} is a front end to the opareport and opaxmlextract tools that" >&2
|
|
Packit |
857059 |
echo "performs an error analysis of a fabric and provides augmented information" >&2
|
|
Packit |
857059 |
echo "from a topology file including all error counters." >&2
|
|
Packit |
857059 |
echo "The output is in a CSV format suitable for importing into a spreadsheet or" >&2
|
|
Packit |
857059 |
echo "parsed by other scripts." >&2
|
|
Packit |
857059 |
echo >&2
|
|
Packit |
857059 |
echo "for example" >&2
|
|
Packit |
857059 |
echo " ${cmd} topology_file" >&2
|
|
Packit |
857059 |
echo >&2
|
|
Packit |
857059 |
echo " ${cmd} topology_file -c my_opamon.conf" >&2
|
|
Packit |
857059 |
echo >&2
|
|
Packit |
857059 |
echo "See the man page for \"opareport\" for the full set of options." >&2
|
|
Packit |
857059 |
echo "By design, the tool ignores \"-o/--output\" report option." >&2
|
|
Packit |
857059 |
echo >&2
|
|
Packit |
857059 |
exit 0
|
|
Packit |
857059 |
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
## Main function:
|
|
Packit |
857059 |
|
|
Packit |
857059 |
cmd=`basename $0`
|
|
Packit |
857059 |
if [ x"$1" = "x--help" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
Usage_full
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if [[ $# -lt 1 || "$1" == -* ]]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
usage
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# NOTE: opareport -o errors generates XML output of this general form:
|
|
Packit |
857059 |
# <Link>
|
|
Packit |
857059 |
# <Rate>....
|
|
Packit |
857059 |
# <LinkDetails>....
|
|
Packit |
857059 |
# <Cable>
|
|
Packit |
857059 |
# ... cable information from topology.xml
|
|
Packit |
857059 |
# </Cable>
|
|
Packit |
857059 |
# <Port>
|
|
Packit |
857059 |
# .. information about 1st port excluding its CableInfo
|
|
Packit |
857059 |
# </Port>
|
|
Packit |
857059 |
# <Port>
|
|
Packit |
857059 |
# .. information about 2nd port excluding its CableInfo
|
|
Packit |
857059 |
# </Port>
|
|
Packit |
857059 |
# <CableInfo>
|
|
Packit |
857059 |
# .. information about the CableInfo for the cable between the two ports
|
|
Packit |
857059 |
# </CableInfo>
|
|
Packit |
857059 |
# </Link>
|
|
Packit |
857059 |
# opaxmlextract produces the following CSV format on each line:
|
|
Packit |
857059 |
# 1 Link ID (CSV 1) LinkID
|
|
Packit |
857059 |
# 3 Link values (CSV 2-4) (Rate, Internal, LinkDetails)
|
|
Packit |
857059 |
# 3 Cable values (CSV 5-7) (CableLength, CableLabel, CableDetails)
|
|
Packit |
857059 |
# Port values (CSV 8-) (port details and error stats)
|
|
Packit |
857059 |
# due to the nesting of tags, opaxmlextract will output the following
|
|
Packit |
857059 |
# All lines have LinkID and Rate and one set of Cable values or Port Values
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# Combine 2 ports for each link onto 1 line, removing redundant Link and Cable values
|
|
Packit |
857059 |
EMPTY_PORT_STR=";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
|
|
Packit |
857059 |
link1=0
|
|
Packit |
857059 |
link2=0
|
|
Packit |
857059 |
printHeader=1
|
|
Packit |
857059 |
curLinkID=""
|
|
Packit |
857059 |
prevLinkID=""
|
|
Packit |
857059 |
RateDetailsStr=";;"
|
|
Packit |
857059 |
CableValuesStr=";;"
|
|
Packit |
857059 |
Port1ValuesStr=$EMPTY_PORT_STR
|
|
Packit |
857059 |
Port2ValuesStr=$EMPTY_PORT_STR
|
|
Packit |
857059 |
while read line
|
|
Packit |
857059 |
do
|
|
Packit |
857059 |
curLinkID=`echo $line | cut -d \; -f 1`
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# When Link_ID changes, print previous link and start new one
|
|
Packit |
857059 |
if [ "$curLinkID" != "$prevLinkID" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
# Display header first time
|
|
Packit |
857059 |
if [ $printHeader -eq 1 ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
echo `echo $line | cut -d \; -f 2-`";"`echo $line | cut -d \; -f 8-`
|
|
Packit |
857059 |
printHeader=0
|
|
Packit |
857059 |
continue
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# Display the previous link before starting this new one
|
|
Packit |
857059 |
if [ "$prevLinkID" != "" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
echo $RateDetailsStr";"$CableValuesStr";"$Port1ValuesStr";"$Port2ValuesStr
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# Reset for the next set of data
|
|
Packit |
857059 |
link1=0
|
|
Packit |
857059 |
link2=0
|
|
Packit |
857059 |
RateDetailsStr=";;"
|
|
Packit |
857059 |
CableValuesStr=";;"
|
|
Packit |
857059 |
Port1ValuesStr=$EMPTY_PORT_STR
|
|
Packit |
857059 |
Port2ValuesStr=$EMPTY_PORT_STR
|
|
Packit |
857059 |
prevLinkID=$curLinkID
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if [ "$RateDetailsStr" == ";;" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
RateDetailsStr=`echo $line | cut -d \; -f 2-4`
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if [ "$CableValuesStr" == ";;" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
CableValuesStr=`echo $line | cut -d \; -f 5-7`
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if [ $link1 -eq 0 ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
if [ "$Port1ValuesStr" == "$EMPTY_PORT_STR" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
Port1ValuesStr=`echo $line | cut -d \; -f 8-`
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
if [ "$Port1ValuesStr" != "$EMPTY_PORT_STR" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
link1=1
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
elif [ $link2 -eq 0 ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
if [ "$Port2ValuesStr" == "$EMPTY_PORT_STR" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
Port2ValuesStr=`echo $line | cut -d \; -f 8-`
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
if [ "$Port2ValuesStr" != "$EMPTY_PORT_STR" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
link2=1
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
done < <(/usr/sbin/opareport -x -Q -d 10 -s -o errors -T "$@" | \
|
|
Packit |
857059 |
/usr/sbin/opaxmlextract -d \; -e Link:id -e Rate -e Internal -e LinkDetails \
|
|
Packit |
857059 |
-e CableLength -e CableLabel -e CableDetails -e Port.NodeGUID \
|
|
Packit |
857059 |
-e Port.PortGUID -e Port.PortNum -e Port.NodeType -e Port.NodeDesc \
|
|
Packit |
857059 |
-e Port.PortDetails \
|
|
Packit |
857059 |
-e XmitDataValue -e XmitPktsValue -e PortMulticastXmitPktsValue \
|
|
Packit |
857059 |
-e RcvDataValue -e RcvPktsValue -e MulticastRcvPktsValue \
|
|
Packit |
857059 |
-e XmitWaitValue -e CongDiscardsValue -e XmitTimeCongValue \
|
|
Packit |
857059 |
-e MarkFECNValue -e RcvFECNValue -e RcvBECNValue \
|
|
Packit |
857059 |
-e RcvBubbleValue -e XmitWastedBWValue -e XmitWaitDataValue \
|
|
Packit |
857059 |
-e LinkQualityIndicatorValue -e LocalLinkIntegrityErrorsValue \
|
|
Packit |
857059 |
-e RcvErrorsValue -e ExcessiveBufferOverrunsValue \
|
|
Packit |
857059 |
-e LinkErrorRecoveryValue -e LinkDownedValue -e UncorrectableErrorsValue \
|
|
Packit |
857059 |
-e FMConfigErrorsValue -e XmitConstraintErrorsValue \
|
|
Packit |
857059 |
-e RcvConstraintErrorsValue -e RcvSwitchRelayErrorsValue \
|
|
Packit |
857059 |
-e XmitDiscardsValue -e RcvRemotePhysicalErrorsValue)
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# print the last link record
|
|
Packit |
857059 |
if [ "$prevLinkID" != "" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
echo $RateDetailsStr";"$CableValuesStr";"$Port1ValuesStr";"$Port2ValuesStr
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
exit 0
|
|
Packit |
857059 |
|