STP SNMP Plugin

Hallo zusammen,

bin gerade dabei ein SNMP Plugin zum Überwachen des STP Status auf unseren Mikrotiks zu entwickeln.
Im Moment sieht das Plugin wie folgt aus:

from .agent_based_api.v1 import *

def parse_stp(string_table):
section = {}
for line in string_table:
section.append(line[0])
return section

register.snmp_section(
name=“stp”,
detect=contains(“.1.3.6.1.2.1.1.2.0”, “…1.3.6.1.2.1.17.2.15.1”),
parse_function=parse_stp,
fetch=[
SNMPTree(
base=“.1.3.6.1.2.1.17.2.15.1”,
oids=[
“1”, # STP Port number
“2”, # STP Port Priority
“3”, # STP Status
“4”, # STP Port Enable
“5”, # STP Designated Root
]),
],
)

def discover_stp(section):
for name section.keys():
yield Service(item=name)

def check_stp(item,section):
yield Result(state=State.OK, summary=“Name %s” % section[0])

register.check_plugin(
name=‘stp’,
sections=[‘stp’],
service_name=‘STP Port Status %s’,
check_default_parameters={},
discovery_function=discover_stp,
check_function=check_stp,
)

Es ist noch nicht fertig.
Allerdings stellt sich mir nun die Frage, wie ich testen kann, ob das Plugin auch verwendet wird.
Ich hab’s unter local/share/check_mk/checks ablegt, allerdings wird es scheinbar nicht angewandt, da ich keinerlei Ausgabe bei einer Discovery.
Was könnte ich machen um das zu testen.
Vielen Dank schonmal.

schaust du hier 15. Dateien und Verzeichnisse :wink:

local/lib/check_mk/base/plugins/agent_based | Ablageort für selbst geschriebene Checkplugins

Also ich hab das Plugin jetzt im richtigen Verzeichnis abgelegt und nochmal den Fehler mit den drei Punkten bei meiner zweiten OID korrigiert.
Allerdings bei dem Host der die entsprechenden OIDs hat, taucht der Check trotzdem nicht auf.

in deiner discovery function fehlt ein in

def discover_stp(section):
   for name section.keys():
       yield Service(item=name)

sollte eher so aussehen.

def discover_stp(section):
   for name in section.keys():
       yield Service(item=name)

du kannst mit cmk --debug -vII <hostname> ob dein Plugin läuft.
evtl. hifft dir diese STP Plugin ja weiter
btw. wenn du Code postest dann bitte auch als Code formatieren, liest sich besser

1 Like
from .agent_based_api.v1 import *

def parse_stp(string_table):
    section = []
    for line in string_table:
        for item in line:
            section.append(item)
    return section

register.snmp_section(
    name="stp",
    detect=contains(".1.3.6.1.2.1.1.2.0", ".1.3.6.1.2.1.17.2.15.1"),
    parse_function=parse_stp,
    fetch=[
        SNMPTree(
            base=".1.3.6.1.2.1.17.2.15.1",
            oids=[
                "1", # STP Port number
                "2", # STP Port Priority
                "3", # STP Status
                "4", # STP Port Enable
                "5", # STP Designated Root
            ]),
    ],
)

def discover_stp(section):
    for line in section:
        yield Service(item=line[0])

def check_stp(item, section):
    for line in section:
        if line[2] != "2":
            yield Result(state=State.OK, summary="Port is not in blocking state")
        if line[2] == "2":
            yield Result(state=State.CRIT, summary="Port is in blocking state")
    return

register.check_plugin(
    name='stp',
    service_name='STP Port Status %s',
    discovery_function=discover_stp,
    check_function=check_stp,
)

