@echo off
rem  **************************************************************************
rem
rem  Licensed Materials - Property of IBM and/or HCL
rem
rem  IBM Informix Dynamic Server
rem  Copyright IBM Corporation 1996, 2015 All rights reserved.
rem  (c) Copyright HCL Technologies Ltd. 2017.  All Rights Reserved.
rem
rem  **************************************************************************
rem
rem  Name        : alarmprogram.bat
rem  Description : Automates many IDS events using event alarms from the
rem               database server. To install this script, add the following
rem               line to the ONCONFIG file :
rem                  ALARMPROGRAM    <INFORMIXDIR>/etc/alarmprogram.bat
rem               where <INFORMIXDIR> is replaced by the full value of $INFORMIXDIR
rem               This script sends email and pages the DBA when necessary.
rem
rem  /**************************************************************************/


rem ########################################
rem                                          
rem PUBLIC SECTION : CONFIGURATION VARIABLES 
rem                                          
rem ########################################

SET BACKUPLOGS=N

SET ALARMADMIN=0
SET ALARMPAGER=0
SET ADMINEMAIL=
SET PAGEREMAIL=

SET MAILUTILITY=%INFORMIXDIR%\bin\ntmail
SET POPSERVER=
SET SENDER=informix@machine.domain.com



rem #########################################
rem                                          
rem     PRIVATE SECTION : EVENT HANDLERS         
rem                                          
rem #########################################

set ALRM_NOTWORTHY=1
set ALRM_INFO=2
set ALRM_ATTENTION=3
set ALRM_EMERGENCY=4
set ALRM_FATAL=5

set EVENT_SEVERITY=%1
set EVENT_CLASS=%2
set EVENT_MSG=%~3
set EVENT_ADD_TEXT="%~4"
set EVENT_FILE="%~5"
set EVENT_UNIQID=%6

set BACKUP_CMD=onbar -b -l
set EXIT_STATUS=0
set RM=del
set ONSTATCMD=onstat
set MAILBODY=%TEMP%\B_%RANDOM%_%EVENT_CLASS%
set MAILHEAD=%TEMP%\H_%RANDOM%_%EVENT_CLASS%
set TMPFILE=%TEMP%\1_%RANDOM%_%EVENT_CLASS%
set TMPFILE2=%TEMP%\2_%RANDOM%_%EVENT_CLASS%
set TMPFILE3=%TEMP%\3_%RANDOM%_%EVENT_CLASS%
set SQLTMPFILE=%TEMP%\S_%RANDOM%_%EVENT_CLASS%
set ALARMTESTFILE=
SET DATE_INT=x
SET TIME_INT=y
SET COUNT=0

rem /* Keep track of last 5 minuts alarm log */
SET LASTALARMFILE=%DBTEMP%\.%INFORMIXSERVER%.alarm
SET CURRENT=%TEMP%\alarm.current

rem /* Get Format and delimiter information for data and time. */
for /F "tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v iDate') do set "DATE_FORMAT=%%a"
for /F "tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sDate') do set "DATE_DELIM=%%a"
for /F "tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sTime') do set "TIME_DELIM=%%a"
for /F "tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sDecimal') do set "DECIMAL_DELIM=%%a"


rem /*Remove optional day in the beginning if it exists. */
for %%x in (%DATE%) do set TODAY_DATE=%%x

rem /*Make international date based on the format */
for /F "tokens=1-3 delims=%DATE_DELIM% " %%x in ("%TODAY_DATE%") do (
  if %DATE_FORMAT%==0 set DATE_INT=%%z-%%x-%%y
  if %DATE_FORMAT%==1 set DATE_INT=%%z-%%y-%%x
  if %DATE_FORMAT%==2 set DATE_INT=%%x-%%y-%%z
)

rem /*Use international time and decimal delimiters to set time information */
for /F "tokens=1,2,3 delims=%TIME_DELIM%%DECIMAL_DELIM%" %%x in ("%TIME%") do set TIMESTR=%%x%%y%%z & set TIME_INT=%%x:%%y:%%z & set M=%%y
if %M%==00 (set MIN=0) else for /F "tokens=1 delims=0" %%x in ("%M%") do set MIN=%%x


