#!/bin/sh -u
# Original Author:  Steve Holdoway
# Date:    23/4/99
#
# Revised for use in 17b4 
# DATE:8-15-01 
# BY :Ron Gedye
# Original script & mods would not work properly, 
# ie bb-ontab test values including color
# would not be passed to senddisplay routine
#
# changed cut statements so as to be portable
# across platforms - now using TR & CUT rather than CUT -cxx
#
# Debugging removed as all parts that were debuggable worked properly
#
# This script tested with Informix 2000 Server
# on Red Hat Linux release 6.1 Cartman/6.2 Zoot/7.1 Seawolf
# and SunOS 5.8
#
# Note if using Red Hat Linux release 7.1 Seawolf
# the script will fail because CUT was moved
# Workaround - edit bbsys.sh or bbsys.local CUT variable from /usr/bin/cut to 
# /bin/cut
#
# Display output could be better for dataspaces - at minimum sort by % used
#
# 
## Updated 20/8/99
## Changed by: Colin Smith
## Changes: 0.1: Now reports database percent used etc.
# #Changes: 0.4: Now uses command variables and correctly reports the
# #              background colour and gif colour to Big Brother. 
# #             Doesn't yet fail correctly if onstat can't connect to
# #               the database and doesn't yet support per dbspace warning
# #              and panic levels.
# #Changes: 0.5: Now checks to se if Informix is up and PANICs if not.
# #NOTE,
#  #             it can't check for quiesent databases.
# #Changes: 0.6: Added functionality so that it now pulls the warn and panic
# #		values out of a table rather than being hard coded into the
# #		script
#
#
# Purpose: Check the status of all informix databases and report back to
#          the "Big Brother" display master.
# - Currently checks DBspace % used & compares to etc/bb-ontab if used
#	bb-ontab format is dbspacename:WARN:PANIC
#		
# - Also checks that oninit process is running
#
# - Added check for Logical Log Backout
#
# Usage:   * This script should be placed in $BBHOME/ext 
#	   * and value added to 'EXT' variable in bbdef.sh
#
#
# Disclaimer: This code carries no warranties expressed or implied.  If
#             you run it and it doesn't work as expected (up to and
#             including trashing your computer) then I will accept no
#             responsibility whatsoever.
#
#	NOTE - It didn't work when I got it - RG
#
#
#
#
# Check that we have a basic environment setup
#

if [ "$BBHOME" = "" ]
then
        echo ERROR: BBHOME variable not set
        exit 1
fi

#
# JOIN WAS NOT DEFINED BBSYS.LOCAL
JOIN="/usr/bin/join"

# TR WAS NOT DEFINED
# USING TR TO REMOVE BLANKS
# AND UPPERCASE CHARATER TO ADJUST FOR MULTIPLE FLAGS IN DBSPACE
# SCRIPT WILL FAIL IF OWNER OR DBSPACE IS CAPITALIZED
TR1="/usr/bin/tr -d [:upper:]"
TR2="/usr/bin/tr -s [:blank:]"

#
# Initialize variables
#
COLOR="green";export COLOR
LINE=""; export LINE
HIGHMARK="";export HIGHMARK
#

# Default warning and panic levels.
# Can be overridden by $BBHOME/etc/bb-ontab
# bb-ontab format is dbspacename:warn:panic
ONWARNVAL=90
ONPANICVAL=95

# Default Logical Log backout %
# set CHECKLLOGS=TRUE to test logs
CHECKLLOGS="FALSE"

# can use bb-tab to override default values
# Format CHECKLOGS:WARN:PANIC -  CHECKLOGS must be Caps

LOGWARNVAL=50
LOGPANICVAL=70

# Local customizations (YOU MUST CHECK THESE!)
# If not set then you must set these
#
# INFORMIXDIR=/opt/informix; export INFORMIXDIR
#
# PATH=$PATH:$INFORMIXDIR/bin
#

