Page 1 of 1

SNMP netwerk monitoring

Posted: Fri Dec 18, 2009 3:22 pm
by Droezel
Ik heb mezelf een SNMP monitoring scriptje gemaakt dat misschien ook wel voor anderen handig kan zijn. Ik gebruik dit script om het verkeer dat door mijn Cisco ASA 5505 router gaat te monitoren.

Om het script aan de praat te krijgen moet je de DLL bestanden in de attachment plaatsen in je Windows/System32 map, en je moet de homeseer settings.ini file aanpassen als volgt:

Code: Select all

ScriptingReferences=System.XML;System.XML.dll,System.Data;System.Data.dll,System.Web;System.web.dll,SNMPDLL;SNMPDll.dll,TableReader;TableReader.dll

Het volgende script laat ik door een event elke 60 seconden uitvoeren. Ik heb natuurlijk eerst enkele devices aangemaakt om de waarden in te bewaren.

Code: Select all

Imports SNMPDll

Sub Main(parm as object)

  Dim sUptime As String = "1.3.6.1.2.1.1.3.0"
  Dim sTrafficIn As String = "1.3.6.1.2.1.2.2.1.16.1"
  Dim sTrafficOut As String = "1.3.6.1.2.1.2.2.1.10.1"
  Dim sExternalIP As String = "1.3.6.1.2.1.4.20.1.1.84.197.3.196"
  Dim iTrafficIn As Int64
  Dim iTrafficOut As Int64
  Const EventRefreshRateSecs As Integer = 60
  
  Dim TrafficIn As Decimal
  Dim TrafficOut As Decimal
  
  Dim a As SNMPAgent = New SNMPAgent("10.111.0.1", "public", "public")
  Dim uptime As SNMPObject = New SNMPObject(sUptime)
  Dim externalIP As SNMPObject = New SNMPObject(sExternalIP)
 
iTrafficIn = CType(New SNMPObject(sTrafficIn).getSimpleValue(a), Int64)
iTrafficOut = CType(New SNMPObject(sTrafficOut).getSimpleValue(a), Int64)

hs.SetDeviceString("V70",  uptime.getSimpleValue(a))
hs.SetDeviceLastChange("V70",now)

hs.SetDeviceString("V71",  externalIP.getSimpleValue(a))
hs.SetDeviceLastChange("V71",now)

TrafficIn = (iTrafficIn - hs.DeviceValue("V72")) / 1024 / EventRefreshRateSecs
TrafficOut = (iTrafficOut - hs.DeviceValue("V73")) / 1024 / EventRefreshRateSecs

hs.SetDeviceString("V74",  TrafficIn.Tostring("0.00") + " KB/sec")
hs.SetDeviceLastChange("V74",now)

hs.SetDeviceString("V75",  TrafficOut.Tostring("0.00") + " KB/sec")
hs.SetDeviceLastChange("V75",now)

hs.SetDeviceString("V72", iTrafficIn.ToString)
hs.SetDeviceValue("V72", iTrafficIn)
hs.SetDeviceLastChange("V72",now)

hs.SetDeviceString("V73",  iTrafficOut.ToString)
hs.SetDeviceValue("V73", iTrafficOut)
hs.SetDeviceLastChange("V73",now)

End Sub
Uiteindelijk met dit tot resultaat:
SNMPMonitoring.JPG
SNMPMonitoring.JPG (66.61 KiB) Viewed 9464 times

Re: SNMP netwerk monitoring

Posted: Fri Dec 18, 2009 10:57 pm
by TANE
Interessant.
het blijft wel lastig om de juiste SNMP waardes op te vragen.

Dit is wel een gebied wat meer aandacht verdient.
Opvragen van WMI waardes zou ook heel interessant zijn.

Een mogelijke werkwijze zou kunnen zijn om bv een opensource monitoring tool te gebruiken en via een HS-plugin data opvragen in de monitoring tool.

Re: SNMP netwerk monitoring

Posted: Sat Dec 19, 2009 2:02 am
by Digit
Ik heb wel wat Powershell scriptjes waarmee ik wat WMI dingen wegschrijf naar SQL.
Zie http://www.hekkers.net/domotica/CPUCharts.aspx
En http://www.hekkers.net/domotica/DiskUsageCharts.aspx

Ik weet alleen niet of je wat met Powershell kunt doen vanuit HS; ik zou denken van wel.

Re: SNMP netwerk monitoring

Posted: Sat Dec 19, 2009 2:20 am
by TANE
@Robert,
dat zal vast wel mogelijk zijn.
Mooiste is natuurlijk alles in een plugin onder te brengen.
Elke 10 seconden runnen van een event spreekt mij niet zo aan.

Re: SNMP netwerk monitoring