if %MIN% LSS 5 (set /A T5MINAGO=%TIMESTR% - 4500) else set /A T5MINAGO=%TIMESTR% - 500

if NOT EXIST %LASTALARMFILE% goto BYPASS
for /F "tokens=1,2,3,4* delims=:. " %%i in (%LASTALARMFILE%) do if %%i EQU %DATE_INT% if %%j%%k%%l GEQ %T5MINAGO% @echo %DATE_INT% %%j:%%k:%%l %%m>> %CURRENT%

if EXIST %CURRENT% move %CURRENT% %LASTALARMFILE%
:BYPASS

rem /* Check the validity for BACKUPLOGS */
if "x%BACKUPLOGS%" == "x" goto bcklogsunset
  if "x%BACKUPLOGS%" == "xy" set BACKUPLOGS=Y
  goto endbcklogs
:bcklogsunset
  rem /* if LTAPEDEV is set to NUL set it to N, if not set it to Y */
  %ONSTATCMD% -c | findstr "^LTAPEDEV" > %TMPFILE%
  for /F "tokens=2" %%x in ( %TMPFILE% ) do set LTAPEDEV=%%x
  if "x%LTAPEDEV%" == "xNUL" set BACKUPLOGS=N else set BACKUPLOGS=Y
:endbcklogs

rem In order to not to send incorrect mails, ALARMADMIN and ALARMPAGER
rem Must be correctly configured, if they are out of range or unset, 
rem they will be reset to 0 (Deactivated)

if "x%ALARMADMIN%" == "x" echo ALARMADMIN is unset, setting it to 0. & set ALARMADMIN=0
if %ALARMADMIN% LSS 0  goto badadmin
if %ALARMADMIN% GTR 5  goto badadmin
  goto ebadadmin
:badadmin
  echo ALARMADMIN is out of range, reseting it to 0 from %ALARMADMIN%
  set ALARMADMIN=0
:ebadadmin

if x%ALARMPAGER% == x echo ALARMPAGER is unset, setting it to 0. & SET ALARMPAGER=0
if %ALARMPAGER% LSS 0 goto badpager
if %ALARMPAGER% GTR 5 goto badpager
  goto ebadpager
:badpager
  echo ALARMPAGER is out of range, reseting it to 0 from %ALARMPAGER% 
  set ALARMPAGER=0
:ebadpager

if %EVENT_SEVERITY% EQU 1 set EVENT_SEVERITY_NAME=trivia
if %EVENT_SEVERITY% EQU 2 set EVENT_SEVERITY_NAME=information
if %EVENT_SEVERITY% EQU 3 set EVENT_SEVERITY_NAME=Attention!
if %EVENT_SEVERITY% EQU 4 set EVENT_SEVERITY_NAME=EMERGENCY!!
if %EVENT_SEVERITY% EQU 5 set EVENT_SEVERITY_NAME=FATAL EVENT!!! 

rem Cleanup the mail header and the mail body file 
%RM% %MAILBODY% %MAILHEAD% %TMPFILE% 2>> nul

rem /* Start of case */
if %EVENT_CLASS% EQU 1 goto defhandler
if %EVENT_CLASS% EQU 2 goto defhandler
if %EVENT_CLASS% EQU 3 goto defhandler

if %EVENT_CLASS% NEQ 4 goto nextto4
  rem /* CHUNK IS OFFLINE */
  echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  echo %EVENT_ADD_TEXT% >> %MAILBODY%
  echo. >> %MAILBODY%
  echo. >> %MAILBODY%

  call :drawseparator %MAILBODY%
  echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  call :drawseparator %MAILBODY%
  call :trimonstat "-d" %MAILBODY% 3
  call :drawseparator %MAILBODY%
  call :trimonstat "-m" %MAILBODY% 3
:endchkoff
  goto endofcase
:nextto4

if %EVENT_CLASS% NEQ 5 goto nextto5
  rem /* DBSPACE IS OFF-LINE */
  echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  echo %EVENT_ADD_TEXT% >> %MAILBODY%
  echo. >> %MAILBODY%
  echo. >> %MAILBODY%

  call :drawseparator %MAILBODY%
  echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  call :drawseparator %MAILBODY%
  call :trimonstat "-d" %MAILBODY% 3
  call :drawseparator %MAILBODY%
  call :trimonstat "-m" %MAILBODY% 3
