1 Додатни JavaScript објекти

Преглед

Ова секција описује Zabbix додатке JavaScript језику који су имплементирани са Duktape-ом и подржане глобалне JavaScript функције.

Уграђени објекти

Zabbix

Објекат Zabbix обезбеђује интеракцију са интерном функционалношћу.

Method Description
log(loglevel, message) Уписује <message> у Zabbix лог користећи <loglevel> ниво записа (погледајте параметар конфигурационе датотеке DebugLevel).

Пример:

Zabbix.log(3, "ово је лог унос написан са 'Warning' лог нивоом")

Можете користити следеће псеудониме:

Alias Alias to
console.log(object) Zabbix.log(4, JSON.stringify(object))
console.warn(object) Zabbix.log(3, JSON.stringify(object))
console.error(object) Zabbix.log(2, JSON.stringify(object))

Укупна величина свих евидентираних порука је ограничена на 8 MB по извршавању скрипте.

Method Description
sleep(delay) Одлаже извршавање JavaScript-а за delay милисекунди.

Пример (одлагање извршавања за 15 секунди):

Zabbix.sleep(15000)

HttpRequest

Овај објекат инкапсулира cURL handle омогућавајући да се праве једноставни HTTP захтеви. Грешке се избацују као изузеци.

Инициализација несколико објеката HttpRequest је ограничена количичином до 10 по извршавању скрипте.

Method Description
addHeader(value) Додаје поље HTTP заглавља. Ово поље се користи за све следеће захтеве док се не обрише методом clearHeader().
Укупна дужина поља заглавља која се могу додати једном објекту HttpRequest ограничена је на 128 кбајта (специјални карактери и имена заглавља су укључена).
clearHeader() Брише HTTP заглавље. Ако нису постављена поља заглавља, HttpRequest ће поставити Content-Type на application/json ако су подаци који се објављују у JSON формату; text/plain иначе.
connect(url) Шаље HTTP CONNECT захтев на URL и враћа одговор.
customRequest(method, url, data) Омогућава да се наведе било који HTTP метод у првом параметру. Шаље захтев са наведеним методом на URL са опционим подацима и враћа одговор.
delete(url, data) Шаље HTTP DELETE захтев на URL са опционим подацима и враћа одговор.
getHeaders(<asArray>) Враћа објекат примљених HTTP поља заглавља.
Параметар asArray може бити подешен на "true" (нпр. getHeaders(true)), "false" или бити недефинисан. Ако је постављено на "true", примљене вредности поља HTTP заглавља биће враћене као низови; ово би требало да се користи за преузимање вредности поља вишеструких заглавља истог имена.
Ако није подешено или подешено на "false", примљене вредности поља HTTP заглавља биће враћене као стрингови.
get(url, data) Шаље HTTP GET захтев на URL са опционим подацима и враћа одговор.
head(url) Шаље HTTP HEAD захтев на URL и враћа одговор.
options(url) Шаље HTTP OPTIONS захтев на URL и враћа одговор.
patch(url, data) Шаље HTTP PATCH захтев на URL са опционим подацима и враћа одговор.
put(url, data) Шаље HTTP PUT захтев на URL са опционим подацима и враћа одговор.
post(url, data) Шаље HTTP POST захтев на URL са опционим подацима и враћа одговор.
getStatus() Враћа статусни код последњег HTTP захтева.
setProxy(proxy) Поставља HTTP прокси на вредност "прокси". Ако је овај параметар празан, онда се прокси не користи.
setHttpAuth(bitmask, username, password) Поставља омогућене методе HTTP аутентификације (HTTPAUTH_BASIC, HTTPAUTH_DIGEST, HTTPAUTH_NEGOTIATE, HTTPAUTH_NTLM, HTTPAUTH_NONE) у параметру 'bitmask'.
Ознака HTTPAUTH_NONE омогућава да се онемогући HTTP аутентификација.
На пример:
request.setHttpAuth(HTTPAUTH_NTLM | HTTPAUTH_BASIC, username, password)
request.setHttpAuth(HTTPAUTH_NONE)
trace(url, data) Шаље 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 подршком.

Method Description
XML.query(data, expression) Добавља садржај чвора помоћу XPath-а. Враћа null ако чвор није пронађен.
израз - XPath израз;
подаци - XML подаци као стринг.
XML.toJson(data) Конвертује податке из XML формата у JSON.
XML.fromJson(object) Конвертује податке из JSON формата у XML.

