1 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 jedno wykonanie skryptu.
| Method | Description |
|---|---|
addHeader(value) |
Dodaje pole nagłówka HTTP. To pole jest używane dla wszystkich kolejnych żądań, dopóki nie zostanie wyczyszczone metodą clearHeader().Łączna długość pól nagłówka, które można dodać do pojedynczego obiektu HttpRequest, jest ograniczona do 128 KB (łącznie ze znakami specjalnymi i nazwami 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ą w formacie JSON; w przeciwnym razie text/plain. |
connect(url) |
Wysyła żądanie HTTP CONNECT do URL i zwraca odpowiedź. |
customRequest(method, url, data) |
Umożliwia określenie dowolnej metody HTTP w pierwszym parametrze. Wysyła żądanie wskazaną metodą do URL z opcjonalnym ładunkiem data i zwraca odpowiedź. |
delete(url, data) |
Wysyła żądanie HTTP DELETE do URL z opcjonalnym ładunkiem data i zwraca odpowiedź. |
getHeaders(<asArray>) |
Zwraca obiekt odebranych pól nagłówka HTTP. Parametr asArray może być ustawiony na "true" (np. getHeaders(true)), "false" lub może być niezdefiniowany. Jeśli jest ustawiony na "true", wartości odebranych pól nagłówka HTTP zostaną zwrócone jako tablice; należy tego używać do pobierania wartości pól wielu nagłówków o tej samej nazwie.Jeśli parametr nie jest ustawiony lub jest ustawiony na "false", wartości odebranych pól nagłówka HTTP zostaną zwrócone jako ciągi znaków. |
get(url, data) |
Wysyła żądanie HTTP GET do URL z opcjonalnym ładunkiem data i zwraca odpowiedź. |
head(url) |
Wysyła żądanie HTTP HEAD do URL i zwraca odpowiedź. |
options(url) |
Wysyła żądanie HTTP OPTIONS do URL i zwraca odpowiedź. |
patch(url, data) |
Wysyła żądanie HTTP PATCH do URL z opcjonalnym ładunkiem data i zwraca odpowiedź. |
put(url, data) |
Wysyła żądanie HTTP PUT do URL z opcjonalnym ładunkiem data i zwraca odpowiedź. |
post(url, data) |
Wysyła żądanie HTTP POST do URL z opcjonalnym ładunkiem data i zwraca odpowiedź. |
getStatus() |
Zwraca kod statusu ostatniego żądania HTTP. |
setProxy(proxy) |
Ustawia HTTP proxy na wartość "proxy". Jeśli ten parametr jest pusty, proxy nie jest używany. |
setHttpAuth(bitmask, username, password) |
Ustawia włączone metody uwierzytelniania HTTP (HTTPAUTH_BASIC, HTTPAUTH_DIGEST, HTTPAUTH_NEGOTIATE, HTTPAUTH_NTLM, HTTPAUTH_NONE) w parametrze 'bitmask'. 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 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').