This is a much usefull plugin that can verify the Windows Event Viewer via nagios remote check
I tested using the NC_NET on Windows 2003 and 2000. There is one tweek that needs to be done for
it to work under windows 2000.
After trying many of the available and complicated ways to do this, I decided to write my own
and share with everyone! 🙂
Important this script requires the Microsoft tool:
dumpel.exe
check_events.vbs
The syntax is simple:
From nagios do:
./check_nt -H server10 -t 50 -v RUNSCRIPT -l “cscript.exe //nologo C:PROGRA~1NC_Netscriptcheck_events.vbs -t System -e 4097 -s DrWatson
OK – No Error(s) found today, for eventID: 4097 , System
Here is the script.
'Get Event Viewer Filering by: event,source,id, USING: dumpel.exe 'Be able to get Multiple Evens from Multiple Servers(servers array ?) events in array (?) 'NOTES: dumpel.exe is much faster then WMI or LogParser API 'Author: Felipe Ferreira 'Adapted to Nagios '1. Get all arguments from cmd '2. Count output of each line of the dumplog '3. Calculate the Warning / Critical / OK '3. Output in the format: 'ex: Found XE event of the type XT and ID XI in the last XT minutes | EventsFound XE : Warn : Crit Option Explicit Dim t1 : t1 = Timer 'time the script dim strScriptFile : strScriptFile = WScript.ScriptFullname dim strScriptPath : strScriptPath = Left(strScriptFile, Len(strScriptFile) - Len(WScript.Scriptname)) Dim EventDumpPath : EventDumpPath = strScriptPath ' WHERE LOG FILE WILL STAY Dim ofso : Set ofso = CreateObject("Scripting.FileSystemObject") Dim blnErrorFound : blnErrorFound = false Dim EventDumplog, strLine, strBody, Server, strLogFile Dim intLineCnt Dim eType,eType2,eSource,eError,eServer,eDays Dim verbose Dim argcountcommand Dim arg(25) '# EDIT HERE # EDIT HERE # EDIT HERE verbose="0" 'eType="System" 'eSource="Srv" 'eError="2022" eServer="localhost" eDays="1" GetArgs() if(argcountcommand >= 4) then eType = GetOneArg("-t") 'Type, Application,System, eError = GetOneArg("-e") 'ID eSource = GetOneArg("-s") 'Source else 'call help() 'wscript.quit(3) end if '# EDIT HERE # EDIT HERE # EDIT HERE # 'FUNCTION CALLS: (eType,eSource,eError,eServer,eDays) Application, Id, Type call pt( "Checking: " & eServer & " Event Source: " & eSource & " EventID: " & eError & " " & eType) call Execute(eType,eSource,eError,eServer,eDays) call CheckifError(EventDumpLog) if (blnErrorFound = true) then wscript.echo "CRITICAL - " & intLineCnt & " Error(s) where found |EventErros=" & intLineCnt else wscript.echo "OK - No Error(s) found today, for eventID: " & eError & " , " & eType & "| EventErros=0" end if '__________________________________FUNCNTIOS AND SUBS_________________________ Function Execute(eType,eSource,eError,eServer,eDays) 'on error resume next blnErrorFound = False EventDumplog = eServer & "_" & eError & ".log" dim strCmd,strCmdOut dim objShell : Set objShell = WScript.CreateObject("WScript.Shell") strCmd = strScriptPath & "dumpel.exe -f " & EventDumpLog & " -l " & eType & " -m " & eSource & " -e " & eError & " -s " & eServer & " -d " & eDays pt(strCmd) Dim objExecObject : Set objExecObject = objShell.Exec(strCmd) 'MUST GET STDOUT, SOMETIMES APP DONT RUN! Do While objExecObject.Status <> 1 'wscript.sleep 20 'Wscript.StdOut.Write(".") Loop 'if err.number = 0 and objExecObject.Status = 1 then 'end if end function sub CheckIfError(strLogFile) 'Looks into Log folder if any .log and not 0kb turn ErrorFound=true that will zip and send email on error resume next Dim ofso,dumpFile,f Dim fso Const ForReading = 1 intLineCnt=0 pt("Checking for errors: " & strLogFile) set fso = CreateObject("Scripting.FileSystemObject") Set ofso = CreateObject("Scripting.FileSystemObject") Set dumpFile = ofso.OpenTextFile(strLogFile, ForReading) 'pt dumpFile.size 'GET FILE SIZE If ofso.FileExists(strLogFile) Then Set f = ofso.GetFile(strLogFile) pt "Arquivo " & strLogFile & " = " & f.Size & " kb" 'displays size of file If (f.size = 0) Then pt "No errors found" dumpFile.close f.delete else Do Until dumpFile.AtEndOfStream strLine = dumpFile.ReadLine intLineCnt = intLineCnt + 1 pt strLine blnErrorFound = True loop end if 'File Dump Size Check else pt "Arquivo " & strLogFile & " nao existe" end if end sub Function GetArgs() 'Get ALL arguments passed to the script On Error Resume Next Dim i argcountcommand=WScript.Arguments.Count for i=0 to argcountcommand-1 arg(i)=WScript.Arguments(i) p i & " - " & arg(i) next End Function Function GetOneArg(strName) On Error Resume Next Dim i for i=0 to argcountcommand-1 if (Ucase(arg(i))=Ucase(strName)) then GetOneArg=arg(i+1) Exit Function end if next End Function Function pt(msgTxt) if verbose = "1" then wscript.echo msgtxt end if end function
Thanks Felipe for the great script.
But how should I configure the servie in /usr/local/nagios/etc/objects/windows.cfg ?
Is this correct?
define service{
use generic-service
host_name oitayelet
service_description Run Script
check_command check_nt!RUNSCRIPT!-l
Hi, what about using some batch or script to monitor the size of it (event viewer for example the “Application” file )?
Good day people!