Vor einigen Tagen erreichte mich eine Anfrage zu einem Scripting-Problem von einem unserer langjährigen Partner, um genau zu sein unserem DCP Marc Handel von der IT unlimited AG, die wir nach ein paar Mails dann auch lösen könnten. Im Austausch mit Marc habe ich erkannt, dass seine Idee den Enterprise Alert Scripting Host, den Windows Task Scheduler und CheckMK zu nutzen, um eine Roundtrip Überwachung zu realisieren auch für die gesamte Community interessant sein könnte. Insbesondere für alle unsere CheckMK Kunden.
Die Idee für den Roundtrip Check war, dass alle CheckMK Server einen API-Call an EA absetzen und eine Alarmierungsrichtlinie auf diese Events hin ein Skript triggert. Die Aufgabe des Scripts soll sein, lokal auf dem EA Server in ein Logfile zu schreiben – dieses Log soll dann überwacht werden und ein Alarm erzeugen sollte das Logfile nicht mehr aktualisiert werden.
Marc hat das in etwa wie unten beschrieben für seinen Kunden umgesetzt:
- In Check MK wurde ein regelmäßig triggerndes Event aufgesetzt das regelmäßig API-Calls an Enterprise Alert absetzt.
- In Enterprise Alert wurde eine Richtlinie erstellt die den eventcheck.js Skript triggert
/* This script handles all incoming messages for all message types from the message master kernel. This script then replies with a confirmation message, notifying the user that message master has received the message. */ function OnNewEvent(objMsg) { EAScriptHost.LogInfo("OnNewEvent - write log entry for checkMK API calls"); var strServer = objMsg.GetEventParameter("Hostname"); EAScriptHost.LogDebug("get Hostname: strServer :" + strServer); var object = new ActiveXObject("Scripting.FileSystemObject"); var file = object.OpenTextFile("E:\\EventCheck\\Eventcheck_hostname_"+strServer+".txt", 8, true); //var file = object.OpenTextFile("E:\\EventCheck\\Eventcheck_checkMK.txt", 8, true); EAScriptHost.LogDebug("+ + + write to log: " + displayTime() + " - E:\\EventCheck\\Eventcheck_hostname_" + strServer + ".txt") file.WriteLine(displayTime() + ' checkMK API call received from ' + strServer); file.Close(); //EAScriptHost.Display(objMsg.GetXml()); //HandleMessageReply(objMsg); //HandleTimeStampUpdate(); } // Sends a confirmation message back to the originator of the message function HandleMessageReply(objMsg) { var objAnswer = objMsg.CreateAnswer(); if (objAnswer != null) { objAnswer.SetProperty("mm_body", "Confirmed message receipt: " + objMsg.GetProperty("mm_body")) objAnswer.Send(); } } // Updates Timestamp of external Tracking file - now done in OnNewEvent function HandleTimeStampUpdate() { EAScriptHost.LogInfo("HandleTimeStamp"); var object = new ActiveXObject("Scripting.FileSystemObject"); //var strServer = eventObject.GetEventParameter("Hostname"); //var file = object.OpenTextFile("E:\\EventCheck\\Eventcheck_"+strServer+".txt", 8, true); var file = object.OpenTextFile("E:\\EventCheck\\Eventcheck_checkMK.txt", 8, true); EAScriptHost.LogDebug("write to log:" + file) file.WriteLine(displayTime() + ' checkMK API call received'); file.Close(); } function displayTime() { EAScriptHost.LogInfo("displayTime"); var str = ""; var now= new Date(), h= now.getHours(), m= now.getMinutes(), s= now.getSeconds(); date = now.getDate(); month = now.getMonth() + 1; //Months are zero based year= now.getFullYear(); if(h<10) h= '0'+h; if(m<10) m= '0'+m; if(s<10) s= '0'+s; if(date<10) date= '0'+date; if(month<10) month= '0'+month; str = date+'-'+month+'-'+year+' '+h+':'+m+':'+s; EAScriptHost.LogInfo("Time:" + str); return str; }
bat file
echo + + + %DATE% %TIME% checking fileage of all files in E:\Eventcheck_hostname*.txt >> E:\Eventcheck_checkMK.log for %%f in (E:\Eventcheck_hostname*.txt) do ( echo DEBUG: checking fileage for file: %%f for /f "tokens=3 delims=_" %%b in ("%%f") do ( for /f "tokens=1 delims=." %%c in ("%%b") do ( cscript //nologo E:\Eventcheck.vbs %%f %%c >> E:\Eventcheck_checkMK.log )))
- Im Windows Task Scheduler wurde nun ein Task angelegt der regelmäßig das untenstehende VBS Skript ausführt und somit überprüft, ob das Log durch das JS geupdatet wurde.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' FileAge.vbs ' This script calculates the age of a file in days. ' If you want the results in hours, change d in the line strdateDiff to h. ' ' USAGE: fileage.vbs file_to_check.txt ' execute this .bat file using the task-schedulrer: ' cscript //nologo E:\Eventcheck\EventCheck_checkMK.vbs E:\Eventcheck\Eventcheck_checkMK.txt checkMK >> E:\Eventcheck\Eventcheck_checkMK.log ' export LANG=en_US.UTF-8 Option Explicit Dim FSO, File, strDateDiff, strOld, strFile, objArguments, strServer ' Zeit bis ein Alarm ausgeloest wird wenn Log nicht aktualisiert wurde (eg. 30 Min) dim intAgeInMinutes intAgeInMinutes = 120 Set objArguments = WScript.Arguments If(objArguments.Count < 2) Then Call Usage() End If strFile = objArguments(0) strServer = objArguments(1) Set FSO = CreateObject("Scripting.FileSystemObject") Set File = FSO.GetFile(strFile) strOld = File.DateLastModified strDateDiff = DateDiff("n", strOld, Now) Wscript.Echo strDateDiff & " minutes - file: " & strFile & " (max. " & intAgeInMinutes & " min.)" if (strDateDiff > intAgeInMinutes) then SendEAAlert("DerDack is missing Events from " & strServer & " since " & strDateDiff & " Minutes") end if Wscript.Quit(1) sub SendEAAlert(strText) dim strCommand strCommand = """C:\Program Files\Enterprise Alert\CommandLine\CommandLineClient.exe"" -event_text """ & strText & """" Dim objShell Set objShell = WScript.CreateObject( "WScript.Shell" ) objShell.Run(strCommand) Set objShell = Nothing end sub Sub Usage() WScript.Echo "Usage:" & vbNewLine & vbNewLine &_ "Fileage Name_of_File" & _ vbNewLine & vbNewline & "E.g. Fileage c:\temp\log.txt" WScript.Quit(0) End Sub
- Wenn das NICHT passiert, wird ein Event mit der Meldung „no new Event from Server xyz received” in Enterprise Alert ausgelöst, welches wiederum eine Alarmierung an Administratoren auslöst.
Natürlich lässt sich diese Überwachung auch ohne weiteres auf andere Quellsysteme übertragen. In diesem Fall war es CheckMK weil dort gerade ein entsprechendes Projekt umgesetzt wurde. Entscheidend für das Setup ist die Möglichkeit regelmäßig API-Calls oder zumindest Nachrichten an Enterprise Alert abzusetzen sowie das vorhanden sein des Enterprise Alert Scripting Hosts.
Zusammenfassung
Nichts ist schlimmer als die Ungewissheit, ob das Monitoring der IT noch funktioniert oder nicht. Mit dem beschriebenen Setup können Sie sich diese Sorgen ersparen und entspannter in die Bereitschaft gehen. Sie wissen, dass sich Enterprise Alert Ihnen zuverlässig melden würde, wenn es ein Problem gibt in ihrer Infrastruktur gibt. Gleichzeitig erlaubt das komplexe Setup gleich mehrere andere Komponenten mit zu überwachen. Wenn sie ein solches Monitoring auch für ihre Systeme haben wollen oder Fragen zu dem beschriebenen Szenario haben können sie sich gerne an uns wenden unter support@de.derdack.com.