1 Objets JavaScript supplémentaires

Vue d’ensemble

Cette section décrit les ajouts de Zabbix au langage JavaScript implémenté avec Duktape, ainsi que les fonctions JavaScript globales prises en charge.

N’utilisez pas d’affectations à des variables non déclarées dans le JavaScript de prétraitement. Utilisez var pour déclarer les variables locales.

Objets intégrés

Zabbix

L'objet Zabbix permet d'interagir avec les fonctionnalités internes de Zabbix.

Méthode Description
log(loglevel, message) Écrit <message> dans le journal Zabbix en utilisant le niveau de journalisation <loglevel> (voir le paramètre DebugLevel du fichier de configuration).

Exemple :

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

Vous pouvez utiliser les alias suivants :

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

La taille totale de tous les messages consignés est limitée à 8 Mo par exécution de script.

Méthode Description
sleep(delay) Retarde l'exécution de JavaScript de delay millisecondes.

Exemple (retarder l'exécution de 15 secondes) :

Zabbix.sleep(15000)

HttpRequest

Cet objet encapsule un handle cURL permettant d’effectuer des requêtes HTTP simples. Les erreurs sont levées sous forme d’exceptions.

L’initialisation de plusieurs objets HttpRequest est limitée à 10 par exécution de script.

Method Description
addHeader(value) Ajoute un champ d’en-tête HTTP. Ce champ est utilisé pour toutes les requêtes suivantes jusqu’à ce qu’il soit effacé avec la méthode clearHeader().
La longueur totale des champs d’en-tête pouvant être ajoutés à un seul objet HttpRequest est limitée à 128 Kio (caractères spéciaux et noms d’en-tête inclus).
clearHeader() Efface l’en-tête HTTP. Si aucun champ d’en-tête n’est défini, HttpRequest définira Content-Type sur application/json si les données envoyées sont au format JSON ; sinon text/plain.
connect(url) Envoie une requête HTTP CONNECT à l’URL et renvoie la réponse.
customRequest(method, url, data) Permet de spécifier n’importe quelle méthode HTTP dans le premier paramètre. Envoie la requête de la méthode à l’URL avec une charge utile data facultative et renvoie la réponse.
delete(url, data) Envoie une requête HTTP DELETE à l’URL avec une charge utile data facultative et renvoie la réponse.
getHeaders(<asArray>) Renvoie l’objet des champs d’en-tête HTTP reçus.
Le paramètre asArray peut être défini sur "true" (par exemple, getHeaders(true)), "false" ou être indéfini. S’il est défini sur "true", les valeurs des champs d’en-tête HTTP reçus seront renvoyées sous forme de tableaux ; cela doit être utilisé pour récupérer les valeurs de champs de plusieurs en-têtes portant le même nom.
S’il n’est pas défini ou s’il est défini sur "false", les valeurs des champs d’en-tête HTTP reçus seront renvoyées sous forme de chaînes.
get(url, data) Envoie une requête HTTP GET à l’URL avec une charge utile data facultative et renvoie la réponse.
head(url) Envoie une requête HTTP HEAD à l’URL et renvoie la réponse.
options(url) Envoie une requête HTTP OPTIONS à l’URL et renvoie la réponse.
patch(url, data) Envoie une requête HTTP PATCH à l’URL avec une charge utile data facultative et renvoie la réponse.
put(url, data) Envoie une requête HTTP PUT à l’URL avec une charge utile data facultative et renvoie la réponse.
post(url, data) Envoie une requête HTTP POST à l’URL avec une charge utile data facultative et renvoie la réponse.
getStatus() Renvoie le code d’état de la dernière requête HTTP.
setProxy(proxy) Définit le proxy HTTP sur la valeur "proxy". Si ce paramètre est vide, aucun proxy n’est utilisé.
setHttpAuth(bitmask, username, password) Définit les méthodes d’authentification HTTP activées (HTTPAUTH_BASIC, HTTPAUTH_DIGEST, HTTPAUTH_NEGOTIATE, HTTPAUTH_NTLM, HTTPAUTH_NONE) dans le paramètre 'bitmask'.
Le drapeau HTTPAUTH_NONE permet de désactiver l’authentification HTTP.
Exemples :
request.setHttpAuth(HTTPAUTH_NTLM | HTTPAUTH_BASIC, username, password)
request.setHttpAuth(HTTPAUTH_NONE)
trace(url, data) Envoie une requête HTTP TRACE à l’URL avec une charge utile data facultative et renvoie la réponse.

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’objet XML permet le traitement des données XML dans le prétraitement des éléments, de la découverte de bas niveau et des webhooks.

Pour utiliser l’objet XML, le serveur/proxy doit être compilé avec la prise en charge de libxml2.

Method Description
XML.query(data, expression) Récupère le contenu d’un nœud à l’aide de XPath. Renvoie null si le nœud est introuvable.
expression - une expression XPath ;
data - des données XML sous forme de chaîne.
XML.toJson(data) Convertit des données au format XML en JSON.
XML.fromJson(object) Convertit des données au format JSON en XML.

Exemple :

Entrée :

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

Sortie :

{
    "menu": {
        "food": {
            "@type": "breakfast",
            "name": "Chocolate",
            "price": "$5.95",
            "description": null,
            "calories": "650"
        }
    }
}
Règles de sérialisation

La conversion de XML en JSON sera effectuée selon les règles suivantes (pour les conversions de JSON en XML, les règles inverses sont appliquées) :

1. Les attributs XML seront convertis en clés dont le nom est préfixé par '@'.

Exemple :

Entrée :

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

Sortie :

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

2. Les éléments auto-fermants (<foo/>) seront convertis avec la valeur 'null'.

Exemple :

Entrée :

<xml>
  <foo/>
</xml>

Sortie :

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

3. Les attributs vides (avec la valeur "") seront convertis avec une valeur de chaîne vide ('').

Exemple :

Entrée :

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

Sortie :

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

4. Plusieurs nœuds enfants portant le même nom d’élément seront convertis en une seule clé dont la valeur sera un tableau de valeurs.

Exemple :

Entrée :

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

Sortie :

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

5. Si un élément de texte n’a ni attributs ni enfants, il sera converti en chaîne de caractères.

Exemple :

Entrée :

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

Sortie :

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

6. Si un élément de texte n’a pas d’enfants mais possède des attributs, le contenu textuel sera converti en un élément avec la clé '#text' et le contenu comme valeur ; les attributs seront convertis comme décrit dans la règle de sérialisation 1.

Exemple :

Entrée :

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

Sortie :

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

Fonctions JavaScript globales

Des fonctions JavaScript globales supplémentaires ont été implémentées avec Duktape :

  • btoa(data) - encode les données en chaîne base64.
  • atob(base64_string) - décode une chaîne base64 en tampon Uint8Array.
try {
    b64 = btoa("test string");
    buffer = atob(b64);

    // Notez que la logique de décodage dépend du format des données du tampon.
    decoded = String.fromCharCode.apply(this, [].slice.call(buffer));
} 
catch (error) {
    return {'error.name' : error.name, 'error.message' : error.message};
}
  • md5(data) - calcule le hachage MD5 des données.
  • sha256(data) - calcule le hachage SHA256 des données.
  • hmac('<hash type>',key,data) - renvoie un hachage HMAC sous forme de chaîne au format hexadécimal ; md5 et sha256 sont pris en charge comme hash type ; les paramètres key et data prennent en charge les données binaires.

    Exemples :

    • hmac('md5',key,data)
    • hmac('sha256',key,data)
  • sign(hash,key,data) - renvoie la signature calculée (signature RSA avec SHA-256) sous forme de chaîne, où :
    hash - seul sha256 est autorisé, sinon une erreur est générée.
    key - la clé privée. Elle doit être conforme à la norme PKCS#1 ou PKCS#8. La clé peut être fournie sous différentes formes :

    • avec des espaces à la place des sauts de ligne
    • avec \n échappés ou non échappés à la place des sauts de ligne
    • sans aucun saut de ligne, sous forme de chaîne sur une seule ligne
    • sous forme de chaîne au format JSON

    La clé peut également être chargée à partir d'une macro utilisateur / macro secrète / coffre-fort.

    data - les données qui seront signées. Il peut s'agir d'une chaîne (les données binaires sont également prises en charge) ou d'un tampon (Uint8Array/ArrayBuffer).

    Exemple :

    • sign('sha256',key,data)

    OpenSSL ou GnuTLS est utilisé pour calculer les signatures. Si Zabbix a été compilé sans l'une de ces bibliothèques de chiffrement, une erreur sera générée ('missing OpenSSL or GnuTLS library').