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 ;md5etsha256sont pris en charge commehash type; les paramètreskeyetdataprennent 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 - seulsha256est 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').