ePowerswitch 8XM r2 und CRE V2 SNMP

Hallo

Versuche gerade eine etwas ältere schaltbare Stromversorgung in der CRE 2 ans laufen zu bekommen. Unter der 1.6 war der schon integriert, aber das Plugin kann nicht erfolgreich konvertiert werden. Mein Plan war auch das neu zu schreiben. Der Switch zeigt nur 2 Infos an und die Versuche an der SNMP Erkennung was zu machen, wie ohne diesen Snmpwalk und was sonst so beschrieben wird, ergeben nichts.

Hat jemand so ein Ding im Einsatz oder einen Tip, wie ich da vorgehen kann??

… interessant ist, das im SNMP Walk alles was mich interessiert zu sehen ist. Z.B. die Temperatur von dem Ding in einer Zeile. .1.3.6.1.4.1.24734.13.4.1.1.3.1.1701 - ist grad 24 Grad… :wink:

Hallo

Hab jetzt mal angefangen das SNMP Plugin neu zu schreiben. FInde in der Doku aber den roten Faden in der Anleitung nicht so recht, zB was jetzt noch zum SNMP Plugin gehört, oder dem weiter oben besprochenen anderen Checks… Hier das ich bisher geschrieben habe… EDIT:

Das ist jetzt aus einem Template von hier:

Meine Python Skills sind ja eher begrenzt. Der “Full service scan” sagt das er den Job completed hat, aber es gibt keine neuen Services. Im Catalog der Check Plugins taucht das neue Plugin auch nicht auf… Wo kann ich ansetzen.??

https://github.com/Bastian-Kuhn/Check_MK-Treasures/blob/master/stuff/skeleton/snmp_check.py

#!/usr/bin/python3

from typing import Dict, List, Mapping, Tuple

from .agent_based_api.v1 import (
    SNMPTree,
    register,
    Service,
    Result,
    State,
    any_of,
    startswith,
    contains,
)


DETECT_FUNCTION = any_of(
    contains(".1.3.6.1", "ePowerSwitch"),
    startswith(".1.3.6.1", "ePowerSwitch"),
)

def parse_epsm_door_function(string_table):
    data = {}
    for line in string_table:
        data[line[0]] = line[1]
    return data

    #return {
    #    line[0]: line[1]
    #    for line in table
    #}


def discovery_epsm_door_function(section):
    for item in section:
        yield Service(item=item)

    #yield from (Serviec(item=item) for item in section)

def check_epsm_door_function(item, section):
    if item not in section:
        return
    data = section[item]
    yield Result(
        state=State.OK, # State.OK, State.WARN, State.CRIT, State.UNKOWN
        summary="Message"
    )


register.snmp_section(
    name="EPowerswitch",
    detect=DETECT_FUNCTION,
    parse_function=parse_epsm_door_function,
    fetch=[
        SNMPTree(
            base=".1.3.6.1.4.1.24734.13.6.1.1.3",
            oids=[
                "1",
                "2",
                "3",
                "4",
            ],
        ),
    ],
)


register.check_plugin(
    name="epsm_door",
    service_name="EPowerswitch_8XM %s",
    discovery_function=discovery_epsm_door_function,
    check_function=check_epsm_door_function,
    #cluster_check_function=my_cluster_check_function,
)

Denn eigenen Code bite als formatierten Text einfügen, so lässt sich leider schlecht sehen wo Probleme liegen könnten.
Am besten selber einfach nen Github Repo erstellen und nur den Link zum richtigen Code posten.

Oh, tut mir leid. Kein Problem, ändere ich morgen. Hab schon ein GIT Account erstellt, brauche das ja sicher noch öfter und Pastbin ist ja nach einer Weile wieder weg…

wenn du die Namen in register.snmp_section und register.check_plugin angleichst sieht das auf den ersten garnicht so falsch aus…

register.snmp_section(
    # name="EPowerswitch",
    name="epsm_door", 
)


register.check_plugin(
    name="epsm_door",
)

`startswith` sieht ein wenig redundant aus...

DETECT_FUNCTION = any_of(
contains(".1.3.6.1", “ePowerSwitch”),
startswith(".1.3.6.1", “ePowerSwitch”),
)

1 Like

Der Startswith steht im Template so ähnlich drin. War nicht sicher was da rein muss…

Hier ist jetzt der Link zu dem File. Hab die Änderungen von thl-cmk noch nicht drin. Kommt iLdTages…

https://github.com/RudiOnTheAir/Check_MK/blob/main/epsm_door.py

Ein Problem was ich sehe ist - es wird nur eine OID geholt und in der Parse Function wird aber erwartet, dass zwei Werte pro Zeile vorhanden sind.
Einfach mal am Anfang der Parse Function die string_table Variable ausgeben um zu prüfen wie die Daten aussehen.

Wie muss das dann konkret aussehen? Dieses Plugin soll tatsächlich nur den Türkontakt darstellen. Also auf oder zu…
Gibt dann aber noch Messwerte wie welche Gruppe der geschalteten Kontakte aktiv ist, Temperatur und Feuchtigkeit. Sind dann vermutlich 4 Plugins…?!

