1 Papildu JavaScript objekti

Pārskats

Šajā sadaļā ir aprakstīti Zabbix papildinājumi JavaScript valodai, kas ieviesti ar Duktape, un atbalstītās globālās JavaScript funkcijas.

Neizmantojiet nedeklarētus piešķīrumus priekšapstrādes JavaScript kodā. Izmantojiet var, lai deklarētu lokālos mainīgos.

Iebūvētie objekti

Zabbix

Zabbix objekts nodrošina mijiedarbību ar Zabbix iekšējo funkcionalitāti.

Method Description
log(loglevel, message) Ieraksta <message> Zabbix žurnālā, izmantojot <loglevel> žurnāla līmeni (skatiet konfigurācijas faila parametru DebugLevel).

Piemērs:

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

Varat izmantot šādus aizstājvārdus:

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))

Visu reģistrēto ziņojumu kopējais lielums ir ierobežots līdz 8 MB vienai skripta izpildei.

Method Description
sleep(delay) Aizkavē JavaScript izpildi par delay milisekundēm.

Piemērs (aizkavē izpildi par 15 sekundēm):

Zabbix.sleep(15000)

HttpRequest

Šis objekts ietver cURL turi, kas ļauj veikt vienkāršus HTTP pieprasījumus. Kļūdas tiek izmestas kā izņēmumi.

Vairāku HttpRequest objektu inicializācija ir ierobežota līdz 10 vienam skripta izpildes gadījumam.

Method Description
addHeader(value) Pievieno HTTP galvenes lauku. Šis lauks tiek izmantots visiem turpmākajiem pieprasījumiem, līdz tas tiek notīrīts ar clearHeader() metodi.
Kopējais galvenes lauku garums, ko var pievienot vienam HttpRequest objektam, ir ierobežots līdz 128 Kbaitiem (ieskaitot speciālās rakstzīmes un galveņu nosaukumus).
clearHeader() Notīra HTTP galveni. Ja nav iestatīts neviens galvenes lauks, HttpRequest iestatīs Content-Type uz application/json, ja nosūtāmie dati ir JSON formātā; pretējā gadījumā — text/plain.
connect(url) Nosūta HTTP CONNECT pieprasījumu uz URL un atgriež atbildi.
customRequest(method, url, data) Ļauj pirmajā parametrā norādīt jebkuru HTTP metodi. Nosūta šīs metodes pieprasījumu uz URL ar neobligātu data slodzi un atgriež atbildi.
delete(url, data) Nosūta HTTP DELETE pieprasījumu uz URL ar neobligātu data slodzi un atgriež atbildi.
getHeaders(<asArray>) Atgriež saņemto HTTP galvenes lauku objektu.
Parametram asArray var iestatīt vērtību "true" (piemēram, getHeaders(true)), "false" vai tas var nebūt definēts. Ja iestatīts uz "true", saņemto HTTP galvenes lauku vērtības tiks atgrieztas kā masīvi; tas jāizmanto, lai iegūtu vairāku vienāda nosaukuma galveņu lauku vērtības.
Ja parametrs nav iestatīts vai ir iestatīts uz "false", saņemto HTTP galvenes lauku vērtības tiks atgrieztas kā virknes.
get(url, data) Nosūta HTTP GET pieprasījumu uz URL ar neobligātu data slodzi un atgriež atbildi.
head(url) Nosūta HTTP HEAD pieprasījumu uz URL un atgriež atbildi.
options(url) Nosūta HTTP OPTIONS pieprasījumu uz URL un atgriež atbildi.
patch(url, data) Nosūta HTTP PATCH pieprasījumu uz URL ar neobligātu data slodzi un atgriež atbildi.
put(url, data) Nosūta HTTP PUT pieprasījumu uz URL ar neobligātu data slodzi un atgriež atbildi.
post(url, data) Nosūta HTTP POST pieprasījumu uz URL ar neobligātu data slodzi un atgriež atbildi.
getStatus() Atgriež pēdējā HTTP pieprasījuma statusa kodu.
setProxy(proxy) Iestata HTTP starpniekserveri uz "proxy" vērtību. Ja šis parametrs ir tukšs, starpniekserveris netiek izmantots.
setHttpAuth(bitmask, username, password) Iestata iespējotās HTTP autentifikācijas metodes (HTTPAUTH_BASIC, HTTPAUTH_DIGEST, HTTPAUTH_NEGOTIATE, HTTPAUTH_NTLM, HTTPAUTH_NONE) parametrā 'bitmask'.
Karogs HTTPAUTH_NONE ļauj atspējot HTTP autentifikāciju.
Piemēri:
request.setHttpAuth(HTTPAUTH_NTLM | HTTPAUTH_BASIC, username, password)
request.setHttpAuth(HTTPAUTH_NONE)
trace(url, data) Nosūta HTTP TRACE pieprasījumu uz URL ar neobligātu data slodzi un atgriež atbildi.

