Parsing of special agent output

Guten Tag

Ich möchte ein special agent für das Produkt Deep Security von Trend Micro erstellen.
Hier für habe ich nun die API Abfrage usw. erstellt.

Aber jetzt möchte ich den Check erstellen, aber das Format das ich im Spezialagenten ausgebe (json) wird im Check als List ausgegeben. Gibt es hier eine Möchglichkeit dies zu unterbinden oder verstehe ich die Überlegung von Check_MK nicht?
Oder sollte ich den JSON Output im special agent weiter parsen? Könntet mir bitte jemand einen Tipp geben?

Herzlichen Dank

Gruss Jovin

Edit1: Es verändert es zu einer Liste, bei welcher Wörter in einem String getrennt werden

CMK hat beim parsen von Agenten Output ein festes Schema.
Dies schaut wie folgt aus.
Jede Zeile wird an Spaces getrennt und erzeugt eine Liste von Strings.
Jede Zeile wiederum erzeugt eine neue Liste.
Damit erhält man am Ende eine Liste von Listen.

Dieses Verhalten kann in der Form beeinflusst werde, dass ein eigener Trenner anstatt von “Space” definiert werden kann. Dies verhindert aber nicht die Erzeugung einer neuen Liste mit einer neuen Zeile.

Ich würde vorschlagen, dass du deinen Output welcher im CMK ankommt einfach mittels Join wieder zu einem langen String zusammen fügst und somit wieder einen JSON String erhälst welchen du dann weiter verarbeiten kannst.

Der ceph_status hat eine schöne Parse Funktion welche eine komplette Agent Sektion wieder in einen JSON String verwandelt.

Danke viel mal für die Antwort.

In Zwischenzeit fiel uns eine andere Option ein, mittels base64 codierten wir die Ausgabe des special agent, und dann beim Check wieder entcodieren.
was hatest du von dieser Idee?

Dein Vorschlag hatte ich auch noch im Kopf, jedoch fand ich nichts unter dem ceph_status. Ist dies ein Modul von Check_MK?

kurz gesagt “Nix” :wink:

Wie sieht dein Check den aus um das alles wieder zu dekodieren?
Lesbarer Output ist immer gut zur Fehlersuche das scheidet bei deiner Version komplett aus.

Hier der Code aus ceph_status

def parse_ceph_status(info):
    import json

    joined_lines = [" ".join(line) for line in info]
    parsed = json.loads(''.join(joined_lines))

    return parsed 

Ist eigentlich voll einfach und verständlich. Kannst 1:1 übernehmen halt nur die Funktion umbenennen.
Als Parse Function und fertig.

1 Like

Aktuell sieht es so aus:

import json
import base64
def parse_deep_security_status(info):
decodedOutput = base64.decodestring(info[0][0])
data = json.loads(decodedOutput)
print(data[“computers”][0][‘computerStatus’][‘agentStatus’])
#return data

Bei mir funktioniert, diese parsing Funktion nicht, gebe ich diese wie folgt aus. (Natürlich nicht für die base64 Version)

resp = self.post(servicespecs[‘API-URL’] + ‘/api/computers/search’, data=json.dumps(payload), headers=headers)
print(resp.status)

*Code wurde vereinfacht.

Es gibt inzwischen einige Check-Plugins (auch builtin), die JSON als Sektionsdaten verwenden.
Die Sektionsüberschrift verwendet dabei sep(0), damit die Zeilen nicht unnötig auseinandergerissen werden, die JSON-Daten sollten dann auch alle in einer Zeile stehen.
Ein gutes Beispiel ist das labels-Checkplugin.