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

Преглед

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

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

Zabbix

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

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

Пример:

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

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

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 дескриптор, омогућавајући једноставне HTTP захтеве. Грешке се избацују као изузеци.

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

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

Пример:

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 ако чвор није пронађен.
expression - XPath израз;
data - 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 атрибути ће бити конвертовани у кључеве чија имена су почев од '@'.

Пример:

Унос:

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

Излаз:

{
            "xml": {
            "@foo": "FOO",
            "bar": {
            "baz": "BAZ"
            }
            }
       }
  1. Самозатварајући елементи (<foo/>) ће бити конвертовани као да имају вредност 'null'.

Пример:

Унос:

 <xml>
        <foo/>
        </xml>

Излаз:

{
            "xml": {
            "foo": null
            }
       }
  1. Празни атрибути (са вредношћу "") биће конвертовани као да имају празну вредност стринга ('').

Пример:

Унос:

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

Излаз:

{
            "xml": {
            "foo": {
            "@bar": ""
            }
            }
       }
  1. Више подређених чворова са истим именом елемента биће конвертовано у један кључ који има низ вредности као своју вредност.

Пример:

Унос:

 <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(data) - кодира податке у base64 стринг;
  • atob(base64_string) - декодира base64 стринг као Uint8Array бафер.
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',кључ,подаци)
  • hmac('sha256',кључ,подаци)
  • sign(хеш,кључ,подаци) - враћа израчунати потпис (RSA потпис са SHA-256) као стринг, где је:
    ** hash** - дозвољен је само 'sha256', у супротном се избацује грешка;
    ** key** - приватни кључ. Требало би да одговара стандарду PKCS#1 или PKCS#8. Кључ може бити дат у различитим облицима:
  • са размацима уместо нових редова;
  • са избегнутим или неизбегнутим \n уместо нових редова;
  • без икаквих нових редова као једноредни стринг;
  • као стринг у JSON формату.

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

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