:enddbsoff
  goto endofcase
:nextto5

if %EVENT_CLASS% NEQ 6 goto nextto6
  rem /* INTERNAL SUBSYSTEM FAILURE */
  echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  echo %EVENT_ADD_TEXT% >> %MAILBODY%
  echo. >> %MAILBODY%
  echo. >> %MAILBODY%

  rem /* Many things cause this problem see the online.log */
  call :drawseparator %MAILBODY%
  echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  call :drawseparator %MAILBODY%
  call :trimonstat "-m" %MAILBODY%
:endintsub
  goto endofcase
:nextto6

if %EVENT_CLASS% EQU 7 goto defhandler
if %EVENT_CLASS% EQU 8 goto defhandler
if %EVENT_CLASS% EQU 9 goto defhandler
if %EVENT_CLASS% EQU 10 goto defhandler
if %EVENT_CLASS% EQU 11 goto defhandler
if %EVENT_CLASS% EQU 12 goto defhandler
if %EVENT_CLASS% EQU 13 goto defhandler
if %EVENT_CLASS% EQU 14 goto defhandler
if %EVENT_CLASS% EQU 15 goto defhandler
if %EVENT_CLASS% EQU 16 goto defhandler

if %EVENT_CLASS% NEQ 17 goto nextto17
  rem /* ARCHIVE FAILED */
  echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  echo %EVENT_ADD_TEXT% >> %MAILBODY%
  echo. >> %MAILBODY%
  echo. >> %MAILBODY%

  rem /* Try to get the stack trace for the ontape thread */
  call :drawseparator %MAILBODY%
  echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  call :drawseparator %MAILBODY%
  %ONSTATCMD% -g ath > %TMPFILE%
  findstr ontape %TMPFILE% > %TMPFILE2%
  findstr arcbackup1 %TMPFILE% >> %TMPFILE2%
  findstr arcbackup2 %TMPFILE% >> %TMPFILE2%
  for /f "tokens=1" %%x in ( %TMPFILE2% ) do call :trimonstat "-g stk %%x" %MAILBODY% 2 & call :drawseparator %MAILBODY%
  call :trimonstat "-g arc" %MAILBODY% 2
:endarcfailed
  goto endofcase
:nextto17

if %EVENT_CLASS% EQU 18 goto defhandler

if %EVENT_CLASS% NEQ 19 goto nextto19
  rem /* LOGICAL LOG BACKUP FAILED */
  echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  echo %EVENT_ADD_TEXT% >> %MAILBODY%
  echo. >> %MAILBODY%
  echo. >> %MAILBODY%

  rem /* Try to get the stack trace for all the ontape thread */
  call :drawseparator %MAILBODY%
  echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  call :drawseparator %MAILBODY%
  call :trimonstat "-g ath" %MAILBODY% 2 
  call :drawseparator %MAILBODY%
  %ONSTATCMD% -g ath | findstr ontape > %TMPFILE2%
  for /f "tokens=1" %%x in ( %TMPFILE2% ) do call :trimonstat "-g stk %%x" %MAILBODY% 2 & call :drawseparator %MAILBODY%
:endlogfailed
  goto endofcase
:nextto19

