alarmprogram.bat 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. @echo off
  2. rem **************************************************************************
  3. rem
  4. rem Licensed Materials - Property of IBM and/or HCL
  5. rem
  6. rem IBM Informix Dynamic Server
  7. rem Copyright IBM Corporation 1996, 2015 All rights reserved.
  8. rem (c) Copyright HCL Technologies Ltd. 2017. All Rights Reserved.
  9. rem
  10. rem **************************************************************************
  11. rem
  12. rem Name : alarmprogram.bat
  13. rem Description : Automates many IDS events using event alarms from the
  14. rem database server. To install this script, add the following
  15. rem line to the ONCONFIG file :
  16. rem ALARMPROGRAM <INFORMIXDIR>/etc/alarmprogram.bat
  17. rem where <INFORMIXDIR> is replaced by the full value of $INFORMIXDIR
  18. rem This script sends email and pages the DBA when necessary.
  19. rem
  20. rem /**************************************************************************/
  21. rem ########################################
  22. rem
  23. rem PUBLIC SECTION : CONFIGURATION VARIABLES
  24. rem
  25. rem ########################################
  26. SET BACKUPLOGS=N
  27. SET ALARMADMIN=0
  28. SET ALARMPAGER=0
  29. SET ADMINEMAIL=
  30. SET PAGEREMAIL=
  31. SET MAILUTILITY=%INFORMIXDIR%\bin\ntmail
  32. SET POPSERVER=
  33. SET SENDER=informix@machine.domain.com
  34. rem #########################################
  35. rem
  36. rem PRIVATE SECTION : EVENT HANDLERS
  37. rem
  38. rem #########################################
  39. set ALRM_NOTWORTHY=1
  40. set ALRM_INFO=2
  41. set ALRM_ATTENTION=3
  42. set ALRM_EMERGENCY=4
  43. set ALRM_FATAL=5
  44. set EVENT_SEVERITY=%1
  45. set EVENT_CLASS=%2
  46. set EVENT_MSG=%~3
  47. set EVENT_ADD_TEXT="%~4"
  48. set EVENT_FILE="%~5"
  49. set EVENT_UNIQID=%6
  50. set BACKUP_CMD=onbar -b -l
  51. set EXIT_STATUS=0
  52. set RM=del
  53. set ONSTATCMD=onstat
  54. set MAILBODY=%TEMP%\B_%RANDOM%_%EVENT_CLASS%
  55. set MAILHEAD=%TEMP%\H_%RANDOM%_%EVENT_CLASS%
  56. set TMPFILE=%TEMP%\1_%RANDOM%_%EVENT_CLASS%
  57. set TMPFILE2=%TEMP%\2_%RANDOM%_%EVENT_CLASS%
  58. set TMPFILE3=%TEMP%\3_%RANDOM%_%EVENT_CLASS%
  59. set SQLTMPFILE=%TEMP%\S_%RANDOM%_%EVENT_CLASS%
  60. set ALARMTESTFILE=
  61. SET DATE_INT=x
  62. SET TIME_INT=y
  63. SET COUNT=0
  64. rem /* Keep track of last 5 minuts alarm log */
  65. SET LASTALARMFILE=%DBTEMP%\.%INFORMIXSERVER%.alarm
  66. SET CURRENT=%TEMP%\alarm.current
  67. rem /* Get Format and delimiter information for data and time. */
  68. for /F "tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v iDate') do set "DATE_FORMAT=%%a"
  69. for /F "tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sDate') do set "DATE_DELIM=%%a"
  70. for /F "tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sTime') do set "TIME_DELIM=%%a"
  71. for /F "tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sDecimal') do set "DECIMAL_DELIM=%%a"
  72. rem /*Remove optional day in the beginning if it exists. */
  73. for %%x in (%DATE%) do set TODAY_DATE=%%x
  74. rem /*Make international date based on the format */
  75. for /F "tokens=1-3 delims=%DATE_DELIM% " %%x in ("%TODAY_DATE%") do (
  76. if %DATE_FORMAT%==0 set DATE_INT=%%z-%%x-%%y
  77. if %DATE_FORMAT%==1 set DATE_INT=%%z-%%y-%%x
  78. if %DATE_FORMAT%==2 set DATE_INT=%%x-%%y-%%z
  79. )
  80. rem /*Use international time and decimal delimiters to set time information */
  81. 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
  82. if %M%==00 (set MIN=0) else for /F "tokens=1 delims=0" %%x in ("%M%") do set MIN=%%x
  83. if %MIN% LSS 5 (set /A T5MINAGO=%TIMESTR% - 4500) else set /A T5MINAGO=%TIMESTR% - 500
  84. if NOT EXIST %LASTALARMFILE% goto BYPASS
  85. 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%
  86. if EXIST %CURRENT% move %CURRENT% %LASTALARMFILE%
  87. :BYPASS
  88. rem /* Check the validity for BACKUPLOGS */
  89. if "x%BACKUPLOGS%" == "x" goto bcklogsunset
  90. if "x%BACKUPLOGS%" == "xy" set BACKUPLOGS=Y
  91. goto endbcklogs
  92. :bcklogsunset
  93. rem /* if LTAPEDEV is set to NUL set it to N, if not set it to Y */
  94. %ONSTATCMD% -c | findstr "^LTAPEDEV" > %TMPFILE%
  95. for /F "tokens=2" %%x in ( %TMPFILE% ) do set LTAPEDEV=%%x
  96. if "x%LTAPEDEV%" == "xNUL" set BACKUPLOGS=N else set BACKUPLOGS=Y
  97. :endbcklogs
  98. rem In order to not to send incorrect mails, ALARMADMIN and ALARMPAGER
  99. rem Must be correctly configured, if they are out of range or unset,
  100. rem they will be reset to 0 (Deactivated)
  101. if "x%ALARMADMIN%" == "x" echo ALARMADMIN is unset, setting it to 0. & set ALARMADMIN=0
  102. if %ALARMADMIN% LSS 0 goto badadmin
  103. if %ALARMADMIN% GTR 5 goto badadmin
  104. goto ebadadmin
  105. :badadmin
  106. echo ALARMADMIN is out of range, reseting it to 0 from %ALARMADMIN%
  107. set ALARMADMIN=0
  108. :ebadadmin
  109. if x%ALARMPAGER% == x echo ALARMPAGER is unset, setting it to 0. & SET ALARMPAGER=0
  110. if %ALARMPAGER% LSS 0 goto badpager
  111. if %ALARMPAGER% GTR 5 goto badpager
  112. goto ebadpager
  113. :badpager
  114. echo ALARMPAGER is out of range, reseting it to 0 from %ALARMPAGER%
  115. set ALARMPAGER=0
  116. :ebadpager
  117. if %EVENT_SEVERITY% EQU 1 set EVENT_SEVERITY_NAME=trivia
  118. if %EVENT_SEVERITY% EQU 2 set EVENT_SEVERITY_NAME=information
  119. if %EVENT_SEVERITY% EQU 3 set EVENT_SEVERITY_NAME=Attention!
  120. if %EVENT_SEVERITY% EQU 4 set EVENT_SEVERITY_NAME=EMERGENCY!!
  121. if %EVENT_SEVERITY% EQU 5 set EVENT_SEVERITY_NAME=FATAL EVENT!!!
  122. rem Cleanup the mail header and the mail body file
  123. %RM% %MAILBODY% %MAILHEAD% %TMPFILE% 2>> nul
  124. rem /* Start of case */
  125. if %EVENT_CLASS% EQU 1 goto defhandler
  126. if %EVENT_CLASS% EQU 2 goto defhandler
  127. if %EVENT_CLASS% EQU 3 goto defhandler
  128. if %EVENT_CLASS% NEQ 4 goto nextto4
  129. rem /* CHUNK IS OFFLINE */
  130. echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  131. echo %EVENT_ADD_TEXT% >> %MAILBODY%
  132. echo. >> %MAILBODY%
  133. echo. >> %MAILBODY%
  134. call :drawseparator %MAILBODY%
  135. echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  136. call :drawseparator %MAILBODY%
  137. call :trimonstat "-d" %MAILBODY% 3
  138. call :drawseparator %MAILBODY%
  139. call :trimonstat "-m" %MAILBODY% 3
  140. :endchkoff
  141. goto endofcase
  142. :nextto4
  143. if %EVENT_CLASS% NEQ 5 goto nextto5
  144. rem /* DBSPACE IS OFF-LINE */
  145. echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  146. echo %EVENT_ADD_TEXT% >> %MAILBODY%
  147. echo. >> %MAILBODY%
  148. echo. >> %MAILBODY%
  149. call :drawseparator %MAILBODY%
  150. echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  151. call :drawseparator %MAILBODY%
  152. call :trimonstat "-d" %MAILBODY% 3
  153. call :drawseparator %MAILBODY%
  154. call :trimonstat "-m" %MAILBODY% 3
  155. :enddbsoff
  156. goto endofcase
  157. :nextto5
  158. if %EVENT_CLASS% NEQ 6 goto nextto6
  159. rem /* INTERNAL SUBSYSTEM FAILURE */
  160. echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  161. echo %EVENT_ADD_TEXT% >> %MAILBODY%
  162. echo. >> %MAILBODY%
  163. echo. >> %MAILBODY%
  164. rem /* Many things cause this problem see the online.log */
  165. call :drawseparator %MAILBODY%
  166. echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  167. call :drawseparator %MAILBODY%
  168. call :trimonstat "-m" %MAILBODY%
  169. :endintsub
  170. goto endofcase
  171. :nextto6
  172. if %EVENT_CLASS% EQU 7 goto defhandler
  173. if %EVENT_CLASS% EQU 8 goto defhandler
  174. if %EVENT_CLASS% EQU 9 goto defhandler
  175. if %EVENT_CLASS% EQU 10 goto defhandler
  176. if %EVENT_CLASS% EQU 11 goto defhandler
  177. if %EVENT_CLASS% EQU 12 goto defhandler
  178. if %EVENT_CLASS% EQU 13 goto defhandler
  179. if %EVENT_CLASS% EQU 14 goto defhandler
  180. if %EVENT_CLASS% EQU 15 goto defhandler
  181. if %EVENT_CLASS% EQU 16 goto defhandler
  182. if %EVENT_CLASS% NEQ 17 goto nextto17
  183. rem /* ARCHIVE FAILED */
  184. echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  185. echo %EVENT_ADD_TEXT% >> %MAILBODY%
  186. echo. >> %MAILBODY%
  187. echo. >> %MAILBODY%
  188. rem /* Try to get the stack trace for the ontape thread */
  189. call :drawseparator %MAILBODY%
  190. echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  191. call :drawseparator %MAILBODY%
  192. %ONSTATCMD% -g ath > %TMPFILE%
  193. findstr ontape %TMPFILE% > %TMPFILE2%
  194. findstr arcbackup1 %TMPFILE% >> %TMPFILE2%
  195. findstr arcbackup2 %TMPFILE% >> %TMPFILE2%
  196. for /f "tokens=1" %%x in ( %TMPFILE2% ) do call :trimonstat "-g stk %%x" %MAILBODY% 2 & call :drawseparator %MAILBODY%
  197. call :trimonstat "-g arc" %MAILBODY% 2
  198. :endarcfailed
  199. goto endofcase
  200. :nextto17
  201. if %EVENT_CLASS% EQU 18 goto defhandler
  202. if %EVENT_CLASS% NEQ 19 goto nextto19
  203. rem /* LOGICAL LOG BACKUP FAILED */
  204. echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  205. echo %EVENT_ADD_TEXT% >> %MAILBODY%
  206. echo. >> %MAILBODY%
  207. echo. >> %MAILBODY%
  208. rem /* Try to get the stack trace for all the ontape thread */
  209. call :drawseparator %MAILBODY%
  210. echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  211. call :drawseparator %MAILBODY%
  212. call :trimonstat "-g ath" %MAILBODY% 2
  213. call :drawseparator %MAILBODY%
  214. %ONSTATCMD% -g ath | findstr ontape > %TMPFILE2%
  215. for /f "tokens=1" %%x in ( %TMPFILE2% ) do call :trimonstat "-g stk %%x" %MAILBODY% 2 & call :drawseparator %MAILBODY%
  216. :endlogfailed
  217. goto endofcase
  218. :nextto19
  219. if %EVENT_CLASS% NEQ 20 goto nextto20
  220. rem /* LOGICAL LOGS ARE FULL */
  221. echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  222. echo %EVENT_ADD_TEXT% >> %MAILBODY%
  223. echo. >> %MAILBODY%
  224. echo. >> %MAILBODY%
  225. call :trimonstat "-l" %TMPFILE% 15
  226. findstr U- %TMPFILE% > %TMPFILE2%
  227. set OLDESLOG=4294967296
  228. for /f "tokens=4" %%x in ( %TMPFILE2% ) do if OLDESTLOG LSS %%x set OLDESTLOG=%%x
  229. call :trimonstat "-x" %TMPFILE2% 3
  230. findstr - active %TMPFILE2% > %TMPFILE%
  231. 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
  232. %ONSTATCMD% -l | find /C "U-B" > %TMPFILE%
  233. for /f "tokens=1" %%x in ( %TMPFILE% ) do set NUMLOGB=%%x
  234. if %NUMLOGB% EQU 0 echo LOGICAL LOGS NEED A BACKUP >> %MAILBODY% echo RUN 'onbar -b -l' OR 'ontape -a' OR 'ontape -c' >> %MAILBODY%
  235. echo. >> %MAILBODY%
  236. call :drawseparator %MAILBODY%
  237. echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  238. call :drawseparator %MAILBODY%
  239. call :trimonstat "-l" %MAILBODY% 2
  240. call :drawseparator %MAILBODY%
  241. call :trimonstat "-x" %MAILBODY% 2
  242. call :drawseparator %MAILBODY%
  243. call :trimonstat "-u" %MAILBODY% 2
  244. :endlogfull
  245. goto endofcase
  246. :nextto20
  247. if %EVENT_CLASS% EQU 21 goto defhandler
  248. if %EVENT_CLASS% NEQ 22 goto nextto22
  249. rem /* LONG TRANSACTION DETECTED */
  250. echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  251. REM #
  252. REM # The next line will print something like this:
  253. REM # Aborting Long Transaction: tx: 0x7000001dc3b88a0 username: gcastro uid: 30062
  254. REM #
  255. echo %EVENT_ADD_TEXT% >> %MAILBODY%
  256. for /F "tokens=5" %%x in ("%EVENT_ADD_TEXT%") do set TX_ADDR=%%x
  257. >> %MAILBODY% echo Tx Address = %TX_ADDR%:
  258. %ONSTATCMD% -x | findstr %TX_ADDR:~2% > %TMPFILE%
  259. >> %MAILBODY% type %TMPFILE%
  260. >> %MAILBODY% echo.
  261. for /F "tokens=3" %%x in (%TMPFILE%) do SET USER_ADDR=%%x
  262. >> %MAILBODY% echo Userthread Address = 0x%USER_ADDR%:
  263. %ONSTATCMD% -u | findstr %USER_ADDR% > %TMPFILE%
  264. >> %MAILBODY% type %TMPFILE%
  265. >> %MAILBODY% echo.
  266. for /F "tokens=3" %%x in (%TMPFILE%) do SET SESS_ID=%%x
  267. >> %MAILBODY% echo Session ID = %SESS_ID%:
  268. >> %MAILBODY% echo.
  269. call :trimonstat "-g ses %SESS_ID%" %MAILBODY% 2
  270. REM #
  271. REM # Trying to find other long transactions
  272. REM #
  273. >> %MAILBODY% echo.
  274. >> %MAILBODY% echo -------------------------------------"
  275. >> %MAILBODY% echo -
  276. >> %MAILBODY% echo - OTHER LONG TRANSACTIONS:
  277. >> %MAILBODY% echo -
  278. >> %MAILBODY% echo -------------------------------------
  279. >> %MAILBODY% echo.
  280. echo select "@", tx_id, trim(LEADING '0' from replace(lower(HEX(tx_owner)), "0x", "")), hex(tx_addr) from systrans where tx_longtx != 0 > %SQLTMPFILE%
  281. dbaccess sysmaster < %SQLTMPFILE% 2> nul | findstr @ > %TMPFILE%
  282. set /A LONGTXCOUNT=0
  283. for /F "tokens=2,3,4" %%x in ( %TMPFILE% ) do call :longtxcatch %%x %%y %%z & set /A LONGTXCOUNT+=1
  284. if %LONGTXCOUNT% NEQ 0 goto longtxtail
  285. >> %MAILBODY% echo NONE
  286. goto longtxtail
  287. :longtxcatch
  288. rem %1=TXID
  289. rem %2=TXOWNER
  290. rem %3=TXADDR
  291. set TMP1=%TEMP%\__lxt1
  292. call :drawseparator %MAILBODY%
  293. %ONSTATCMD% -u | findstr %2 > %TMP1%
  294. for /F "tokens=3" %%x in ( %TMP1% ) do set SESSID=%%x
  295. echo please check the information below about transaction TXID=%1 at %3 >>%MAILBODY%
  296. echo that was generated by session %SESSID%. >> %MAILBODY%
  297. echo. >> %MAILBODY%
  298. echo SESSION INFORMATION: >> %MAILBODY%
  299. call :trimonstat "-g ses %SESSID%" %MAILBODY% 2
  300. goto :eof
  301. :longtxtail
  302. call :drawseparator %MAILBODY%
  303. echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  304. call :drawseparator %MAILBODY%
  305. call :trimonstat "-x" %MAILBODY% 2
  306. call :drawseparator %MAILBODY%
  307. call :trimonstat "-l" %MAILBODY% 2
  308. call :drawseparator %MAILBODY%
  309. call :trimonstat "-m" %MAILBODY% 2
  310. :longtx
  311. goto endofcase
  312. :nextto22
  313. if %EVENT_CLASS% NEQ 23 goto nextto23
  314. rem /* LOGICAL LOG FILE COMPLETED */
  315. rem /* onbar assumes no operator is present, so all messages are written to the
  316. rem activity log and there shouldn't be any output, but send everything to
  317. rem NUL just in case */
  318. echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  319. echo %EVENT_ADD_TEXT% >> %MAILBODY%
  320. rem /* TO IMPLEMENT LATER
  321. rem If there is already a logical log backup don't launch onbar again. */
  322. if "x%BACKUPLOGS%" == "xY" goto dobackup
  323. echo "Script will not backup the logical logs."
  324. goto nobackup
  325. :dobackup
  326. call %BACKUP_CMD% 2>&1 > NUL
  327. rem /* 0 means BACKUP_CMD was successful */
  328. if ERRORLEVEL 1 goto ERROR
  329. if ERRORLEVEL 0 goto SUCCESS
  330. goto backcmddone
  331. :ERROR
  332. set EXIT_STATUS=1
  333. goto backcmddone
  334. :SUCCESS
  335. set EXIT_STATUS=0
  336. :backcmddone
  337. echo '%BACKUP_CMD%' has been executed and returned CODE=%EXIT_STATUS% >> %MAILBODY%
  338. echo. >> %MAILBODY%
  339. :nobackup
  340. rem /* Now check if the logs are near to fill up */
  341. %ONSTATCMD% -l | find /C "U-B" > %TMPFILE%
  342. for /F "tokens=1" %%x in (%TMPFILE%) do set NUMLOGUB=%%x
  343. %ONSTATCMD% -l | find /C "F-" > %TMPFILE%
  344. for /F "tokens=1" %%x in (%TMPFILE%) do set NUMLOGF=%%x
  345. %ONSTATCMD% -l | find /C "A-" > %TMPFILE%
  346. for /F "tokens=1" %%x in (%TMPFILE%) do set NUMLOGA=%%x
  347. %ONSTATCMD% -l | find /V "U-B" | find /C "U-" > %TMPFILE%
  348. for /F "tokens=1" %%x in (%TMPFILE%) do set NUMLOGU=%%x
  349. set /A NUMLOG=%NUMLOGU%+%NUMLOGA%+%NUMLOGF%
  350. set /A PERC=(100*(%NUMLOGUB%+%NUMLOGF%+%NUMLOGA%))/%NUMLOG%
  351. if %PERC% GTR 10 goto endlogcomplete
  352. set /A PERC=100-%PERC%
  353. call :drawseparator %MAILBODY%
  354. echo WARNING : MORE THAN 90 PERCENT (%PERC% percent) OF THE LOGICAL LOGS ARE FULL >> %MAILBODY%
  355. echo A LOGICAL LOG BACKUP IS NEEDED. SEE INFO BELOW >> %MAILBODY%
  356. echo. >> %MAILBODY%
  357. call :drawseparator %MAILBODY%
  358. echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  359. call :drawseparator %MAILBODY%
  360. call :trimonstat "-l" %MAILBODY% 2
  361. :endlogcomplete
  362. goto endofcase
  363. :nextto23
  364. if %EVENT_CLASS% EQU 24 goto defhandler
  365. if %EVENT_CLASS% EQU 25 goto defhandler
  366. if %EVENT_CLASS% NEQ 26 goto nextto26
  367. rem /* LOG FILE DYNAMICALLY ADDED */
  368. echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  369. for /F "tokens=5,8 usebackq" %%x in ( `echo %EVENT_ADD_TEXT%` ) do set /A LOGNUM=%%x & set /A DBSNUM=%%y
  370. echo select '@', number, trunc(physloc/1048576), lower(hex(physloc)), size from syslogfil where number = %LOGNUM%; > %SQLTMPFILE%
  371. dbaccess sysmaster < %SQLTMPFILE% 2> nul | findstr @ > %TMPFILE%
  372. for /F "tokens=2,3,4,5" %%a in ( %TMPFILE% ) do set LOG=%%a & set CHKNUM=%%b & set PHYSLOC=%%c & set SIZE=%%d
  373. echo select name as dbsname from sysdbspaces d where dbsnum = %DBSNUM%; > %SQLTMPFILE%
  374. dbaccess sysmaster < %SQLTMPFILE% 2> nul | findstr dbsname > %TMPFILE%
  375. for /F "tokens=2" %%x in ( %TMPFILE% ) do set DBSNAME=%%x
  376. echo Logical log file number %LOGNUM% has been dynamically added by >> %MAILBODY%
  377. echo the engine; the log was added to Chunk Number %CHKNUM% in dbspace '%DBSNAME%' >> %MAILBODY%
  378. echo please check free space on this dbspace and the process that >> %MAILBODY%
  379. echo generated this event. >> %MAILBODY%
  380. call :drawseparator %MAILBODY%
  381. echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  382. call :drawseparator %MAILBODY%
  383. call :trimonstat "-l" %MAILBODY% 2
  384. call :drawseparator %MAILBODY%
  385. call :trimonstat "-d" %MAILBODY% 2
  386. :endlogdyn
  387. goto endofcase
  388. :nextto26
  389. if %EVENT_CLASS% NEQ 27 goto nextto27
  390. rem /* LOG FILE REQUIERED */
  391. echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  392. echo %EVENT_ADD_TEXT% >> %MAILBODY%
  393. call :drawseparator %MAILBODY%
  394. echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  395. call :drawseparator %MAILBODY%
  396. call :trimonstat "-l" %MAILBODY% 2
  397. call :drawseparator %MAILBODY%
  398. call :trimonstat "-d" %MAILBODY% 2
  399. :endlogreq
  400. goto endofcase
  401. :nextto27
  402. if %EVENT_CLASS% NEQ 28 goto nextto29
  403. rem /* NO SPACE AVAILABLE FOR DINAMIC LOG */
  404. echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  405. echo %EVENT_ADD_TEXT% >> %MAILBODY%
  406. call :drawseparator %MAILBODY%
  407. echo RELATED INFORMATION: >> %MAILBODY% & echo. >> %MAILBODY%
  408. call :drawseparator %MAILBODY%
  409. call :trimonstat "-d" %MAILBODY% 2
  410. call :drawseparator %MAILBODY%
  411. call :trimonstat "-l" %MAILBODY% 2
  412. call :drawseparator %MAILBODY%
  413. call :trimonstat "-m" %MAILBODY% 2
  414. :enddynnospace
  415. goto endofcase
  416. :nextto29
  417. rem /*
  418. rem I could use defhandler instead of enddynnospace, but this could lead a problems
  419. rem if the amount of events get increased and someone forgets to change the label
  420. rem */
  421. :defhandler
  422. rem /************************************************************************
  423. rem If you implement a specific handler for 29 put it before this label
  424. rem with this implementation any future event will have a default handler.
  425. rem ************************************************************************/
  426. echo Subject: %INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% >> %MAILHEAD%
  427. echo %EVENT_ADD_TEXT% >> %MAILBODY%
  428. :endofcase
  429. rem /* End of case */
  430. set NOSENDER=1
  431. rem /* Send e-mail to who may be interested */
  432. if %ALARMADMIN% EQU 0 goto eadmin
  433. if %EVENT_SEVERITY% LSS %ALARMADMIN% goto lssadmin
  434. if "x%ADMINEMAIL%" == "x" goto eadmin
  435. echo To: %ADMINEMAIL% >> %MAILHEAD%
  436. set MAILTO=%ADMINEMAIL%
  437. set NOSENDER=0
  438. goto eadmin
  439. :lssadmin
  440. echo Event Severity = %EVENT_SEVERITY% is lower than ALARMADMIN=%ALARMADMIN%
  441. echo No mail will be sent to ALARMEMAIL
  442. :eadmin
  443. if %ALARMPAGER% EQU 0 goto eapager
  444. if %EVENT_SEVERITY% LSS %ALARMPAGER% goto lsspager
  445. if "x%PAGEREMAIL%" == "x" goto :eapager
  446. if %NOSENDER% EQU 0 echo cc: %PAGEREMAIL% >> %MAILHEAD% & set MAILTO=%MAILTO% %PAGEREMAIL% & goto eapager
  447. echo To: %PAGEREMAIL% >> %MAILHEAD%
  448. set MAILTO=%PAGEREMAIL%
  449. goto :eapager
  450. :lsspager
  451. echo Event Severity = $EVENT_SEVERITY is lower than ALARMPAGER=%ALARMPAGER%
  452. echo No mail will be sent to PAGEREMAIL
  453. :eapager
  454. if "x%MAILTO%" == "x" echo SENDER IS NULL NO MAIL WILL BE SENT. & goto endprog
  455. rem /* send mail */
  456. if "x%ALARMPROGRAMTEST%" == "x" goto tomail
  457. type %MAILBODY% >> %ALARMTESTFILE%
  458. goto endprog
  459. :tomail
  460. if "x%MAILUTILITY%" == "x" echo MAILUTILITY is not set, NO MAIL will be sent. & goto endprog
  461. REM /* Do not send same alarm in less than 5 minute intervel. */
  462. if NOT EXIST %LASTALARMFILE% echo. > %LASTALARMFILE%
  463. TYPE %LASTALARMFILE% | FIND /C "%EVENT_MSG%" > %TMPFILE3%
  464. for /f "tokens=1" %%x in ( %TMPFILE3% ) do set COUNT=%%x
  465. if %COUNT% GEQ 1 goto endprog
  466. %MAILUTILITY% -h %POPSERVER% -f %SENDER% -s "%INFORMIXSERVER% : %EVENT_SEVERITY_NAME% : %EVENT_MSG% " %MAILTO% < %MAILBODY% >> NUL 2>&1
  467. goto :endprog
  468. :trimonstat
  469. rem /* %1 = onstat options */
  470. rem /* %2 = output file */
  471. rem /* %3 = amount of lines to trim from the begining */
  472. set TAILFILE=%RANDOM%
  473. set TMP1=%TEMP%\t1%RANDOM%
  474. set TMP2=%TEMP%\t2%RANDOM%
  475. echo 1,%3d > %TAILFILE%
  476. echo e >> %TAILFILE%
  477. echo q >> %TAILFILE%
  478. echo y >> %TAILFILE%
  479. %ONSTATCMD% %~1 > %TMP1%
  480. findstr /V Blocked: %TMP1% > %TMP2%
  481. findstr /V Block: %TMP2% > %TMP1%
  482. edlin %TMP1% < %TAILFILE% > nul
  483. type %TMP1% >> %2
  484. %RM% %TMP1% %TMP2% %TAILFILE%
  485. goto :eof
  486. :drawseparator
  487. rem /* %1 = output file */
  488. echo ------------------------------------- >> %1
  489. echo. >> %1
  490. goto :eof
  491. :checklongtx
  492. rem /* %1 = Oldest logical log */
  493. rem /* %2 = Output file */
  494. rem /* %3 = Tx address */
  495. rem /* %5 = Userthread */
  496. rem /* %7 = LogBegin */
  497. set TMP1=%TEMP%\l1%RANDOM%
  498. set TMP2=%TEMP%\l2%RANDOM%
  499. if %7 NEQ %1 goto :eof
  500. rem /* A long transaction has ocurred, get the culprit one */
  501. call :trimonstat "-u" %TMP1% 2
  502. findstr %5 %TMP1% > %TMP2%
  503. for /f "tokens=3" %%x in ( %TMP2% ) do set SESSID=%%x
  504. echo A LONG TRANSACTION has filled the Logical Logs, please check >> %2
  505. echo the next information about transaction 0x$ADDRESS that was generated >> %2
  506. echo by session $SESSID. >> %2
  507. echo. >> %2
  508. echo. >> %2
  509. echo SESSION INFORMATION: >> %2
  510. call :trimonstat "-g ses %SESSID%" %2 2
  511. %RM% %TMP1% %TMP2%
  512. goto :eof
  513. :endprog
  514. echo %DATE_INT% %TIME_INT% %EVENT_MSG% >> %LASTALARMFILE%
  515. %RM% %MAILHEAD% %MAILBODY% %TMPFILE% %TMPFILE2% %TMPFILE3% %SQLTMPFILE%
  516. SET BACKUPLOGS=
  517. SET ALARMADMIN=
  518. SET ALARMPAGER=
  519. SET ADMINEMAIL=
  520. SET PAGEREMAIL=
  521. SET MAILUTILITY=
  522. SET POPSERVER=
  523. SET SENDER=
  524. set ALRM_NOTWORTHY=
  525. set ALRM_INFO=
  526. set ALRM_ATTENTION=
  527. set ALRM_EMERGENCY=
  528. set ALRM_FATAL=
  529. rem /* input parameters */
  530. set EVENT_SEVERITY=
  531. set EVENT_CLASS=
  532. set EVENT_MSG=
  533. set EVENT_ADD_TEXT=
  534. set EVENT_FILE=
  535. set BACKUP_CMD=
  536. set RM=
  537. set ONSTATCMD=
  538. set MAILBODY=
  539. set MAILHEAD=
  540. set TMPFILE=
  541. set TMPFILE2=
  542. set TMPFILE3=
  543. set SQLTMPFILE=
  544. set EXIT_STATUS=