1 Objectes JavaScript addicionals

Vista general

Aquesta secció descriu les addicions de Zabbix al llenguatge JavaScript implementats amb Duktape i les funcions globals de JavaScript admeses.

Objectes integrats

Zabbix

L'objecte Zabbix proporciona interacció amb la funcionalitat interna de Zabbix.

Mètode Descripció
log(loglevel, message) Escriu <missatge> al registre de Zabbix emprant el nivell de registre <loglevel> (veieu la configuració de DebugLevel al fitxer de configuració).

Exemple:

 Zabbix.log(3, "aquesta és una entrada de registre escrita amb el nivell de registre 'Avís'")

Podeu emprar els àlies següents:

Àlies Àlies a
console.log(objecte) Zabbix.log(4, JSON.stringify(objecte))
console.warn(objecte) Zabbix.log(3, JSON.stringify(objecte))
console.error(objecte) Zabbix.log(2, JSON.stringify(objecte))

La mida total de tots els missatges registrats és limitada a 8 Mo per execució de l'script.

Mètode Descripció
sleep(delay) Endarrereix l'execució de JavaScript delay mil·lisegons.

Exemple (execució endarrerida durant 15 segons):

 Zabbix.sleep(15000)

HttpRequest

Aquest objecte encapsula el maneig cURL que permet fer peticions HTTP senzilles. Els errors es llancen com a excepcions.

::: nota important La inicialització de diversos objectes HttpRequest és limitada a 10 per execució de l'script. :::

Mètode Descripció
addHeader(name, value) Afegeix un camp de capçalera HTTP. Aquest camp s'empra per a totes les peticions següents fins que s'esborri amb el mètode clearHeader().
La longitud total dels camps de capçalera que es poden afegir a un sol objecte HttpRequest és limitada a 128 Koctets (caràcters especials i noms de capçalera inclosos).
clearHeader() Esborra la capçalera HTTP. Si no s'estableix cap camp de capçalera, HttpRequest establirà Content-Type a application/json si les dades que es publiquen tenen format JSON; text/llaç en cas contrari.
connect(url) Envia la petició HTTP CONNECT a l'URL i retorna la resposta.
customRequest(method, url, data) Permet especificar qualsevol mètode HTTP al primer paràmetre. Envia la petició de mètode a l'URL amb la càrrega útil opcional data i retorna la resposta.
delete(url, data) Envia la petició HTTP DELETE a l'URL amb una càrrega útil opcional data i retorna la resposta.
getHeaders(<asArray>) Retorna l'objecte dels camps de capçalera HTTP rebuts.
El paràmetre asArray es pot establir com a "cert" (per exemple, getHeaders(true)), "fals" o no estar definit. Si es defineix com a "cert", els valors dels camps de capçalera HTTP rebuts es retornaran com a matrius; així s'ha d'emprar per recuperar els valors de camp de diverses capçaleres del mateix nom.
Si no s'estableix o s'estableix com a "fals", els valors dels camps de la capçalera HTTP rebuts es retornaran com a cadenes.
get(url, data) Envia la petició HTTP GET a l'URL amb una càrrega útil opcional data i retorna la resposta.
head(url) Envia la petició HTTP HEAD a l'URL i retorna la resposta.
options(url) Envia la petició HTTP OPTIONS a l'URL i retorna la resposta.
patch(url, data) Envia la petició HTTP PATCH a l'URL amb una càrrega útil opcional data i retorna la resposta.
put(url, dades) Envia la petició HTTP PUT a l'URL amb una càrrega útil opcional data i retorna la resposta.
post(url, data) Envia la petició HTTP POST a l'URL amb una càrrega útil opcional data i retorna la resposta.
getStatus() Retorna el codi d'estat de la darrera petició HTTP.
setProxy(proxy) Defineix el proxy HTTP al valor "proxy". Si aquest paràmetre és buit, no s'empra cap proxy.
setHttpAuth(bitmask, username, password) Defineix els mètodes d'autenticació HTTP activats (HTTPAUTH_BASIC, HTTPAUTH_DIGEST, HTTPAUTH_NEGOTIATE, HTTPAUTH_NTLM, HTTPAUTH_NONE) al paràmetre 'bitmask'.
L'HTTPAUTH. _NONE permet desactivar l'autenticació HTTP.
Exemples:
request.setHttpAuth(HTTPAUTH_NTLM \| HTTPAUTH_BASIC, nom d'usuari, mot de pas)
request.setHttpAuth(HTTPAUTH_NONE)
trace(url, data) Envia la petició HTTP TRACE a l'URL amb una càrrega útil opcional data i retorna la resposta.

Exemple:

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

L'objecte XML permet el processament de dades XML en preprocessament de descoberta d'elements de baix nivell i webhooks.

Per emprar l'objecte XML, el servidor/proxy s'ha de compilar amb suport libxml2.

Mètode Descripció
XML.query(data, expression) Recuperar el contingut del node mitjançant XPath. Retorna null si no es troba el node.
expressió - una expressió XPath;
dades - dades XML com a cadena.
XML.toJson(data) Converteix les dades en format XML a JSON.
XML.fromJson(object) Converteix les dades en format JSON a XML.

Exemple :

Entrada:

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

Sortida:

{
           "menu": {
               "food": {
                   "@type": "breakfast",
                   "name": "Chocolate",
                   "price": "$5.95",
                   "description": null,
                   "calories": "650"
               }
           }
       }
Regles de serialització

La conversió de XML a JSON es processarà d'acord amb les regles següents (per a les conversions de JSON a XML, s'apliquen regles inverses):

