O R G A N I C / F E R T I L I Z E R: monitoring dns [revisited] …

Jul 16, 2008

monitoring dns [revisited] …

update: i revised this script to add the “debug” parameter because i was having some issues with it reporting inaccurately about looking up domains.  if you set this parameter to true, you’ll find a log called “dns_debug.log” in your %windir%\temp directory.  anyway, i finally got it all fixed.  i went ahead and updated this post along with the post date.

you might recall a previous post about monitoring dns synthetically.  after much frustration with how poorly i wrote it the first time (lacking key things like sleep and retry attempts), i decided to update it a little bit to make it work better.  instead of the previous two parameters, you’ll now need four.

  • HostNames – comma-delimited list of hosts to query (“microsoft.com,google.com,yahoo.com”) or whatever…
  • LogSuccessEvent –boolean value to log successes (very noisy)
  • Repeat – how often to try before determining the query fails
  • Sleep – interval between queries (in milliseconds)
  • Debug – boolean value set to log activity to %windir%\temp\dns_debug.log

 

the event id values are still the same:

  • source – DNS Synthetic Script
  • 41000 – no hostnames defined
  • 41001 – lookup failed
  • 41002 – lookup succeeded

here’s the revised script.  i’ll post it later if you want to just download it.

'==========================================================================
' NAME:        DNS Lookup
' AUTHOR:        Marcus Oh
' DATE:        7/16/2008
' COMMENT:    Returns 'error' if nslookup fails.
'
' 7/2/2008    Updated to include variables for iSleep and iRepeat.
'            Rewrote the logic to loop hosts and lookups.
' 7/16/2008    Added Debug switch to write to log in %windir%\temp called
'            dns_debug.log
'==========================================================================

' Standard Event Type Numeric Values
Const EVENT_TYPE_SUCCESS = 0
Const EVENT_TYPE_ERROR   = 1
Const EVENT_TYPE_WARNING = 2
Const EVENT_TYPE_INFORMATION = 4

Dim iSleep, iRepeat, oLogFile

Set oShell = CreateObject("Wscript.Shell")
sComSpec = oShell.ExpandEnvironmentStrings("%ComSpec%")

' Parameters for MOM
sHosts = ScriptContext.Parameters.Get("HostNames")
bLogSuccessEvent = CBool(ScriptContext.Parameters.Get("LogSuccessEvent"))
iSleep = ScriptContext.Parameters.Get("Sleep")
iRepeat = ScriptContext.Parameters.Get("Repeat")
bDebug = ScriptContext.Parameters.Get("Debug")

If bDebug Then
    sWinDir = oShell.ExpandEnvironmentStrings("%WinDir%")
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oLogFile = oFSO.CreateTextFile(sWinDir & "\temp\dns_debug.log",True)
End If

aHosts = Split(sHosts,",")

If Len(sHosts) > 0 Then
    For Each host In aHosts
        DNSlookup(host)
    Next
Else
    CreateEvent 41000,EVENT_TYPE_INFORMATION,"DNS Synthetic Script","No host names defined."
End If

Function DNSlookup(sHost)
    sCommand = sComSpec & " /c nslookup " & sHost
    
    iSuccess = 0
    For i = 0 To iRepeat
        f_debugLog("Executing command: " & sCommand)
        Set oShellRun = oShell.Exec(sCommand)
        Do Until oShellRun.StdOut.AtEndOfStream
            sLine = Trim(oShellRun.StdOut.ReadLine)
            f_debugLog(sLine)
            NameTag = LCase(Left(sLine,5))
            Select Case NameTag
                Case "name:"
                    iSuccess = iSuccess + 1
                    sData = Trim(Mid(sLine,6))
                    aLine = Split(sLine, ":")
                    sData = Trim(aLine(1))
                    f_debugLog("Successful!  Attempt #: " & iSuccess)
                    Exit Do
            End Select
        Loop
        ScriptContext.Sleep(iSleep)
    Next
    
    f_debugLog("Total successful attempts: " & iSuccess)
    
    If iSuccess > 0 Then
        f_debugLog("Successfully looked up " & sHost & "." & vbTab & "Successful attempts: " & iSuccess)
        If bLogSuccessEvent Then
            CreateEvent 41002,EVENT_TYPE_INFORMATION,"DNS Synthetic Script","Successfully looked up " & sHost & "."
        End If
    Else
        f_debugLog("Lookup failed for " & sHost & "." & vbTab & "Successful attempts: " & iSuccess)
           CreateEvent 41001,EVENT_TYPE_ERROR,"DNS Synthetic Script","Lookup failed for " & sHost & "." & VbCrLf & "Successful attempts: " & iSuccess
    End If
End Function

' Standard Event creation subroutine
Sub CreateEvent(iEventNumber,iEventType,sEventSource,sEventMessage)
    Set oEvent = ScriptContext.CreateEvent()
    oEvent.EventNumber = iEventNumber
    oEvent.EventType = iEventType 
    oEvent.EventSource = sEventSource
    oEvent.Message = sEventMessage
    ScriptContext.Submit oEvent
End Sub

Function f_debugLog(sDebugInfo)
    If bDebug Then
        oLogFile.WriteLine "DEBUG:" & sDebugInfo
    End If
End Function