Hilfe zu SNMP

  • Hallo,

    vielleicht hat von euch jemand eine Idee,
    ich habe ein kleines Tool geschrieben mit dem ich den Status und die Supply stände von Druckern über SNMP ermittle.
    Momentan mach ich das so:

    [autoit]

    $pid = Run(@ComSpec & " /c snmpget -v1 " & $drucker & ' public ' & ".1.3.6.1.2.1.1.3.0", @TempDir , "", 2)
    $status = StdoutRead($pid)
    $status = StringSplit($status, "=")

    [/autoit]

    Nun ist das so das ich pro Drucker ca 40 werte abfrage und ~400 drucker habe.
    Nach einer gewissen zeit stürzt das ganze dann mal ab das nicht genügend systemressourcen vorhanden wären um das Programm auszuführen.

    Gibt es da nicht eine Bessere möglichkeit wie ein externes tool einzusätzen ?

    Danke schonmal

    Grüße

    Boodo

    Einmal editiert, zuletzt von boodo (22. April 2008 um 00:09)

  • Wenn nicht lange genug ausgelesen wird, bleiben für jeden Prozess die StdOutPielines offen. Die müssen erst leergelesen werden. Dann werden sie auch geschlossen.

    [autoit]

    While 1
    $temp = StdoutRead($pid)
    If @error Then ExitLoop
    Wend
    $temp = ""

    [/autoit]
  • Hi boodo,
    Autoit ist eigentlich ein super Tool um Werte per SNMP auszulesen ich benutze als Netzwerkadmin auch einige selbst geschribenen SNMP Tools.
    Ich würde aber an deiner Stelle einen geplanten Task anlegen und alle 1 Minute den Tast starten und das Script ausführen.

    Ich kombiniere das noch mit einer Datenbankanbindung oder einer Ini-Datei um die OID Werte abzulegen.
    Ich frage z.B. alle Stunde 12 Switche (a 48 Ports) ab und speicher die Werte in einer Datenbank (MySQL). Die Verarbeitung und das Auslesen (Formatieren der Werte) habe ich mit Autoit realisiert.

    MfG
    Der_Doc

  • Danke für die Schnelle Antwort, paar nette Anregungen dabei.

    Leider ist der Geplane Task keine Wirklich gute Lösung, da die werte der Drucker nicht standartisiert sind und ich mit nem schlanken 1000 Zeiler abfangen muss was da überhaupt ankommt.

    Exitloop ist leider keine Lösung da ich es als dienst laufen lasse und der nicht unbedingt abbrechen sollte.
    Trozdem vielen dank für dei Anregung, ich habe festgestellt das ich den Fehler bei der Abfrage garnicht abgefangen habe. Werde ich verbessern:)

    Meine überlegung war ob sich nicht jemand mal die mühe gemacht hat ne UDF zu verfassen oder sowas ?
    Fände ich einfach die schönere Lösung

    Thanks all

  • Hi boodo,
    ich wüsste net wieso da jemand ne UDF schreiben sollte. Ist dochn nur SNMPwalk.exe und SNMPget.exe diese kannst du doch wunderbar abfragen.

    Du lässt das Tool als Dienst laufen? Das heist Autoit läuft den ganzen Tag oder beendet sich das Prog zwischen durch?.
    Hatte nämlich mal versucht eine Netzwerküberwachung zu schreiben, als 15 Switche auf ihren Datendurchsatz pro Uplinkport (2 x 10 Gigabit) alle 20 sec. abfragen und diesen Wert dann in Label anzeigen lasen.
    Habe das Projekt aber abgebrochen, da sich der Rechner (4 GB Ram) so mit Speicher vollgefressen hatte, das nur noch ein Neustart half.

    MfG
    Der_Doc


  • Exitloop ist leider keine Lösung da ich es als dienst laufen lasse und der nicht unbedingt abbrechen sollte.

    Wenn das auf meine Lösung bezogen war, hast du sie nicht ganz verstanden. Da wird nur eine Schleife verlassen, nicht das Script:)

    [autoit]

    $status = _snmpget(@ComSpec & " /c snmpget -v1 " & $drucker & ' public ' & ".1.3.6.1.2.1.1.3.0")
    Func _snmpget($command)
    Local $pid = Run($command, @TempDir , "", 2)
    Local $status = ""
    While 1
    $status &= StdoutRead($pid)
    If @error Then ExitLoop ;Beenden, wenn keine Daten mehr kommen
    Wend
    $status = StringSplit($status, "=")
    Return $status
    EndFunc

    [/autoit]
  • An diesem Punkt befinde ich mich in ein For schleife da ich einen Ini datei habe und die sektionen eingelesen habe.
    Wenn ich nun die Schleife verlasssen würde, würde das ganze wieder von vorne Anfangen...

  • o_O es wird ja eine neu erzeugte Schleife verlassen :)
    Also: in Zeile 5 wird eine Schleife gestartet. Diese läft zwischen Zeile 5 und 8, bis das mit Run aufgerufene Programm beendet ist und keine Daten mehr sendet
    Dann wird genau diese und NUR DIESE Schleife verlassen, die zum auslesen gestartet wurde :)
    Klar? ;)

  • Wer lesen kann ist klar im Vorteil... :D sry

    supi lösung allerdings werd ich daduch mein problem das immer mehr handles aufgemacht werden auch nicht los.... :cursing:

    Merci

  • Kwick&Dirty :P

    Irgendwie müsste man das aber doch direkt über udp abbilden können....

    Ich geb net auf !:D