ONSTAT="onstat -d"
ONLOG="onstat -l"
ONLOGFILE=$BBHOME/tmp/onlogtmp
ONLOGFILE2=$BBHOME/tmp/onlog
ONLOGFILE3=$BBHOME/tmp/onlogB
ONLOGFILE4=$BBHOME/tmp/onlogS
ONVTMP=$BBHOME/tmp/onvtmp
ONVERSION=$BBHOME/tmp/onversion
ONSTATUS=$BBHOME/tmp/onstatus
ONTMP=$BBHOME/tmp/ontmp
ONDBSPACES=$BBHOME/tmp/ondbspaces
ONDBCHUNKS=$BBHOME/tmp/ondbchunks
ONLISTING=$BBHOME/tmp/onlisting
ONTAB=$BBHOME/etc/bb-ontab

##################################################
## Define verifyprocs

verifyprocs ()
{
$PS | $GREP oninit | $GREP -v grep > /dev/null 2>&1
if [ $? -eq 1 ]
then
        LINE="Informix is not running"; export LINE
        COLOR="red"
	echo "LINE=\"${LINE}\"" >$ONSTATUS
	echo "COLOR=$COLOR" >>$ONSTATUS
	senddisplay
	exit 
fi

}

##################################################
## Define choplines routine

choplines ()
{
	STARTLINE=$1
	ENDLINE=$2
	${HEAD} -${ENDLINE} | ${TAIL} +${STARTLINE}
}

##################################################
## Define getwarnval routine

getwarnval ()
{
	if [ -f $ONTAB ]
	then
		TABVALUE=""

		CHECKDBSPACE=$1
		TABVALUE=`${GREP} $CHECKDBSPACE $ONTAB | ${CUT} -d: -f2 2> /dev/null`
		if [ -n "$TABVALUE" ]
		then
			echo $TABVALUE
		else
			if [ "$WARNTYPE" = "DBASE" ]
			then
				echo $ONWARNVAL
			else
				echo $LOGWARNVAL
			fi
		fi
	else
		if [ "$WARNTYPE" = "DBASE" ]
		then
			echo $ONWARNVAL
		else
			echo $LOGWARNVAL
		fi
	fi
}

##################################################
## Define getpanicval routine

getpanicval ()
{
	if [ -f $ONTAB ]
	then

		TABVALUE=""
		CHECKDBSPACE=$1
		TABVALUE=`${GREP} $CHECKDBSPACE $ONTAB | ${CUT} -d: -f3 2> /dev/null`
		if [ -n "$TABVALUE" ]
		then
			echo $TABVALUE
		else
			if [ "$WARNTYPE" = "DBASE" ]
			then
				echo $ONPANICVAL
			else
				echo $LOGPANICVAL
			fi
		fi
	else
		if [ "$WARNTYPE" = "DBASE" ]
		then
			echo $ONPANICVAL
		else
			echo $LOGPANICVAL
		fi
	fi
}

##################################################
## Define formatstats routine

formatstats ()
{

	DBSBEGINMOD=2	
	DBSENDMOD=-3	
	CHUNKSBEGINMOD=2	
	CHUNKSENDMOD=-3
	ENDOFFILE=0

	$ONSTAT > $ONTMP


	echo "ENDOFFILE" >> $ONTMP

	

	DBSPACESMARKER=`${GREP} -n Dbspaces $ONTMP | ${CUT} -d: -f1`
	CHUNKSMARKER=`${GREP} -n Chunks $ONTMP | ${CUT} -d: -f1`
	ENDOFFILE=`${GREP} -n ENDOFFILE $ONTMP | ${CUT} -d: -f1`
	
	DBSBEGINLINE=`${EXPR} $DBSPACESMARKER + $DBSBEGINMOD`
	DBSENDLINE=`${EXPR} $CHUNKSMARKER + $DBSENDMOD`
	CHUNKBEGINLINE=`${EXPR} $CHUNKSMARKER + $CHUNKSBEGINMOD`
	CHUNKENDLINE=`${EXPR} $ENDOFFILE + $CHUNKSENDMOD`

	choplines  $DBSBEGINLINE $DBSENDLINE < $ONTMP | ${TR1} |${TR2} | ${CUT} -d" " -f2,5,7 | ${SORT} > $ONDBSPACES

# added GREP for PO to assure mirrors are not counted in space
	choplines  $CHUNKBEGINLINE $CHUNKENDLINE < $ONTMP | ${GREP} PO | ${TR2} | ${CUT} -d" " -f3,5,6,8 | ${SORT} > $ONDBCHUNKS
	${JOIN} $ONDBCHUNKS  $ONDBSPACES > $ONTMP

}

