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) Отправка HTTP CONNECT запроса на URL и получение ответа.
customRequest(метод, url, данные) Позволяет указать первым параметром любой HTTP метод. Отправляет запрос указанным методом на URL с опциональной полезной нагрузкой в параметре данные и возвращает ответ.
delete(url, данные) Отправка запроса HTTP DELETE на URL с опциональной полезной нагрузкой в параметре данные и получение ответа.
getHeaders(<в_виде_массива>) Возвращает объект полученных полей HTTP заголовков.
Параметр в_виде_массива можно задать значением "true" (например, getHeaders(true)), "false" или неопределённым. Если задано значением "true", полученные значения полей HTTP заголовков вернутся в виде массивов; это следует использовать для получения значений полей нескольких заголовков с одинаковыми именами.
Если не задано или значение "false", полученные значения полей HTTP заголовков возвращаются в виде строк.
get(url, данные) Отправка запроса HTTP GET на URL с опциональной полезной нагрузкой в параметре данные и получение ответа.
head(url) Отправка запроса HTTP HEAD на URL и получение ответа.
options(url) Отправка запроса HTTP OPTIONS на URL и получение ответа.
patch(url, данные) Отправка запроса HTTP PATCH на URL с опциональной полезной нагрузкой в параметре данные и получение ответа.
put(url, данные) Отправка запроса HTTP PUT на URL с опциональной полезной нагрузкой в параметре данные и получение ответа.
post(url, данные) Отправка запроса HTTP POST на URL с опциональной полезной нагрузкой в параметре данные и получение ответа.
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, данные) Отправка запроса HTTP TRACE на URL с опциональной полезной нагрузкой в параметре данные и получение ответа.

Пример:

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) - декодирование строки base64
try {
           b64 = btoa("utf8 string");
           utf8 = atob(b64);
       } 
       catch (error) {
           return {'error.name' : error.name, 'error.message' : error.message}
       }
  • md5(данные) - вычисление MD5 хеш-суммы строки
  • sha256(данные) - вычисление SHA256 хеш-суммы строки
  • hmac('<тип_хеша>',ключ,данные) - возврат HMAC хеш-суммы в виде 16-ричной строки. Поддерживаются типы хеша 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.