Dodatkowe obiekty JavaScript
Przegląd
Ta sekcja opisuje dodatki Zabbix do języka JavaScript zaimplementowanego przy użyciu Duktape oraz obsługiwane globalne funkcje JavaScript.
Nie używaj niezadeklarowanych przypisań w skryptach JavaScript przetwarzania wstępnego.
Używaj var do deklarowania zmiennych lokalnych.
Wbudowane obiekty
Zabbix
Obiekt Zabbix umożliwia interakcję z wewnętrzną funkcjonalnością Zabbix.
| Method | Description |
|---|---|
log(loglevel, message) |
Zapisuje <message> do logu Zabbix z użyciem poziomu logowania <loglevel> (zobacz parametr DebugLevel w pliku konfiguracyjnym). |
Przykład:
Zabbix.log(3, "this is a log entry written with 'Warning' log level")
Możesz używać następujących aliasów:
| 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)) |
Łączny rozmiar wszystkich rejestrowanych komunikatów jest ograniczony do 8 MB na jedno wykonanie skryptu.
| Method | Description |
|---|---|
sleep(delay) |
Opóźnia wykonanie JavaScript o delay milisekund. |
Przykład (opóźnienie wykonania o 15 sekund):
Zabbix.sleep(15000)
HttpRequest
Ten obiekt hermetyzuje uchwyt cURL, umożliwiając wykonywanie prostych żądań HTTP. Błędy są zgłaszane jako wyjątki.
Inicjalizacja wielu obiektów HttpRequest jest ograniczona do 10 na wykonanie skryptu.
| Method | Description |
|---|---|
addHeader(value) |
Dodaje pole nagłówka HTTP. To pole jest używane dla wszystkich kolejnych żądań do momentu wyczyszczenia za pomocą metody clearHeader().Łączna długość pól nagłówka, które można dodać do pojedynczego obiektu HttpRequest, jest ograniczona do 128 KB (wliczając znaki specjalne i nazwy nagłówków). |
clearHeader() |
Czyści nagłówek HTTP. Jeśli nie ustawiono żadnych pól nagłówka, HttpRequest ustawi Content-Type na application/json, jeśli wysyłane dane są sformatowane jako JSON; w przeciwnym razie na text/plain. |
connect(url) |
Wysyła żądanie HTTP CONNECT do adresu URL i zwraca odpowiedź. |
customRequest(method, url, data) |
Umożliwia określenie dowolnej metody HTTP w pierwszym parametrze. Wysyła żądanie określonej metody do adresu URL z opcjonalnym ładunkiem data i zwraca odpowiedź. |
delete(url, data) |
Wysyła żądanie HTTP DELETE do adresu URL z opcjonalnym ładunkiem data i zwraca odpowiedź. |
getHeaders(<asArray>) |
Zwraca obiekt odebranych pól nagłówka HTTP. Parametr asArray może mieć wartość "true" (np. getHeaders(true)), "false" lub być niezdefiniowany. Jeśli ma wartość "true", wartości odebranych pól nagłówka zostaną zwrócone jako tablice; należy użyć tej opcji w celu pobrania wartości wielu nagłówków o tej samej nazwie.Jeśli parametr nie jest ustawiony lub ma wartość "false", wartości odebranych pól nagłówka zostaną zwrócone jako ciągi znaków. |
get(url, data) |
Wysyła żądanie HTTP GET do adresu URL z opcjonalnym ładunkiem data i zwraca odpowiedź. |
head(url) |
Wysyła żądanie HTTP HEAD do adresu URL i zwraca odpowiedź. |
options(url) |
Wysyła żądanie HTTP OPTIONS do adresu URL i zwraca odpowiedź. |
patch(url, data) |
Wysyła żądanie HTTP PATCH do adresu URL z opcjonalnym ładunkiem data i zwraca odpowiedź. |
put(url, data) |
Wysyła żądanie HTTP PUT do adresu URL z opcjonalnym ładunkiem data i zwraca odpowiedź. |
post(url, data) |
Wysyła żądanie HTTP POST do adresu URL z opcjonalnym ładunkiem data i zwraca odpowiedź. |
getStatus() |
Zwraca kod stanu ostatniego żądania HTTP. |
setProxy(proxy) |
Ustawia proxy HTTP na wartość "proxy". Jeśli ten parametr jest pusty, proxy nie jest używane. |
setHttpAuth(bitmask, username, password) |
Ustawia w parametrze 'bitmask' włączone metody uwierzytelniania HTTP (HTTPAUTH_BASIC, HTTPAUTH_DIGEST, HTTPAUTH_NEGOTIATE, HTTPAUTH_NTLM, HTTPAUTH_NONE). Flaga HTTPAUTH_NONE umożliwia wyłączenie uwierzytelniania HTTP. Przykłady: request.setHttpAuth(HTTPAUTH_NTLM | HTTPAUTH_BASIC, username, password)request.setHttpAuth(HTTPAUTH_NONE) |
trace(url, data) |
Wysyła żądanie HTTP TRACE do adresu URL z opcjonalnym ładunkiem data i zwraca odpowiedź. |
Przykład:
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
Obiekt XML umożliwia przetwarzanie danych XML we wstępnym przetwarzaniu pozycji i wykrywaniu niskopoziomowym oraz w webhookach.
Aby używać obiektu XML, serwer/proxy musi być skompilowany z obsługą libxml2.
| Method | Description |
|---|---|
XML.query(data, expression) |
Pobiera zawartość węzła przy użyciu XPath. Zwraca null, jeśli węzeł nie zostanie znaleziony. expression - wyrażenie XPath; data - dane XML jako ciąg znaków. |
XML.toJson(data) |
Konwertuje dane w formacie XML do JSON. |
XML.fromJson(object) |
Konwertuje dane w formacie JSON do XML. |
Przykład:
Wejście:
<menu>
<food type = "breakfast">
<name>Chocolate</name>
<price>$5.95</price>
<description></description>
<calories>650</calories>
</food>
</menu>
Wyjście:
{
"menu": {
"food": {
"@type": "breakfast",
"name": "Chocolate",
"price": "$5.95",
"description": null,
"calories": "650"
}
}
}
Zasady serializacji
Konwersja XML do JSON będzie przetwarzana zgodnie z następującymi zasadami (w przypadku konwersji JSON do XML stosowane są zasady odwrotne):
1. Atrybuty XML zostaną przekonwertowane na klucze, których nazwy są poprzedzone znakiem '@'.
Przykład:
Wejście:
<xml foo="FOO">
<bar>
<baz>BAZ</baz>
</bar>
</xml>
Wyjście:
{
"xml": {
"@foo": "FOO",
"bar": {
"baz": "BAZ"
}
}
}
2. Elementy samozamykające się (<foo/>) zostaną przekonwertowane tak, jakby miały wartość 'null'.
Przykład:
Wejście:
<xml>
<foo/>
</xml>
Wyjście:
{
"xml": {
"foo": null
}
}
3. Puste atrybuty (o wartości "") zostaną przekonwertowane tak, jakby miały wartość pustego ciągu znaków ('').
Przykład:
Wejście:
<xml>
<foo bar="" />
</xml>
Wyjście:
{
"xml": {
"foo": {
"@bar": ""
}
}
}
4. Wiele węzłów podrzędnych o tej samej nazwie elementu zostanie przekonwertowanych na pojedynczy klucz, którego wartością będzie tablica wartości.
Przykład:
Wejście:
<xml>
<foo>BAR</foo>
<foo>BAZ</foo>
<foo>QUX</foo>
</xml>
Wyjście:
{
"xml": {
"foo": ["BAR", "BAZ", "QUX"]
}
}
5. Jeśli element tekstowy nie ma atrybutów ani elementów podrzędnych, zostanie przekonwertowany jako ciąg znaków.
Przykład:
Wejście:
<xml>
<foo>BAZ</foo>
</xml>
Wyjście:
{
"xml": {
"foo": "BAZ"
}
}
6. Jeśli element tekstowy nie ma elementów podrzędnych, ale ma atrybuty, zawartość tekstowa zostanie przekonwertowana na element z kluczem '#text', a zawartość będzie jego wartością; atrybuty zostaną przekonwertowane zgodnie z zasadą serializacji 1.
Przykład:
Wejście:
<xml>
<foo bar="BAR">
BAZ
</foo>
</xml>
Wyjście:
{
"xml": {
"foo": {
"@bar": "BAR",
"#text": "BAZ"
}
}
}
Globalne funkcje JavaScript
Dodatkowe globalne funkcje JavaScript zostały zaimplementowane przy użyciu Duktape:
btoa(data)- koduje dane do ciągu base64.atob(base64_string)- dekoduje ciąg base64 jako bufor Uint8Array.
try {
b64 = btoa("test string");
buffer = atob(b64);
// Należy pamiętać, że logika dekodowania zależy od formatu danych w buforze.
decoded = String.fromCharCode.apply(this, [].slice.call(buffer));
}
catch (error) {
return {'error.name' : error.name, 'error.message' : error.message};
}
md5(data)- oblicza skrót MD5 danych.sha256(data)- oblicza skrót SHA256 danych.-
hmac('<hash type>',key,data)- zwraca skrót HMAC jako ciąg w formacie szesnastkowym; jakohash typeobsługiwane sąmd5isha256; parametrykeyidataobsługują dane binarne.Przykłady:
hmac('md5',key,data)hmac('sha256',key,data)
-
sign(hash,key,data)- zwraca obliczony podpis (podpis RSA z SHA-256) jako ciąg, gdzie:
hash - dozwolone jest tylkosha256, w przeciwnym razie zostanie zgłoszony błąd.
key - klucz prywatny. Powinien być zgodny ze standardem PKCS#1 lub PKCS#8. Klucz może być podany w różnych formach:- ze spacjami zamiast znaków nowej linii
- z poprzedzonymi znakiem ucieczki lub niepoprzedzonymi znakiem ucieczki
\nzamiast znaków nowej linii - bez żadnych znaków nowej linii, jako ciąg jednoliniowy
- jako ciąg w formacie JSON
Klucz może być również wczytany z makra użytkownika/tajnego makra/sejfu.
data - dane, które zostaną podpisane. Mogą to być ciąg znaków (obsługiwane są również dane binarne) lub bufor (Uint8Array/ArrayBuffer).
Przykład:
sign('sha256',key,data)
Do obliczania podpisów używany jest OpenSSL lub GnuTLS. Jeśli Zabbix został zbudowany bez którejkolwiek z tych bibliotek szyfrowania, zostanie zgłoszony błąd ('missing OpenSSL or GnuTLS library').