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;md5undsha256werden alshash typeunterstützt; die Parameterkeyunddataunterstü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 - nursha256zulä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
\nanstelle 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').