Monitor Sybase error log
#!/bin/sh
#set -x
##
## This scripts scans the errorlog for errors and notifies if
## problems are found.
##
##
## Usage: check_errorlog_and_notify <ASE Server Name>
##
##
##
VERSION="check_errorlog_and_notify Version 1.2"
## Input Parameters for script
SRVNAME=`echo $1 | tr '[a-z]' '[A-Z]'`
ENV_DIR="/sybase_sa"
ENVFILE="$ENV_DIR/.$SRVNAME.env"
##
## Check for correct number of parameters
if [ $# -lt 1 ]
then
echo "Usage: $0 <SQL-Server Name> "
exit 1
fi
EXECUTE_ENV()
{
##
## Check for existence of ASE file
if [ ! -s $ENVFILE ]
then
echo "$ENVFILE files does not exist for ASE Server ($SRVNAME) .."
echo "Script exiting ..."
exit 1
fi
##
## Source environment (ASE) file
. $ENVFILE
}
SET_VARIABLES()
{
##
## Defining system variables
SA_PW=`$GET_PW $SRVNAME`
SEARCHFILE="$SRV_LOG/errorlog_$SRVNAME"
NUMBERED_SEARCHFILE="$SYB_TMP/errorlog_$SRVNAME"
STARTLINE_FILE="$SYB_BIN/STARTLINE_FILE"
KEYWORD_FILE="$SYB_BIN/KEYWORDS"
TEMP_MSGFILE="$SYB_TMP/check_msgfile.$SRVNAME"
TEMP_MSGFILE1="$SYB_TMP/check_msgfile1.$SRVNAME"
TEMP_MSGFILE2="$SYB_TMP/check_msgfile2.$SRVNAME"
MSGFILE="$SYB_TMP/check_msgfile3.$SRVNAME"
rm -f $NUMBERED_SEARCHFILE $TEMP_MSGFILE $TEMP_MSGFILE1 2>/dev/null
rm -f $TEMP_MSGFILE2 $MSGFILE 2>/dev/null
}
FIND_COUNTER()
{
##
## start at this line in log file
##
if [ -f "$STARTLINE_FILE" ]
then
STARTLINE=`cat $STARTLINE_FILE`
else
STARTLINE=0
fi
}
CONTINUE_SEARCH()
{
##
## are there any lines past our start point ?
## if not, we are done
##
if [ $STARTLINE -ge `cat $SEARCHFILE | wc -l` ]
then
exit 0
fi
}
CREATE_NUMBER_FILE()
{
##
## start at starting line number
## put line numbers on errorlog for message output
##
LINE_COUNTER=`expr $STARTLINE + 1`
cat $SEARCHFILE | tail +$STARTLINE | while read SEARCHLINE
do
if [ $LINE_COUNTER -ge $STARTLINE ]
then
echo "$LINE_COUNTER $SEARCHLINE" >> $NUMBERED_SEARCHFILE
fi
LINE_COUNTER=`expr $LINE_COUNTER + 1`
echo $LINE_COUNTER > $STARTLINE_FILE
done
}
KEYWORD_SEARCH()
{
##
## now get down to business....
## grep for errors. KEY_ERROR file has what we grep for and what we ignore
##
cat $KEYWORD_FILE | tail +7 | while read LINE
do
KEY_ERROR=`echo $LINE | cut -d~ -f1`
IGNORE=`echo $LINE | cut -d~ -f2`
ROWS=`echo $LINE | cut -d~ -f3`
NUM=`echo $LINE | cut -d~ -f4`
if [ $NUM -ne 0 ]
then
grep -i "$KEY_ERROR" $NUMBERED_SEARCHFILE > $TEMP_MSGFILE2
NEW_NUM=5
LAST_NUM=`expr $NUM + 4`
while [ $LAST_NUM -ge $NEW_NUM ]
do
NEW_ERROR=`echo $LINE | cut -d~ -f$NEW_NUM`
grep -v "$NEW_ERROR" $TEMP_MSGFILE2 > $TEMP_MSGFILE1
cp $TEMP_MSGFILE1 $TEMP_MSGFILE2
NEW_NUM=`expr $NEW_NUM + 1`
done
if [ $ROWS -ne 0 ]
then
cat $TEMP_MSGFILE2 | nawk '{print $1}' | while read FILE_ROW
do
FILE_ROW=`expr $FILE_ROW - $STARTLINE`
cat $NUMBERED_SEARCHFILE | tail +$FILE_ROW | head -$ROWS >> $TEMP_MSGFILE
done
else
mv $TEMP_MSGFILE2 $TEMP_MSGFILE
fi
else
if [ $ROWS -eq 0 ]
then
grep -i "$KEY_ERROR" $NUMBERED_SEARCHFILE > $TEMP_MSGFILE
else
grep -i "$KEY_ERROR" $NUMBERED_SEARCHFILE | nawk '{print $1}' | while read FILE_ROW
do
FILE_ROW=`expr $FILE_ROW - $STARTLINE`
cat $NUMBERED_SEARCHFILE | tail +$FILE_ROW | head -$ROWS >> $TEMP_MSGFILE
done
fi
fi
if [ -s "$TEMP_MSGFILE" ]
then
rm -f $MSGFILE
UNIX_SRVR=`grep -w $SRVNAME $SERVERS | grep -w sql | nawk '{print $4}' | head -1`
if [ "$IGNORE" = "MAIL" ]
then
echo "Sql($SRVNAME):Unix($UNIX_SRVR)-MAILONLY: " > $MSGFILE
cat $TEMP_MSGFILE >> $MSGFILE
else
echo "Sql($SRVNAME):Unix($UNIX_SRVR):" > $MSGFILE
cat $TEMP_MSGFILE | while read LINE
do
echo $LINE | cut -d" " -f5- >> $MSGFILE
done
fi
if [ -s "$MSGFILE" ]
then
MSGTEXT=`cat $MSGFILE | sed s/\'/\ /g`
echo "################### `date` #################################"
cat $MSGFILE
fi
MSGTEXT1=`echo $MSGTEXT | cut -c1-210`
MSGTEXT="$MSGTEXT1 *END*"
echo "***END***" >> $MSGFILE
MSG_CNT1=`cat $MSGFILE | wc -c`
MSG_CNT=`echo $MSG_CNT1`
TEXT_CNT1=`echo $MSGTEXT | wc -c`
TEXT_CNT=`echo $TEXT_CNT1`
$SYB_BIN/send_messages $SRVNAME "$MSGFILE" "$MSGTEXT" BOTH ALL
fi
rm -f $TEMP_MSGFILE
done
}
CLEANUP()
{
##
## Mom taught us to clean up after ourselves...
## remove our work files
##
rm -f $MSGFILE $TEMP_MSGFILE $TEMP_MSGFILE1 $TEMP_MSGFILE2 $NUMBERED_SEARCHFILE 2>/dev/null
}
##
## MAIN SECTION
EXECUTE_ENV
SET_VARIABLES
FIND_COUNTER
CONTINUE_SEARCH
CREATE_NUMBER_FILE
KEYWORD_SEARCH
CLEANUP
exit