Ich hab das Plugin jetzt nochmal überarbeitet.
Wenn ich cmk --debug -vII hostname ausführe taucht die Services nicht auf.
Geb ich allerdings --detect-plugins=stp mit an bekomme ich die drei Services raus, die ich auch haben will.
Merkwürdigerweise tauchen die Services bei der Check Discovery auf, allerdings als vanished Services.
Wie krieg ich’s hin, dass das Plugin auch korrekt verwendet wird.
Edit: Es wird ausgegeben “Check plugin received no monitoring data”

sieht so aus als wenn die Detect funktion nicht funktioniert.

was kommt den bei einem snmpwalk raus wenn du die OID .1.3.6.1.2.1.1.2.0 ausliest?

Für die OID kommt folgendes raus:
.1.3.6.1.2.1.1.2.0 .1.3.6.1.4.1.14988.1
Sollte also passen.
Mir ist allerdings jetzt aufgefallen, dass wohl die Funktion check_stp nicht ausgeführt wird.
Rest funktioniert und zieht auch die passenden Werte.
Ich versuch das mal noch weiter zu debuggen.

Hab’s jetzt nochmal ein bisschen angepasst.
Wenn ich jetzt cmk --debug -vv --detect-plugins=stp CNP-K-11379-002 ausführe, kommen die drei Services mit den richtigen Ergebnissen raus.
Allerdings ohne detect-plugins funktioniert nicht.

eher nicht, das Detect sagt, dass in .1.3.6.1.2.1.1.2.0 drin .1.3.6.1.2.1.17.2.15.1 stehen soll, es steht aber .1.3.6.1.2.1.1.2.0 .1.3.6.1.4.1.14988.1 drin… solltest du mal anpassen…

Moment " .1.3.6.1.4.1.14988.1" ist das Ergebnis von der OID " .1.3.6.1.2.1.1.2.0". Ich überprüfe allerdings nur ob die beiden OIDs " .1.3.6.1.2.1.1.2.0" und “.1.3.6.1.2.1.17.2.15.1” überhaupt existieren.
Also der register section is das Ergebnis der OID komplett egal.

Ok, ich bin dumm.
Hab übersehen, dass ich ja contains und nicht exists verwendet hab.

#!/usr/bin/env python3

from .agent_based_api.v1 import *

def parse_stp(string_table):
    section = []
    for line in string_table:
        for item in line:
            section.append(item)
    return section

register.snmp_section(
    name="stp",
    detect=exists(".1.3.6.1.2.1.17.2.15.1.1.1"),
    parse_function=parse_stp,
    fetch=[
        SNMPTree(
            base=".1.3.6.1.2.1.17.2.15.1",
            oids=[
                "1", # STP Port number
                "2", # STP Port Priority
                "3", # STP Status
                "4", # STP Port Enable
                "5", # STP Designated Root
            ]),
    ],
)

def discover_stp(section):
    for line in section:
        yield Service(item=line[0])

def check_stp(item,section):
    for line in section:
        if line[0] == item:
            if line[2] != "2":
                yield Result(state=State.OK, summary="Port is not in blocking state")
            if line[2] == "2":
                yield Result(state=State.CRIT, summary="Port is in blocking state")
    return

register.check_plugin(
    name='stp',
    service_name="STP Port Status %s",
    discovery_function=discover_stp,
    check_function=check_stp,
)

So sieht das finale Plugin aus.
Da das die allgemeine OID für STP ist, sollte es auch abseits von Mikrotik funktionieren.
Im Moment wird nur geprüft, ob der Port im Blocking state ist oder nicht, kann man in Zukunft vielleicht noch erweitern.
Ich lad das Plugin nochmal seperat in ein Github Repository hoch, damit jemand der’s braucht, es benutzen kann.
Vielen Dank thl-cmk für deine Hilfe.

@f.sollfrank du kannst es auch im CMK Exchange hochladen da ist es evtl. einfacher zu finden als verstreut auf github :slight_smile:

btw: Hier solltest du nur importieren was du wirklich verwendest, nicht *

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed. Contact an admin if you think this should be re-opened.