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

usage()
{
	echo
	echo	bfa_supportsave
	echo		To create and save the supportsave in /tmp directory.
	echo
	echo	bfa_supportsave "[dir]" "[file]"
	echo		To create and save the supportsave under "[dir]" with name "[file]".
	echo		If no argument is provided supportsave file would be saved under
	echo		/tmp directory. 
	echo
	echo	bfa_supportsave --help
	echo		To view bfa_supportsave usage.
	echo
	echo	bfa_supportsave -h
	echo		To view bfa_supportsave usage.
	echo
	echo	bfa_supportsave --version
	echo		To view bfa_supportsave version information.
	echo
	echo	bfa_supportsave -v
	echo		To view bfa_supportsave version information.
	echo	
}

if [ "$1" == "--help" ]; then
	usage
	exit -1
fi

if [ "$1" == "-h" ]; then
	usage
	exit -1
fi

if [ "$1" == "--version" ]; then
	echo Brocade Support-Save utility
	bcu -v | grep -v -i brocade
	exit -1
fi

if [ "$1" == "-v" ]; then
	echo Brocade Support-Save utility
	bcu -v | grep -v -i brocade
	exit -1
fi

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


SS_DATE_TIME=`date +%F_%H_%M_%S`

SS_PWD=`pwd`
SS_DIR=/tmp
SS_OUTDIR=bfa_ss_out_$SS_DATE_TIME
SS_FILE="bfa_supportsave_$SS_DATE_TIME.tgz"
export SS_RUNNING=TRUE


## hcmagent uses this script as follows:
## /usr/bin/bfa_supportsave /tmp/hcmagttmp filename
## hcmagent always creates the support save files at constant location. 

