#!/bin/bash
#!/bin/bash -x
#

DEVICE_ID_CT_FC=0x0021

SS_IS_ESXi="false"
if [ -f /bin/vmware ] && [ `vmware -v | awk '{print $2}'` = "ESXi" ]; then
	export PATH=`pwd`:${PATH}
	SS_IS_ESXi="true"
fi

#Create a dummy function declare() if we are in ESXi
if [ $SS_IS_ESXi == "true" ]; then
   echo "declare()" > esx4i_functions.sh
   echo "{" >> esx4i_functions.sh
   echo "set dummy_line=0" >> esx4i_functions.sh
   echo "}" >> esx4i_functions.sh
   source esx4i_functions.sh
fi

eyecatcher="================================================================================="
declare -i fbl=80
declare -i ind=10
declare -i hbl=${fbl}/2

center()
{
    txt="${*}"
    declare -i size=${#txt}+2
    declare -i cntp=${size}/2
    declare -i first=${hbl}-${cntp}
    declare -i last=${fbl}-${size}-${first}

    if [ $SS_IS_ESXi == "true" ]; then
       first=10
       last=0
    fi
    first_str=`echo $eyecatcher | awk '{print substr("'"${eyecatcher}"'", 1, "'"${first}"'")}'`
    last_str=`echo $eyecatcher | awk '{print substr("'"${eyecatcher}"'", 1, "'"${last}"'")}'`
    echo $first_str $* $last_str
#    echo "${eyecatcher:1:${first}} $* ${eyecatcher:1:${last}}" >& 2
}

format()
{
    txt="$*"
    declare -i size=${#txt}+2
    declare -i last=${fbl}-${size}
    if [ $SS_IS_ESXi == "true" ]; then
       last=10
    fi   
    last_str=`echo $eyecatcher | awk '{print substr("'"${eyecatcher}"'", 1, "'"${last}"'")}'`
    echo "${last_str} $*:"
#    echo "${eyecatcher:1:${last}} $*:" >& 2
}

#
# Hex to decimal
#
h2d()
{
    x=$1
    printf "%d" $x
}

dump_lspci()
{
    ids=`lspci -n | awk '{print $3}' | sort -u`

    ARCH=$(uname -m)

    for id in $ids
    do
        intruder=`echo $id | cut -d: -f2`
	# Incase of intruder, reading the following registers from pci config
	# space would cause PCI/non-fatal error if AER is enabled:
	# Slot control/capability/status, Root Control/capability/Status regs.
	# The problem would be seen if we are dumping beyond 256 bytes.
        if [ "$intruder" = "0013" ] && [ "$ARCH" = "ppc64" ]; then
             lspci -d $id -xxx
        else
             lspci -d $id -xxxx
        fi
    done
}

if [ $SS_IS_ESXi == "true" ] || [ -f /var/log/vmkernel ];
then
        vmkload_mod -l | grep -q bna
elif [ `uname` == "Linux" ]
then
        lsmod | grep -q bna
elif [ `uname` == "SunOS" ]
then
        modinfo | grep bna 2>&1 > /dev/null
fi
if [ $? -eq 0 ]
then
        SS_IS_BNA="true"
else
        SS_IS_BNA="false"
fi

if [ $SS_IS_ESXi == "true" ] || [ -f /var/log/vmkernel ];
then
        vmkload_mod -l | grep -q bfa
elif [ `uname` == "Linux" ]
then
        lsmod | grep -q bfa
elif [ `uname` == "SunOS" ]
then
        modinfo | grep -w bfa 2>&1 > /dev/null
fi
if [ $? -eq 0 ]
then
        SS_IS_BFA="true"
else
        SS_IS_BFA="false"
fi

SS_AD_LIST=`bcu adapter --list | grep "[1-9]" | awk '{ print $1 }'`
SS_OS=`uname`

center "Start of supportshow output"
echo 
center "Start time"
date
echo

echo 
bcu -v
echo

echo "BNA Driver Loaded: "$SS_IS_BNA
echo "BFA Driver Loaded: "$SS_IS_BFA

echo
center "System Info"
echo

center "uname"
uname -a
echo

center "uptime"
uptime
echo

if [ $SS_IS_ESXi == "true" ] || [ -f /var/log/vmkernel ];
then
        if [ `/usr/bin/vmware -v | grep "ESX 5" | wc -l` = "1" ] ||
	        [ `/usr/bin/vmware -v | grep "ESXi 5" | wc -l` = "1" ];
	then
                echo
                center "Module Information - BFA"
                echo
                vmkload_mod -s bfa
                echo
                center "Module Information - BNA"
                echo
                vmkload_mod -s bna
                echo
                center "vmware -v  on ESX5.0"
                echo
                /usr/bin/vmware -v
                echo
                center "Packages"
                echo
		esxcli software vib list
                echo
                center "esxcli software vib get"
                echo
                esxcli software vib get
                echo
                center "esxcfg-scsidevs -a"
                echo
                /usr/sbin/esxcfg-scsidevs -a
                echo
                center "esxcfg-scsidevs -A"
                echo
                /usr/sbin/esxcfg-scsidevs -A
                echo
                center "esxcfg-scsidevs -l"
                echo
                /usr/sbin/esxcfg-scsidevs -l
                echo
                center "esxcfg-scsidevs -u"
                echo
                /usr/sbin/esxcfg-scsidevs -u
                echo
                center "esxcfg-scsidevs -m"
                echo
		/usr/sbin/esxcfg-scsidevs -m
                echo
                center "esxcfg-mpath -l"
                echo
                /usr/sbin/esxcfg-mpath -l
                echo
                center "esxcfg-dumppart -l"
                echo
		/usr/sbin/esxcfg-dumppart -l
                echo
                center "esxcfg-info"
                echo
		/usr/sbin/esxcfg-info
                center "esxcfg-vswitch -l"
                echo
		/usr/sbin/esxcfg-vswitch -l
                center "esxcfg-nics -l"
                echo
		/usr/sbin/esxcfg-nics -l
                center "esxcfg-vmknic -l"
                echo
		/usr/sbin/esxcfg-vmknic -l

        elif [ `/usr/bin/vmware -v | grep "ESX 4" | wc -l` = "1" ] ||
	        [ `/usr/bin/vmware -v | grep "ESXi 4" | wc -l` = "1" ];
        then
                echo
                center "Module Information - BFA"
                echo
                vmkload_mod -s bfa
                echo
                center "Module Information - BNA"
                echo
                vmkload_mod -s bna
                echo
                center "vmware -v  on ESX4.0"
                echo
                /usr/bin/vmware -v
                echo
                center "Packages"
                echo
                /usr/sbin/esxupdate info
                echo
                center "esxudpate query --vib-view"
                echo
                /usr/sbin/esxupdate query --vib-view
                echo
                center "esxcfg-scsidevs -a"
                echo
                /usr/sbin/esxcfg-scsidevs -a
                echo
                center "esxcfg-scsidevs -A"
                echo
                /usr/sbin/esxcfg-scsidevs -A
                echo
                center "esxcfg-scsidevs -l"
                echo
                /usr/sbin/esxcfg-scsidevs -l
                echo
                center "esxcfg-scsidevs -u"
                echo
                /usr/sbin/esxcfg-scsidevs -u
                echo
                center "esxcfg-scsidevs -m"
                echo
		/usr/sbin/esxcfg-scsidevs -m
                echo
                center "esxcfg-mpath -l"
                echo
                /usr/sbin/esxcfg-mpath -l
                echo
                center "esxcfg-dumppart -l"
                echo
		/usr/sbin/esxcfg-dumppart -l
                echo
                center "esxcfg-info"
                echo
		/usr/sbin/esxcfg-info
                center "esxcfg-vswitch -l"
                echo
		/usr/sbin/esxcfg-vswitch -l
                center "esxcfg-nics -l"
                echo
		/usr/sbin/esxcfg-nics -l
                center "esxcfg-vswif -l"
                echo
		/usr/sbin/esxcfg-vswif -l
                center "esxcfg-vmknic -l"
                echo
		/usr/sbin/esxcfg-vmknic -l
                center "/proc/vmware/interrupts"
                echo
		cat /proc/vmware/interrupts
        else
                echo
                center "vmware -v  on ESX3.5"
                echo
                /usr/bin/vmware -v
                echo
                center "Packages"
                echo
                /usr/sbin/esxupdate -l query
                echo
                center "grep bfa /proc/vmware/pci"
                echo
		grep bfa /proc/vmware/pci
                echo
                center "esxcfg-vmhbadevs -a"
                echo
		/usr/sbin/esxcfg-vmhbadevs -a
                echo
                center "esxcfg-mpath -lv"
                echo
		/usr/sbin/esxcfg-mpath -lv
                echo
                center "esxcfg-dumppart -l"
                echo
		/usr/sbin/esxcfg-dumppart -l
                echo
                center "esxcfg-info"
                echo
		/usr/sbin/esxcfg-info
        fi
fi

if [ $SS_OS == "Linux" ] || [ $SS_OS == "VMkernel" ]
then
	center "lspci -vv"
	lspci -vv
	echo

        if [ $SS_IS_ESXi == "true" ]; then
            center "lspci -dv"
    	    lspci -dv
            echo
        else
            center "lspci -xxxx"
    	    dump_lspci
            echo
        fi

	center "lsmod"
	lsmod
	echo

	center "top -n 1"
	# Execute top with -b (batch mode flag)
	# else tty is not hooked up when ran as
	# background process results in script to hang.
	top -b -n 1 | col -b
	echo

	center "dump /proc entries"
	for ii in interrupts meminfo cpuinfo
	do
		center "$ii"
		cat /proc/$ii
		echo
	done

	echo
	center "ls -l /dev/sd*"
	ls -l /dev/sd*
	echo

	if [ ! -f /etc/vmware-release ]
	then
		center "Linux I/O Scheduler"
		cd /dev

		for ii in `ls sd*`
                do
			if [ -f /sys/block/$ii/queue/scheduler ]
			then
				echo "$ii -- " `cat /sys/block/$ii/queue/scheduler`
			fi
                done
		echo

		cd - 2>&1 >/dev/null

		center "modinfo bfa"
		modinfo bfa
		echo

		echo
		center "multipath -ll"
		multipath -ll	
		echo

		for ii in version info table status 
		do
			echo
			center "dmsetup $ii"
			dmsetup `echo $ii`
			echo
		done
	fi

	center "vmstat -m"
	vmstat -m 2>&1
	echo

	if [ $SS_IS_BFA == "true" ]
	then
		if [ -c /dev/bfa* ]
		then
			echo
			center "ls -l /dev/bfa*"
			ls -l /dev/bfa*
			echo
		fi

		if [ -c /proc/scsi/bfa/HbaApiNode* ]
		then
			echo
			center "ls -l /proc/scsi/bfa/HbaApiNode*"
			ls -l /proc/scsi/bfa/HbaApiNode*
			echo
		fi

		echo
		center "ls -l /dev/sd*"
		ls -l /dev/sd*
		echo
	fi
	
	center "dmidecode"
	dmidecode	
	echo

fi

if [ $SS_OS == "SunOS" ]
then
	center "isainfo -kv"
	isainfo -kv
	echo

	center "prtdiag"
	prtdiag
	echo

	center "modinfo"
	modinfo
	echo

	center "dmesg"
	dmesg
	echo

	center "mdb -k ::interrupts"
	echo -e "::interrupts" | mdb -k
	echo

	center "mdb -k ::interrupts -d"
	echo -e "::interrupts -d" | mdb -k
	echo

	center "netstat -na | grep 34568"
	netstat -na | grep 34568
	echo

	center "netstat -s"
	netstat -s
	echo

	center "svcs hcmagentservice"
	svcs hcmagentservice
	echo
else
	if [ $SS_IS_ESXi != "true" ]; then
	center "netstat -punta | grep hcm"
	netstat -punta | grep hcm
	echo

	center "hcmagentservice status"
	hcmagentservice status
	echo

	center "chkconfig --list hcmagentservice"
	chkconfig --list hcmagentservice
	echo

	center "netstat -ts"
	netstat -ts
	echo

	center "chkconfig --list"
	chkconfig --list
	echo

	center "service --status-all"
	service --status-all
	echo

fi
fi

if [ $SS_IS_ESXi == "true" ]; then
	center "ps -cs"
	ps -cs
else
center "ps -efl"
ps -efl
fi
echo

if [ $SS_IS_ESXi != "true" ]; then
center "ifconfig"
ifconfig -a 2>& 1
echo

center "arp -na"
arp -na 2>& 1
echo

center "netstat -nr"
netstat -nr 2>& 1
echo

fi

bcu adapter --list 2>&1 >/dev/null

if [ $? -eq 1 ]
then
		echo
		echo "BFA driver not installed or no adapters found...."
		echo "Exiting Supportsave..."
		echo
		exit
fi

if [ $SS_IS_BNA == "true" ]
then
	if [ -c /dev/bna ]
	then
		echo
		center "ls -l /dev/bna*"
		ls -l /dev/bna*
		echo
	fi
	if [ $SS_IS_ESXi != "true" ]; then
	echo
	center "modinfo bna"
	echo
	rpm -qa | grep bna
	if [ $? -eq 0 ]
	then
		modinfo bna
	else
		if [ -f /var/log/vmkernel ];
		then
			modinfo bna.o
		else
			modinfo bna.ko
		fi
	fi
fi
fi

echo
center "adapter --list"
echo
bcu adapter --list

echo
center "port --list"
echo
bcu port --list
echo

# just to get the driver/firmware version
if [ $SS_IS_BFA == "true" ]
then
	echo
	center "vhba --query 1/0"
	echo
	bcu vhba --query 1/0
	echo
fi


for i in $SS_AD_LIST
do 
	echo
	center "Adapter $i details"
	echo

	SS_PORT_LIST=`bcu port --bfs_list $i`
	echo
	center "Adapter $i type"
	device_id=""
	device_id=`bcu adapter --query $i | grep "device id" | awk '{ print $3; }'`
	echo device_id is $device_id

	for j in $SS_PORT_LIST
	do
		bcu debug --dump $i/$j
	done

	bcu diag --pciloopback $i/0 a5a5a5a5 -c 1
	if [ $? -ne 0 ]
	then
		echo "$i/0 pciloopback test failed"
	fi

	bcu adapter --query $i | grep "num ports" | grep 2 2>&1 > /dev/null
	if [ $? -eq 0 ]
	then
		bcu diag --pciloopback $i/1 a5a5a5a5 -c 1
		if [ $? -ne 0 ]
		then
			echo "$i/1 pciloopback test failed"
		fi
	fi

	echo
	center "pcifn --list $i"
	echo
	bcu pcifn --list $i
	echo

	if [ $SS_IS_BFA == "true" ]
	then
		echo
		center "flash --query"
		bcu flash --query $i
		echo
		echo
	fi

	center "adapter --query"
	echo
	bcu adapter --query $i -v

	echo
	center "diag --tempshow"
	bcu diag --tempshow $i
	echo

	if [ $SS_IS_BFA == "true" ]
	then
		center "trunk --query $i"
		echo
		bcu trunk --query $i
		echo
	fi

	for j in $SS_PORT_LIST
	do
		bcu port --query $i/$j | grep "port mode" | grep "FC" 2>&1 > /dev/null
		if [ $? -eq 0 ]
		then
			SS_PORT_MODE="FC"	
		else
			SS_PORT_MODE="NON_FC"	
		fi
		center "port --query $i/$j"
		echo
		bcu port --query $i/$j
		echo

		
		center "port --stats $i/$j"
		echo
		bcu port --stats $i/$j
		echo

		SS_PCIFN_LIST=`bcu port --pcifn_list $i $j`
		for k in $SS_PCIFN_LIST ; do
			center "log --level $i/$j/$k"
			echo
			bcu log --level $i/$j/$k
			echo
		done
		
		if [ $SS_PORT_MODE == "NON_FC" ]
		then
			
			center "dcb --query $i/$j"
			echo
			bcu dcb --query $i/$j
			echo
					
			center "dcb --stats $i/$j"
			echo
			bcu dcb --stats $i/$j
			echo
		fi
				
		if [ $SS_IS_BNA == "true" ]
		then
			center "ethboot --query $i/$j"
			echo
			bcu ethboot --query  $i/$j
			echo

			SS_PCIFN_ETHLIST=`bcu port --pcifn_ethlist $i $j`
			for k in $SS_PCIFN_ETHLIST ; do
				center "vnic --query $i/$j/$k"
				echo
				bcu vnic --query $i/$j/$k
				echo
							
				center "vnic --stats $i/$j/$k"
				echo
				bcu vnic --stats $i/$j/$k
				echo
			done
							
		fi
				
		if [ $SS_IS_BFA == "true" ]
		then
			center "bios --query $i/$j"
			echo
			bcu bios --query  $i/$j
			echo
		
			SS_PCIFN_FCLIST=`bcu port --pcifn_fclist $i $j`
			for k in $SS_PCIFN_FCLIST ; do
				center "vhba --query $i/$j/$k"
				echo
				bcu vhba --query $i/$j/$k
				echo

				center "vhba --stats $i/$j/$k"
				echo
				bcu vhba --stats $i/$j/$k
				echo
			done	
			center "port --fwstats $i/$j"
			echo
			bcu port --fwstats $i/$j
			echo

			center "ratelim --query $i/$j"
			echo
			bcu ratelim --query  $i/$j
			echo
			
			if [ $SS_PORT_MODE == "FC" ]
			then
				center "qos --query $i/$j"
				echo
				bcu qos --query  $i/$j
				echo
				
				center "qos --vcquery $i/$j"
				echo
				bcu qos --query  $i/$j -d
				echo
				
				center "qos --stats $i/$j"
				echo
				bcu qos --stats $i/$j
				echo

				center "port --faa_query $i/$j"
				echo
				bcu port --faa_query $i/$j
				echo

				center "port --bbcr_query $i/$j"
				echo
				bcu port --bbcr_query $i/$j
				echo

				center "port --fec_query $i/$j"
				echo
				bcu port --fec_query $i/$j
				echo

			fi
			
			center "debug --portlog $i/$j"
			echo
			bcu debug --portlog $i/$j
			echo

			center "lport --list $i/$j"
			echo
			bcu lport --list $i/$j
			SS_VPORT_LIST=`bcu lport --list $i/$j | egrep -v "^$|^----|^[A-U]|^[W-Z]" | cut -f6 -d" "`
			echo

			center "lport --query $i/$j"
			echo
			bcu lport --query $i/$j
			echo

			center "lport --stats $i/$j"
			echo
			bcu lport --stats $i/$j
			echo
				
			center "fabric --stats $i/$j"
			echo
			bcu fabric --stats $i/$j
			echo

			center "rport --list $i/$j"
			echo
			bcu rport --list $i/$j
			echo

                        center "fcpim --trs_query $i/$j"
                        echo
                        bcu fcpim --trs_query $i/$j
                        echo

                        center "fcpim --ioprofile_query $i/$j"
                        echo
                        bcu fcpim --ioprofile_query $i/$j
                        echo

			SS_RPORT_LIST=`bcu rport --list $i/$j | egrep -v "^----|^$|^[A-Z]" | cut -f4 -d" "`

			if [ "$SS_RPORT_LIST" != "" ]
			then
				for r in $SS_RPORT_LIST
				do
					center "rport --query $i/$j $r"
					echo
					bcu rport --query $i/$j $r
					echo

					center "rport --stats $i/$j $r"
					echo
					bcu rport --stats $i/$j $r
					echo

					bcu rport --query $i/$j $r | grep "^Function" | grep Target 2>&1 > /dev/null

					if [ $? -eq 0 ]
					then
                                                center "fcpim --query $i/$j $r"
						echo
						bcu fcpim --query $i/$j $r
						echo

						center "fcpim --stats $i/$j $r"
						echo
						bcu fcpim --stats $i/$j $r
						echo

						center "fcpim --lunlist $i/$j -v"
						echo
						bcu fcpim --lunlist $i/$j -v
						echo

						center "fcpim --lunmaskquery $i/$j"
						echo
						bcu fcpim --lunmaskquery $i/$j
						echo

						center "fcpim --throttlequery $i/$j"
						echo
						bcu fcpim --throttlequery $i/$j
						echo
					fi
				done
			fi

			if [ "$SS_VPORT_LIST" != "" ]
			then
				for v in $SS_VPORT_LIST
				do
					center "vport --stats $i/$j $v"
					echo
					bcu vport --stats $i/$j $v
					echo

					echo
					center "rport --list $i/$j -l $v"
					echo
					bcu rport --list $i/$j -l $v
					echo

					SS_RPORT_LIST=`bcu rport --list $i/$j -l $v | egrep -v "^----|^$|^[A-Z]" | cut -f4 -d" "`

					if [ "$SS_RPORT_LIST" != "" ]
					then
						for r in $SS_RPORT_LIST
						do
							center "rport --query $i/$j $r -l $v"
							echo
							bcu rport --query $i/$j $r -l $v
							echo
							
							center "rport --stats $i/$j $r -l $v"
							echo
							bcu rport --stats $i/$j $r -l $v
							echo

							bcu rport --query $i/$j $r -l $v | grep "^Function" | grep Target 2>&1 > /dev/null

							if [ $? -eq 0 ]
							then
									center "fcpim --query $i/$j $r -l $v"
									echo
									bcu fcpim --query $i/$j $r -l $v
									echo

									center "fcpim --stats $i/$j $r -l $v"
									echo
									bcu fcpim --stats $i/$j $r -l $v
									echo

									center "fcpim --lunlist $i/$j -l $v -v"
									echo
									bcu fcpim --lunlist $i/$j -l $v -v
									echo
									center "fcpim --lunmaskquery $i/$j"
									echo
									bcu fcpim --lunmaskquery $i/$j 
									echo
							fi
						done
					fi
				done
			fi
		fi
		
		echo
		center "Diagnostics for $i/$j"
		echo
		center "diag --pciloopback"
        	bcu diag --pciloopback $i/$j A5A5A5A5 -c 10
		echo
		center "diag --sfpshow"
        	bcu diag --sfpshow $i/$j
		echo
		bcu adapter --query $i | grep "Brocade-1741" 2>&1 > /dev/null
		if [ $? -eq 0 ]
		then
			echo
			center "phy --query $i/$j"
			bcu phy --query $i/$j
			echo
			center "phy --stats $i/$j"
			bcu phy --stats $i/$j
			echo
		fi
	done
done
	
if [ $SS_IS_BNA == "true" ]
then
	if [ $SS_OS == "SunOS" ]
	then
		echo
		center "kstat -m bna -n debug"
		kstat -m bna -n debug
		echo
	else	
		SS_INTERFACE_LIST=`bcu port --list | grep eth | awk '{ print $4 }'`
		for f in $SS_INTERFACE_LIST
		do
			echo
			center "ethtool -i $f"
			echo
			ethtool -i $f
			echo
			center "ethtool -S $f"
			echo
			ethtool -S $f
			echo
			center "ethtool -k $f"
			echo
			ethtool -k $f
			echo
			center "ethtool -a $f"
			echo
			ethtool -a $f
			echo
			center "ethtool -c $f"
			echo
			ethtool -c $f
			echo
			center "ethtool -g $f"
			echo
			ethtool -g $f
			echo
		done
	fi
fi

echo 
center "End time"
date
echo

echo
center "End of supportshow output"