Пример:

Input:

<menu>
           <food type = "breakfast">
               <name>Chocolate</name>
               <price>$5.95</price>
               <description></description>
               <calories>650</calories>
           </food>
       </menu>
  • Output:*
{
           "menu": {
               "food": {
                   "@type": "breakfast",
                   "name": "Chocolate",
                   "price": "$5.95",
                   "description": null,
                   "calories": "650"
               }
           }
       }
Правила сериализације

Конверзија XML-а у JSON ће бити обрађена у складу са следећим правилима (за конверзије JSON у XML примењују се обрнута правила):

1. XML атрибути ће бити конвертовани у кључеве чија имена имају префикс '@'.

Пример:

Input:

 <xml foo="FOO">
          <bar>
            <baz>BAZ</baz>
          </bar>
        </xml>

Output:

 {
          "xml": {
            "@foo": "FOO",
            "bar": {
              "baz": "BAZ"
            }
          }
        }

2. Елементи који се самозатварају (< foo/>) ће бити конвертовани као да имају вредност 'null'.

Пример:

Input:

<xml>
         <foo/>
       </xml>

Output:

{
         "xml": {
           "foo": null
         }
       }

3. Празни атрибути (са вредношћу "") биће конвертовани као да имају вредност празног стринга ('').

Пример:

Input:

<xml>
         <foo bar="" />
       </xml>

Output:

{
         "xml": {
           "foo": {
             "@bar": ""
           }
         }
       }

4. Више подређених чворова са истим именом елемента биће конвертовано у један кључ који има низ вредности као вредност.

Пример:

Input:

<xml>
         <foo>BAR</foo>
         <foo>BAZ</foo>
         <foo>QUX</foo>
       </xml>

Output:

{
         "xml": {
           "foo": ["BAR", "BAZ", "QUX"]
         }
       }

5. Ако текстуални елемент нема атрибуте и подређене елементе, биће конвертован као стринг.

Пример:

Input:

<xml>
           <foo>BAZ</foo>
       </xml>

Output:

{
         "xml": {
           "foo": "BAZ"
          }
       }

6. Ако текстуални елемент нема подређене елементе, али има атрибуте, текстуални садржај ће бити конвертован у елемент са кључем '#text' и садржајем као вредношћу; атрибути ће бити конвертовани као што је описано у правилу серијализације 1.

Пример:

Input:

<xml>
         <foo bar="BAR">
           BAZ
         </foo>
       </xml>

Output:

{
         "xml": {
           "foo": {
             "@bar": "BAR",
             "#text": "BAZ"
           }
         }
       }

Глобалне JavaScript функције

Додатне глобалне JavaScript функције су имплементиране са Duktape-ом:

  • btoa(data) - кодира податке у Base64 стринг;
  • atob(base64_string) - од верзије 7.0.1, декодира Base64 стринг као Uint8Array бафер (у Zabbix 7.0.0 ова функција враћа декодирани стринг).
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(data) - израчунава MD5 хеш података

  • sha256(data) - израчунава SHA256 хеш података

  • hmac('<hash type>',key,data) - враћа HMAC хеш као хексадецимални стринг; Подржани су MD5 и SHA256 типови хеша; параметри кључа и података подржавају бинарне податке. Примери:

    • hmac('md5',key,data)
    • hmac('sha256',key,data)
  • sign(hash,key,data) - враћа израчунати потпис (RSA потпис са SHA-256) као стринг, где је:
    hash - дозвољено је само 'sha256', иначе се јавља грешка;
    key - приватни кључ. Требало би да одговара стандарду PKCS#1 или PKCS#8. Кључ се може доставити у различитим облицима:

    • са размацима уместо нових редова;
    • са escaped or non-escaped '' уместо нових редова;
    • без нових редова као стринг у једној линији;
    • као стринг у формату JSON.

    Кључ се такође може учитати из корисничког макроа/тајног макроа/трезора.

    подаци - подаци који ће бити потписани. То може бити стринг (бинарни подаци су такође подржани) или бафер (Uint8Array/ArrayBuffer).
    OpenSSL или GnuTLS се користи за израчунавање потписа. Ако је Zabbix направљен без било које од ових библиотека за енкрипцију, појавиће се грешка ('missing OpenSSL or GnuTLS library').