if [ $# -ge 3 ]
then
	usage
	exit -1
fi

if [ $# -ge 1 ]
then

	SS_DIR=$1
	
	if [ -f $1 ]
	then
		echo
		echo "File $1 exists. Cannot use it as dir..."
		usage
		exit -1
	fi

	if [ ! -d $1 ]
	then
		echo
		echo "Directory $1 does not exist. Creating the dir..."
		mkdir $1
	fi
fi

if [ $# == 2 ]
then
	if [ -d $2 ]
	then
		echo
		echo "Directory $2 exists. Cannot use it as the file for supportsave..."
		usage
		exit -1
	fi

	SS_FILE=$2
fi


SS_SHOW_OFILE=bfa_ss.txt
SS_SHOW=bfa_supportshow
SS_OS=`uname`

eyecatcher="================================================================================="
declare -i fbl=80+${#1}
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
	first=10
	last=0
    fi   
    last_str=`echo $eyecatcher | awk '{print substr("'"${eyecatcher}"'", 1, "'"${last}"'")}'`
    echo "${last_str} $*:"
#    echo "${eyecatcher:1:${last}} $*:" >& 2
}


cd $SS_DIR

if [ -d $SS_OUTDIR ]
then
	echo "ERROR: Output dir $SS_OUTDIR already exists"
	echo "Please remove or move the directory and re-execute bfa_supportsave"
	cd $SS_PWD
	exit -1
fi

mkdir -p $SS_OUTDIR

BRCD_FC_HBA_LIST="Brocade-415 Brocade-425 Brocade-815 Brocade-825" 

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

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

# Mount debugfs if not mounted already - for 2.6.31 > kernels
if [ `uname` == "Linux" ] && [ ! -f  /bin/vmware ];
then
	if [ "`uname -r | sed s/[-_]/./g | cut -d\. -f3`" -ge "32" ]; then
		if [ "`/bin/mount | grep debugfs`" == "" ]; then
			mount -t debugfs debugfs /sys/kernel/debug 2>/dev/null
		fi
	fi
fi

for i in $SS_AD_LIST
do 
	SS_PORT_LIST=`bcu port --bfs_list $i`

	for j in $SS_PORT_LIST
	do
		SS_PCIFN_LIST=`bcu port --pcifn_list $i $j`
		for k in $SS_PCIFN_LIST ; do
			center "Fetching Driver trace for instance $i/$j/$k"
			SS_OUTFILE=$SS_OUTDIR/dtrc_ad$i-p$j-f$k.bin
			bcu debug --dtrc $i/$j/$k $SS_OUTFILE 1>/dev/null 2>&1
			bfatrc $SS_OUTFILE > $SS_OUTDIR/dtrc_ad$i-p$j-f$k.txt 2>/dev/null
		done
		echo  "	Done."
	done
done

for i in $SS_AD_LIST
do 
	SS_PORT_LIST=`bcu port --bfs_list $i`

	for j in $SS_PORT_LIST
	do
		center "Fetching Firmware traces/logs for port $i/$j"
		SS_OUTFILE=$SS_OUTDIR/ftrc_ad$i-p$j.bin
		bcu debug --ftrc $i/$j $SS_OUTFILE 1>/dev/null 2>&1
		bfatrc $SS_OUTFILE > $SS_OUTDIR/ftrc_ad$i-p$j.txt 2>/dev/null
	
		if [ $j -eq 0 ]
			then	
		bcu flash --read $i -r $SS_OUTDIR/flog_ad$i.bin 1>/dev/null 2>&1
		bfatrc $SS_OUTDIR/flog_ad$i.bin > $SS_OUTDIR/flog_ad$i.txt 2>/dev/null
		fi

		SS_PCIFN_LIST=`bcu port --pcifn_list $i $j`
		for k in $SS_PCIFN_LIST ; do
                        SS_OUTFILE=$SS_OUTDIR/fsave_ad$i-p$j-f$k.bin
                        bcu debug --fsave $i/$j/$k $SS_OUTFILE 1>/dev/null 2>&1
                        bfatrc $SS_OUTFILE > $SS_OUTDIR/fsave_ad$i-p$j-f$k.txt 2>/dev/null
                done
		echo  "	Done."
	done

	for j in $SS_PORT_LIST
	do
		center "Dumping the PBC Flash Partition Contents for port $i/$j"
		SS_OUTFILE=$SS_OUTDIR/pbc_flash_ad$i-p$j.bin
		bcu flash  --read $i -p $SS_OUTFILE -i $j >/dev/null 2>&1
		echo  "	Done."
	done
done

center "Dumping the ASIC block content for ct2 cards"
for i in $SS_AD_LIST
do
	SS_OUTFILE=$SS_OUTDIR/ct2_ablk_ad$i.bin
	bcu flash --dumpasicblk $i $SS_OUTFILE >/dev/null 2>&1
done
echo  "	Done."

center "Dumping the FRU VPD contents for 1867/1869 adapters"
for i in $SS_AD_LIST
do
	bcu adapter --query $i | grep "Brocade-1867" 2>&1 > /dev/null
	if [ $? -eq 0 ]
	then
		SS_OUTFILE=$SS_OUTDIR/fruvpd_ad$i.txt
		bcu fruvpd --read $i 0 8192 > $SS_OUTFILE  2>/dev/null
	else
		bcu adapter --query $i | grep "Brocade-1869" 2>&1 > /dev/null
		if [ $? -eq 0 ]
		then
			SS_OUTFILE=$SS_OUTDIR/fruvpd_ad$i.txt
			bcu fruvpd --read $i 0 8192 > $SS_OUTFILE  2>/dev/null
		fi
	fi
done
echo  "	Done."

if [ `uname` == "SunOS" ] && [ `uname -p` == "i386" ]
then
	echo 
	echo 
	center "supportsave operation is in progress."
	center "It will take a few minutes. Please wait."
	echo 
	echo 
fi

center "Fetching supportshow details"
if [ $SS_IS_ESXi == "true" ]; then
if [ -f /opt/brocade/bin/$SS_SHOW ]; then
/opt/brocade/bin/$SS_SHOW > $SS_OUTDIR/$SS_SHOW_OFILE 2>&1
else
sh `which $SS_SHOW` > $SS_OUTDIR/$SS_SHOW_OFILE 2>&1
fi
else
$SS_SHOW > $SS_OUTDIR/$SS_SHOW_OFILE 2>&1
fi
echo  "	Done."

# copy agent log files
if [ -f /opt/brocade/adapter/hbaagent/scripts/hcmagent_supportsave.sh ]
then
    center "Fetching HCM Agent logs"
    /opt/brocade/adapter/hbaagent/scripts/hcmagent_supportsave.sh $SS_OUTDIR
    echo  "	Done."
fi

center "Creating a tar ball"

if [ `uname` == "SunOS" ]
then
	cp /kernel/drv/bfa.conf $SS_OUTDIR
	echo "	Copying /var/adm/message* to output dir..."
	cp /var/adm/message* $SS_OUTDIR/
	cp /etc/release $SS_OUTDIR

	if [ $SS_IS_BFA == "true" ]
	then
		echo -e "::fptrace\n::fcptrace\n$q" | mdb -k > $SS_OUTDIR/lv_trace.log 2>&1
	fi

	if [ $SS_IS_BNA == "true" ];
	then
		if [ -f /kernel/drv/bna.conf ];
		then
			cp /kernel/drv/bna.conf $SS_OUTDIR
		fi
	fi

	echo "	creating tar ball..."
	tar cf bfa_supportsave.tar $SS_OUTDIR/*
	gzip bfa_supportsave.tar
	mv bfa_supportsave.tar.gz $SS_FILE
	echo "	Done"
else
	cp /etc/bfa.conf $SS_OUTDIR
	if [ $SS_IS_ESXi != "true" ]; then 
		cp /opt/brocade/adapter/bfa/bfa.log $SS_OUTDIR/bfa_cfg.log
	fi

	# copy some system files
    	for ii in /etc/modprobe.conf /etc/multipath.conf /etc/modprobe.d/blacklist
    	do
        	if [ -f $ii ]
        	then
            		cp $ii $SS_OUTDIR/
        	fi
    	done

	if [ -f /var/log/messages ]; then
		echo "	Copying /var/log/messages* ..."
		cp /var/log/message* $SS_OUTDIR/
	fi

	if [ $SS_IS_BNA == "true" ]
	then
		if [ $SS_IS_ESXi == "true" ] || [ -f /var/log/vmkernel ];
		then
			cp /etc/vmware/esx.conf $SS_OUTDIR/
		fi
		if [ -e /etc/redhat-release ]; 
		then
			cp /etc/sysconfig/network-scripts/ifcfg-* $SS_OUTDIR/
		elif [ -e /etc/SuSE-release ];
		then
			cp /etc/sysconfig/network/ifcfg-* $SS_OUTDIR/
		fi
	fi

	if [ -f /var/log/vmkernel ] || [ -f /var/log/vmkernel.log ];
	then
		echo "	Copying /var/log/vmkernel* and vmkwarning* to output dir..."
		cp /var/log/vmkernel* $SS_OUTDIR/
		cp /var/log/vmkwarning* $SS_OUTDIR/
		if [ -f /var/log/syslog.log ]; then
			echo "	Copying /var/log/syslog* ..."
			cp /var/log/syslog* $SS_OUTDIR/
		fi
		if [ -f /var/log/esxupdate.log ]; then
			echo "	Copying /var/log/esxupdate* ..."
			cp /var/log/esxupdate* $SS_OUTDIR/
		fi
		if [ -f /var/log/vmware/esxupdate.log ]; then
			echo "	Copying /var/log/vmware/esxupdate* ..."
			cp /var/log/vmware/esxupdate* $SS_OUTDIR/
		fi
		if [ `ls -rt /root/vmkernel-zdump* 2> /dev/null | wc -l` != "0" ];
		then
			cp `ls -rt /root/vmkernel-zdump* | tail -n 1` $SS_OUTDIR/
		fi
		echo "	Done"
	fi
	if [ -f /proc/vmware/log ];
	then
		echo "	Copying /proc/vmware/log..."
		cp /proc/vmware/log $SS_OUTDIR/
		echo "	Done"
	fi

	echo "	creating tar ball..."
	tar zcf $SS_FILE $SS_OUTDIR
	echo "	Done"
fi

rm -rf $SS_OUTDIR

center  "Done"
echo
echo "Output file is $SS_DIR/$SS_FILE"

cd $SS_PWD

