@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 /etc/alarmprogram.bat rem where 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=