1. Дополнительные объекты Javascript
Обзор
В этом разделе описаны дополнения Zabbix к языку JavaScript, реализованные с помощью Duktape, а также поддерживаемые глобальные функции JavaScript.
Не используйте необъявленные присваивания в JavaScript предобработки.
Используйте var для объявления локальных переменных.
Встроенные объекты
Zabbix
Объект Zabbix обеспечивает взаимодействие с внутренней функциональностью Zabbix.
| Method | Description |
|---|---|
log(loglevel, message) |
Записывает <message> в журнал Zabbix с использованием уровня журналирования <loglevel> (см. параметр DebugLevel в файле конфигурации). |
Пример:
Zabbix.log(3, "this is a log entry written with 'Warning' log level")
Вы можете использовать следующие псевдонимы:
| 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)) |
Общий размер всех записываемых в журнал сообщений ограничен 8 МБ на одно выполнение скрипта.
| Method | Description |
|---|---|
sleep(delay) |
Задерживает выполнение JavaScript на delay миллисекунд. |
Пример (задержка выполнения на 15 секунд):
Zabbix.sleep(15000)
HttpRequest
Этот объект инкапсулирует дескриптор cURL, позволяя выполнять простые HTTP-запросы. Ошибки генерируются как исключения.
Инициализация нескольких объектов HttpRequest ограничена 10 на одно выполнение скрипта.
| Method | Description |
|---|---|
addHeader(value) |
Добавляет поле HTTP-заголовка. Это поле используется для всех последующих запросов, пока не будет очищено методом clearHeader().Суммарная длина полей заголовка, которые можно добавить в один объект HttpRequest, ограничена 128 Кбайтами (включая специальные символы и имена заголовков). |
clearHeader() |
Очищает HTTP-заголовок. Если поля заголовка не заданы, HttpRequest установит Content-Type в application/json, если отправляемые данные имеют формат JSON; в противном случае — text/plain. |
connect(url) |
Отправляет HTTP-запрос CONNECT на URL и возвращает ответ. |
customRequest(method, url, data) |
Позволяет указать любой HTTP-метод в первом параметре. Отправляет запрос указанным методом на URL с необязательной полезной нагрузкой data и возвращает ответ. |
delete(url, data) |
Отправляет HTTP-запрос DELETE на URL с необязательной полезной нагрузкой data и возвращает ответ. |
getHeaders(<asArray>) |
Возвращает объект полученных полей HTTP-заголовка. Параметр asArray может быть установлен в "true" (например, getHeaders(true)), "false" или быть неопределённым. Если установлено значение "true", значения полученных полей HTTP-заголовка будут возвращены как массивы; это следует использовать для получения значений полей нескольких заголовков с одинаковыми именами.Если параметр не задан или установлен в "false", значения полученных полей HTTP-заголовка будут возвращены как строки. |
get(url, data) |
Отправляет HTTP-запрос GET на URL с необязательной полезной нагрузкой data и возвращает ответ. |
head(url) |
Отправляет HTTP-запрос HEAD на URL и возвращает ответ. |
options(url) |
Отправляет HTTP-запрос OPTIONS на URL и возвращает ответ. |
patch(url, data) |
Отправляет HTTP-запрос PATCH на URL с необязательной полезной нагрузкой data и возвращает ответ. |
put(url, data) |
Отправляет HTTP-запрос PUT на URL с необязательной полезной нагрузкой data и возвращает ответ. |
post(url, data) |
Отправляет HTTP-запрос POST на URL с необязательной полезной нагрузкой data и возвращает ответ. |
getStatus() |
Возвращает код состояния последнего HTTP-запроса. |
setProxy(proxy) |
Устанавливает HTTP-прокси в значение "proxy". Если этот параметр пуст, прокси не используется. |
setHttpAuth(bitmask, username, password) |
Устанавливает включённые методы HTTP-аутентификации (HTTPAUTH_BASIC, HTTPAUTH_DIGEST, HTTPAUTH_NEGOTIATE, HTTPAUTH_NTLM, HTTPAUTH_NONE) в параметре 'bitmask'. Флаг HTTPAUTH_NONE позволяет отключить HTTP-аутентификацию. Примеры: request.setHttpAuth(HTTPAUTH_NTLM | HTTPAUTH_BASIC, username, password)request.setHttpAuth(HTTPAUTH_NONE) |
trace(url, data) |
Отправляет HTTP-запрос TRACE на URL с необязательной полезной нагрузкой data и возвращает ответ. |
Пример:
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
Объект XML позволяет обрабатывать XML-данные при предобработке элемента данных, низкоуровневом обнаружении и в вебхуках.
Для использования объекта XML сервер/прокси должны быть скомпилированы с поддержкой libxml2.
| Method | Description |
|---|---|
XML.query(data, expression) |
Извлекает содержимое узла с помощью XPath. Возвращает null, если узел не найден. expression - выражение XPath; data - XML-данные в виде строки. |
XML.toJson(data) |
Преобразует данные в формате XML в JSON. |
XML.fromJson(object) |
Преобразует данные в формате JSON в XML. |
Пример:
Входные данные:
<menu>
<food type = "breakfast">
<name>Chocolate</name>
<price>$5.95</price>
<description></description>
<calories>650</calories>
</food>
</menu>
Выходные данные:
{
"menu": {
"food": {
"@type": "breakfast",
"name": "Chocolate",
"price": "$5.95",
"description": null,
"calories": "650"
}
}
}
Правила сериализации
Преобразование XML в JSON будет выполняться в соответствии со следующими правилами (для преобразования JSON в XML применяются обратные правила):
1. Атрибуты XML будут преобразованы в ключи, к именам которых добавляется префикс '@'.
Пример:
Входные данные:
<xml foo="FOO">
<bar>
<baz>BAZ</baz>
</bar>
</xml>
Выходные данные:
{
"xml": {
"@foo": "FOO",
"bar": {
"baz": "BAZ"
}
}
}
2. Самозакрывающиеся элементы (<foo/>) будут преобразованы как имеющие значение 'null'.
Пример:
Входные данные:
<xml>
<foo/>
</xml>
Выходные данные:
{
"xml": {
"foo": null
}
}
3. Пустые атрибуты (со значением "") будут преобразованы как имеющие значение пустой строки ('').
Пример:
Входные данные:
<xml>
<foo bar="" />
</xml>
Выходные данные:
{
"xml": {
"foo": {
"@bar": ""
}
}
}
4. Несколько дочерних узлов с одинаковым именем элемента будут преобразованы в один ключ, значением которого будет массив значений.
Пример:
Входные данные:
<xml>
<foo>BAR</foo>
<foo>BAZ</foo>
<foo>QUX</foo>
</xml>
Выходные данные:
{
"xml": {
"foo": ["BAR", "BAZ", "QUX"]
}
}
5. Если текстовый элемент не имеет атрибутов и дочерних элементов, он будет преобразован в строку.
Пример:
Входные данные:
<xml>
<foo>BAZ</foo>
</xml>
Выходные данные:
{
"xml": {
"foo": "BAZ"
}
}
6. Если текстовый элемент не имеет дочерних элементов, но имеет атрибуты, текстовое содержимое будет преобразовано в элемент с ключом '#text', а содержимое — в значение; атрибуты будут преобразованы, как описано в правиле сериализации 1.
Пример:
Входные данные:
<xml>
<foo bar="BAR">
BAZ
</foo>
</xml>
Выходные данные:
{
"xml": {
"foo": {
"@bar": "BAR",
"#text": "BAZ"
}
}
}
Глобальные функции JavaScript
С помощью Duktape были реализованы дополнительные глобальные функции JavaScript:
btoa(data)— кодирует данные в строку base64.atob(base64_string)— декодирует строку base64 в буфер Uint8Array.
try {
b64 = btoa("test string");
buffer = atob(b64);
// Обратите внимание, что логика декодирования зависит от формата данных буфера.
decoded = String.fromCharCode.apply(this, [].slice.call(buffer));
}
catch (error) {
return {'error.name' : error.name, 'error.message' : error.message};
}
md5(data)— вычисляет MD5-хеш данных.sha256(data)— вычисляет SHA256-хеш данных.-
hmac('<hash type>',key,data)— возвращает HMAC-хеш в виде строки в шестнадцатеричном формате; в качествеhash typeподдерживаютсяmd5иsha256; параметрыkeyиdataподдерживают двоичные данные.Примеры:
hmac('md5',key,data)hmac('sha256',key,data)
-
sign(hash,key,data)— возвращает вычисленную подпись (RSA-подпись с SHA-256) в виде строки, где:
hash — допускается толькоsha256, в противном случае будет сгенерирована ошибка.
key — закрытый ключ. Он должен соответствовать стандарту PKCS#1 или PKCS#8. Ключ может быть предоставлен в разных формах:- с пробелами вместо переводов строк
- с экранированными или неэкранированными
\nвместо переводов строк - без переводов строк, как однострочная строка
- как строка в формате JSON
Ключ также может быть загружен из пользовательского макроса/секретного макроса/хранилища секретов.
data — данные, которые будут подписаны. Это может быть строка (также поддерживаются двоичные данные) или буфер (Uint8Array/ArrayBuffer).
Пример:
sign('sha256',key,data)
Для вычисления подписей используется OpenSSL или GnuTLS. Если Zabbix был собран без какой-либо из этих библиотек шифрования, будет сгенерирована ошибка ('missing OpenSSL or GnuTLS library').