if %EVENT_CLASS% NEQ 20 goto nextto20
  rem /* LOGICAL LOGS ARE FULL */
  echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  echo %EVENT_ADD_TEXT% >> %MAILBODY%
  echo. >> %MAILBODY%
  echo. >> %MAILBODY%

  call :trimonstat "-l" %TMPFILE% 15
  findstr U- %TMPFILE% > %TMPFILE2%
  set OLDESLOG=4294967296
  for /f "tokens=4" %%x in ( %TMPFILE2% ) do if OLDESTLOG LSS %%x set OLDESTLOG=%%x

  call :trimonstat "-x" %TMPFILE2% 3
  findstr - active %TMPFILE2% > %TMPFILE%

  for /f "tokens=1,2,3,4,5,6,7,8,9,10" %%a in ( %TMPFILE% ) do call :drawseparator %MAILBODY% & call :checklongtx %OLDESTLOG% %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j 

  %ONSTATCMD% -l | find /C "U-B" > %TMPFILE%

  for /f "tokens=1" %%x in ( %TMPFILE% ) do set NUMLOGB=%%x

  if %NUMLOGB% EQU 0 echo LOGICAL LOGS NEED A BACKUP >> %MAILBODY% echo RUN 'onbar -b -l' OR 'ontape -a' OR 'ontape -c' >> %MAILBODY%

  echo. >> %MAILBODY%
  call :drawseparator %MAILBODY%
  echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  call :drawseparator %MAILBODY%
  call :trimonstat "-l" %MAILBODY% 2
  call :drawseparator %MAILBODY%
  call :trimonstat "-x" %MAILBODY% 2
  call :drawseparator %MAILBODY%
  call :trimonstat "-u" %MAILBODY% 2
:endlogfull
  goto endofcase
:nextto20

if %EVENT_CLASS% EQU 21 goto defhandler

if %EVENT_CLASS% NEQ 22 goto nextto22
  rem /* LONG TRANSACTION DETECTED */

  echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  REM # 
  REM # The next line will print something like this:
  REM # Aborting Long Transaction: tx: 0x7000001dc3b88a0 username: gcastro uid: 30062
  REM #
  echo %EVENT_ADD_TEXT% >> %MAILBODY%

  for /F "tokens=5" %%x in ("%EVENT_ADD_TEXT%") do set TX_ADDR=%%x
  >> %MAILBODY%    echo Tx Address = %TX_ADDR%:
			 %ONSTATCMD% -x | findstr %TX_ADDR:~2%    > %TMPFILE%     
  >> %MAILBODY%    type %TMPFILE%
  >> %MAILBODY%    echo.
  
  for /F "tokens=3" %%x in (%TMPFILE%) do SET USER_ADDR=%%x
  >> %MAILBODY%    echo Userthread Address = 0x%USER_ADDR%:
                   %ONSTATCMD% -u | findstr %USER_ADDR%     > %TMPFILE%
  >> %MAILBODY%    type %TMPFILE%
  >> %MAILBODY%    echo.
  
  
  for /F "tokens=3" %%x in (%TMPFILE%) do SET SESS_ID=%%x
  >> %MAILBODY%    echo Session ID = %SESS_ID%:
  >> %MAILBODY%    echo.
  call :trimonstat "-g ses %SESS_ID%" %MAILBODY% 2

  REM # 
  REM # Trying to find other long transactions
  REM #
  >> %MAILBODY%    echo.
  >> %MAILBODY%    echo -------------------------------------"
  >> %MAILBODY%    echo -    
  >> %MAILBODY%    echo -  OTHER LONG TRANSACTIONS:
  >> %MAILBODY%    echo -    
  >> %MAILBODY%    echo -------------------------------------
  >> %MAILBODY%    echo.  
       
  echo select "@", tx_id, trim(LEADING '0' from replace(lower(HEX(tx_owner)), "0x", "")), hex(tx_addr) from systrans where tx_longtx != 0 > %SQLTMPFILE%
  dbaccess sysmaster < %SQLTMPFILE% 2> nul | findstr @  > %TMPFILE%

  set /A LONGTXCOUNT=0
  for /F "tokens=2,3,4" %%x in ( %TMPFILE% ) do  call :longtxcatch %%x %%y %%z & set /A LONGTXCOUNT+=1

  if %LONGTXCOUNT% NEQ 0 goto longtxtail
    >> %MAILBODY%  echo NONE
    goto longtxtail

:longtxcatch
  rem %1=TXID
  rem %2=TXOWNER
  rem %3=TXADDR
  set TMP1=%TEMP%\__lxt1
  
  call :drawseparator %MAILBODY%
  %ONSTATCMD% -u | findstr %2 > %TMP1%

  for /F "tokens=3" %%x in ( %TMP1% ) do set SESSID=%%x
  echo please check the information below about transaction TXID=%1 at %3 >>%MAILBODY%
  echo that was generated by session %SESSID%. >> %MAILBODY%
  echo. >> %MAILBODY%
  echo SESSION INFORMATION: >> %MAILBODY%
  call :trimonstat "-g ses %SESSID%" %MAILBODY% 2
  goto :eof

