#!/bin/sh
#    sgevt - Handle sg disk events from sgdiskmon 
#    Parameters
#       $1 = event  ("Fail", "Insert") 
#       $2 = disk   (/dev/sdb6)
#       $3 = SCSI target ID 
#       $4 = iteration (only used during Insert)
#
# Changes:
# 11/16/06 ARC: created from mdevt
# 04/13/07 ARC: changed disklist to use /proc/partitions instead of fdisk
#
log=/var/log/sgevents
pdir=/usr/share/scsirastools
alarmcmd=/usr/sbin/ialarms
tmpf=/tmp/sgevt.tmp
# set dosnmptrap to 1 if you want to send snmp traps
dosnmptrap=0
# set snmpipadr to the snmp enterprise server destination
snmpipadr=127.0.0.1
# These sample SNMP Trap OIDs show up as Adaptec SCSI traps (see iommib.mib).
# Use other OIDs if you wish.
trapoid="enterprises.795.12.1.107"
vboid1=".enterprises.795.12.1.9000.9001"
vboid2=".enterprises.795.12.1.9000.9002"
vboid3=".enterprises.795.12.1.9000.9008"
vboid4=".enterprises.795.12.1.9000.9009"
vboid5=".enterprises.795.12.1.9000.9010"
snmphost=`uname -n`

echo "-------------------"  >>$log
echo "sgevt: $* `date`"  |tee -a >>$log
# write the event also to the syslog
logger -i "sgevt: $* `date`"  
dname=$2
tgt=$3
iter=$4
case "$1" in 
#####
##### Fail/Remove a disk/partition, called from sgdiskmon
#####
"Fail")
   # get the disk name from the partition device name
   if [ -d /dev/scsi/host0 ] || [ -d /dev/scsi/host1 ]
   then
        idisk=`echo $dname |sed -e 's/part[0-9]/disc/'`
        disklist=`cat /proc/partitions |awk '{print $4}' |grep disc`
   else
        idisk=`echo $dname |sed -e 's/[0-9]//'`
        disklist=`cat /proc/partitions |awk '{print $4}' |grep sd |grep -v [0123456789]`
   fi
   # Use alarmcmd read to see if this is mBMC
   $alarmcmd >$tmpf 2>/dev/null
   if [ $? -ne 0 ]
   then
	echo "$alarmcmd error, make sure ipmiutil is installed." >>$log
        # will have written something to $tmpf, so ok.
   fi
	# get the disk index (usu 0 or 1) from the disk name
	#disklist="`fdisk -l |grep "^Disk " |cut -f1 -d':' |sed -e 's/Disk //'`"
	i=0
	for d in $disklist
	do
		if [ "$idisk" = "/dev/$d" ]
		then
			break
		else
			i=`expr $i + 1`
		fi
	done
   echo "Disk $idisk, index = $i, from list: $disklist" >>$log
   # Set the disk fault LED if mBMC platform
   # If not mBMC, then assume sdiskmon set LED via SAF-TE or SES.
   grep "mBMC" $tmpf >/dev/null
   if [ $? -eq 0 ] 
   then
	# set the disk fault LED on
	echo "Setting Fault LED for Disk $i" >>$log
	if [ $i -eq 0 ]
	then
	   $alarmcmd -a1  >>$log 2>&1
	else
	   $alarmcmd -b1  >>$log 2>&1
	fi
   else 
        tgt=`expr $tgt - 1`
	echo "Setting Fault LED for Disk $tgt" >>$log
        $alarmcmd -d${tgt}1  >>$log 2>&1
   fi
   # Send an SNMP trap
   if [ $dosnmptrap -eq 1 ]
   then
      uptim=`cat /proc/uptime |cut -f1 -d' '`
      snmpsev=5
      snmpfn=3
      echo "Sending SNMP trap to $snmpipadr for Disk $i failure" >>$log
      snmptrap -v 1 -c public $snmpipadr $trapoid $snmphost 6 0 $uptim $vboid1 i $snmpfn $vboid2 i $i $vboid3 i 7 $vboid4 i $i $vboid5 i $snmpsev >>$log 2>&1 
   fi 
   ;;
#####
##### Insert a new disk/partition, called from sgdiskmon
#####
"Insert")
   if [ -d /dev/scsi/host0 ] || [ -d /dev/scsi/host1 ]
   then
        idisk=`echo $dname |sed -e 's/part[0-9]/disc/'`
        disklist=`cat /proc/partitions |awk '{print $4}' |grep disc`
   else
        idisk=`echo $dname |sed -e 's/[0-9]//'`
        disklist=`cat /proc/partitions |awk '{print $4}' |grep sd |grep -v [0123456789]`
   fi
   if [ "$iter" = "1" ]
   then 
      # Send an SNMP trap
      if [ $dosnmptrap -eq 1 ]
      then
         # get disk number (usu 0 or 1), allow for devfs, idisk was set above
         #disklist="`fdisk -l |grep "^Disk " |cut -f1 -d':' |sed -e 's/Disk //'`"
         newdisk=$idisk
         i=0
         for d in $disklist
	 do
		if [ "$newdisk" = "/dev/$d" ]
		then
			break
		else
			i=`expr $i + 1`
		fi
	 done
         uptim=`cat /proc/uptime |cut -f1 -d' '`
         snmpfn=2
         snmpsev=6
         echo "Sending SNMP trap to $snmpipadr for Disk $i insert" >>$log
         snmptrap -v 1 -c public $snmpipadr $trapoid $snmphost 6 0 $uptim $vboid1 i $snmpfn $vboid2 i $i $vboid3 i 7 $vboid4 i $i $vboid5 i $snmpsev >>$log 2>&1 
      fi 

      # clear the disk fault LED if mBMC platform
      $alarmcmd >$tmpf 2>/dev/null
      if [ $? -ne 0 ]
      then
	echo "$alarmcmd error, make sure ipmiutil is installed." >>$log
      fi
      grep "mBMC" $tmpf >/dev/null
      if [ $? -eq 0 ] 
      then
	# set the disk fault LED off
	echo "Clearing Fault LED for Disk $i" >>$log
	if [ $i -eq 0 ]
	then
	   $alarmcmd -a0  >>$log 2>&1
	else
	   $alarmcmd -b0  >>$log 2>&1
	fi
      else
        tgt=`expr $tgt - 1`
        echo "Clearing Fault LED for Disk $tgt" >>$log
        $alarmcmd -d${tgt}0  >>$log 2>&1
      fi
   fi
   ;;
#####
##### Display Usage if invalid parameters
#####
*)
   echo "Invalid function: $0 $1 $2 $3 $4" | tee -a $log
   echo "Usage: sgevt <event> [disk] [tgt_id] [iteration]" | tee -a $log
   echo "       where parameters are:"
   echo "         1 = event     (Fail, Insert)"
   echo "         2 = disk      (e.g. /dev/sdb6)"
   echo "         3 = target id (e.g. 1-6)"
   echo "         4 = iteration (e.g. 1,2,3  - for Insert only)"
   ;;
esac
