#!/bin/bash
#
# Name: hp_system_info
# Copyright: (C)2004-2006 Hewlett-Packard Company
#
# Description: gathers system information and bundles it together
#              into a tarball
# 
# CD	03/01/04 Initial Development
# CD    06/11/04 Changes for SLES 9 (2.6 kernel)
# CD	01/05/06 Changes for lpfc support
# CD	03/27/06 Check to see if files actually exist before putting
#                them in the tarfile to avoid extraneous error messages
# CD	08/30/06 Changes for SLES 10; Added checks for libraries and 
#                Multipulse RPMs

# Defines

SYSINFODIR="/tmp"
SYSINFOFILE="/tmp/system_info.txt"
TARBALL="/tmp/system_info.tar"
PROCSCSI="/tmp/proc_scsi.txt"
PROCQLA="/tmp/proc_qla.txt"
PROCLPFC="/tmp/proc_lpfc.txt"
FILELIST="system_info.txt proc_scsi.txt proc_qla.txt proc_lpfc.txt messages"
LSSD="/opt/hp/hp_fibreutils/lssd"
RPORT_SCAN="/opt/hp/hp_fibreutils/sysfs_scan_rport"

# init files

rm -f $TARBALL.gz
rm -f $SYSINFOFILE
rm -f $PROCSCSI
rm -f $PROCQLA
rm -f $PROCLPFC
echo -n "" > $SYSINFOFILE
echo -n "" > $PROCQLA

# write out system information file

echo "Capturing System Information..."
echo "   System Information" >> $SYSINFOFILE
echo  "------------------------"  >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
echo "Date: `date`"  >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
cat /etc/issue >> $SYSINFOFILE
echo "Hostname: `hostname`"  >> $SYSINFOFILE
echo "Kernel: `uname -r`"  >> $SYSINFOFILE

# print whether system is running a uniprocessor or
# an SMP kernel

if [ "`cat /proc/version | grep SMP`" = "" ]
then
  echo "Kernel is uniprocessor"  >> $SYSINFOFILE
else
  echo "Kernel is SMP"  >> $SYSINFOFILE
fi

echo "Architecture: `uname -m`"  >> $SYSINFOFILE
echo "LVM version: `rpm -q lvm`"  >> $SYSINFOFILE
echo "LVM2 version: `rpm -q lvm2`"  >> $SYSINFOFILE
echo "Device-Mapper version: `rpm -q device-mapper`"  >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
echo "CPU Info:"  >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
cat /proc/cpuinfo >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
echo "Memory Info:"  >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
cat /proc/meminfo >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
echo "Process Info:"  >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
ps -eaf >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
echo "PCI Bus Info:"  >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
lspci >> $SYSINFOFILE
echo  ""  >> $SYSINFOFILE
echo "Module Info"  >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
lsmod >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
echo "Disk Info:"  >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
$LSSD >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
echo "Filesystem Info:"  >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
df -Tk >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
echo "HP RPM Information:"  >> $SYSINFOFILE
echo ""  >> $SYSINFOFILE
echo "qla2x00 RPM installed:       `rpm -q qla2x00`"  >> $SYSINFOFILE
echo "hp_qla2x00 RPM installed:    `rpm -q hp_qla2x00`"  >> $SYSINFOFILE
echo "hp_qla2x00src RPM installed: `rpm -q hp_qla2x00src`"  >> $SYSINFOFILE
echo "hp-lpfc RPM installed:       `rpm -q hp-lpfc`"  >> $SYSINFOFILE
echo "hp-multipulse RPM installed: `rpm -q hp-multipulse`" >> $SYSINFOFILE
echo "fibreutils RPM installed:    `rpm -q fibreutils`"  >> $SYSINFOFILE
echo "HP SANsurfer RPM installed:  `rpm -q hp_sansurfer`"  >> $SYSINFOFILE
echo "HBAnyware RPM installed:     `rpm -q HBAnyware`"  >> $SYSINFOFILE
echo "" >> $SYSINFOFILE
echo "Library information:" >> $SYSINFOFILE
echo "" >> $SYSINFOFILE
ls -l /usr/lib/libemsdm.so 1>> $SYSINFOFILE 2>&1
ls -l /usr/lib/libdfc.so 1>> $SYSINFOFILE 2>&1
ls -l /usr/lib/libqlsdm.so 1>> $SYSINFOFILE 2>&1

# capture /proc/scsi/scsi

echo "Capturing /proc/scsi/scsi..."
cat /proc/scsi/scsi >> $PROCSCSI

# capture /proc/scsi/qla2200

if [ -d /proc/scsi/qla2200 ]
then
 echo "Capturing /proc/scsi/qla2200..."
 more /proc/scsi/qla2200/* >> $PROCQLA
fi

# capture /proc/scsi/qla2300

if [ -d /proc/scsi/qla2300 ]
then
 echo "Capturing QLogic driver information"
 more /proc/scsi/qla2300/* >> $PROCQLA
fi

# capture /proc/scsi/qla2xxx

if test -d /proc/scsi/qla2xxx
then
 echo "Capturing QLogic driver information"
 more /proc/scsi/qla2xxx/* >> $PROCQLA
fi

# capture /proc/scsi/lpfc

if test -d /proc/scsi/lpfc || [ "`uname -r | cut -c 1-3`" = "2.6" ]
then
 echo "Capturing Emulex driver information"
 
 if test -d /proc/scsi/lpfc
 then
 	more /proc/scsi/lpfc/* >> $PROCLPFC
 fi

 # gather information from the /sys filesystem if we are a 2.6 kernel
 if [ "`uname -r | cut -c 1-3`" = "2.6" ]
 then
	LIST="`ls /sys/class/scsi_host`"
	EADAPTLIST=""

 	for i in $LIST
 	do
		if test -f /sys/class/scsi_host/$i/lpfc_drvr_version
		then
			EADAPTLIST=${EADAPTLIST}${i}" "
		fi
 	done

 	for i in $EADAPTLIST
 	do
 		echo "" >> $PROCLPFC
		echo "===/sys/class/scsi_host/$i===" >> $PROCLPFC
 		SYSFSFILELIST=`ls /sys/class/scsi_host/$i`
		
		for j in $SYSFSFILELIST
		do
			OUTPUT="`cat /sys/class/scsi_host/$i/$j 2>/dev/null`"
			echo "---$j---" >> $PROCLPFC
			echo "$OUTPUT" >> $PROCLPFC
		done
		echo "---rport information---" >> $PROCLPFC
                $RPORT_SCAN `basename ${i#host}` >> $PROCLPFC

	done	
 fi 
fi

# make tar file

cp /var/log/messages /tmp
cd $SYSINFODIR
echo "Making system information archive $TARBALL.gz"

# double check the files in the filelist to make sure
# that the file actually exists

FILELIST2=""

for i in $FILELIST
do
 if test -f $i
 then
	FILELIST2=$FILELIST2" ${i}"
 fi
done

tar cvf $TARBALL $FILELIST2 1>/dev/null
gzip $TARBALL

# clean up

rm -f $SYSINFOFILE
rm -f $PROCSCSI
rm -f $PROCQLA
rm -f $PROCLPFC
rm -f /tmp/messages