##################################################
## Define checkspace routine 

checkspace ()
{

LASTDBSPACE=""
TOTALSIZE=0
TOTALFREE=0
CURRENTCHUNK=0
MESSAGE="DB Spaces"

${CAT} $ONTMP | while read DBSLINE
	do
		set $DBSLINE
		DBSPACE=$6
		DBSNO=$1
		CHUNKNO=$5
		SIZE=$2
		FREE=$3
		CHUNK=$4
		
		CURRENTCHUNK=`${EXPR} $CURRENTCHUNK + 1`

		# this means that the $ONTMP file MUST be ${SORT}ed.
		if [ "$DBSPACE" != "$LASTDBSPACE" ]
		then
			TOTALSIZE=0
			TOTALFREE=0
			CURRENTCHUNK=1
		fi

		TOTALSIZE=`${EXPR} $TOTALSIZE + $SIZE`
		TOTALFREE=`${EXPR} $TOTALFREE + $FREE`
		TOTALUSED=`${EXPR} $TOTALSIZE - $TOTALFREE`
		PERCENTUSED1=`${EXPR} 100 \* $TOTALUSED / $TOTALSIZE`


		
		if [ $CURRENTCHUNK -eq $CHUNKNO ]
		then
		# If we're on the last chunk in the 
		# dbspace, add the line.

			WARNTYPE="DBASE"
			DBSWARNVAL=`getwarnval $DBSPACE`

			if [ $PERCENTUSED1 -ge $DBSWARNVAL ]
			then
				MARK="WARNING"
				MARKLEVEL=$DBSWARNVAL
				GIFCOLOR="&yellow"
				COLOR1="yellow"
				HIGHMARK1=$MARK
			
				DBSPANICVAL=`getpanicval $DBSPACE`
			
				if [ $PERCENTUSED1 -ge $DBSPANICVAL ]
				then
	       	                 		COLOR1="red" 
	             				MARK="PANIC"
	                       			MARKLEVEL=$DBSPANICVAL
	                       			HIGHMARK1=$MARK
	                       			GIFCOLOR="&red"
				fi
			
			LINE1="${GIFCOLOR} ${DBSPACE} (${PERCENTUSED1}%) has reached the defined space ${MARK} level (${MARKLEVEL}%)"
			
				if [ -f $ONSTATUS ]
				then
					. $ONSTATUS
				
					if [ $COLOR = $COLOR1 ]
					then
						COLOR2=$COLOR
						HIGHMARK2=$HIGHMARK
						PERCENTUSED2=$PERCENTUSED

						if [ $PERCENTUSED1 -ge $PERCENTUSED ]
						then
							LINE2="$LINE1
$LINE"
						else
							LINE2="$LINE
$LINE1"
						fi

						echo "LINE=\"${LINE2}\"" >$ONSTATUS
						echo "COLOR=$COLOR2" >>$ONSTATUS
						echo "HIGHMARK=$HIGHMARK2" >>$ONSTATUS
						echo "PERCENTUSED=$PERCENTUSED2" >>$ONSTATUS
						echo "MESSAGE=\"$MESSAGE\"" >>$ONSTATUS

					else
						if [ $COLOR = "yellow" ]
						then 
							COLOR2=$COLOR1
							HIGHMARK2=$HIGHMARK1
							PERCENTUSED2=$PERCENTUSED1
							LINE2="$LINE1
$LINE"
						else					
							COLOR2=$COLOR
							HIGHMARK2=$HIGHMARK
							PERCENTUSED2=$PERCENTUSED
							LINE2="$LINE
$LINE1"
						fi

						echo "LINE=\"${LINE2}\"" >$ONSTATUS
						echo "COLOR=$COLOR2" >>$ONSTATUS
						echo "HIGHMARK=$HIGHMARK2" >>$ONSTATUS
						echo "PERCENTUSED=$PERCENTUSED2" >>$ONSTATUS
						echo "MESSAGE=\"$MESSAGE\"" >>$ONSTATUS			
					fi
				else
					echo "LINE=\"${LINE1}\"" >$ONSTATUS
					echo "COLOR=$COLOR1" >>$ONSTATUS
					echo "HIGHMARK=$HIGHMARK1" >>$ONSTATUS
					echo "PERCENTUSED=$PERCENTUSED1" >>$ONSTATUS
					echo "MESSAGE=\"$MESSAGE\"" >>$ONSTATUS
				fi
			fi
			##
			echo "$CHUNKNO	$TOTALSIZE		$TOTALUSED	 	${PERCENTUSED1}% 		$DBSPACE" >> $ONLISTING
		fi

		LASTDBSPACE=$DBSPACE


	done

}

