WUG.ninja

Search

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 This Post

More To Explore

WhatsUp Gold

WhatsUp Gold Tip #3: Monitor your systems

Focus on what is important It’s nice to have detailed monitoring information for every system on your network, but if a non-critical system is unavailable

Blog Posts

WhatsUp Gold Tip #2: Discover your systems

Introduction When you finish adding your credentials to WhatsUp Gold, the next step to success is configuring the discovery process in WhatsUp Gold to work for you.

credentials
Blog Posts

WhatsUp Gold Tip #1: Add your credentials first

Introduction Following installation, the first step to success is adding credentials for your infrastructure. WhatsUp Gold Network Monitoring and Log Management is an agentless solution