Sidebar

Zabbix Summit 2022
View presentations

Дополнительные объекты 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(объект))
Метод Описание
sleep(задержка) Задержка выполнения JavaScript на задержка миллисекунд.

Пример (задержка выполнения на 15 секунд):

Zabbix.sleep(15000)

HttpRequest

Этот объект инкапсулирует cURL обработчик, который позволяет выполнять простые HTTP запросы. Ошибки сообщаются в вызове исключений.

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

Метод Описание
addHeader(имя, значение) Добавление поля HTTP заголовка. Это поле используется для всех последующих вызовов, до момента очистки при помощи ClearHeader() метода.
clearHeader() Очистка HTTP заголовка. Если заданные поля заголовков отсутствуют, CurlHttpRequest задаст 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://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.

Пример:

Input:

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