#!/bin/sh
#
#    Collect LINUX system info
#
#    Optional parameter:  name
#        If present, <name> will be used to generate the output
#               directory/file:/tmp/netapp/netapp_linux_name
#        compressed tar file will be called /tmp/netapp_linux_name.tar.gz
#
#    If <name> is not specified, output will be in
#       /tmp/netapp_linux_info.tar.gz and so on.
#
#
# Copyright (c) 2002-2010 NetApp, Inc., All Rights Reserved
#

USAGE="linux_info fcp|iscsi|all [-d <directory>] [-f] [ -n <name>]"

HELP1="\nCollects LINUX configuration information.\n"
HELP2="This creates a tar file ready to be sent to\n"
HELP3="Customer Support.\n\n"
HELP4="\tfcp\tcollects information for FCP enabled hosts\n"
HELP5="\tiscsi\tcollects information for iSCSI enabled hosts\n"
HELP6="\tall\tcollects information for both FCP and iSCSI enabled hosts\n"
HELP7="\t-d <directory>\tgives the directory to place the files in\n"
HELP8="\t-f force overwriting of output files if they already exist\n"
HELP9="\t\t\t(default is /tmp/netapp)\n\n"
HELPA="\t-n <name>\tgives a name string to be used in the output\n"
HELPB="\t\t\tfile and directory names\n"
HELP="$HELP1$HELP2$HELP3$HELP4$HELP5$HELP6$HELP7$HELP8$HELP9$HELPA$HELPB"


CD=cd
CP="/bin/cp -p"
CAT=/bin/cat
COMPRESS=/usr/bin/gzip
DATE=/bin/date
DF=/bin/df
ECHO="/bin/echo -e"
FDISK=/sbin/fdisk
GREP=/bin/grep
LSMOD=/sbin/lsmod
LSPCI=/sbin/lspci
MKDIR=/bin/mkdir
MOUNT=/bin/mount
MV=/bin/mv
RM=/bin/rm
RPM=/bin/rpm
SANSURFER=/opt/QLogic_Corporation/SANsurferCLI/scli
SANSURFERi=/opt/QLogic_Corporation/SANsurferiCLI/iscli
HBACMD=/usr/sbin/hbanyware/hbacmd
STRINGS=/usr/bin/strings
SYSCTL=/sbin/sysctl
TAR=/bin/tar
UNAME=/bin/uname
WHOAMI=/usr/bin/whoami
PSCMD=/bin/ps
LSOF_REDHAT=/usr/sbin/lsof
LSOF_SUSE=/usr/bin/lsof
UPTIME=/usr/bin/uptime
LS=/bin/ls
AWK=/bin/awk
DMSETUP=/sbin/dmsetup
MULTIPATH=/sbin/multipath
VMSTAT=/usr/bin/vmstat
IOSTAT=/usr/bin/iostat
SERVICE=/sbin/service
CHKCONFIG=/sbin/chkconfig
LSBRLSE=/usr/bin/lsb_release
SELINUXENABLED=/usr/sbin/selinuxenabled
MODINFO=/sbin/modinfo

FSTAB=/etc/fstab
MCONF=/etc/modules.conf
MCONF2=/etc/modprobe.conf
MCONF3=/etc/modprobe.conf.local

SAN_UTIL_DIR=/opt/netapp/santools
SAN_UTIL_PROG=sanlun
SANLUN=$SAN_UTIL_DIR/$SAN_UTIL_PROG

QLREMOTE=/usr/local/bin/qlremote
iQLREMOTE=/usr/local/bin/iqlremote

VXDISK=/usr/sbin/vxdisk
VXDDLADM=/usr/sbin/vxddladm
VXDMPADM=/sbin/vxdmpadm
VXDMP_DEVS=/dev/vx/dmp
VXDCTL=/sbin/vxdctl
VXLICREP=/sbin/vxlicrep
VXPRINT=/sbin/vxprint
VXCLUSTADM=/opt/VRTS/bin/vxclustadm
VXFENADM=/sbin/vxfenadm
VXFENADM=/sbin/vxfenadm
VXFENDEBUG=/opt/VRTSvcs/vxfen/bin/vxfendebug
VXDG=/usr/sbin/vxdg
VXSTAT=/usr/sbin/vxstat

LLTCONFIG=/sbin/lltconfig
LLTSTAT=/sbin/lltstat
GABCONFIG=/sbin/gabconfig
HASTATUS=/opt/VRTSvcs/bin/hastatus
HASYS=/opt/VRTSvcs/bin/hasys
CFSCLUSTER=/opt/VRTS/bin/cfscluster

# save a copy of the command line
CMDLINE="$0 $@"

# set default arguements/options
directory=/tmp/netapp
name="info"
FFLAG=0
FCPFLAG=0
ISCSIFLAG=0


# Collect as much sysrq information

get_sysrq ()
{ if [ -f /proc/sys/kernel/sysrq ]; then
    echo 1 > /proc/sys/kernel/sysrq;
    fi

    if [ -f /proc/sysrq-trigger ]; then

    cat < /proc/kmsg >> $outdir/sysrq.txt &
    jobid=`jobs| grep -i "/proc/kmsg" | cut -c2`;

    if [ -z $jobid ]; then
        echo "Probably I couldn't read the kernel ring buffer. MAC/RAC ?????\n" > $outdir/sysrq_failed
    else
            # Increase the logging level
            echo 8 > /proc/sysrq-trigger;

            # Collect memory details
            echo m > /proc/sysrq-trigger;
            sleep 2;

            # Collect Pc status
            echo p > /proc/sysrq-trigger;
            sleep 2;

            # Collect all timer status
            echo q > /proc/sysrq-trigger;
            sleep 2;

            echo 1 > /proc/sysrq-trigger;

               kill -s term %$jobid

        fi
    fi
    echo 0 > /proc/sys/kernel/sysrq
    #
    # AMD machines hang while collecting task related data.
    # Hence task related data will be collected only
    # if the machine does not have AMD processor.
    #
    grep "model name" /proc/cpuinfo | grep "AMD" > /dev/null
    if [ $? -eq 1 ]; then
        if [ -f /proc/sys/kernel/sysrq ]; then
                echo 1 > /proc/sys/kernel/sysrq;
        fi

        if [ -f /proc/sysrq-trigger ]; then
                cat < /proc/kmsg >> $outdir/sysrq.txt &
                jobid=`jobs| grep -i "/proc/kmsg" | cut -c2`;

                if [ -z $jobid ]; then
                        echo "Probably I couldn't read the kernel ring buffer. MAC/RAC ?????\n" > $outdir/sysrq_failed
                else
                        # Increase the logging level
                        echo 8 > /proc/sysrq-trigger;

                        # Collect all Task status;
                        echo t > /proc/sysrq-trigger;
                        # This one takes a lot of time.
                        sleep 10;

                        # And the Blocked Tasks;
                        echo w > /proc/sysrq-trigger;
                        sleep 2;

                        echo 1 > /proc/sysrq-trigger;

                        kill -s term %$jobid
                fi
        fi
        echo 0 > /proc/sys/kernel/sysrq
    fi
}


