1. Дополнительные объекты Javascript

Обзор

Этот раздел описывает дополнения Zabbix к языку JavaScript, который реализован при помощи Duktape, и поддерживаемые глобальные функции JavaScript.

Встроенные объекты

Zabbix

Объект Zabbix даёт возможность взаимодействия с внутренним функционалом Zabbix.

Метод Описание
log(уровень_журнала, сообщение) Записывает <сообщение> в журнал Zabbix с использованием уровня журнала <уровень_журнала> (смотрите параметр DebugLevel в файле конфигурации).

Пример:

Zabbix.log(3, "this is a log entry written with 'Warning' log level")

Вы можете использовать следующие псевдонимы:

Псевдоним Псевдоним к
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 секунд):

Zabbix.sleep(15000)

HttpRequest

HttpRequest — новое имя этого объекта с Zabbix 5.4. Ранее он назывался «CurlHttpRequest». Имена методов также изменились в Zabbix 5.4. Старые имена объекта/методов теперь считаются устаревшими, и их поддержка будет прекращена после Zabbix 6.0.

Этот объект инкапсулирует обработчик 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 данные в элементах данных и в предварительной обработке низкоуровневых обнаружений, а также в вебхуках.

Чтобы использовать объект 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 преобразуются в ключи, имеющие в своих именах префикс '@'.

Пример:

Входящие данные:

 <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

Дополнительные глобальные функции JavaScript реализованы при помощи Duktape:

  • btoa(данные) — кодирует данные в строку Base64
  • atob(строка_base64) — начиная с версии 6.0.31, декодирует строку Base64 как буфер Uint8Array (в Zabbix 6.0.0 — 6.0.30 возвращает декодированную строку)
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. Ключ может быть представлен в различных формах:

    • с пробелами вместо переводов строк;
    • с экранированными или неэкранированными «» вместо переводов строк;
    • вообще без переводов строк, как одна строка;
    • в виде строки в формате JSON.

    Ключ также может быть загружен из пользовательского макроса / скрытого макроса / хранилища).

    данные — данные, которые будут подписаны. Это может быть строка (поддерживаются бинарные данные) или буфер (Uint8Array/ArrayBuffer).
    Для вычисления подписей используются OpenSSL или GnuTLS. Если Zabbix был скомпилирован без какой-либо из этих библиотек шифрования, будет выброшена ошибка («missing OpenSSL or GnuTLS library»).
    Эта функция поддерживается, начиная с Zabbix 6.0.15.