##################################################
## Define checklogs routine

# USED TO CHECK LOGICAL LOGS
# CHECKLLOGS must be TRUE
# Looks for CHECKLOGS:##:## in ONTAB
#  ##'s not set uses default warning/panic level from LOGWARN

checklogs ()
{
#set -x
if [ "$CHECKLLOGS" = "TRUE" ]
then
	LLOGBEGINMOD=1	
	LLOGENDMOD=-3
	MESSAGE2="Logical Logs"

	# Get log values and calculate

	$ONLOG > $ONLOGFILE
	echo "ENDOFFILE" >> $ONLOGFILE

	LLOGMARKER=`${GREP} -n address $ONLOGFILE | ${CUT} -d: -f1`
	ENDOFLOGFILE=`${GREP} -n ENDOFFILE $ONLOGFILE | ${CUT} -d: -f1`

	LLOGBEGINLINE=`${EXPR} $LLOGMARKER + $LLOGBEGINMOD`
	LLOGENDLINE=`${EXPR} $ENDOFLOGFILE + $LLOGENDMOD`
#	NUMLLOGS=`${EXPR} $LLOGENDLINE + -$LLOGBEGINLINE`

	# Chops to Logical Log info only - reduced to just flags
	choplines  $LLOGBEGINLINE $LLOGENDLINE < $ONLOGFILE | ${TR2} | ${CUT} -d" " -f3  > $ONLOGFILE2
	
	NUMLLOGS=`${WC} $ONLOGFILE2 | ${TR2} | ${CUT} -f2 -d" "`
	# Chops to Logical Log info - B Backed Out log count
	${CAT} $ONLOGFILE2 | ${GREP} B > $ONLOGFILE3


	NUMBLLOGS=`${WC} $ONLOGFILE3 | ${TR2} | ${CUT} -f2 -d" "`
	NUMNOBLLOGS=`${EXPR} $NUMLLOGS + -$NUMBLLOGS`
		
	PERCENTNOBLLOGS=`${EXPR} 100 \* $NUMNOBLLOGS / $NUMLLOGS`
	PERCENTBLLOGS=`${EXPR} 100 + -$PERCENTNOBLLOGS`


	if [ -f $ONTAB ]
	then
		# look for CHECKLOGS in ONTAB		
		WARNTYPE="LOG"
		LOGPANICVAL=`getpanicval CHECKLOGS`
		LOGWARNVAL=`getwarnval CHECKLOGS`
	# no ontab file
	# Use Default Values already set
	fi

	# Test for problems

	if [ $PERCENTNOBLLOGS -ge $LOGWARNVAL ]
	then
		#Test for red
		if [ $PERCENTNOBLLOGS -ge $LOGPANICVAL ]
		then
			#Condition Critical
			#Overwrite ONSTATUS
			COLOR1="red"
			GIFCOLOR="&red"
			MARK="PANIC"
			HIGHMARK1=$MARK
			MARKLEVEL=$LOGPANICVAL

			#Call Send Display
		else
			#Yellow - 
			COLOR1="yellow"
			GIFCOLOR="&yellow"
			MARK="WARNING"
			HIGHMARK1=$MARK
			MARKLEVEL=$LOGWARNVAL
		fi
	#set display items ONSTATUS
	LINE1="${GIFCOLOR} Logical Logs NOT Backed Out (${PERCENTNOBLLOGS}%) has reached the defined ${MARK} level (${MARKLEVEL}%)"

#set +x

# Test for Status file  See If there is another problem

		if [ -f $ONSTATUS ]
		then
			. $ONSTATUS

			if [ $COLOR = $COLOR1 ]
			then
				COLOR2=$COLOR
				HIGHMARK2=$HIGHMARK
	
				LINE2="$LINE1
$LINE"
				echo "LINE=\"${LINE2}\"" >$ONSTATUS
				echo "COLOR=$COLOR2" >>$ONSTATUS
				echo "HIGHMARK=$HIGHMARK2" >>$ONSTATUS
				MESSAGE="${MESSAGE} and ${MESSAGE2}"
				echo "MESSAGE=\"$MESSAGE\"" >>$ONSTATUS

			else
				if [ $COLOR = "yellow" ] 
				then 
					COLOR2=$COLOR1
					HIGHMARK2=$HIGHMARK1
					LINE2="$LINE1
$LINE"
				else					
					COLOR2=$COLOR
					HIGHMARK2=$HIGHMARK
					LINE2="$LINE
$LINE1"
				fi

				echo "LINE=\"${LINE2}\"" >$ONSTATUS
				echo "COLOR=$COLOR2" >>$ONSTATUS
				echo "HIGHMARK=$HIGHMARK2" >>$ONSTATUS
				echo "MESSAGE=\"$MESSAGE\"" >>$ONSTATUS			
			fi
		else
			echo "LINE=\"${LINE1}\"" >$ONSTATUS
			echo "COLOR=$COLOR1" >>$ONSTATUS
			echo "HIGHMARK=$HIGHMARK1" >>$ONSTATUS
			echo "MESSAGE=\"$MESSAGE2\"" >>$ONSTATUS

		fi

		#No problems - output log level
	fi

	echo "Logical Logs are ${PERCENTBLLOGS}% Backed Out" >$ONLOGFILE4

# CHECKLLOGS is False - No test
fi

}