:longtxtail	
call :drawseparator %MAILBODY%
echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
call :drawseparator %MAILBODY%
call :trimonstat "-x" %MAILBODY% 2
call :drawseparator %MAILBODY%
call :trimonstat "-l" %MAILBODY% 2
call :drawseparator %MAILBODY%
call :trimonstat "-m" %MAILBODY% 2
:longtx
  goto endofcase
:nextto22

if %EVENT_CLASS% NEQ 23 goto nextto23
  rem /* LOGICAL LOG FILE COMPLETED */ 
  rem /* onbar assumes no operator is present, so all messages are written to the
  rem    activity log and there shouldn't be any output, but send everything to 
  rem    NUL just in case */
  echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  echo %EVENT_ADD_TEXT% >> %MAILBODY%

  rem /* TO IMPLEMENT LATER
  rem   If there is already a logical log backup don't launch onbar again. */

  if "x%BACKUPLOGS%" == "xY" goto dobackup
     echo "Script will not backup the logical logs."
     goto nobackup
  :dobackup
  call %BACKUP_CMD% 2>&1 > NUL
  rem /* 0 means BACKUP_CMD was successful */
  if ERRORLEVEL 1 goto ERROR
  if ERRORLEVEL 0 goto SUCCESS
    goto backcmddone
  :ERROR
    set EXIT_STATUS=1
    goto backcmddone
  :SUCCESS
    set EXIT_STATUS=0
  :backcmddone
    echo '%BACKUP_CMD%' has been executed and returned CODE=%EXIT_STATUS% >> %MAILBODY%
    echo. >> %MAILBODY%
  :nobackup

  rem /* Now check if the logs are near to fill up */
  %ONSTATCMD% -l | find /C "U-B" > %TMPFILE%
  for /F "tokens=1" %%x in (%TMPFILE%) do set NUMLOGUB=%%x
  %ONSTATCMD% -l | find /C "F-" > %TMPFILE%
  for /F "tokens=1" %%x in (%TMPFILE%) do set NUMLOGF=%%x
  %ONSTATCMD% -l | find /C "A-" > %TMPFILE%
  for /F "tokens=1" %%x in (%TMPFILE%) do set NUMLOGA=%%x
  %ONSTATCMD% -l | find /V "U-B" | find /C "U-" > %TMPFILE%
  for /F "tokens=1" %%x in (%TMPFILE%) do set NUMLOGU=%%x
 
  set /A NUMLOG=%NUMLOGU%+%NUMLOGA%+%NUMLOGF%
  set /A PERC=(100*(%NUMLOGUB%+%NUMLOGF%+%NUMLOGA%))/%NUMLOG%

  if %PERC% GTR 10 goto endlogcomplete
    set /A PERC=100-%PERC%
    call :drawseparator %MAILBODY%
    echo WARNING : MORE THAN 90 PERCENT (%PERC% percent) OF THE LOGICAL LOGS ARE FULL >> %MAILBODY%
    echo A LOGICAL LOG BACKUP IS NEEDED. SEE INFO BELOW >> %MAILBODY%
    echo. >> %MAILBODY%
    call :drawseparator %MAILBODY%
    echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
    call :drawseparator %MAILBODY%
    call :trimonstat "-l" %MAILBODY% 2

:endlogcomplete
  goto endofcase
:nextto23

if %EVENT_CLASS% EQU 24 goto defhandler
if %EVENT_CLASS% EQU 25 goto defhandler

