Этот раздел описывает дополнения Zabbix к языку JavaScript, который реализован при помощи Duktape, и поддерживаемые глобальные функции JavaScript.
Объект Zabbix даёт возможность взаимодействия с внутренним функционалом Zabbix.
Метод | Описание |
---|---|
log(уровень_журнала, сообщение) |
Записывает <сообщение> в журнал Zabbix с использованием уровня журнала <уровень_журнала> (смотрите параметр DebugLevel в файле конфигурации). |
Пример:
Вы можете использовать следующие псевдонимы:
Псевдоним | Псевдоним к |
---|---|
console.log(объект) | Zabbix.log(4, JSON.stringify(объект)) |
console.warn(объект) | Zabbix.log(3, JSON.stringify(объект)) |
console.error(объект) | Zabbix.log(2, JSON.stringify(объект)) |
Суммарный размер всех записываемых в журнал сообщений ограничен величиной 8 мегабайт на выполняемый скрипт.
Метод | Описание |
---|---|
sleep(задержка) |
Задержка выполнения JavaScript на задержка миллисекунд. |
Пример (задержка выполнения на 15 секунд):
Этот объект инкапсулирует обработчик cURL, который позволяет выполнять простые HTTP запросы. Ошибки сообщаются как исключения.
Инициализация нескольких объектов HttpRequest
ограничена количеством 10 штук на выполняемый скрипт.
Метод | Описание |
---|---|
addHeader(значение) |
Добавление поля HTTP заголовка. Это поле используется для всех последующих вызовов, до момента очистки при помощи метода clearHeader() .Суммарная длина полей заголовков, которые могут быть добавлены к одному объекту HttpRequest , ограничена величиной 128 килобайт (включая специальные символы и имена заголовков). |
clearHeader() |
Очистка HTTP заголовка. Если заданные поля заголовков отсутствуют, HttpRequest задаст Content-Type значением application/json, если публикуемые данные отформатированы в виде JSON; в противном случае — text/plain. |
connect(url) |
Отправка на URL HTTP запроса CONNECT и получение ответа. |
customRequest(метод, url, данные) |
Позволяет указать первым параметром любой HTTP метод. Отправляет на URL запрос указанным методом с опциональной полезной нагрузкой в параметре данные и возвращает ответ. |
delete(url, данные) |
Отправка на URL HTTP запроса DELETE с опциональной полезной нагрузкой в параметре данные и получение ответа. |
getHeaders(<в_виде_массива>) |
Возвращает объект полученных полей HTTP заголовков. Параметр в_виде_массива можно задать значением «true» (например, getHeaders(true) ), «false» или неопределённым. Если задано значением «true», полученные значения полей HTTP заголовков вернутся в виде массивов; это следует использовать для получения значений полей нескольких заголовков с одинаковыми именами.Если не задано или значение «false», полученные значения полей HTTP заголовков возвращаются в виде строк. |
get(url, данные) |
Отправка на URL HTTP запроса GET с опциональной полезной нагрузкой в параметре данные и получение ответа. |
head(url) |
Отправка на URL HTTP запроса HEAD и получение ответа. |
options(url) |
Отправка на URL HTTP запроса OPTIONS и получение ответа. |
patch(url, данные) |
Отправка на URL HTTP запроса PATCH с опциональной полезной нагрузкой в параметре данные и получение ответа. |
put(url, данные) |
Отправка на URL HTTP запроса PUT с опциональной полезной нагрузкой в параметре данные и получение ответа. |
post(url, данные) |
Отправка на URL HTTP запроса POST с опциональной полезной нагрузкой в параметре данные и получение ответа. |
getStatus() |
Получение кода состояния последнего HTTP запроса. |
setProxy(прокси) |
Задаёт HTTP прокси значением «прокси». Если этот параметр пустой, то никакой прокси не используется. |
setHttpAuth(битовая_маска, имя_пользователя, пароль) |
Включение методов HTTP аутентификации (HTTPAUTH_BASIC, HTTPAUTH_DIGEST, HTTPAUTH_NEGOTIATE, HTTPAUTH_NTLM, HTTPAUTH_NONE) в параметре «битовая_маска». Флаг HTTPAUTH_NONE позволяет отключить HTTP аутентификацию. Например: request.setHttpAuth(HTTPAUTH_NTLM | HTTPAUTH_BASIC, username, password) request.setHttpAuth(HTTPAUTH_NONE) |
trace(url, данные) |
Отправка на URL HTTP запроса TRACE с опциональной полезной нагрузкой в параметре данные и получение ответа. |
Пример:
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, сервер/прокси должны быть скомпилированы с поддержкой libxml2.
Метод | Описание |
---|---|
XML.query(данные, выражение) |
Получение содержимого узла с использованием XPath. Возвращает null, если узел не найден. выражение — выражение XPath; данные — данные XML в виде строки. |
XML.toJson(данные) |
Преобразование данных в XML формате в JSON. |
XML.fromJson(данные) |
Преобразование данных в 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 преобразуются в ключи, имеющие в своих именах префикс '@'.
Пример:
Входящие данные:
Вывод:
2. Элементы, которые закрываются в самих себе (<foo/>), будут преобразованы как имеющие значение «null».
Пример:
Входящие данные:
Вывод:
3. Пустые атрибуты (со значением "") будут преобразованы как имеющие значение пустой строки ('').
Пример:
Входящие данные:
Вывод:
4. Несколько дочерних узлов с идентичными именами элементов будут преобразованы в один ключ, который имеет массив значений в качестве своего значения.
Пример:
Входящие данные:
Вывод:
5. Если текстовый элемент не имеет атрибутов и дочерних элементов, он будет преобразован в строку.
Пример:
Входящие данные:
Вывод:
6. Если текстовый элемент не имеет дочерних элементов, но имеет атрибуты, то текстовое содержимое будет преобразовано в элемент с ключом «#text» и содержимым в виде значения; атрибуты будут преобразованы в соответствии с правилом сериализации 1.
Пример:
Входящие данные:
Вывод:
Дополнительные глобальные функции JavaScript реализованы при помощи Duktape:
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(данные) — вычисление MD5 хеш-суммы строки
sha256(данные) — вычисление SHA256 хеш-суммы строки
hmac('<тип_хеша>',ключ,данные) — возврат HMAC хеш-суммы в виде шестнадцатеричной строки; поддерживаются типы хеша MD5 и SHA256; параметры ключ и данные поддерживают бинарные данные. Примеры:
hmac('md5',key,data)
hmac('sha256',key,data)
sign(хеш,ключ,данные) — возврат вычисленной подписи (RSA-подпись с SHA-256) в виде строки, где:
хеш — разрешено только 'sha256', иначе выбрасывается ошибка;
ключ — закрытый ключ (private key). Он должен соответствовать стандарту PKCS#1 или PKCS#8. Ключ может быть представлен в различных формах:
\n
» вместо переводов строк;Ключ также может быть загружен из пользовательского макроса / скрытого макроса / хранилища).
данные — данные, которые будут подписаны. Это может быть строка (поддерживаются бинарные данные) или буфер (Uint8Array/ArrayBuffer).
Для вычисления подписей используются OpenSSL или GnuTLS. Если Zabbix был скомпилирован без какой-либо из этих библиотек шифрования, будет выброшена ошибка («missing OpenSSL or GnuTLS library»).