1 Zusätzliche JavaScript-Objekte

Übersicht

Dieser Abschnitt beschreibt die von Zabbix vorgenommenen Erweiterungen der mit Duktape implementierten JavaScript-Sprache sowie die unterstützten globalen JavaScript-Funktionen.

Verwenden Sie in der Vorverarbeitungs-JavaScript keine Zuweisungen an nicht deklarierte Variablen. Verwenden Sie var, um lokale Variablen zu deklarieren.

Integrierte Objekte

Zabbix

Das Zabbix-Objekt ermöglicht die Interaktion mit der internen Zabbix-Funktionalität.

Method Description
log(loglevel, message) Schreibt <message> mit dem Protokollierungsgrad <loglevel> in das Zabbix-Protokoll (siehe Parameter DebugLevel in der Konfigurationsdatei).

Beispiel:

Zabbix.log(3, "this is a log entry written with 'Warning' log level")

Sie können die folgenden Aliase verwenden:

Alias Alias to
console.log(object) Zabbix.log(4, JSON.stringify(object))
console.warn(object) Zabbix.log(3, JSON.stringify(object))
console.error(object) Zabbix.log(2, JSON.stringify(object))

Die Gesamtgröße aller protokollierten Meldungen ist auf 8 MB pro Skriptausführung begrenzt.

Method Description
sleep(delay) Verzögert die JavaScript-Ausführung um delay Millisekunden.

Beispiel (Ausführung um 15 Sekunden verzögern):

Zabbix.sleep(15000)

HttpRequest

Dieses Objekt kapselt ein cURL-Handle, mit dem sich einfache HTTP-Anfragen ausführen lassen. Fehler werden als Ausnahmen ausgelöst.

Die Initialisierung mehrerer HttpRequest-Objekte ist auf 10 pro Skriptausführung begrenzt.

Method Description
addHeader(value) Fügt ein HTTP-Header-Feld hinzu. Dieses Feld wird für alle folgenden Anfragen verwendet, bis es mit der Methode clearHeader() gelöscht wird.
Die Gesamtlänge der Header-Felder, die zu einem einzelnen HttpRequest-Objekt hinzugefügt werden können, ist auf 128 KByte begrenzt (einschließlich Sonderzeichen und Header-Namen).
clearHeader() Löscht den HTTP-Header. Wenn keine Header-Felder gesetzt sind, setzt HttpRequest Content-Type auf application/json, wenn die gesendeten Daten im JSON-Format vorliegen, andernfalls auf text/plain.
connect(url) Sendet eine HTTP-CONNECT-Anfrage an die URL und gibt die Antwort zurück.
customRequest(method, url, data) Ermöglicht die Angabe einer beliebigen HTTP-Methode im ersten Parameter. Sendet die Methodenanforderung an die URL mit optionaler data-Nutzlast und gibt die Antwort zurück.
delete(url, data) Sendet eine HTTP-DELETE-Anfrage an die URL mit optionaler data-Nutzlast und gibt die Antwort zurück.
getHeaders(<asArray>) Gibt das Objekt der empfangenen HTTP-Header-Felder zurück.
Der Parameter asArray kann auf "true" (z. B. getHeaders(true)), "false" gesetzt oder undefiniert sein. Wenn er auf "true" gesetzt ist, werden die Werte der empfangenen HTTP-Header-Felder als Arrays zurückgegeben; dies sollte verwendet werden, um die Feldwerte mehrerer Header mit demselben Namen abzurufen.
Wenn er nicht gesetzt ist oder auf "false" gesetzt ist, werden die Werte der empfangenen HTTP-Header-Felder als Zeichenfolgen zurückgegeben.
get(url, data) Sendet eine HTTP-GET-Anfrage an die URL mit optionaler data-Nutzlast und gibt die Antwort zurück.
head(url) Sendet eine HTTP-HEAD-Anfrage an die URL und gibt die Antwort zurück.
options(url) Sendet eine HTTP-OPTIONS-Anfrage an die URL und gibt die Antwort zurück.
patch(url, data) Sendet eine HTTP-PATCH-Anfrage an die URL mit optionaler data-Nutzlast und gibt die Antwort zurück.
put(url, data) Sendet eine HTTP-PUT-Anfrage an die URL mit optionaler data-Nutzlast und gibt die Antwort zurück.
post(url, data) Sendet eine HTTP-POST-Anfrage an die URL mit optionaler data-Nutzlast und gibt die Antwort zurück.
getStatus() Gibt den Statuscode der letzten HTTP-Anfrage zurück.
setProxy(proxy) Setzt den HTTP-Proxy auf den Wert "proxy". Wenn dieser Parameter leer ist, wird kein Proxy verwendet.
setHttpAuth(bitmask, username, password) Setzt die aktivierten HTTP-Authentifizierungsmethoden (HTTPAUTH_BASIC, HTTPAUTH_DIGEST, HTTPAUTH_NEGOTIATE, HTTPAUTH_NTLM, HTTPAUTH_NONE) im Parameter 'bitmask'.
Das Flag HTTPAUTH_NONE ermöglicht das Deaktivieren der HTTP-Authentifizierung.
Beispiele:
request.setHttpAuth(HTTPAUTH_NTLM | HTTPAUTH_BASIC, username, password)
request.setHttpAuth(HTTPAUTH_NONE)
trace(url, data) Sendet eine HTTP-TRACE-Anfrage an die URL mit optionaler data-Nutzlast und gibt die Antwort zurück.