#
# save_sysfs_info
#
# args:
# $1 - sysfs dir to save
# $2 - base output directory to copy info to
#
save_sysfs_info () {
    if [ -d $1 ]; then
        for i in $( ls $1 ); do
            tmp_dir=$2/$i
            $MKDIR -p $tmp_dir
            for j in $( ls $1/$i ); do
                if [ $j = uevent ] || [ $j = device ]; then
                    continue
                fi
                if [ -f $1/$i/$j ] && [ -r $1/$i/$j ]; then
                    $CP $1/$i/$j $tmp_dir 2>&1
                fi
            done
        done
    fi
    return 0
}

#
# lvm_info:
#           Collects lvm related information.
#           Outputs of commands - lvdisplay, vgdisplay,
#           pvdisplay are collected into base directory
#           as seperate files.
#
# args:
#      no args required
#
#
lvm_info () {
        exec_cmd "lvdisplay -v"  "$outdir/lvdisplay" "lvdisplay"   &
        exec_cmd "vgdisplay -v" "$outdir/vgdisplay" "vgdisplay"   &
        exec_cmd "pvdisplay -v" "$outdir/pvdisplay" "pvdisplay"   &
    exec_cmd "lvm dumpconfig" "$outdir/lvm_dumpconfig" "lvm_dumpconfig"  &
}

#
# iSCSI_HBA_info:
#                 Collects iSCSI HBA related information.
#                 Information includes qla4xxx driver info,HBA info,
#                 qisioctl driver info, iqlremote info, iscli info
#                 and qlogic logs.
#
iSCSI_HBA_info(){

   printf "Gathering iSCSI HBA information...\n"

   # Check for qlogic in general
   #
   if [ -d /sys/bus/pci/drivers/qla4* ]; then
      #
      #         Get info from proc if possible
      #
      if [ -d /proc/scsi/qla4xxx ]; then
         for i in `ls -1 /proc/scsi/qla4xxx` ; do
             exec_cmd "$CP /proc/scsi/qla4xxx/$i $outdir/qla4xxx.$i" "" "$CP /proc/scsi/qla4xxx/$i"   &
         done
      fi

      #
      #         Collect driver information
      #
      exec_cmd "$MODINFO qla4xxx" "$outdir/modinfo_qla4xxx" "$MODINFO qla4xxx" &
      exec_cmd "$MODINFO qisioctl" "$outdir/modinfo_qisioctl" "$MODINFO qisioctl" &
      #
      #         Get info from sysfs if possible
      #
      if [ -d /sys/module/qla4xxx ]; then
          exec_cmd "cpio_sysfs /sys/module/qla4xxx $outdir/sys_module_qla4xxx 2" "" "cpio_sysfs /sys/module/qla4xxx"   &
      fi

      if [ ! -d /opt/QLogic_Corporation/SANsurferiCLI ]; then
          $ECHO "NOTICE: SANsurfer cli not installed in default location" > $outdir/sansurferi.X 2>&1
      else
          # retrieve target info
          exec_cmd "$SANSURFERi -t 0" "$outdir/sansurferi_target_info_0" "$SANSURFERi -t 0"  &
          exec_cmd "$SANSURFERi -t 1" "$outdir/sansurferi_target_info_1" "$SANSURFERi -t 1"  &
          # retrieve host settings
          exec_cmd "$SANSURFERi -c " "$outdir/sansurferi_host_settings"  "$SANSURFERi -c " &
          exec_cmd "$SANSURFERi -i" "$outdir/sansurferi_hba_info"  "$SANSURFERi -i" &
          # retrive version info
          exec_cmd "$SANSURFERi -ver" "$outdir/sansurferi_verion_info"  "$SANSURFERi -ver" &
      fi

      #
      #         Get info from the qlremote agent:
      #
      if [ ! -f $iQLREMOTE ]; then
         $ECHO "NOTICE: iqlremote agent not installed in default location" > $outdir/iqlremote.X 2>&1
      else
         exec_cmd "$iQLREMOTE -v" "$outdir/iqlremote_v"  " $iQLREMOTE -v" &
      fi

      #Collect all the ql-iscsi-install log files in /usr/src/qlogic
      if [ -d /usr/src/qlogic ]; then
           for file in `$LS /usr/src/qlogic`
           do
                $ECHO $file | grep -q ".log";
                LOG_EXISTS=$?
                if [ $LOG_EXISTS -eq 0 ]; then
                     exec_cmd "$CP /usr/src/qlogic/$file $outdir"
                fi
           done
      fi

   else
      $ECHO "NOTICE:qla4xxx driver not loaded" > $outdir/qla4xxx.X 2>&1
   fi

#   printf "...DONE\n"
}



