|
Packit |
857059 |
#!/bin/bash
|
|
Packit |
857059 |
# BEGIN_ICS_COPYRIGHT8 ****************************************
|
|
Packit |
857059 |
#
|
|
Packit |
857059 |
# Copyright (c) 2015-2018, Intel Corporation
|
|
Packit |
857059 |
#
|
|
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 |
857059 |
#
|
|
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 |
857059 |
#
|
|
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 |
857059 |
#
|
|
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 |
|
|
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 |
exit 2
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
Usage_full()
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
echo >&2
|
|
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. Report provides cable information as well" >&2
|
|
Packit |
857059 |
echo "as symbol error count." >&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"
|
|
Packit |
857059 |
echo >&2
|
|
Packit |
857059 |
echo " ${cmd} topology_file -c my_opamon.conf"
|
|
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 |
# 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 |
# 2 Link values (CSV 2-3) (Rate, LinkDetails)
|
|
Packit |
857059 |
# 3 Cable values (CSV 4-6) (CableLength, CableLabel, CableDetails)
|
|
Packit |
857059 |
# 3 Port values (CSV 7-9) (NodeDesc, PortNum, LinkQualityIndicator)
|
|
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 |
link1=0
|
|
Packit |
857059 |
link2=0
|
|
Packit |
857059 |
printHeader=1
|
|
Packit |
857059 |
curLinkID=""
|
|
Packit |
857059 |
prevLinkID=""
|
|
Packit |
857059 |
RateStr=""
|
|
Packit |
857059 |
LinkDetailsStr=""
|
|
Packit |
857059 |
CableValuesStr=";;"
|
|
Packit |
857059 |
Port1ValuesStr=";;"
|
|
Packit |
857059 |
Port2ValuesStr=";;"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
header="Rate;LinkDetails;CableLength;CableLabel;CableDetails;Port.NodeDesc;Port.PortNum;LinkQualityIndicator.Value;Port.NodeDesc;Port.PortNum;LinkQualityIndicator.Value"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
while read line
|
|
Packit |
857059 |
do
|
|
Packit |
857059 |
|
|
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 $header
|
|
Packit |
857059 |
printHeader=0
|
|
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 $RateStr";"$LinkDetailsStr";"$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 |
RateStr=""
|
|
Packit |
857059 |
LinkDetailsStr=""
|
|
Packit |
857059 |
CableValuesStr=";;"
|
|
Packit |
857059 |
Port1ValuesStr=";;"
|
|
Packit |
857059 |
Port2ValuesStr=";;"
|
|
Packit |
857059 |
prevLinkID=$curLinkID
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if [ "$RateStr" == "" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
RateStr=`echo $line | cut -d \; -f 2`
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if [ "$LinkDetailsStr" == "" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
LinkDetailsStr=`echo $line | cut -d \; -f 3`
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if [ "$CableValuesStr" == ";;" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
CableValuesStr=`echo $line | cut -d \; -f 4-6`
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if [ $link1 -eq 0 ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
if [ "$Port1ValuesStr" == ";;" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
Port1ValuesStr=`echo $line | cut -d \; -f 7-`
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
if [ "$Port1ValuesStr" != ";;" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
link1=1
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
elif [ $link2 -eq 0 ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
if [ "$Port2ValuesStr" == ";;" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
Port2ValuesStr=`echo $line | cut -d \; -f 7-`
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
if [ "$Port2ValuesStr" != ";;" ]
|
|
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 -H -d \; -e Link:id -e Rate -e LinkDetails -e CableLength \
|
|
Packit |
857059 |
-e CableLabel -e CableDetails -e Port.NodeDesc -e Port.PortNum \
|
|
Packit |
857059 |
-e LinkQualityIndicator.Value)
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if [ $printHeader -eq 1 ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
# No links displayed, still print header
|
|
Packit |
857059 |
echo $header
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# print the last link record
|
|
Packit |
857059 |
if [ "$prevLinkID" != "" ]
|
|
Packit |
857059 |
then
|
|
Packit |
857059 |
echo $RateStr";"$LinkDetailsStr";"$CableValuesStr";"$Port1ValuesStr";"$Port2ValuesStr
|
|
Packit |
857059 |
fi
|
|
Packit |
857059 |
|
|
Packit |
857059 |
exit 0
|
|
Packit |
857059 |
|