Restart a service checking a pattern in the event log and sending an e-mail to the xxxx@xxxx.com.
' ----- ExeScript Options Begin ----- ' ScriptType: window,activescript,administrator ' DestDirectory: current ' CommandLine: -c 112 -p "3 / 10" -l Application -e "1 / 10" ' Icon: default ' 32Bit: yes
' Author: Babu Dhinakaran S ' ----- ExeScript Options End ----- 'On Error Resume Next Dim subStr Dim Return1,Return2 Const CONVERT_TO_LOCAL_TIME = True Dim strServiceName Dim eCode Dim patternMatch Dim logFile Dim aeCode, apatternMatch, alogFile Dim dtmStartDate Dim Flag aeCode = Wscript.Arguments.Item(0) eCode = CInt(Wscript.Arguments.Item(1)) apatternMatch = Wscript.Arguments.Item(2) patternMatch = Wscript.Arguments.Item(3) alogFile = Wscript.Arguments.Item(4) logFile = Wscript.Arguments.Item(5) aerrorPattern = Wscript.Arguments.Item(6) errorPattern = Wscript.Arguments.Item(7) 'Wscript.Echo "aeCode"&aeCode 'Wscript.Echo "eCode"&eCode 'Wscript.Echo "apatternMatch"&apatternMatch 'Wscript.Echo "alogFile"&alogFile 'Wscript.Echo "logFile"&logFile 'Wscript.Echo "aerrorPattern"&aerrorPattern 'Wscript.Echo "errorPattern"&errorPattern If aeCode = "-c" and apatternMatch = "-p" and alogFile = "-l" and aerrorPattern = "-e" Then Set objFSO = CreateObject("Scripting.FileSystemObject") fileName = "C:\Program Files\NSClient++\scripts\" & logFile & "_ "& ecode & ".txt" fileName2 = "C:\Program Files\NSClient++\scripts\" & logFile & "_ "& ecode & "_flag"&".txt" 'Wscript.Echo "FileName:" & fileName 'The Below File or fileName variable holds the TimeStamp of the EventLog If objFSO.FileExists(fileName) Then 'Wscript.Echo "File Exists" Set objTextFile = objFSO.OpenTextFile(fileName, 1) Do Until objTextFile.AtEndOfStream dtmStartDate = objTextFile.Readline 'Wscript.Echo " DtmStartDate:" & dtmStartDate Loop Else Set objTextFile = objFSO.CreateTextFile(fileName, true) Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime") dtmStartDate.SetVarDate (CDate (now)) 'Wscript.Echo "File Doesn't exists create one" objTextFile.WriteLine(dtmStartDate) 'Wscript.Echo " DtmStartDate:" & dtmStartDate 'objTextFile.Close() End If 'The below file holds the Flag value and initially the flag is set to 0 stating there were no error found If objFSO.FileExists(fileName2) Then 'Wscript.Echo "File Exists" Set objTextFile1 = objFSO.OpenTextFile(fileName2, 1) Do Until objTextFile1.AtEndOfStream flag = CInt(objTextFile1.Readline) 'Wscript.Echo "File Exists:" & flag Loop Else Set objTextFile1 = objFSO.CreateTextFile(fileName2, true) 'Wscript.Echo "File Doesn't exists create one and set falg to 0" objTextFile1.WriteLine("0") 'objTextFile1.Close() End If strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate,(Security)}!\\" _ & strComputer & "\root\cimv2") 'Set the event code in the below WMI Query such as 112 or 113 Set colEvents = objWMIService.ExecQuery _ ("Select * from Win32_NTLogEvent Where Logfile = '" & logFile & "' and " & " TimeWritten > ' " & dtmStartDate & " ' and EventCode=" & eCode & "") 'Wscript.Echo logFile 'Wscript.Echo eCode 'Wscript.Echo dtmStartDate If Err.Number <> 0 Then 'WScript.Echo "Error: " & Err.Number 'WScript.Echo "Error (Hex): " & Hex(Err.Number) 'WScript.Echo "Source: " & Err.Source 'WScript.Echo "Description: " & Err.Description Err.Clear Wscript.Echo "Unable to Access the remote Server" Wscript.Quit(3) Else If flag = 0 Then For each objEvent in colEvents 'Wscript.Echo "Category: " & objEvent.Category 'Wscript.Echo "Computer Name: " & objEvent.ComputerName 'Wscript.Echo "Event Code: " & objEvent.EventCode 'Wscript.Echo "Message: " & objEvent.Message subStr = objEvent.Message 'Wscript.Echo "Message:" & subStr 'Wscript.Echo "Record Number: " & objEvent.RecordNumber 'Wscript.Echo "Source Name: " & objEvent.SourceName 'Wscript.Echo "Time Written: " & objEvent.TimeWritten 'Wscript.Echo "Event Type: " & objEvent.Type 'Wscript.Echo "User: " & objEvent.User 'Wscript.Echo objEvent.LogFile 'Prepare a regular expression object strServiceName = objEvent.SourceName dateWritten = objEvent.TimeWritten 'Wscript.Echo "Date Written:" & dateWritten Set myRegExp = New RegExp myRegExp.IgnoreCase = True myRegExp.Global = True myRegExp.Pattern = errorPattern 'Wscript.Echo "errorPattern:" & errorPattern ' Echo for each match Set myMatches = myRegExp.Execute(subStr) If myMatches.count > 0 Then 'Wscript.Echo "Service will be restarted:" &strServiceName 'Set the New Time Stamp Set objTextFile = objFSO.CreateTextFile(fileName, true) 'Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime") 'dtmStartDate.SetVarDate (dateWritten) 'Wscript.Echo "ErrorPattern Date:" & dateWritten objTextFile.WriteLine(dateWritten) 'objTextFile.Close() 'Set the New Flag 1 if a match is found for errorPattern Set objTextFile1 = objFSO.CreateTextFile(fileName2, true) 'Wscript.Echo "File Doesn't exists create one" objTextFile1.WriteLine("1") 'objTextFile1.Close() Wscript.Echo "System has entered in CRITICAL State of /10" 'For Each myMatch in myMatches ' Wscript.Echo myMatch.Value, "Found Match" ' Wscript.Echo "---------------------------------------------------------------" ' Next Wscript.Quit(2) Else 'don't do anything let it to loop till the match End If Next Wscript.Echo "System has not entered in CRITICAL State of /10" Wscript.Quit(0) End If If flag = 1 Then For each objEvent in colEvents 'Wscript.Echo "Category: " & objEvent.Category 'Wscript.Echo "Computer Name: " & objEvent.ComputerName 'Wscript.Echo "Event Code: " & objEvent.EventCode 'Wscript.Echo "Message: " & objEvent.Message subStr = objEvent.Message 'Wscript.Echo "Message:" & subStr 'Wscript.Echo "Record Number: " & objEvent.RecordNumber 'Wscript.Echo "Source Name: " & objEvent.SourceName 'Wscript.Echo "Time Written: " & objEvent.TimeWritten 'Wscript.Echo "Event Type: " & objEvent.Type 'Wscript.Echo "User: " & objEvent.User 'Wscript.Echo objEvent.LogFile 'Prepare a regular expression object strServiceName = objEvent.SourceName dateWritten = objEvent.TimeWritten 'Wscript.Echo "Date Written:" & dateWritten Set myRegExp = New RegExp myRegExp.IgnoreCase = True myRegExp.Global = True myRegExp.Pattern = patternMatch 'Wscript.Echo "Pattern Match:" & patternMatch ' Echo for each match Set myMatches = myRegExp.Execute(subStr) If myMatches.count > 0 Then 'Set the New Time Stamp Set objTextFile = objFSO.CreateTextFile(fileName, true) 'Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime") 'dtmStartDate.SetVarDate (dateWritten) 'Wscript.Echo "Pattern Date:" & dateWritten objTextFile.WriteLine(dateWritten) 'objTextFile.Close() 'Set the New Flag 0 if a match is found for patternMatch Set objTextFile1 = objFSO.CreateTextFile(fileName2, true) objTextFile1.WriteLine("0") 'objTextFile1.Close() 'For Each myMatch in myMatches 'Wscript.Echo myMatch.Value, "Found Match" 'Wscript.Echo "---------------------------------------------------------------" 'Next 'Restart the Service and Send an successful or unsccessful message accordingly Set objMessage = CreateObject("CDO.Message") objMessage.From = "no-reply@cmcmarkets.com" objMessage.To = "b.dhinakaran@cmcmarkets.com" objMessage.Cc = "t.welsh@cmcmarkets.com" objMessage.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 objMessage.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.cmc.local" objMessage.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 objMessage.Configuration.Fields.Update Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name ='" & strServiceName & "'") If Err.Number <> 0 Then 'WScript.Echo "Error: " & Err.Number 'WScript.Echo "Error (Hex): " & Hex(Err.Number) 'WScript.Echo "Source: " & Err.Source 'WScript.Echo "Description: " & Err.Description Err.Clear objMessage.Subject = "Unable to invoke object to restart the service:" & strServiceName mailbody = "Please check to why this was not restarted automatically or manually restart the Service" objMessage.TextBody = mailbody objMessage.Send Wscript.Quit(3) Else 'Stop Service For Each objService in colListOfServices Return1 = objService.StopService() If Return1 <> 0 Then 'Wscript.Echo "Failed to Stop the Service and the Error code = " & Return1 objMessage.Subject = "Service didn't respond for Stop Signal:" & strServiceName mailbody = "Please check to why this was not restarted automatically or manually restart the Service" objMessage.TextBody = mailbody objMessage.Send Wscript.Quit(2) End If Next Wscript.Sleep(20000) 'Sleep for 20 seconds before starting a service. 'Start Service For Each objService in colListOfServices Return2 = objService.StartService() If Return2 <> 0 Then Wscript.Echo "Failed to Start the Service and the Error code = " & Return2 objMessage.Subject = "Service didn't respond for Start Signal after the Stop:" & strServiceName mailbody = "Please check to why this was not restarted automatically or manually restart the Service" objMessage.TextBody = mailbody objMessage.Send Wscript.Quit(2) Else WScript.Echo "Successful Restart of Service:" & strServiceName objMessage.Subject = "Successful Restart of Service:" & strServiceName mailbody = "Successful Restart of Service" objMessage.TextBody = mailbody objMessage.Send Wscript.Quit(0) End If Next End If Else 'Wscript.Echo "System has entered in CRITICAL State of /10" 'Wscript.Quit(2) End If Next Wscript.Echo "System has entered in CRITICAL State of /10" Wscript.Quit(2) End If End If Else Wscript.Echo "Follow the Syntax: example: eventlog -c EventCode -p Pattern_to_Match_in_the_message_to_service_restart -l logfile_Application_System -e errorPattern_to_Match _in_then_message_to_trigger_an_alarm" End If
No comments:
Post a Comment