#
# cpio_sysfs
#
# args:
# $1 - sysfs dir to save (no trailing slash)
# $2 - base output directory to copy info to (no trailing slash)
# $3 - maximum depth
#
cpio_sysfs () {
     $MKDIR $2
     #-print0 should come after -maxdepth to avoid warnings
     find $1 -depth -maxdepth $3 -print0 | cpio -0dmaup --no-preserve-owner $2 >& /dev/null
     $MV $2$1/* $2/
     rm -rf $2/sys
     echo "usage of 'cat' command may be necessary in order to view file contents" > $2/README.txt
     return 0
}
#
#    Execute command with proper log messages.
#    Input
#    1) command with all parameters.
#    2) command output file
#    3) message to be logged into log file
#
#    eg. exec_cmd "lvdisplay"  "$outdir/lvdisplay" "lvdisplay command"
#
#    2nd and 3rd input is optional. You can choose not to give log
#    message. For some commands you don't require output file, at
#    that time you can choose not to give o/p file.
#    Here are some examples.
#    exex_cmd "cp /tmp/tp.sh /" "" "Copying tp.sh file"
#    exex_cmd "cp /tmp/tp.sh /"
#

exec_cmd () {
        if [ -z "$2" ] && [ -z "$3" ]; then
                $ECHO "Start : $1" >> $LOGFILE && $1 >> /dev/null 2>>$ERRFILE && $ECHO "End : $1" >> $LOGFILE
        elif [ -z "$2" ]; then
                $ECHO "Start : $3" >> $LOGFILE && $1 >> /dev/null 2>>$ERRFILE && $ECHO "End : $3" >> $LOGFILE
        elif [ -z "$3" ]; then
                $ECHO "Start : $1" >> $LOGFILE && $1 >> $2 2>>$ERRFILE && $ECHO "End : $1" >> $LOGFILE
        else
                $ECHO "Start : $3" >> $LOGFILE && $1 >> $2 2>>$ERRFILE && $ECHO "End : $3" >> $LOGFILE
        fi
}

#
#       Get the latest kernel messages
#       Scheme is as follows:
#       1. Grab up to 2MB of log messages
#
#       This scheme should work for both RHEL and SLES.  This was
#       changed from a simpler scheme of just copying one file because
#       the logs rotate and there's a reasonable chance the interesting
#       messages are not in the latest messages file.  The main reason
#       _not_ to copy all messages file is because of file size (and
#       SLES gzips the files, so there may be a lot of them).
#

get_sys_messages ()
{
    msize=0
    mcount=1
    MaxSize=2048
    for file in `$LS -t /var/log/messages*`
    do
            exec_cmd "$CP $file $outdir"
            #
            # break out if we get 2048k of data
            #
            msize=$(($msize + `$LS -sk $file | $AWK '{print $1}'`))
            if [ "$msize" -gt $MaxSize ]
            then
                    break
            fi
    done
}

###########################################################
# Get the Veritas Storage Foundation related information  #
###########################################################

veritas_info()
{

    # Get the disk related info

    if [ -x $VXDISK ]
    then
      printf "Gathering VSF information..."
      # List the available disks under vx dmp
      echo "$VXDISK list" > $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
      $VXDISK list >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS

      # Display the disk header information along with disk id, host id, etc.
      echo "$VXDISK -s list" >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
      $VXDISK -s list >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS

      # Gather information on each disk
      $VXDISK list >/dev/null 2>>$ERRFILEVERITAS && list=$($VXDISK -q list | cut -d" " -f1)
      echo "$VXDISK list $list" >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
      $VXDISK list $list >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS

      # Check the usability for each disk
      echo "$VXDISK check $list" >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
      $VXDISK check $list >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS

      # Show all associations between disks and disk groups.
      echo "$VXDISK -o alldgs list" >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
      $VXDISK -o alldgs list >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS

      # List the available paths to all disks
      echo "$VXDISK path" >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
      $VXDISK path >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS

          # List veritas naming scheme and os naming scheme together for all the devices.
          echo "$VXDISK -ev list" >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
          $VXDISK -ev list >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS
          echo >> $outdir/Veritas/vxdisk_info 2>>$ERRFILEVERITAS

    fi

    # Get the ASL info
    $LS -lt /etc/vx/lib/discovery.d/*netapp* >> $outdir/Veritas/ASL_info 2>>$ERRFILEVERITAS
    $LS -lt /etc/vx/aslkey.d/*netapp* >> $outdir/Veritas/ASL_info 2>>$ERRFILEVERITAS
    $LS -lt /etc/vx/apmkey.d/32/*netapp* >> $outdir/Veritas/ASL_info 2>>$ERRFILEVERITAS

    #Copy important files
    $CP /etc/vxfentab $outdir/Veritas/vxfentab 2>>$ERRFILEVERITAS
    $CP /etc/vxfendg $outdir/Veritas/vxfendg 2>>$ERRFILEVERITAS
    $CP /etc/vx/dmpevents.log* $outdir/Veritas 2>>$ERRFILEVERITAS
    $CP /etc/vxfenmode $outdir/Veritas/vxfenmode 2>>$ERRFILEVERITAS

    #Print debug logging from the vxfen driver.
    $VXFENDEBUG -p >> $outdir/Veritas/vxfendebug_op 2>>$ERRFILEVERITAS

    #cfscluster_info
    $CFSCLUSTER status >> $outdir/Veritas/cfscluster_info 2>>$ERRFILEVERITAS

    # Now get the process related info

    # Get the veritas processes running
    echo "$PSCMD -elf | $GREP vx" > $outdir/Veritas/vx_proc_info 2>>$ERRFILEVERITAS
    $PSCMD -elf | $GREP vx >> $outdir/Veritas/vx_proc_info 2>>$ERRFILEVERITAS
    echo >> $outdir/Veritas/vx_proc_info 2>>$ERRFILEVERITAS

    # Get List of disk groups
        echo "$VXDG list" > $outdir/Veritas/vxdg_info 2>>$ERRFILEVERITAS
        $VXDG list >> $outdir/Veritas/vxdg_info 2>>$ERRFILEVERITAS
        echo >> $outdir/Veritas/vxdg_info 2>>$ERRFILEVERITAS

          # List disk groups
          $VXDG list >/dev/null 2>>$ERRFILEVERITAS && dgname_list=$($VXDG list | $GREP -v NAME | $AWK '{ print $1 }')
          for i in $dgname_list
          do
            # For each disk group, get statistics
            echo "$VXSTAT -g $i" >> $outdir/Veritas/vxdg_info 2>>$ERRFILEVERITAS
            $VXSTAT -g $i >> $outdir/Veritas/vxdg_info 2>>$ERRFILEVERITAS
            echo >> $outdir/Veritas/vxdg_info 2>>$ERRFILEVERITAS
          done



    # Get device discovery layer information.

    if [ -x $VXDDLADM ]
    then
      # List all the asl library versions for each array supported
      echo "$VXDDLADM listversion" > $outdir/Veritas/vxddladm_info 2>>$ERRFILEVERITAS
      $VXDDLADM listversion >> $outdir/Veritas/vxddladm_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxddladm_info 2>>$ERRFILEVERITAS

      # List libraries and their vendor IDs
      echo "$VXDDLADM listsupport" >> $outdir/Veritas/vxddladm_info 2>>$ERRFILEVERITAS
      $VXDDLADM listsupport >> $outdir/Veritas/vxddladm_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxddladm_info 2>>$ERRFILEVERITAS

      # Get the NETAP library supported array type, array name, etc.
      $VXDDLADM listsupport >/dev/null 2>>$ERRFILEVERITAS && lib_list=$($VXDDLADM listsupport all | $GREP ^l | $GREP netapp | $AWK '{ print $1 }')
      echo "$VXDDLADM listsupport libname=$lib_list" >> $outdir/Veritas/vxddladm_info 2>>$ERRFILEVERITAS
      $VXDDLADM listsupport libname=$lib_list >> $outdir/Veritas/vxddladm_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxddladm_info 2>>$ERRFILEVERITAS

      # Lists informtion on disk arrays which are excluded from device discovery
      echo "$VXDDLADM listexclude" >> $outdir/Veritas/vxddladm_info 2>>$ERRFILEVERITAS
      $VXDDLADM listexclude >> $outdir/Veritas/vxddladm_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxddladm_info 2>>$ERRFILEVERITAS
    fi


    # Collect multipathing administration information

    if [ -x $VXDMPADM ]
    then
      # List all array policy modules supported
      echo "$VXDMPADM listapm all" > $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
      $VXDMPADM listapm all >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS

          # Shows the default and current settings for dmp daemon
          echo "$VXDMPADM gettune all" > $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
          $VXDMPADM gettune all >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
          echo >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS

      # List the enclosures connected to this host
      echo "$VXDMPADM listenclosure all" >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
      $VXDMPADM listenclosure all >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS

      # List the names of storage controllers connected to the host
      echo "$VXDMPADM listctlr all" >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
      $VXDMPADM listctlr all >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS

      # List the path information for each storage controller
      $VXDMPADM listctlr all >/dev/null 2>>$ERRFILEVERITAS && ctlr_list=$($VXDMPADM listctlr all | $GREP ^c | $AWK '{ print $1 }')
      for i in $ctlr_list
      do
        # For each controller, get subpaths
        echo "$VXDMPADM getsubpaths ctlr=$i" >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
        $VXDMPADM getsubpaths ctlr=$i >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
        echo >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
      done

          # List the names of dmpnode
          echo "$VXDMPADM list dmpnode" >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
          $VXDMPADM list dmpnode >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
          echo >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS

     # List the information of dmpnode
          $VXDMPADM list dmpnode >/dev/null 2>>$ERRFILEVERITAS && dmpnode_list=$($VXDMPADM list dmpnode | $GREP dmpdev | $AWK '{ print $3 }')
          for i in $dmpnode_list
          do
            # For each dmpnode, get information
            echo "$VXDMPADM list dmpnode dmpnodename=$i" >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
         $VXDMPADM list dmpnode dmpnodename=$i >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
            echo >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
          done


      # Get the dmpnodenames for each enclosure and get the subpath information
      $VXDMPADM listenclosure all >/dev/null 2>>$ERRFILEVERITAS && enclr_list=$($VXDMPADM listenclosure all | $GREP ^F | grep -v DIS | $AWK '{ print $1 }')
      for i in $enclr_list
      do
        echo "For enclosure $i:" >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
        $VXDMPADM getdmpnode enclosure=$i >/dev/null 2>>$ERRFILEVERITAS && dmpnode_list=$($VXDMPADM getdmpnode enclosure=$i | $GREP ^F | $AWK '{ print $1 }')
        for j in $dmpnode_list
        do
          echo "$VXDMPADM getsubpaths dmpnodename=$j" >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
          $VXDMPADM getsubpaths dmpnodename=$j >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
          echo >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
        done
      done

      # For each enclosure in the list, get IO policy
      for i in $enclr_list
      do
        echo "$VXDMPADM getattr enclosure $i iopolicy" >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
        $VXDMPADM getattr enclosure $i iopolicy >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
        echo >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
      done

          # For each enclosure in the list, get recovery opion
          for i in $enclr_list
          do
        echo "$VXDMPADM getattr enclosure $i recoveryoption" >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
            $VXDMPADM getattr enclosure $i recoveryoption >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
        echo >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
          done


      # Get the restore interval daemon information
      echo "$VXDMPADM stat restored" >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
      $VXDMPADM stat restored >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdmpadm_info 2>>$ERRFILEVERITAS
    fi

    # List the contents of /dev/vx/dmp directory
    if [ -d $VXDMP_DEVS ]
    then
      echo "$LS -l $VXDMP_DEVS" > $outdir/Veritas/vxdmpdevs 2>>$ERRFILEVERITAS
      $LS -l $VXDMP_DEVS >> $outdir/Veritas/vxdmpdevs 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdmpdevs 2>>$ERRFILEVERITAS
    fi

    # Get the vx config daemon information
    if [ -x $VXDCTL ]
    then
      # Get the vxconfig daemon mode of operation
      echo "$VXDCTL mode" > $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS
      $VXDCTL mode >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS

      # Clustered or not, if yes, which one is active
      echo "$VXDCTL -c mode" >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS
      $VXDCTL -c mode >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS

      # Get the support information of vxconfig daemon
      echo "$VXDCTL support" >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS
      $VXDCTL support >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS

      # Get the lincense information
      echo "$VXDCTL license" >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS
          $VXDCTL license >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS
          echo >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS


      # List information on vxconfig daemon
      echo "$VXDCTL list" >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS
      $VXDCTL list >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxdctl_info 2>>$ERRFILEVERITAS
    fi

    # Collect the installed licenses
    if [ -x $VXLICREP ]
    then
      echo "$VXLICREP" > $outdir/Veritas/vxlicrep_info 2>>$ERRFILEVERITAS
      $VXLICREP >> $outdir/Veritas/vxlicrep_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxlicrep_info 2>>$ERRFILEVERITAS
    fi

    # Collect the records from veritas volume manager configuration
    if [ -x $VXPRINT ]
    then
      echo "$VXPRINT" > $outdir/Veritas/vxprint_info 2>>$ERRFILEVERITAS
      $VXPRINT >> $outdir/Veritas/vxprint_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxprint_info 2>>$ERRFILEVERITAS

      # Collect detailed hierarchical information on dg and vg
      echo "$VXPRINT -htv" >> $outdir/Veritas/vxprint_info 2>>$ERRFILEVERITAS
      $VXPRINT -htv >> $outdir/Veritas/vxprint_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxprint_info 2>>$ERRFILEVERITAS

      # Display all information from each selected record.
      echo "$VXPRINT -l" >> $outdir/Veritas/vxprint_info 2>>$ERRFILEVERITAS
      $VXPRINT -l >> $outdir/Veritas/vxprint_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vxprint_info 2>>$ERRFILEVERITAS
    fi

    # Collect the cluster information
    if [ -x $VXCLUSTADM ]
    then
      # List mapping of node ids bw cluster monitor and cluster support-subsystem
      echo "$VXCLUSTADM nidmap" > $outdir/Veritas/vxclustadm_info 2>>$ERRFILEVERITAS
      $VXCLUSTADM nidmap >> $outdir/Veritas/vxclustadm_info 2>>$ERRFILEVERITAS
      echo  >> $outdir/Veritas/vxclustadm_info 2>>$ERRFILEVERITAS

      # Collect the state of a node in the cluster
      echo "$VXCLUSTADM -v nodestate" >> $outdir/Veritas/vxclustadm_info 2>>$ERRFILEVERITAS
      $VXCLUSTADM -v nodestate >> $outdir/Veritas/vxclustadm_info 2>>$ERRFILEVERITAS
      echo  >> $outdir/Veritas/vxclustadm_info 2>>$ERRFILEVERITAS
    fi

    # IO fencing administration information
    if [ -x $VXFENADM ]
    then
      # Copy the vxfen file
      $CP /etc/vxfen $outdir/Veritas/. 2>>$ERRFILEVERITAS
      #Collect the keys registered on all disks listed in disk_filename
      echo "$VXFENADM -g all -f /etc/vxfentab" > $outdir/Veritas/vxfenadm_info 2>>$ERRFILEVERITAS
      $VXFENADM -g all -f /etc/vxfentab >> $outdir/Veritas/vxfenadm_info 2>>$ERRFILEVERITAS
      echo  >> $outdir/Veritas/vxfenadm_info 2>>$ERRFILEVERITAS
      $VXFENADM -d >> $outdir/Veritas/vxfenadm_info 2>>$ERRFILEVERITAS
    fi

    #
    #  Collect Veritas VCS Info
    #
    # Check for installed veritas rpms
    $RPM -qa | grep VRTS >>$outdir/Veritas/vrts_rpms 2>>$ERRFILEVERITAS
    vcs_installed=$?

    if [ $vcs_installed -eq 0 ]
    then
      # Copy the conf files
      $CP -p /etc/llthosts $outdir/Veritas/vcs_llthosts 2>/dev/null
      $CP -p /etc/llttab $outdir/Veritas/vcs_llttab 2>/dev/null
      $CP -p /etc/gabtab $outdir/Veritas/vcs_gabtab 2>/dev/null
      $CP -p /etc/VRTSvcs/conf/config/main.cf $outdir/Veritas/vcs_main.cf 2>>$ERRFILEVERITAS
      $CP -p /etc/VRTSvcs/conf/config/types.cf $outdir/Veritas/vcs_types.cf 2>>$ERRFILEVERITAS
      $MKDIR $outdir/Veritas/vcs_logs 2>>$ERRFILEVERITAS
      $CP -R /var/VRTSvcs/log/* $outdir/Veritas/vcs_logs/.

      # Collect the llt process information
      echo "$PSCMD -elf | $GREP llt" > $outdir/Veritas/vcs_proc_info 2>>$ERRFILEVERITAS
      $PSCMD -elf | $GREP llt >> $outdir/Veritas/vcs_proc_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vcs_proc_info 2>>$ERRFILEVERITAS

      # Collect the VRTSvcs processes
      echo "$PSCMD -elf | $GREP VRTSvcs" >> $outdir/Veritas/vcs_proc_info 2>>$ERRFILEVERITAS
      $PSCMD -elf | $GREP VRTSvcs >> $outdir/Veritas/vcs_proc_info 2>>$ERRFILEVERITAS
      echo >> $outdir/Veritas/vcs_proc_info 2>>$ERRFILEVERITAS

      # Collect the llt configuration information
      if [ -x $LLTCONFIG ]
      then
        echo "$LLTCONFIG" > $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
        $LLTCONFIG >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
        echo >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
            echo "$LLTCONFIG -a list" > $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
            $LLTCONFIG -a list >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
            echo >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
      fi

      # Collect the lltstat information
      if [ -x $LLTSTAT ]
      then
        # Collect the information of cluster nodes
        echo "$LLTSTAT -n" >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
        $LLTSTAT -n >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
        echo >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS

        # Very verbose output of lltstat -n
        echo "$LLTSTAT -nvv" >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
        $LLTSTAT -nvv >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
        echo >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS

        # Collect the current status of the ports in use.
        echo "$LLTSTAT -p" >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
        $LLTSTAT -p >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
        echo >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
      fi

      # Collect GAB driver port memberships.
      if [ -x $GABCONFIG ]
      then
        echo "$GABCONFIG -a" >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
        $GABCONFIG -a >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
        echo >> $outdir/Veritas/vcs_llt_gab_info 2>>$ERRFILEVERITAS
      fi

      # Collect summary of vcs cluster information
      if [ -x $HASTATUS ]
      then
        echo "$HASTATUS -sum" > $outdir/Veritas/vcs_ha_info 2>>$ERRFILEVERITAS
            $HASTATUS -sum >> $outdir/Veritas/vcs_ha_info 2>>$ERRFILEVERITAS
        echo >> $outdir/Veritas/vcs_ha_info 2>>$ERRFILEVERITAS
#            echo "$HASTATUS" >> $outdir/Veritas/vcs_ha_info 2>>$ERRFILEVERITAS
#            $HASTATUS >> $outdir/Veritas/vcs_ha_info 2>>$ERRFILEVERITAS
            echo >> $outdir/Veritas/vcs_ha_info 2>>$ERRFILEVERITAS
      fi

      # Collect attribute names and values for all systems.
      if [ -x $HASYS ]
      then
        echo "$HASYS -display" >> $outdir/Veritas/vcs_ha_info 2>>$ERRFILEVERITAS
        $HASYS -display >> $outdir/Veritas/vcs_ha_info 2>>$ERRFILEVERITAS
            echo >> $outdir/Veritas/vcs_ha_info 2>>$ERRFILEVERITAS
      fi
    fi

    if [ -x $VXDISK ]
    then
        printf "...DONE\n"
    fi
}

# process the first arguement
# at least one parameter from {fcp|isci|all} is required
case "$1" in
    fcp)    FCPFLAG=1
        shift;;
    iscsi)    ISCSIFLAG=1
        shift;;
    all)    ISCSIFLAG=1
        FCPFLAG=1
        shift;;
    *)    $ECHO $USAGE
        $ECHO $HELP
                exit 1;;
esac

# process remaining options
while getopts d:n:f opt
do
        case $opt in
        d)      directory=$OPTARG;;
    f)    FFLAG=1;;
        n)      name=$OPTARG;;
        \?)     $ECHO $USAGE
        $ECHO $HELP
                exit 1;;
        esac
done

outdir=$directory/netapp_linux_$name
outfile=$directory/netapp_linux_$name.tar
final_file=$outfile.gz

ME=`$WHOAMI`
if [ "$ME" != "root" ]; then
    $ECHO "You must be root to run this script \(current user: $ME\)"
    exit 1
fi

if [ -f $directory ] ; then
    $ECHO "Argument to -d option, $directory, exists as a file."
    $ECHO "Please select a different directory or delete the file, then re-run this script"
    exit 1
fi
# make sure the directory exists; re-use it if it's already there
if [ ! -d $directory ] ; then
    $MKDIR -p $directory
fi

if [ $FFLAG -eq 0 ]; then
   if [ -d $outdir -o -f $outdir ]; then
      $ECHO "$outdir already exists; please delete it or specify a different name from \"$name\""
      exit 1
   fi

   if [ -f $outfile ]; then
      $ECHO "$outfile already exists; please delete it or specify a different name from \"$name\""
      exit 1
   fi

   if [ -f $final_file ]; then
      $ECHO "$final_file already exists; please delete it or specify a different name from \"$name\""
      exit 1
   fi
else
   $RM -rf $outdir
   $RM -f $final_file
fi

printf "Gathering RPM information...\n"
$MKDIR -m 777 $outdir
$MKDIR -m 777 $outdir/Veritas

LOGFILE=$outdir/log_linux_info
ERRFILE=$outdir/err_linux_info
ERRFILEVERITAS=$outdir/Veritas/err_veritas_info
$ECHO "linux_info log file" > $LOGFILE
$ECHO "linux_info error file" > $ERRFILE
$ECHO "veritas_info error file" > $ERRFILEVERITAS

# Collect _BRAND_SHORT_STRING_ package information
#$RPM -qa | grep $SAN_UTIL_RPM > $outdir\$SAN_UTIL_RPM.rpminfo
exec_cmd "$RPM -qa" "$outdir/packages" "rpm -qa"   &

# Collect status and runlevel information for system services
exec_cmd "$SERVICE --status-all" "$outdir/services" "$SERVICE -status-all"   &
exec_cmd "$CHKCONFIG --list" "$outdir/chkconfig-list" "$CHKCONFIG --list"   &
exec_cmd "$CHKCONFIG --list" "$outdir/chkconfig-list" "$CHKCONFIG --list"   &

#printf "...DONE\n"

#
#    Get the version info for the kit
#
exec_cmd "$SAN_UTIL_DIR/san_version -v" "$outdir/san_version" " san_version -v"   &

#
#    Double check the version in the sanlun binary
#
exec_cmd "$SANLUN version" "$outdir/sanlun_version" " san_version"   &

printf "Gathering general Linux information...\n"
#
#     Get config files from /etc
#
# Collect boot messages
        exec_cmd "dmesg"  "$outdir/dmesg" &

exec_cmd "$CP $FSTAB  $outdir/fstab"
# 2.4 kernels
if [ -f $MCONF ]; then
   exec_cmd "$CP $MCONF  $outdir/modules.conf" &
fi
# 2.6 kernels
if [ -f $MCONF2 ]; then
    exec_cmd "$CP $MCONF2  $outdir/modprobe.conf" &
fi
if [ -f $MCONF3 ]; then
    exec_cmd "$CP $MCONF3  $outdir/modprobe.conf.local" &
fi

#
#    Get the partition and filesystem information
#
exec_cmd "$FDISK -l"    "$outdir/fdisk_l" "$FDISK -l"   &
exec_cmd "$MOUNT"     "$outdir/mount" "$MOUNT"   &
exec_cmd "$CAT /proc/partitions" "$outdir/proc.partitions" "$CAT /proc/partitions"   &
exec_cmd "$DF -h" "$outdir/df_h" "$DF -h"  &

#
#    Get the current scsi mid layer view of the world
#
exec_cmd "$CAT /proc/scsi/scsi" "$outdir/proc.scsi.scsi" "$CAT /proc/scsi/scsi"  &

#
# Get raw and SCSI disk device info
#
exec_cmd "raw -qa" "$outdir/raw_qa" "raw -qa" &
exec_cmd "ls -l /dev/sd*" "$outdir/dev_sd" "ls -l /dev/sd*"   &

exec_cmd "get_sys_messages" &

#
#    Collect OS version and uptime
#

exec_cmd "$CP /etc/selinux/config $outdir/selinux_config" &
$SELINUXENABLED 2>>$ERRFILE ; echo $? >> $outdir/selinuxenabled &
exec_cmd "$UNAME -a" "$outdir/uname_a" " $UNAME -a"   &
exec_cmd "$CP /etc/issue.net $outdir/issue.net" &
exec_cmd "$UPTIME" "$outdir/uptime" "$UPTIME"   &
exec_cmd "$LSBRLSE -a" "$outdir/release" "$LSBRLSE"   &
if [ -f /etc/redhat-release ]; then
    exec_cmd "$CP /etc/redhat-release $outdir/redhat-release" "" " $CP /etc/redhat-release"   &
fi
if [ -f /etc/UnitedLinux-release ]; then
    exec_cmd "$CP /etc/UnitedLinux-release $outdir/UnitedLinux-release" "" " $CP /etc/UnitedLinux-release"   &
fi
if [ -f /etc/SuSE-release ]; then
    exec_cmd "$CP /etc/SuSE-release $outdir/SuSE-release" "" " $CP /etc/SuSE-releas"   &
fi

#
#    Get the full hardware configuration of the system
#
$ECHO "lspci basic info\n===================="        >  $outdir/lspci 2>&1
exec_cmd "$LSPCI"    "$outdir/lspci" " $LSPCI"   &
$ECHO "\n\nlspci verbose info\n===================="    >> $outdir/lspci 2>&1
exec_cmd "$LSPCI -v"    "$outdir/lspci" " $LSPCI -v"   &

exec_cmd "$CAT /proc/cpuinfo" "$outdir/proc.cpuinfo" &
exec_cmd "$CAT /proc/meminfo" "$outdir/proc.meminfo"  &

#
# Collect cpu,vm,io load statastics
#
exec_cmd "$VMSTAT -a" "$outdir/vmstat"  &
exec_cmd "$IOSTAT 2 3" "$outdir/iostat"  &
exec_cmd "$CAT /proc/loadavg" "$outdir/proc.loadavg" &

#
# Get current process and open file information
#
exec_cmd "$PSCMD -efl" "$outdir/ps_efl" " $PSCMD -efl"   &
if [ "`grep -i suse /etc/issue.net`" ]; then
    exec_cmd "$LSOF_SUSE" "$outdir/lsof" "$LSOF_SUSE"   &
elif [ "`grep -i \"Red Hat\" /etc/issue.net`" ]; then
    exec_cmd "$LSOF_REDHAT" "$outdir/lsof" "$LSOF_REDHAT"   &
else
    exec_cmd "$LSOF_REDHAT" "$outdir/lsof" "$LSOF_REDHAT"   &
fi

#
#    Get the kernel boot parameters and modules info
#
exec_cmd "$CAT /proc/cmdline" "$outdir/proc.cmdline" "$CAT /proc/cmdline"   &
exec_cmd "$SYSCTL -a"    "$outdir/sysctl_a" "$SYSCTL -a"   &
exec_cmd "$LSMOD" "$outdir/lsmod" "$LSMOD"   &
#printf "...DONE\n"

# Call lvm_info to collect lvm related info
     exec_cmd "lvm_info" &

#
#    Get the info from the sanlun utility:
#
      printf "Collecting sanlun information....\n"
      exec_cmd "$SANLUN lun show -v all" "$outdir/luns" " lun show -v all "   &
      exec_cmd "$SANLUN lun show -pv all" "$outdir/luns_pv" " lun show -pv "   &
      exec_cmd "$SANLUN lun show -pm" "$outdir/luns_pm" " lun show -pm "   &

#
# ----- FCP information section -----
#    Get data that pertains to FCP
#
if [ $FCPFLAG -eq 1 ]; then
   printf "Gathering FCP information...\n"

   # Check for qlogic in general
   #
   if [ -d /sys/bus/pci/drivers/qla2* ]; then
      #
      #        Get info from proc if possible
      #
      if [ -d /proc/scsi/qla2xxx ]; then
         for i in `ls -1 /proc/scsi/qla2xxx | grep -v HbaApiNode`; do
             exec_cmd "$CP /proc/scsi/qla2xxx/$i $outdir/qla2xxx.$i" "" "$CP /proc/scsi/qla2xxx/$i"   &
         done
      fi

      #
      #        Get info from sysfs if possible
      #
      if [ -d /sys/module/qla2xxx ]; then
          exec_cmd "cpio_sysfs /sys/module/qla2xxx $outdir/sys_module_qla2xxx 2" "" "cpio_sysfs /sys/module/qla2xxx"   &
      fi

      if [ ! -d /opt/QLogic_Corporation/SANsurferCLI ]; then
      $ECHO "NOTICE: SANsurfer cli not installed in default location" > $outdir/sansurfer.X 2>&1
      else
      # retrieve target info
        exec_cmd "$SANSURFER -t" "$outdir/sansurfer_target_info" "$SANSURFER -t"  &
      # retrieve host settings
      exec_cmd "$SANSURFER -c all" "$outdir/sansurfer_host_settings"  "$SANSURFER -c all" &
      exec_cmd "$SANSURFER -i all" "$outdir/sansurfer_hba_info"  "$SANSURFER -i all" &
      fi

      #
      #        Get info from the qlremote agent:
      #
      if [ ! -f $QLREMOTE ]; then
         $ECHO "NOTICE: qlremote agent not installed in default location" > $outdir/qlremote.X 2>&1
      else
         exec_cmd "$QLREMOTE -v" "$outdir/qlremote_v"  " $QLREMOTE -v" &
      fi

      #Collect all the qlinstall log files in /usr/src/qlogic
      if [ -d /usr/src/qlogic ]; then
           for file in `$LS /usr/src/qlogic`
           do
                $ECHO $file | grep -q ".log";
                LOG_EXISTS=$?
                if [ $LOG_EXISTS -eq 0 ]; then
                 exec_cmd "$CP /usr/src/qlogic/$file $outdir"
                fi
           done
      fi

   else
      $ECHO "NOTICE:qla2xxx driver not loaded" > $outdir/qla2xxx.X 2>&1
   fi

   #
   # Collect Emulex related info
   #
   if [ -d /sys/bus/pci/drivers/lpfc ]; then
   #
   #  Get info from sys directories
   #
        ls -l -d /sys/bus/pci/drivers/lpfc/*/host* > /dev/null 2>&1
        if [ $? -eq 0 ]; then
          for i in `ls -1 -d /sys/bus/pci/drivers/lpfc/*/host* | sed -e "s/.*host//"`; do
              exec_cmd "cpio_sysfs /sys/class/scsi_host/host$i $outdir/sys_class_lpfc_host$i 1" "" " cpio_sysfs /sys/class/scsi_host/host$i 1"   &
         done
        fi

        #Collect Emulex utilities install log
        if [ -f /usr/src/lpfcdfc/utils-install.log ]; then
              exec_cmd "$CP /usr/src/lpfcdfc/utils-install.log $outdir"
        fi

        if [ ! -f $HBACMD ]; then
             $ECHO "NOTICE: hbacmd not installed in default location" > $outdir/hbacmd.X 2>&1
        else
             #Collect hbacmd info of the Emulex adapter
             #Currently only "ListHBAs" info is collected
             exec_cmd "$HBACMD ListHBAs" "$outdir/hbacmd_ListHBAs" "ListHBAs"   &
        fi

   else
       $ECHO "NOTICE:lpfc driver not loaded" > $outdir/lpfc.X 2>&1
   fi
   #
   #    Get the info from the sanlun utility:
   #
   if [ -d /proc/scsi/qla2xxx -o -d /sys/bus/pci/drivers/lpfc ];then
      exec_cmd "$SANLUN fcp show adapter -v all" "$outdir/adapters" "show adapter -v all"   &
   fi

#   printf "...DONE\n"
fi

#
# ----- iSCSI information section -----
#    Get data that pertains to iSCSI
#
if [ $ISCSIFLAG -eq 1 ]; then

   #Collect iSCSI HBA related information
   iSCSI_HBA_info &

   # make sure the directory exists; re-use it if it's already there
   if [ ! -d $outdir/iscsi ] ; then
      exec_cmd "$MKDIR -p $outdir/iscsi" "" "created iscsi directory"
   fi
   #
   # Get general TCP/IP info: netstat -an, netstat -rn, ifconfig -a
   # and ifcfg-* files
   #
   printf "Gathering iSCSI networking information...\n"
   exec_cmd "netstat -an" "$outdir/iscsi/netstat_an"  &
   exec_cmd "netstat -rn"  "$outdir/iscsi/netstat_rn" &
   exec_cmd "ifconfig -a"  "$outdir/iscsi/ifconfig_a"  &

   if [ -d /etc/sysconfig/network-scripts ]; then
        exec_cmd "$CP /etc/sysconfig/network-scripts/ifcfg-* $outdir/iscsi" "" "$CP ifcfg-*"   &
   fi

   if [ -d /etc/sysconfig/network ]; then
        exec_cmd "$CP /etc/sysconfig/network/ifcfg-* $outdir/iscsi" "" "$CP ifcfg-*"   &
   fi

#   printf "...DONE\n"

   #
   # Get specific iscsi information
   #
   printf "Gathering iSCSI configuration information...\n"
   if [ -f /sbin/iscsiadm ]; then
        exec_cmd "/sbin/iscsiadm -m session -P3" "$outdir/iscsi/iscsiadm-P3" "/sbin/iscsiadm -m session -P3"   &
        exec_cmd "/sbin/iscsiadm -m session -i" "$outdir/iscsi/iscsiadm-i" "/sbin/iscsiadm -m session -i"   &
   fi

   if [ -f /var/log/iscsi.log ]; then
       exec_cmd "$CP /var/log/iscsi.log $outdir/iscsi" "" "$CP /var/log/iscsi.log"   &
   fi
   if [ -d /var/lib/open-iscsi ]; then
       exec_cmd "$CP -R /var/lib/open-iscsi/ $outdir/iscsi" "" "$CP -R /var/lib/open-iscsi/"   &
   fi
   if  [ -d /var/lib/iscsi ]; then
    exec_cmd "$CP -R /var/lib/iscsi/ $outdir/iscsi" "" "$CP -R /var/lib/iscsi/"   &
   fi
   if [ -f /usr/sbin/iscsi-ls ]; then
      exec_cmd "/usr/sbin/iscsi-ls -l" "$outdir/iscsi/iscsi-ls_l" "/usr/sbin/iscsi-ls -l"   &
      exec_cmd "/usr/sbin/iscsi-ls -c" "$outdir/iscsi/iscsi-ls_c" "/usr/sbin/iscsi-ls -c"   &
      exec_cmd "/usr/sbin/iscsi-ls" "$outdir/iscsi/iscsi-ls" "/usr/sbin/iscsi-ls"   &
   elif [ -f /sbin/iscsi-ls ]; then
      exec_cmd "/sbin/iscsi-ls -l" "$outdir/iscsi/iscsi-ls_l" "/sbin/iscsi-ls -l"   &
      exec_cmd "/sbin/iscsi-ls -c" "$outdir/iscsi/iscsi-ls_c" "/sbin/iscsi-ls -c"   &
      exec_cmd "/sbin/iscsi-ls" "$outdir/iscsi/iscsi-ls" "/sbin/iscsi-ls"   &
   elif [ -f /usr/local/sbin/iscsi-ls ]; then
      exec_cmd "/usr/local/sbin/iscsi-ls -l" "$outdir/iscsi/iscsi-ls_l" "/usr/local/sbin/iscsi-ls -l"   &
      exec_cmd "/usr/local/sbin/iscsi-ls -c" "$outdir/iscsi/iscsi-ls_c" "/usr/local/sbin/iscsi-ls -c"   &
      exec_cmd "/usr/local/sbin/iscsi-ls" "$outdir/iscsi/iscsi-ls" "/usr/local/sbin/iscsi-ls"   &
   fi
   if [ -d /proc/scsi/iscsi ]; then
      exec_cmd "$CAT /proc/scsi/iscsi/*" "$outdir/iscsi/proc_scsi_iscsi" "$CAT /proc/scsi/iscsi/*"   &
   fi
   if [ -f /etc/iscsi.conf ]; then
      exec_cmd "$CP /etc/iscsi.conf $outdir/iscsi/iscsi.conf" ""  " $CP /etc/iscsi.conf"   &
   elif [ -f /etc/iscsid.conf ]; then
      exec_cmd "$CP /etc/iscsid.conf $outdir/iscsi/iscsid.conf" "" "$CP /etc/iscsid.conf"   &
   fi
   if [ -f /etc/initiatorname.iscsi ]; then
      exec_cmd "$CP /etc/initiatorname.iscsi $outdir/iscsi/initiatorname.iscsi" "" "$CP /etc/initiatorname.iscsi"   &
   fi
   if [ -f /etc/fstab.iscsi ]; then
      exec_cmd "$CP /etc/fstab.iscsi $outdir/iscsi/fstab.iscsi" "" "$CP /etc/fstab.iscsi"   &
   fi
   if [ -d /etc/iscsi ]; then
      exec_cmd "$CP -R /etc/iscsi/* $outdir/iscsi" "" "$CP -R /etc/iscsi/*"   &
   fi
   #
   # For 3-4 linux-iscsi versions, grab /dev/iscsi/... symlinks
   #
   if [ -d /dev/iscsi ]; then
      exec_cmd "ls -lR /dev/iscsi" "$outdir/iscsi/dev_iscsi_ls_lR" "ls -lR /dev/iscsi"   &
   elif [ -d /dev/disk/by-id ]; then
      #
      # For SLES9, get device persistency links
      #
      if [ "`grep -i suse /etc/issue.net`" ]; then
         exec_cmd "ls -l /dev/disk/by-id/iscsi*" "$outdir/iscsi/dev_disk_by-id_symlinks" &
      fi
   fi

   #
   # Open-iscsi (sles10, etc)
   #
   exec_cmd "save_sysfs_info /sys/class/iscsi_connection \
                   $outdir/iscsi/sys_class_iscsi_connection" "" "save_sysfs_info /sys/class/iscsi_connection" &
   exec_cmd "save_sysfs_info /sys/class/iscsi_session \
                   $outdir/iscsi/sys_class_iscsi_session" "" "save_sysfs_info /sys/class/iscsi_session" &
   exec_cmd "save_sysfs_info /sys/class/iscsi_host \
                   $outdir/iscsi/sys_class_iscsi_host" "" "save_sysfs_info /sys/class/iscsi_host" &
   exec_cmd "save_sysfs_info /sys/class/iscsi_transport \
                   $outdir/iscsi/sys_class_iscsi_transport" "" "save_sysfs_info /sys/class/iscsi_transport" &

   #
   # For RHEL4 and other 2.6 versions that use sysfs, grab sysfs stuff
   #
   if [ -d /sys/class/scsi_host ]; then
       for i in $( ls /sys/class/scsi_host ); do
           if [ "`grep -i iscsi /sys/class/scsi_host/$i/proc_name`" ]; then
               tmp_dir=$outdir/iscsi/sys_class_scsi_host/$i
               exec_cmd "$MKDIR -p $tmp_dir"
               for j in $( ls /sys/class/scsi_host/$i ); do
                   #
                   # Skip open-iscsi read-only attributes (not sure why
                   # bash '-r' test passes while cp fails)
                   #
                   if [ $j = uevent ] || [ $j = scan ] || [ $j = device ]; then
                       continue
                   fi
                   #
                   # Skip RHEL4 (linux-iscsi) read-only attributes (not
                   # sure why bash '-r' test passes while cp fails)
                   #
                   if [ $j = shutdown ] || [ $j = drop_session ]; then
                       continue
                   fi
                   #
                   # Skip SLES9 (linux-iscsi) read-only attributes (not
                   # sure why bash '-r' test passes while cp fails)
                   #
                   if [ $j = log ] || [ $j = failover ]; then
                       continue
                   fi
                   if [ -r /sys/class/scsi_host/$i/$j ]; then
                       exec_cmd "$CP -R /sys/class/scsi_host/$i/$j $tmp_dir" &
                   fi
               done
           fi
       done
   fi

   if [ -f /var/lib/iscsi/bindings ]; then
     exec_cmd "$CP /var/lib/iscsi/bindings $outdir/iscsi/bindings" "" " $CP /var/lib/iscsi/bindings"   &
   fi
#   printf "...DONE\n"

fi

#
#    Device mapper multipathing (dm-multipath)
#
# RHEL4 U3
# make sure the directory exists; re-use it if it's already there
printf "Gathering dm-multipath information...\n"
if [ ! -d $outdir/dm-multipath ] ; then
   exec_cmd "$MKDIR -p $outdir/dm-multipath" "" "Created multipath directory"
fi
if [ -f /etc/multipath.conf ]; then
   exec_cmd "$CP /etc/multipath.conf $outdir/dm-multipath/multipath.conf" "" "$CP /etc/multipath.conf"   &
fi
if [ -f /var/lib/multipath/bindings ]; then
   exec_cmd "$CP /var/lib/multipath/bindings $outdir/dm-multipath/bindings" "" "$CP /var/lib/multipath/bindings"   &
fi
#
# Unfortunately we can't run "multipath -l" unless we want to risk it hanging if a path
# is down (not unlikely if there's a support case).  Just dump kernel table, which seems
# to be non-blocking in the case of path failure.
#
if [ -f $DMSETUP ]; then
   exec_cmd "$DMSETUP table --verbose 99" "$outdir/dm-multipath/dm_setup_table" "$DMSETUP table"   &
   exec_cmd "$DMSETUP status --verbose 99" "$outdir/dm-multipath/dm_status_target_multipath" "$DMSETUP status"   &
fi
if [ -f $MULTIPATH ]; then
   exec_cmd "$MULTIPATH -l -v3 -d" "$outdir/dm-multipath/multipath_v3" "$MULTIPATH -l -v3 -d"   &
fi
# RHEL4
if [ -d /dev/mpath/ ]; then
   exec_cmd "ls -lR /dev/mpath" "$outdir/dm-multipath/dev_mpath_ls" "ls -lR /dev/mpath"   &
elif [ -d /dev/disk/by-name ]; then    # SLES9
   exec_cmd "ls -lR /dev/disk/by-name" "$outdir/dm-multipath/dev_mpath_ls" "ls -lR /dev/disk/by-name"   &
fi

if [ -f $MULTIPATH ]; then
    exec_cmd "$MULTIPATH -ll" "$outdir/dm-multipath/multipath_ll" "multipath -ll"   &
    exec_cmd "/etc/init.d/multipathd status" "$outdir/dm-multipath/multipathd_status" "multipathd status"   &
fi

# Now collect SysRq - This is commented due to system panic in linux systems interminently..
# printf "Gathering sysrq information ... \n"
# exec_cmd "get_sysrq" &

#Now collect veritas info
printf "Gathering veritas information...\n"
exec_cmd "veritas_info" &

#printf "...DONE\n"

#
#    linux_info will wait for maximum 5 minutes to collect all information.
#    If all processes doesn't get execute in 5 minutes, linux_info will ask
#    user for extending time limit.
#    jobs file will contain all peding jobs. Pending jobs can be because of
#    processes gone into uniteruptible IO wait or any other reason.
#

printf "Waiting for processes to finish up For Max 5 minutes...\n"
pid=$$
count=0
# Total wait time is WaitTime*countTime sec.
# Here total wait time is 300 sec. that is 5 mins.
WaitTime=10
countTime=30
while [ 1 ]
do
    proccount=`ps ax -o ppid,cmd | grep $pid | grep -v grep | wc -l`
    $ECHO " No of processes running $proccount" >> $LOGFILE
    if [ $proccount -le 1 ] || [ $count -ge $countTime ]; then
    Wtime=`expr $count \* $WaitTime`
    $ECHO "Waited for $Wtime second" >> $LOGFILE
    if [ $count -eq $countTime ]; then
        printf "Still some processes are running. Do you want to wait for 5 more minutes? (y/n) : \c"
        read choice
        if [ "$choice" = "n" ]; then
                printf "Stopping linux_info...Please send collected info to Customer Support for analysis."
            break
        else
            count=0
            printf "Waiting for processes to finish up For Max 5 more minutes...\n"
        fi
    else
               printf "Done gathering information.\n"
        break
    fi
    fi
    $ECHO "waiting for $WaitTime sec more as still jobs are running" >> $LOGFILE
    sleep $WaitTime
    count=`expr $count + 1`
done

exec_cmd "jobs" "$outdir/jobs"
exec_cmd "ps -ef" "$outdir/final_process_list"

#
#    Save the runtime params for this invocation of linux_info
#
$ECHO "Run on `date`"            >  $outdir/linux_info.runtime
$ECHO "Command line was:\n\n\t$CMDLINE"    >> $outdir/linux_info.runtime

exec_cmd "$TAR -cf $outfile -C $directory netapp_linux_$name"
exec_cmd "$COMPRESS $outfile"
#
#    Print out what's where, and exit
#
$ECHO "\n\nLINUX system info is in directory $outdir"
$ECHO "\tCompressed file is $final_file"
$ECHO "\tPlease send this file to Customer Support for analysis."
exit 0
