Serviceparameter dem Agent mitgeben

Hallo,

ich habe mit der Anleitung aus der Doku angefangen ein Plugin zuschreiben, welches als erst-entwickeltes Plugin prüfen soll, ob ein Pfad vorhanden ist.
In der Dokumentation habe ich jedoch nirgendwo rauslesen können, wie man den zu prüfenden Pfad an den Agent mitgeben kann.

Wenn ich das korrekt aus der Doku rauslese, sind die Serviceparameter um serverseitig mit den Ergebnissen des Agents die Logik für den Status zu bestimmen.
Bin ich gezwungen alle möglichen Pfade hart einzutragen oder kann ich das als Parameter einbauen und in den Agent einbacken?

agent_based:

#!/usr/bin/python

from .agent_based_api.v1 import *


def discover_exists(section):
    for path, shouldCrit, exists in section:
        yield Service(item=path)

def check_exists(item, params, section):
    shouldCrit = params["shouldCrit"]
    for path, exists in section:
        if path == item:
            exists = bool(exists)
            shouldCrit = bool(shouldCrit)
            if exists:
                s = State.OK
                summary = f"Found {path}"
            else:
                summary = f"Did not found {path}"
                if shouldCrit:
                    s = State.CRIT
                else:
                    s = State.WARN
            yield Result(
                state = s,
                summary = summary
            )
            return


# Check deklarieren
register.check_plugin(
    name='exists',
    service_name='Exist %s',
    discovery_function=discover_find,
    check_function=check_find,
    check_default_parameters={"shouldCrit": True},
    check_ruleset_name="exists",
)

Regelsatz:

#!/usr/bin/python

from cmk.gui.i18n import _

from cmk.giu.valuespec import (
    Dictionary,
    Integer,
    textAscii,
    DropdownChoice
)

from cmk.gui.plugins.wato import (
    CheckParameterRuleSpecWithItem,
    rulespec_registry,
    RulespecGroupCheckParametersOperatingSystem,
)

def _item_valuespec_exists():
    return TextAscii(title=_("absolute Path"))

def _parameter_valuespec_exists():
    return Dictionary(
        elements=[
            ("shouldCrit", DropDownChoice(
                title = _("Throw critical if not found otherwise throw warning"),
                help = _("default is Yes"),
                choices = [
                    (False, _("No")),
                    (True, _("Yes")),
                ],
                default_value= "yes"
            )),

        ]
    )


rulespec_registry.register(
    CheckParameterRulespecWithItem(
        check_group_name="exists",
        group=RulespecGroupParametersOperatingSystem,
        item_spec=_item_valuespec_exists,
        match_type="dict",
        parameter_valuespec=_parameter_valuespec_exists,
        title=lambda: _("Get if File or Folder exists")
    )
)

Der Check (erster ansatz) für den Agent

#!/usr/bin/python
# Import OS Modul
import os


# Sektionskopf
print('<<<exists>>>')

 

path = r'C:/Testpfad\egal/ob/Linux\oder\Windows/Datei/geht/auch.txt'
path = path.replace("\\", os.sep).replace("/", os.sep)


isExist = os.path.exists(path)
print([path,Exist])

Du wirst Deinem Agentenplugin eine Konfigurationsdatei spendieren müssen, der die Agentenkommunikation selber ist ja read-only.

Eine solche Datei liegt üblicherweise in /etc/check_mk und kann auch mit Hilfe der Bakery erstellt werden.

Das macht die Klasse PluginConfig in dem Beispiel hier: check_mk_extensions/sslcertificates.py at cmk2.1 · HeinleinSupport/check_mk_extensions · GitHub

1 Like

Mittlerweile ist mein Plugin ausgerollt und Funktioniert. :slight_smile:

Für den Ernstfall haben wir intern Diskutiert, wie man Parameter ausrollen kann, ohne auf das Backen angewiesen zu sein.
Das Thema ist aktuell noch nicht durch, jedoch haben wir als Ansatz einen automation User erstellt, welcher Agentseitig die Serviceparameter in einem bestimmten Intervall aus der Web-API ausliest und selber in eine Config-Datei schreibt.

So können wir Zukünftig, wenn es Konzeptioniert, Umgesetzt und getestet ist bei Sicherheitslücken wie zB. die Log4J oder commons-text.jar Sache ohne zu Backen die Parameter an die Agents mitgeben.

Wenn die Sache weiter Fortgeschritten ist und ich daran Denke, werde ich hier nochmal genauer Erklären wie wir das dann umgesetzt haben.