##################################################
## Define senddisplay routine

senddisplay ()
{

if [ -f $ONSTATUS ]
then
. $ONSTATUS
fi

if [  "$CHECKLLOGS" = "TRUE"  ]
then 
LOGMSG=" and Logical Logs"
else
LOGMSG=""
echo "" >$ONLOGFILE4
fi

	if [ "$COLOR" = "green" ]
	then
		LINE=" DB Spaces $LOGMSG on $MACHINE OK

`${CAT} $ONVERSION`

`${CAT} $ONLOGFILE4`

Chunks	   Total Size	Total Used	Percent Used	DBSpace Name

`${CAT} $ONLISTING`"
	else
		if [ "$LINE" = "Informix is not running" ]
		then 
			LINE=$LINE
		else
			LINE="$MESSAGE on $MACHINE at $HIGHMARK level
${LINE}


`${CAT} $ONVERSION`

`${CAT} $ONLOGFILE4`

Chunks	   Total Size	Total Used	Percent Used	DBSpace Name

`${CAT} $ONLISTING`"

		fi
	fi

$BB $BBDISP "status $MACHINE.informix $COLOR `date` - $LINE"


$RM -f $ONTMP
$RM -f $ONDBSPACES
$RM -f $ONDBCHUNKS
$RM -f $ONLISTING
$RM -f $ONVTMP
$RM -f $ONVERSION
$RM -f $ONSTATUS
$RM -f $ONLOGFILE4
if [  "$CHECKLLOGS" = "TRUE"  ]
then 
$RM -f $ONLOGFILE
$RM -f $ONLOGFILE2
$RM -f $ONLOGFILE3
fi

}

# Start of Program
verifyprocs
# added to show version in display
${ONSTAT} >$ONVTMP
${HEAD} -2 $ONVTMP |${GREP} "Informix"| ${CUT} -f1 -d"-" >$ONVERSION
#
formatstats
checkspace
checklogs
senddisplay
