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 und ermöglicht das Ausführen einfacher HTTP-Anfragen. Fehler werden als Ausnahmen ausgelöst.

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

Methode Beschreibung
addHeader(value) Fügt ein HTTP-Headerfeld hinzu. Dieses Feld wird für alle folgenden Anfragen verwendet, bis es mit der Methode clearHeader() gelöscht wird.
Die Gesamtlänge der Headerfelder, die einem einzelnen HttpRequest-Objekt hinzugefügt werden können, ist auf 128 KByte begrenzt (einschließlich Sonderzeichen und Headernamen).
clearHeader() Löscht den HTTP-Header. Wenn keine Headerfelder festgelegt sind, setzt HttpRequest Content-Type auf application/json, wenn die zu sendenden 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 mit einer optionalen data-Nutzlast an die URL und gibt die Antwort zurück.
delete(url, data) Sendet eine HTTP-DELETE-Anfrage mit einer optionalen data-Nutzlast an die URL und gibt die Antwort zurück.
getHeaders(<asArray>) Gibt das Objekt der empfangenen HTTP-Headerfelder zurück.
Der Parameter asArray kann auf "true" (z. B. getHeaders(true)), "false" oder nicht definiert gesetzt werden. Bei "true" werden die Werte der empfangenen HTTP-Headerfelder als Arrays zurückgegeben. Dies sollte verwendet werden, um die Feldwerte mehrerer Header mit demselben Namen abzurufen.
Wenn der Parameter nicht gesetzt oder auf "false" gesetzt ist, werden die Werte der empfangenen HTTP-Headerfelder als Zeichenfolgen zurückgegeben.
get(url, data) Sendet eine HTTP-GET-Anfrage mit einer optionalen data-Nutzlast an die URL 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 mit einer optionalen data-Nutzlast an die URL und gibt die Antwort zurück.
put(url, data) Sendet eine HTTP-PUT-Anfrage mit einer optionalen data-Nutzlast an die URL und gibt die Antwort zurück.
post(url, data) Sendet eine HTTP-POST-Anfrage mit einer optionalen data-Nutzlast an die URL 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) Legt die aktivierten HTTP-Authentifizierungsmethoden (HTTPAUTH_BASIC, HTTPAUTH_DIGEST, HTTPAUTH_NEGOTIATE, HTTPAUTH_NTLM, HTTPAUTH_NONE) im Parameter 'bitmask' fest.
Mit dem Flag HTTPAUTH_NONE kann die HTTP-Authentifizierung deaktiviert werden.
Beispiele:
request.setHttpAuth(HTTPAUTH_NTLM | HTTPAUTH_BASIC, username, password)
request.setHttpAuth(HTTPAUTH_NONE)
trace(url, data) Sendet eine HTTP-TRACE-Anfrage mit einer optionalen data-Nutzlast an die URL 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').