Hilfe bei eigenem SNMP Check

Hallo CheckMK Community,

ich möchte einen SNMP Check erstellen, dieser Check fragt eine bestimmte OID ab. Von dieser OID bekomme ich einen Integer-Wert zurück, dieser Integer kann nur 1 oder 0 sein. Mein Check soll jetzt prüfen ob entweder eine 0, dann ist der Check OK, oder eine 1 zurückkommt. Dazu habe ich am Server unter /omd/sites/*****/local/share/check_mk/checks ein eigenes Python Skript wie in der “Writing SNMP based checks” Anleitung beschrieben erstellt. Das Skript sieht so aus:

def inventory_sbc_clusterstate(info):
	for state in info:
	    yield state, None

def check_sbc_clusterstate(item, params, info):
    if state == "[u'0']":
        return (0, "OK" )
    else:
        return (2, "Fail")

check_info["sbc_clusterstate"] = {
    'check_function'        : check_sbc_clusterstate,
    'inventory_function'    : inventory_sbc_clusterstate,
    'service_description'  : 'SBCState',
    'snmp_info'             : ( ".1.3.6.1.4.1.5003.9.10.3.1.2.1", [ "6" ] ),
}

Wenn ich dann aber im WATO versuche einen Full Scan auszuführen bekomme ich folgende Fehlermeldung:

Error running automation call try-inventory (exit code 2), error:
unhashable type: 'list'

Wenn ich jetzt jedoch bei der Inventory Funktion bei yield das None entferne sagt er mir folgendes:

*HOST*: Check sbc_clusterstate returned invalid discovery data (entry not a tuple): "[u'0']"

Er sagt ja “entry not a tuple” aber eigentlich müsste er doch als Ausgabe (0, “OK” ) oder (2, “Fail”) bekommen. Wobei 0 der OK Zustand und 2 der Crit Zustand ist, zusammen mit dem Text “OK” oder eben “Fail” ist es dann doch eine tuple?

So wie ich das sehe gibt er mir also nicht den return Wert aus der Check Funktion, sondern aus der Inventory Funktion aus. Was also muss ich machen damit er im WATO nicht mehr den Rückgabewert aus der Inventory Funktion, sondern aus der Check Funktion ausgibt?

Noch zur Info, ich nutze CheckMK Version 1.6.0p10 Enterprise.

Schonmal im Voraus Vielen Dank für eure Hilfe. Und bitte entschuldigt falls ich hier etwas offensichtliches übersehe, aber ich habe keinerlei Vorkenntnisse mit Python oder allgemein im Programmieren.

Hi,
ist der Einzelwert an der OID .1.3.6.1.4.1.5003.9.10.3.1.2.1.6 oder an der OID .1.3.6.1.4.1.5003.9.10.3.1.2.1.6.0?

Weder Inventory noch Check Function sind korrekt implementiert.

def inventory_sbc_clusterstate(info):
    if info:
        yield None, None

def check_sbc_clusterstate(_no_item, _no_params, info):
    if info[0][0] == u'0':
        yield (0, 'OK')
    else:
        yield (2, 'Fail')
1 Like

Hi r.sander,

der Wert den ich Abfrage ist an der OID .1.3.6.1.4.1.5003.9.10.3.1.2.1.6
Mit dem oben genannten Skript funktionert mein Check jetzt, das if info: in der Inventory Funktion brauche ich aber eigentlich nicht oder? Was ich auch noch nicht ganz verstehe ist, warum wir in der Inventory Funktion zweimal None übergeben, müssten wir hier nicht schon den Wert übergeben den wir von der OID bekommen? Auf jedenfall schonmal vielen Dank für die Hilfe.

Doch, denn wenn info leer ist, sollte die Inventory Function nichts zurückliefern.

Nein, der erste Wert des Tupels ist das Item. Bei diesem Check gibt es aber kein Item, da der Check nur einmal pro Host existieren kann. Also None.
Der zweite Wert des Tupels sind Parameter, die zum Zeitpunkt des Service Discovery festgelegt werden und dann in der Check Function im Parameter params auftauchen würden. Die gibt es hier auch nicht, also None.

2 Likes

Aktuell werden die Inventory Funktionen gar nicht mehr getriggert wenn wirklich keine Daten da sind.
Sollte also nicht gebraucht werden das “if”. Bei manchen Checks wie der Fehlerstatus von Druckern muss man explizit sagen, dass was bei leerem Info passieren soll.

1 Like

Hallo Zusammen,

ok, eure Antworten haben mir sehr weitergeholfen und auch der Check Funktioniert jetzt.
Vielen Dank nochmal für die Hilfe.