Saturday, October 20, 2012

Monitor Sybase error log


 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

3 comments:

  1. Hi,
    I am getting following erro
    $ ./sp_mon TG108DS
    ./sp_mon: s: not found.
    ./sp_mon[11]: echo $1 | tr [a-z] [A-Z] : not found.
    ./sp_mon[105]: 0403-057 Syntax error at line 185 : `'' is not matched.
    $

    ReplyDelete
  2. This comment has been removed by the author.

    ReplyDelete