Posted: Sat Dec 19, 2009 11:41 am
by Droezel
TANE wrote:Interessant.
het blijft wel lastig om de juiste SNMP waardes op te vragen.

Dit is wel een gebied wat meer aandacht verdient.
Ik heb de MIB browser van iReasoning gebruikt om naar de juiste snmp waarden te zoeken:
http://www.ireasoning.com/mibbrowser.shtml

Dat werkt op zich wel handig. Ik heb nog even gedacht om er een plugin van te maken maar dat zou pas echt makkelijk werken als je ermee door de MIB van een divice kan bladeren om zo SNMP devices toe te voegen... een opensource monitoring tool zou hiervoor inderdaad wat handiger zijn (MRTG is misschien een optie, maar dat is naar het schijnt nogal lastig aan de praat te krijgen)

Re: SNMP netwerk monitoring

Posted: Fri Sep 10, 2010 12:48 pm
by DJF3
Hi,

Het is mij niet helemaal gelukt.
- Copy DLL files naar WINNT/System32 (ja, ik draai Win2k server)
- Voeg code toe aan settings.ini
- Restart home-seer
- Geen error messages

Script:

Code: Select all

Imports SNMPDll
Sub Main(parm as object)
  Dim a As SNMPAgent = New SNMPAgent("10.1.1.1", "public", "public")
  Dim drivetemp As SNMPObject = New SNMPObject("1.3.6.1.4.1.24681.1.2.11.1.3")

hs.writelog("SNMP_01", "<B>START SNMP</b>")
hs.WriteLog("SNMP_01",  drivetemp.getSimpleValue(a))
hs.writelog("SNMP_01", "<B>STOP SNMP</b>")
End Sub
bij het starten van dit test-script. Error bij regel "drivetemp.getSimpleValue(a)":
"Scripting runtime error: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object. at SNMPDll.SNMPAgent.getValue(SNMPObject mySNMPObject) at SNMPDll.SNMPObject.getSimpleValue(SNMPAgent myAgent) at scriptcode16.scriptcode16.Main(Object parm) --- End of inner exception stack trace --- .............etc.etc."

Enig idee wat dit zou kunnen zijn?
-Misschien het verkeerde trap nummer? (MIB nummer komt uit MIB browser, type Octet-string)
-Code probleem? (filename: snmp.vb)
-DLL probleem?

Re: SNMP netwerk monitoring

Posted: Sat Sep 11, 2010 10:44 am
by Droezel
Als ik de mib string verander naar iets ongeldig krijg ik volgende error:

Code: Select all

[color=#FF0000]11/09/2010 10:35:58  - Error - Scripting runtime error: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object.   at SNMPDll.SNMPAgent.getValue(SNMPObject mySNMPObject)   at SNMPDll.SNMPObject.getSimpleValue(SNMPAgent myAgent)   at scriptcode5.scriptcode5.Main(Object parm)   --- End of inner exception stack trace ---   at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)   at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)   at Scheduler.VsaScriptHost.Invoke(String ModuleName, String MethodName, Object[] Arguments)[/color]
Lijkt me zo ongeveer dezelfde error. Misschien eens wat andere mib nummertjes proberen?

Posted: Sat Sep 11, 2010 11:58 am
by DJF3
Ga ik direct testen! Oh boy, als dit gaat werken krijg ik er 50 devices bij ;-)

Re: SNMP netwerk monitoring

Posted: Sat Sep 11, 2010 12:37 pm
by DJF3
Update: het werkt nu en ik weet wat het probleem was.
Ik had in de MIB browser de .MIB van mijn device geladen. Alle standaard info kan ik nu uit het device halen.

Hoe kan ik in deze code een 'externe' MIB laden om meer informatie uit devices te halen?

Groeten!
DJ

Re: SNMP netwerk monitoring

Posted: Sat Sep 11, 2010 5:27 pm
by DJF3
Even onder voorbehoud: Het lijkt er op dat de volgende code werkt met additionele MIB files.

- Pas de code aan zodat deze naar de directory wijst waarin de .MIB files staan. ALLE .mib files die in deze directory staan worden geladen. Ik weet niet wat de invloed is op system performance.

Code: Select all

Imports SNMPDll

Sub Main(parm as object)

  Dim myMib As Mib = new Mib()
  myMib.loadDirectoryMib("C:\Program Files\HomeSeer 2\")


  Dim a As SNMPAgent = New SNMPAgent("10.1.1.1", "public", "private")
  Dim drivetemp As SNMPObject = New SNMPObject(".1.3.6.1.4.1")

hs.writelog("SNMP_01", "<B>START SNMP</b>")
hs.WriteLog("SNMP_01",  drivetemp.getSimpleValue(a))
hs.writelog("SNMP_01", "<B>STOP SNMP</b>")

End Sub
Info gevonden via: http://www.codeproject.com/KB/cs/SNMPDLL.aspx