Beispiel:

try {
    Zabbix.log(4, 'jira webhook script value='+value);

    var result = {
        'tags': {
            'endpoint': 'jira'
        }
    },
    params = JSON.parse(value),
    req = new HttpRequest(),
    fields = {},
    resp;

    req.addHeader('Content-Type: application/json');
    req.addHeader('Authorization: Basic '+params.authentication);

    fields.summary = params.summary;
    fields.description = params.description;
    fields.project = {"key": params.project_key};
    fields.issuetype = {"id": params.issue_id};
    resp = req.post('https://jira.example.com/rest/api/2/issue/',
        JSON.stringify({"fields": fields})
    );

    if (req.getStatus() != 201) {
        throw 'Response code: '+req.getStatus();
    }

    resp = JSON.parse(resp);
    result.tags.issue_id = resp.id;
    result.tags.issue_key = resp.key;
} catch (error) {
    Zabbix.log(4, 'jira issue creation failed json : '+JSON.stringify({"fields": fields}));
    Zabbix.log(4, 'jira issue creation failed : '+error);

    result = {};
}

return JSON.stringify(result);

XML

Das XML-Objekt ermöglicht die Verarbeitung von XML-Daten in der Datenpunkt- und Low-Level-Discovery-Präprozessierung sowie in webhooks.

Um das XML-Objekt zu verwenden, müssen Server/Proxy mit Unterstützung für libxml2 kompiliert sein.

Method Description
XML.query(data, expression) Ruft den Inhalt eines Knotens mithilfe von XPath ab. Gibt null zurück, wenn der Knoten nicht gefunden wird.
expression - ein XPath-Ausdruck;
data - XML-Daten als Zeichenfolge.
XML.toJson(data) Konvertiert Daten im XML-Format in JSON.
XML.fromJson(object) Konvertiert Daten im JSON-Format in XML.

Beispiel:

Eingabe:

<menu>
    <food type = "breakfast">
        <name>Chocolate</name>
        <price>$5.95</price>
        <description></description>
        <calories>650</calories>
    </food>
</menu>

Ausgabe:

{
    "menu": {
        "food": {
            "@type": "breakfast",
            "name": "Chocolate",
            "price": "$5.95",
            "description": null,
            "calories": "650"
        }
    }
}
Serialisierungsregeln

Die Konvertierung von XML nach JSON wird gemäß den folgenden Regeln verarbeitet (für Konvertierungen von JSON nach XML werden die Regeln umgekehrt angewendet):

1. XML-Attribute werden in Schlüssel umgewandelt, deren Namen mit '@' vorangestellt werden.

Beispiel:

Eingabe:

<xml foo="FOO">
  <bar>
    <baz>BAZ</baz>
  </bar>
</xml>

Ausgabe:

{
  "xml": {
    "@foo": "FOO",
    "bar": {
      "baz": "BAZ"
    }
  }
}

