Это перевод страницы документации с английского языка. Помогите нам сделать его лучше.

Дополнительные объекты 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

This object encapsulates cURL handle allowing to make simple HTTP requests. Errors are thrown as exceptions.

HttpRequest is a new name for this object since Zabbix 5.4. Previously it used to be called CurlHttpRequest. Method names have also been changed in Zabbix 5.4. The old object/method names are now deprecated and their support will be discontinued after Zabbix 6.0.

Method Description
addHeader(name, value) Adds HTTP header field. This field is used for all following requests until cleared with the clearHeader() method.
clearHeader() Clears HTTP header. If no header fields are set, HttpRequest will set Content-Type to application/json if the data being posted is JSON-formatted; text/plain otherwise.
connect(url) Sends HTTP CONNECT request to the URL and returns the response.
customRequest(method, url, data) Allows to specify any HTTP method in the first parameter. Sends the method request to the URL with optional data payload and returns the response.
delete(url, data) Sends HTTP DELETE request to the URL with optional data payload and returns the response.
getHeaders() Returns object of received HTTP header fields.
get(url, data) Sends HTTP GET request to the URL with optional data payload and returns the response.
head(url) Sends HTTP HEAD request to the URL and returns the response.
options(url) Sends HTTP OPTIONS request to the URL and returns the response.
patch(url, data) Sends HTTP PATCH request to the URL with optional data payload and returns the response.
put(url, data) Sends HTTP PUT request to the URL with optional data payload and returns the response.
post(url, data) Sends HTTP POST request to the URL with optional data payload and returns the response.
getStatus() Returns the status code of the last HTTP request.
setProxy(proxy) Sets HTTP proxy to "proxy" value. If this parameter is empty then no proxy is used.
setHttpAuth(bitmask, username, password) Sets enabled HTTP authentication methods (HTTPAUTH_BASIC, HTTPAUTH_DIGEST, HTTPAUTH_NEGOTIATE, HTTPAUTH_NTLM, HTTPAUTH_NONE) in the 'bitmask' parameter.
The HTTPAUTH_NONE flag allows to disable HTTP authentication.
Examples:
request.setHttpAuth(HTTPAUTH_NTLM \| HTTPAUTH_BASIC, username, password)
request.setHttpAuth(HTTPAUTH_NONE)
trace(url, data) Sends HTTP TRACE request to the URL with optional data payload and returns the response.

Example:

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://tsupport.zabbix.lan/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.