Piemērs:

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 objekts ļauj apstrādāt XML datus vienuma un zema līmeņa atklāšanas priekšapstrādē, kā arī webhook.

Lai izmantotu XML objektu, serverim/starpniekserverim jābūt kompilētam ar libxml2 atbalstu.

Method Description
XML.query(data, expression) Iegūst mezgla saturu, izmantojot XPath. Atgriež null, ja mezgls netiek atrasts.
expression - XPath izteiksme;
data - XML dati virknes formā.
XML.toJson(data) Pārveido datus XML formātā uz JSON.
XML.fromJson(object) Pārveido datus JSON formātā uz XML.

Piemērs:

Ievade:

<menu>
    <food type = "breakfast">
        <name>Chocolate</name>
        <price>$5.95</price>
        <description></description>
        <calories>650</calories>
    </food>
</menu>

Izvade:

{
    "menu": {
        "food": {
            "@type": "breakfast",
            "name": "Chocolate",
            "price": "$5.95",
            "description": null,
            "calories": "650"
        }
    }
}
Serializācijas noteikumi

XML pārveidošana uz JSON tiks apstrādāta saskaņā ar šādiem noteikumiem (JSON pārveidošanai uz XML tiek piemēroti apgriezti noteikumi):

1. XML atribūti tiks pārveidoti par atslēgām, kuru nosaukumiem priekšā ir pievienots '@'.

Piemērs:

Ievade:

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

Izvade:

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

2. Pašaizverošie elementi (<foo/>) tiks pārveidoti kā tādi, kuriem ir 'null' vērtība.

Piemērs:

Ievade:

<xml>
  <foo/>
</xml>

Izvade:

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

3. Tukši atribūti (ar "" vērtību) tiks pārveidoti kā tādi, kuriem ir tukšas virknes ('') vērtība.

Piemērs:

Ievade:

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

Izvade:

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

4. Vairāki bērnelementi ar vienādu elementa nosaukumu tiks pārveidoti par vienu atslēgu, kuras vērtība ir vērtību masīvs.

Piemērs:

Ievade:

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

Izvade:

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

5. Ja teksta elementam nav atribūtu un nav bērnelementu, tas tiks pārveidots par virkni.

Piemērs:

Ievade:

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

Izvade:

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

6. Ja teksta elementam nav bērnelementu, bet tam ir atribūti, teksta saturs tiks pārveidots par elementu ar atslēgu '#text' un saturu kā vērtību; atribūti tiks pārveidoti, kā aprakstīts 1. serializācijas noteikumā.

Piemērs:

Ievade:

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

Izvade:

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

Globālās JavaScript funkcijas

Ar Duktape ir ieviestas papildu globālās JavaScript funkcijas:

  • btoa(data) — kodē datus base64 virknē.
  • atob(base64_string) — dekodē base64 virkni kā Uint8Array buferi.
try {
    b64 = btoa("test string");
    buffer = atob(b64);

    // Ņemiet vērā, ka dekodēšanas loģika ir atkarīga no bufera datu formāta.
    decoded = String.fromCharCode.apply(this, [].slice.call(buffer));
} 
catch (error) {
    return {'error.name' : error.name, 'error.message' : error.message};
}
  • md5(data) — aprēķina datu MD5 jaucējvērtību.
  • sha256(data) — aprēķina datu SHA256 jaucējvērtību.
  • hmac('<hash type>',key,data) — atgriež HMAC jaucējvērtību kā heksadecimāli formatētu virkni; kā hash type tiek atbalstīti md5 un sha256; parametri key un data atbalsta bināros datus.

    Piemēri:

    • hmac('md5',key,data)
    • hmac('sha256',key,data)
  • sign(hash,key,data) — atgriež aprēķināto parakstu (RSA paraksts ar SHA-256) kā virkni, kur:
    hash — ir atļauts tikai sha256, pretējā gadījumā tiks izraisīta kļūda.
    key — privātā atslēga. Tai jāatbilst PKCS#1 vai PKCS#8 standartam. Atslēgu var norādīt dažādās formās:

    • ar atstarpēm jaunu rindu vietā
    • ar ekrānētu vai neekrānētu \n jaunu rindu vietā
    • bez jebkādām jaunām rindām kā vienas rindas virkni
    • kā JSON formatētu virkni

    Atslēgu var arī ielādēt no lietotāja makrosa/secret macro/vault.

    data — dati, kas tiks parakstīti. Tā var būt virkne (tiek atbalstīti arī binārie dati) vai buferis (Uint8Array/ArrayBuffer).

    Piemērs:

    • sign('sha256',key,data)

    Parakstu aprēķināšanai tiek izmantots OpenSSL vai GnuTLS. Ja Zabbix ir būvēts bez kādas no šīm šifrēšanas bibliotēkām, tiks izraisīta kļūda ('missing OpenSSL or GnuTLS library').