2. Selbstschließende Elemente (<foo/>) werden so umgewandelt, als hätten sie den Wert 'null'.

Beispiel:

Eingabe:

<xml>
  <foo/>
</xml>

Ausgabe:

{
  "xml": {
    "foo": null
  }
}

3. Leere Attribute (mit dem Wert "") werden so umgewandelt, als hätten sie einen leeren String-Wert ('').

Beispiel:

Eingabe:

<xml>
  <foo bar="" />
</xml>

Ausgabe:

{
  "xml": {
    "foo": {
      "@bar": ""
    }
  }
}

4. Mehrere untergeordnete Knoten mit demselben Elementnamen werden in einen einzelnen Schlüssel umgewandelt, dessen Wert ein Array von Werten ist.

Beispiel:

Eingabe:

<xml>
  <foo>BAR</foo>
  <foo>BAZ</foo>
  <foo>QUX</foo>
</xml>

Ausgabe:

{
  "xml": {
    "foo": ["BAR", "BAZ", "QUX"]
  }
}

5. Wenn ein Textelement keine Attribute und keine untergeordneten Elemente hat, wird es als String umgewandelt.

Beispiel:

Eingabe:

<xml>
    <foo>BAZ</foo>
</xml>

Ausgabe:

{
  "xml": {
    "foo": "BAZ"
   }
}

6. Wenn ein Textelement keine untergeordneten Elemente, aber Attribute hat, wird der Textinhalt in ein Element mit dem Schlüssel '#text' und dem Inhalt als Wert umgewandelt; Attribute werden wie in Serialisierungsregel 1 beschrieben umgewandelt.

Beispiel:

Eingabe:

<xml>
  <foo bar="BAR">
    BAZ
  </foo>
</xml>

Ausgabe:

{
  "xml": {
    "foo": {
      "@bar": "BAR",
      "#text": "BAZ"
    }
  }
}

Globale JavaScript-Funktionen

Zusätzliche globale JavaScript-Funktionen wurden mit Duktape implementiert:

  • btoa(data) - kodiert die Daten in einen base64-String.
  • atob(base64_string) - dekodiert einen base64-String als Uint8Array-Puffer.
try {
    b64 = btoa("test string");
    buffer = atob(b64);

    // Note that decoding logic depends on the data format of the buffer.
    decoded = String.fromCharCode.apply(this, [].slice.call(buffer));
} 
catch (error) {
    return {'error.name' : error.name, 'error.message' : error.message};
}
  • md5(data) - berechnet den MD5-Hash der Daten.
  • sha256(data) - berechnet den SHA256-Hash der Daten.
  • hmac('<hash type>',key,data) - gibt einen HMAC-Hash als hexadezimal formatierten String zurück; md5 und sha256 werden als hash type unterstützt; die Parameter key und data unterstützen Binärdaten.

    Beispiele:

    • hmac('md5',key,data)
    • hmac('sha256',key,data)
  • sign(hash,key,data) - gibt die berechnete Signatur (RSA-Signatur mit SHA-256) als String zurück, wobei:
    hash - nur sha256 zulässig ist, andernfalls wird ein Fehler ausgelöst.
    key - der private Schlüssel ist. Er sollte dem Standard PKCS#1 oder PKCS#8 entsprechen. Der Schlüssel kann in verschiedenen Formen angegeben werden:

    • mit Leerzeichen anstelle von Zeilenumbrüchen
    • mit maskierten oder nicht maskierten \n anstelle von Zeilenumbrüchen
    • ohne Zeilenumbrüche als einzeiliger String
    • als JSON-formatierter String

    Der Schlüssel kann auch aus einem Benutzermakro/geheimen Makro/Vault geladen werden.

    data - die Daten, die signiert werden. Es kann sich um einen String handeln (Binärdaten werden ebenfalls unterstützt) oder um einen Puffer (Uint8Array/ArrayBuffer).

    Beispiel:

    • sign('sha256',key,data)

    OpenSSL oder GnuTLS wird zur Berechnung der Signaturen verwendet. Wenn Zabbix ohne eine dieser Verschlüsselungsbibliotheken erstellt wurde, wird ein Fehler ausgelöst ('missing OpenSSL or GnuTLS library').