Ich hab jetzt einen Printbefehl eingefügt.

print(‘string_table’)

Aber davon unabhängig, scheint ein Fehler da zu sein, weil ein

cmk -vII --detect-plugins=epsm_door hostname

ergibt ein:

SUCCESS - Found no services, no host labels
WARNING: Parsing of section epsm_door failed - please submit a crash report! (Crash-ID: ce42baae-4de5-11ec-9824-9252ee7cb19f)

Docu zur Check API findest du in deiner CMK Installation…
image

Z.B. für startswith oder contains

Wen du das print(string_table) noch an den Anfang der Funktion setzt (und die Hochkommas weg läst) bekommst du auch eine Ausgabe.

def parse_epsm_door_function(string_table):
    print(string_table)  # TEST
    data = {}
    for line in string_table:
        data[line[0]] = line[1]
    return data

Die Crash Reports findest du unter → Monitoring → Crash reports

image

Da findest du dann alle Details zu dem Fehler.

In der Tat. Stelle fest, ich muss an meinen Python Skills arbeiten. Hab schon ne Menge Sachen mit Shellscripten gemacht, auch weil das ja Teil der “Sprache” ist, die man eh schon täglich eintippt.

  • EXECUTING HOST LABEL DISCOVERY
    [[[‘Closed’], [‘Closed’], [‘Open’], [‘Open’], [‘Open’], [‘Open’], [‘Open’], [‘Open’], [‘Applied’]]]

Das steht unter anderem ja auch im Crash Report. Hätte jetzt erwartet, das da ein!! Zustand des Kontaktes erscheint. Auch in dem SNMP Walk sind da so viele redundante Meldungen.
:thinking:

Ich vermute, das das eh nicht die richtige Stelle in der langen Liste ist. Hab die mal in das GIT geworfen. Ob diese MIB Datei noch was erhellendes beisteuern kann?

https://github.com/RudiOnTheAir/Check_MK/blob/main/snmp-walk.txt

… hab den alten Code auch noch ins GIT kopiert. Da sich ja so viel geändert hat mit der V2 war ich der Ansicht, ein Rewrite ist die beste Lösung, aber evtl. lassen sich da ja noch Dinge anpassen oder übernehmen. Vor allem wegen der Zuordnung.

Tut es doch, Closed → Kontakt geschlossen, Open → Kontakt Offen,
Die OID .1.3.6.1.4.1.24734.13.6.1.1.1 dürfte der Kontaktname sein (könntest du als i
Iem nehmen) und OID .1.3.6.1.4.1.24734.13.6.1.1.2 sieht nach der Beschreibung aus (Schrank 1 Vordertür, Schrank 1 Hintertür, und - nc - für Not connected (?))

1 Like

Überlege grad, wo Du die Namen gefunden hast?

Das hantieren mit Python und der API ist ja nicht ohne. In diesem “Teil” wird doch der benötigte Content
herausgeparsed??

def parse_epsm_door_function(string_table):
print(string_table) # TEST
data = {}
for line in string_table:
data[line[0]] = line[1]
return data

Mir ist aber noch nicht klar, wo ich da ansetzen kann und was dann am Ende ausgegeben werden muss, damit CMK das gebrauchen kann…

Überlege grad, wo Du die Namen gefunden hast?
Aus dem SNMP Walk :wink:

.1.3.6.1.4.1.24734.13.6.1.1.2.1 "53 63 68 72 61 6E 6B 20 31 20 56 6F 72 64 65 72 74 FC 72 "
.1.3.6.1.4.1.24734.13.6.1.1.2.2 "53 63 68 72 61 6E 6B 20 31 20 48 69 6E 74 65 72 74 FC 72 "
.1.3.6.1.4.1.24734.13.6.1.1.2.3 - nc -

Zu deiner DETECT_FUNCTION hier solltest do besser auf die SysDecr oder SysObjid testen (war im Original auch so). Kannst du dann auch direkt inm register.snmp einbauen.

detect=startswith(".1.3.6.1.2.1.1.2.0", “.1.3.6.1.4.1.24734.”)

Btw. kannst du noch die SNMP MIB in dein Git repository stellen?

Hatte damit auch experimentiert, in meinem Template war das aber “komplexer” umgesetzt, und ich hatte dann probiert das mit any_of und all_of zu testen und wollte wissen wann es durchläuft und wann nicht. Hab dann aber erst gesehen, das dieser Import nur any_of drin hatte. In anderen “Vorlagen” hab ich da meist import * gesehen… Warum auch immer… Wollte das nur verstehen.

Die MIB lade ich gleich hoch… Done

Hier eine StepByStep Anleitung zum Plugins schreiben aus der CMK Doku

Ab Punkt 8 geht es dann um SNMP Basierte Plugins. Das sollte dir helfen zu verstehen wie ein Check funktioniert.