1. Els atributs XML es convertiran en claus els noms de les quals aniran precedits per '@'.

Exemple:

Entrada:

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

Sortida:

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

2. Els elements de tancament automàtic (<foo/>) es convertiran com a valor "nul".

Exemple:

Entrada:

<xml>
         <foo/>
       </xml>

Sortida:

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

3. Els atributs buits (amb el valor "") es convertiran com a valor de cadena buida ('').

Exemple:

Entrada:

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

Sortida:

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

4. Diversos nodes secundaris amb el mateix nom d'element es convertiran en una única clau que tingui una matriu de valors com a valor.

Exemple:

Entrada:

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

Sortida:

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

5. Si un element de text no té ni atribut ni elements fills, es convertirà a cadena.

Exemple:

Entrada:

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

Sortida:

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

6. Si un element de text no té fills, però té atributs: el contingut del text es convertirà a un element amb la clau '#text' i el contingut com a valor; els atributs es convertiran tal com es descriu a la regla de serialització 1.

Exemple:

Entrada:

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

Sortida:

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

Funcions globals de JavaScript

S'han afegit funcions JavaScript globals addicionals amb Duktape:

  • btoa (data) - codifica la cadena a cadena en base64;
  • atob(base64_string) - des de la versió 7.0.1, descodifica la cadena en base64 com a buffer Uint8Array (a Zabbix 7.0.0 retornava una cadena descodificada).
try {
           b64 = btoa("test string");
           buffer = atob(b64);
       
           // Fixeu-vos que la lògica de descodificació depen del format de les dades del buffer.
           decoded = String.fromCharCode.apply(this, [].slice.call(buffer));
       } 
       catch (error) {
           return {'error.name' : error.name, 'error.message' : error.message};
       }
  • md5(dades) - calcula el hash MD5 d'una cadena

  • sha256(dades) - calcula el hash SHA256 d'una cadena

  • mac('<tipus hash>',clau,dades) - retorna el hash HMAC com una cadena en format hexadecimal; S'admeten els tipus hash MD5 i SHA256; Els paràmetres clau i de dades admeten dades binàries. Exemples:

    • hmac('md5',clau,dades)
    • hmac('sha256',clau,dades)
  • sign(hash,clau,dades) - retorna la signatura calculada (signatura RSA amb SHA-256) com a cadena, on:
    hash - només es permet 'sha256', en cas contrari es genera un error;
    clau - la clau privada. Ha de correspondre a l'estàndard PKCS#1 o PKCS#8. La clau es pot proporcionar de diferents formes:

    • amb espais en lloc de noves línies;
    • amb o sense escapat '' en lloc de noves línies;
    • sense cap nova línia com una cadena d'una sola línia;
    • com a cadena en format JSON.

    La clau també es pot carregar des d'una macro d'usuari/macro/macro secreta.

    dades - les dades que es signaran. Pot ser una cadena (també s'admeten dades binàries) o una memòria intermèdia (Uint8Array/ArrayBuffer).
    OpenSSL o GnuTLS s'empren per calcular signatures. Si Zabbix s'ha compilat sense cap d'aquestes biblioteques de xifrat, es generarà un error ('Manquen les biblioteques OpenSSL o GnuTLS').