Interface Active Monitor Naming Script

The gentleman who originally wrote this was Michael Nyland. I have slightly modified it, but all credit goes to him. Many WhatsUp® Gold users find this very useful. This script allows you to update the comment on interface active monitors so the comment is one of [or a combination of] the following: ifName, ifAlias, ifDescr. If you want to run this against your entire environment, you may need to run this “external” to WhatsUp® Gold, so to speak. There is an internal timeout maximum of 60 seconds for scripts run within WhatsUp® Gold. If you do need to run this “external” to WhatsUp® Gold, you must fill in the database username/password section near the very bottom. If you plan to run directly in WUG [smaller environments], remove the line near the top starting Dim Context. I will also provide a screenshot that shows how to run this “external” to WhatsUp® Gold but having it be scheduled as a recurring action.


' This Action Script is NOT Device assigned and should be used 
' as a global reoccuring Action that could be scheduled or run manually as needed.
' Original Author: petersenme
' Updated 03-16-09: mnyland
' Updated 08-18-14: jalberino
' Updated 12-10-15: jalberino
 Option Explicit
 Dim Context : Set Context = New clContext ' This line for running outside of WUG
 'Comment out or delete the line above and the clContext class at end when running within WUG
'CONFIGURATION* 'Choose which values to use, and you can enable more than one. 'Note: The sComment column in the database is limited to 150 characters, anything over that will be trimmed!
 Dim bUseIfName : bUseIfName = 1
 Dim bUseIfAlias : bUseIfAlias = 1
 Dim bUseIfDescr : bUseIfDescr = 0
 'Do a single IP or all devices in the environment?
 Dim bDoSingleIP : bDoSingleIP = 0 '0 to do the entire environment, 1 to do a single IP
 Dim sSingleIP : sSingleIP = "192.168.170.55" 'If single IP, enter it here
 'Set to 0 to NOT update the database, 1 to update the database
 Dim bDoTheUpdate : bDoTheUpdate = 1
 'Adjust SNMP settings
 Dim nSNMPTimeout : nSNMPTimeout = 3000 'Set ms for SNMP timeouts
 Dim nSNMPRetry : nSNMPRetry = 2 'Set the number of SNMP retries
 'END CONFIGURATION*
 'DO NOT EDIT BELOW HERE
 '*
 Dim oSnmp : Set oSnmp = CreateObject("CoreAsp.SnmpRqst")
 Dim nTimeout : nTimeout = oSnmp.SetTimeoutMs(nSNMPTimeout)
 Dim nRetries : nRetries = oSnmp.SetNumRetries(nSNMPRetry)
 Dim oEvent : Set oEvent = CreateObject("CoreAsp.EventHelper")
 ' global variables
 Dim indexNum, arrDevices, iRc, iNumUpdated
 Dim nPivotID, nDevID, sArg, sCmt, sAddr, arrDevChange, sDevChange
 Const idxPivotID   = 0
 Const idxDevID     = 1
 Const idxArg       = 2
 Const idxCmt       = 3
 Const idxAddr      = 4
 Const elementRow   = 2
 Const elementCol   = 1
 Const sOID_ifName  = "1.3.6.1.2.1.31.1.1.1.1"
 Const sOID_ifDescr = "1.3.6.1.2.1.2.2.1.2"
 Const sOID_ifAlias = "1.3.6.1.2.1.31.1.1.1.18"
 ' Perform processing here
 Dim oDb : Set oDb = Context.GetDB
 indexNum = 0
 iNumUpdated = 0
 If gatherDevices(arrDevices) Then
  For indexNum = 0 To UBound(arrDevices, elementRow)
  nPivotID = arrDevices(idxPivotID, indexNum)
  nDevID   = arrDevices(idxDevID  , indexNum)
  sArg     = arrDevices(idxArg    , indexNum)
  sCmt     = arrDevices(idxCmt    , indexNum)
  sAddr    = arrDevices(idxAddr   , indexNum)
  Context.NotifyProgress "Checking Device=" & nDevID & " Addr=" & sAddr & " PivotID=" & nPivotID & " Arg=" & sArg & " PrevCmt=" & sCmt & vbCrLf
  iRc = UpdateComment(nPivotID, nDevID, sArg, sCmt, sAddr)
  If iRc = 0 Then
   Context.NotifyProgress "         No update" & vbCrLf
  Else
   iNumUpdated = iNumUpdated + 1
   Context.NotifyProgress "         Change to: " & sCmt & vbCrLf
  End If
  Next
 End If
 Context.NotifyProgress iNumUpdated & " interface monitor comments changed" & vbCrLf
 If iNumUpdated <> 0 Then
  'Context.NotifyProgress sDevChange
  arrDevChange = ReformatString(sDevChange)
  'Context.NotifyProgress arrDevChange
  SendChangeEvent(arrDevChange)
 End If
 ' **
 ' * Function gatherDevice ** Function gatherDevice ** Function gatherDevice ** Function gatherDevice *
 ' **
 Function gatherDevices(arrDevices)
 Dim i, j, sqlQry1, oRs1
 sqlQry1 = "SELECT nPivotActiveMonitorTypeToDeviceID, Device.nDeviceID, sArgument, sComment, sNetworkAddress " &_
             "FROM PivotActiveMonitorTypeToDevice " &_
             "JOIN Device            ON Device.nDeviceID                       = PivotActiveMonitorTypeToDevice.nDeviceID " &_
             "JOIN ActiveMonitorType ON ActiveMonitorType.nActiveMonitorTypeID = PivotActiveMonitorTypeToDevice.nActiveMonitorTypeID " &_
             "JOIN NetworkInterface  ON NetworkInterface.nNetworkInterfaceID   = Device.nDefaultNetworkInterfaceID " &_
            "WHERE PivotActiveMonitorTypeToDevice.bRemoved = 0 " &_
              "AND Device.bRemoved = 0 " &_
              "AND ActiveMonitorType.bRemoved = 0 " &_
              "AND ActiveMonitorType.sMonitorTypeName = 'Interface' "
 If bDoSingleIP Then
    sqlQry1 = sqlQry1 & "AND sNetworkAddress = '" & sSingleIP & "' "
 End If
 sqlQry1 = sqlQry1 & "ORDER BY 5,3"
 Set oRs1 = CreateObject("ADODB.Recordset")
 Set oRs1 = oDb.Execute(sqlQry1)
 If oRs1.EOF Or oRs1.BOF Then
    gatherDevices = 0
    Context.NotifyProgress "No interface monitors meet criteria"
 Else
    gatherDevices = 1
    arrDevices = oRs1.GetRows()
 End If
 oRs1.Close
 Set oRs1 = Nothing
 End Function
 '  
 ' * Function UpdateComment ** Function UpdateComment ** Function UpdateComment ** Function UpdateComment *
 '  
 Function UpdateComment (nPivotID, nDevID, sArg, sCmt, sAddr)
 UpdateComment = 0
 Dim oRs1, rc, sValues, bUpdate
 Dim sIfName, sIfAlias, sIfDesc, sNewVal, sSql, sValArray, nValLength
 Dim bFail, sErrorMsg
 bFail = 0
 sErrorMsg = ""
 bUpdate = 1
 Set rc = oSnmp.Initialize(nDevID)
 If Not rc.Failed Then
  'ifName
  If bUseIfName = 1 Then
   sIfName = Trim(GetSNMPVal(sOID_ifName & "." & sArg, bFail, sErrorMsg))
  End If
  'ifAlias
  If bUseIfAlias = 1 Then
   sIfAlias = Trim(GetSNMPVal(sOID_ifAlias & "." & sArg, bFail, sErrorMsg))
  End If
  'ifDesc
  If bUseIfDescr = 1 Then
   sIfDesc = Trim(GetSNMPVal(sOID_ifDescr & "." & sArg, bFail, sErrorMsg))
  End If
 End If
 If bFail <> 0 Then
  bUpdate = 0
  Context.NotifyProgress "There was a SNMP error: " & sErrorMsg
 Else
  sValues = sIfName & "," & sIfAlias & "," & sIfDesc
 End If
 sValArray = Split(sValues, ",")
 Dim x : For x = 0 To UBound(sValArray)
  'Context.NotifyProgress sValArray(x)
  If Len(sValArray(x)) <> 0 Then
   sNewVal = sNewVal + sValArray(x) & " "
  End If
 Next
 If Len(sNewVal) > 150 Then
     sNewVal = Left(sNewVal, 150)
 End If
 sNewVal = Trim(sNewVal)
 If Len(sNewVal) = 0 Then
  bUpdate = 0
 End If
 If bDoTheUpdate = 1 And bUpdate = 1 Then
  sSql = "Update PivotActiveMonitorTypeToDevice Set sComment = " & StringIfy(sNewVal) & " Where nPivotActiveMonitorTypeToDeviceID = " & nPivotID
  Set oRs1 = CreateObject("ADODB.Recordset")
  Set oRs1 = oDb.Execute(sSql)
  sDevChange = sDevChange & nDevID & ","
  UpdateComment = 1
 End If
 'Context.NotifyProgress sDevChange
 End Function
 ' **
 ' *  GetSNMPVal  *
 ' **
 Function GetSNMPVal(sOID, ByRef bFail, ByRef sErrorMsg)
 GetSNMPVal = 0
 Dim rc
 Set rc = oSnmp.Get(sOID)
 If rc.Failed Then
     sErrorMsg = rc.GetErrorMsg
     bFail = bFail + 1
 Else
 GetSNMPVal = rc.GetValue
 End If
 End Function
 Function ReformatString(sString)
 Dim arrDevId, DeviceID, sTmp, DevID
 arrDevId = Split(sString, ",")
 sTmp = ""
 For Each DevID In arrDevId
  If DevID <> "" And InStr(1, sTmp, DevID, vbTextCompare) = 0 Then
   sTmp = sTmp & DevID & ","
  End If
 Next
 ReformatString = sTmp
 End Function
 ' *
 ' * StringIfy *
 ' *
 Function StringIfy(str)
 If IsNull(str) Then
    StringIfy = "NULL"
 Else
    StringIfy = "'" & QuoteChars(str) & "'"
 End If
 End Function
 '  ' * NumIfy * ' 
 Function NumIfy(num)
 If IsNull(num) Then
    NumIfy = "NULL"
 Else
    NumIfy = num
 End If
 End Function
 '
 ' 
 ' * QuoteChars *
 ' 
 Function QuoteChars(ByVal szLine)
 Dim rc
 If Not IsNull(szLine) And Len(szLine) > 0 Then
    rc = InStr(szLine, "'")
    Do While Not IsNull(rc) And rc > 0
       szLine = Left(szLine, rc) & "'" & Right(szLine, Len(szLine) - rc)
       rc = InStr(rc + 2, szLine, "'")
    Loop
 End If
 QuoteChars = szLine
 End Function
 Sub SendChangeEvent(aDevChangeID)
 Dim DevID, arrDevChange1
 'Context.NotifyProgress aDevChangeID
 'Variables for device change event
 Const DCT_MODIFIED = 2
 Const DCIT_DEVICE  = 1
 arrDevChange1 = Split(aDevChangeID, ",")
 For Each DevID In arrDevChange1
  If DevID <> "" And DevID <> "," And DevID <> " " Then
   oEvent.SendChangeEvent DCT_MODIFIED, DevID, DCIT_DEVICE
   Context.NotifyProgress DevID & " was sent a change event."
  End If
 Next
 End Sub
 ' 
 ' * Class clContext ** Class clContext ** Class clContext ** Class clContext *
 ' 
 Class clContext
 Private internal_StartTime
 Private oDb
 Private bGotDB
 Public Function LogMessage(szMsg)
  Debug.WriteLine szMsg
  wsh.echo szMsg           
  LogMessage = 1
 End Function
 Public Function NotifyProgress(szMsg)
  Debug.WriteLine szMsg
  wsh.echo szMsg           
  NotifyProgress = 1
 End Function
 Public Property Get GetDB
  If bGotDB = 1 Then
   GetDB = oDb
  Else
   Set oDb = CreateObject("ADODB.Connection")
   oDb.Open "dsn=WhatsUp;uid=sa;pwd=sa;"
   If oDb.Errors.Count <> 0 Then
    Dim i
    For i = 0 to oDb.errors.count -1
     LogMessage "DB Connnect Msg: " + CStr(oDb.Errors.Item(i).NativeError) + " - " + oDb.Errors.Item(i).Description
    Next
   End If
   Set GetDB = oDb
   bGotDB = 1
  End If
 End Property
 End Class

Create a new program action in WhatsUp® Gold with the following settings, pointing at your script you’d like to launch ‘external’. This will use WhatsUp® Gold to launch the action, but it will launch as a separate process.

Share:

Leave a Reply

Your email address will not be published. Required fields are marked *


CAPTCHA Image
Reload Image

This site uses Akismet to reduce spam. Learn how your comment data is processed.