if %EVENT_CLASS% NEQ 26 goto nextto26
  rem /* LOG FILE DYNAMICALLY ADDED */

  echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  for /F "tokens=5,8 usebackq" %%x in ( `echo %EVENT_ADD_TEXT%` ) do  set /A LOGNUM=%%x & set /A DBSNUM=%%y 

  echo select '@', number, trunc(physloc/1048576), lower(hex(physloc)), size from syslogfil where number = %LOGNUM%; > %SQLTMPFILE%
  dbaccess sysmaster < %SQLTMPFILE% 2> nul | findstr @  > %TMPFILE%

  for /F "tokens=2,3,4,5" %%a in ( %TMPFILE% ) do set LOG=%%a & set CHKNUM=%%b & set PHYSLOC=%%c & set SIZE=%%d

  echo select name as dbsname from sysdbspaces d where dbsnum = %DBSNUM%; > %SQLTMPFILE%
  dbaccess sysmaster < %SQLTMPFILE% 2> nul | findstr dbsname > %TMPFILE%
  for /F "tokens=2" %%x in ( %TMPFILE% ) do set DBSNAME=%%x

  echo Logical log file number %LOGNUM% has been dynamically added by >> %MAILBODY%
  echo the engine; the log was added to Chunk Number %CHKNUM% in dbspace '%DBSNAME%' >> %MAILBODY%
  echo please check free space on this dbspace and the process that >> %MAILBODY%
  echo generated this event. >> %MAILBODY%
  call :drawseparator %MAILBODY%
  echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  call :drawseparator %MAILBODY%
  call :trimonstat "-l" %MAILBODY% 2
  call :drawseparator %MAILBODY%
  call :trimonstat "-d" %MAILBODY% 2
:endlogdyn
  goto endofcase
:nextto26

if %EVENT_CLASS% NEQ 27 goto nextto27
  rem /* LOG FILE REQUIERED */

  echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  echo %EVENT_ADD_TEXT% >> %MAILBODY%
  call :drawseparator %MAILBODY%
  echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  call :drawseparator %MAILBODY%
  call :trimonstat "-l" %MAILBODY% 2
  call :drawseparator %MAILBODY%
  call :trimonstat "-d" %MAILBODY% 2
:endlogreq
  goto endofcase
:nextto27

if %EVENT_CLASS% NEQ 28 goto nextto29
  rem /* NO SPACE AVAILABLE FOR DINAMIC LOG */

  echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  echo %EVENT_ADD_TEXT% >> %MAILBODY%

  call :drawseparator %MAILBODY%
  echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  call :drawseparator %MAILBODY%
  call :trimonstat "-d" %MAILBODY% 2
  call :drawseparator %MAILBODY%
  call :trimonstat "-l" %MAILBODY% 2
  call :drawseparator %MAILBODY%
  call :trimonstat "-m" %MAILBODY% 2
:enddynnospace
  goto endofcase
:nextto29

rem /*
rem I could use defhandler instead of enddynnospace, but this could lead a problems
rem if the amount of events get increased and someone forgets to change the label
rem */

:defhandler
  rem /************************************************************************ 
  rem   If you implement a specific handler for 29 put it before this label
  rem   with this implementation any future event will have a default handler.
  rem  ************************************************************************/
  echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  echo %EVENT_ADD_TEXT% >> %MAILBODY%
:endofcase
rem /* End of case */


set NOSENDER=1
rem /* Send e-mail to who may be interested */

if %ALARMADMIN% EQU 0 goto eadmin
if %EVENT_SEVERITY% LSS %ALARMADMIN% goto lssadmin
if "x%ADMINEMAIL%" == "x" goto eadmin
  echo To: %ADMINEMAIL% >> %MAILHEAD%
  set MAILTO=%ADMINEMAIL%
  set NOSENDER=0
  goto eadmin
:lssadmin
  echo Event Severity = %EVENT_SEVERITY% is lower than ALARMADMIN=%ALARMADMIN%
  echo No mail will be sent to ALARMEMAIL
:eadmin

if %ALARMPAGER% EQU 0 goto eapager
if %EVENT_SEVERITY% LSS %ALARMPAGER% goto lsspager
if "x%PAGEREMAIL%" == "x" goto :eapager
  if %NOSENDER% EQU 0 echo cc: %PAGEREMAIL% >> %MAILHEAD% & set MAILTO=%MAILTO% %PAGEREMAIL% & goto eapager
    echo To: %PAGEREMAIL%  >> %MAILHEAD%
    set MAILTO=%PAGEREMAIL%
    goto :eapager
:lsspager
  echo Event Severity = $EVENT_SEVERITY is lower than ALARMPAGER=%ALARMPAGER%
  echo No mail will be sent to PAGEREMAIL
:eapager

if "x%MAILTO%" == "x" echo SENDER IS NULL NO MAIL WILL BE SENT. & goto endprog

rem /* send mail */ 
if "x%ALARMPROGRAMTEST%" == "x" goto tomail 
  type %MAILBODY% >> %ALARMTESTFILE%
goto endprog

:tomail
if "x%MAILUTILITY%" == "x" echo MAILUTILITY is not set, NO MAIL will be sent. & goto endprog 
  REM /* Do not send same alarm in less than 5 minute intervel. */
  if NOT EXIST %LASTALARMFILE% echo. > %LASTALARMFILE%
  TYPE %LASTALARMFILE% | FIND /C "%EVENT_MSG%" > %TMPFILE3% 
  for /f "tokens=1" %%x in ( %TMPFILE3% ) do set COUNT=%%x 
  if %COUNT% GEQ 1 goto endprog
   %MAILUTILITY% -h %POPSERVER% -f %SENDER% -s "%INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% " %MAILTO% < %MAILBODY%  >> NUL 2>&1
   goto :endprog

:trimonstat 
  rem /* %1 = onstat options */
  rem /* %2 = output file */
  rem /* %3 = amount of lines to trim from the begining */

  set TAILFILE=%RANDOM%
  set TMP1=%TEMP%\t1%RANDOM%
  set TMP2=%TEMP%\t2%RANDOM%

  echo 1,%3d > %TAILFILE%
  echo e >> %TAILFILE%
  echo q >> %TAILFILE%
  echo y >> %TAILFILE%

  %ONSTATCMD% %~1 > %TMP1%
  findstr /V Blocked: %TMP1% > %TMP2%
  findstr /V Block:   %TMP2% > %TMP1%
  edlin %TMP1% < %TAILFILE% > nul
  type %TMP1% >> %2
  %RM% %TMP1% %TMP2% %TAILFILE%
  goto :eof

:drawseparator
  rem /* %1 = output file */

  echo ------------------------------------- >> %1
  echo. >> %1
  goto :eof

:checklongtx
  rem /* %1 = Oldest logical log */
  rem /* %2 = Output file */
  rem /* %3 = Tx address */
  rem /* %5 = Userthread */
  rem /* %7 = LogBegin */

  set TMP1=%TEMP%\l1%RANDOM%
  set TMP2=%TEMP%\l2%RANDOM%

  if %7 NEQ %1 goto :eof
    rem /* A long transaction has ocurred, get the culprit one */
    call :trimonstat "-u" %TMP1% 2
    findstr %5 %TMP1% > %TMP2%
    for /f "tokens=3" %%x in ( %TMP2% ) do set SESSID=%%x
    echo A LONG TRANSACTION has filled the Logical Logs, please check >> %2
    echo the next information about transaction 0x$ADDRESS that was generated >> %2
    echo by session $SESSID. >> %2
    echo. >> %2
    echo. >> %2
    echo SESSION INFORMATION: >> %2
    call :trimonstat "-g ses %SESSID%" %2 2 

    %RM% %TMP1% %TMP2%
  goto :eof

:endprog
echo %DATE_INT% %TIME_INT% %EVENT_MSG% >> %LASTALARMFILE%
%RM% %MAILHEAD% %MAILBODY% %TMPFILE% %TMPFILE2% %TMPFILE3% %SQLTMPFILE% 

SET BACKUPLOGS=
SET ALARMADMIN=
SET ALARMPAGER=
SET ADMINEMAIL=
SET PAGEREMAIL=
SET MAILUTILITY=
SET POPSERVER=
SET SENDER=


set ALRM_NOTWORTHY=
set ALRM_INFO=
set ALRM_ATTENTION=
set ALRM_EMERGENCY=
set ALRM_FATAL=

rem /* input parameters */
set EVENT_SEVERITY=
set EVENT_CLASS=
set EVENT_MSG=
set EVENT_ADD_TEXT=
set EVENT_FILE=

set BACKUP_CMD=
set RM=
set ONSTATCMD=
set MAILBODY=
set MAILHEAD=
set TMPFILE=
set TMPFILE2=
set TMPFILE3=
set SQLTMPFILE=
set EXIT_STATUS=