1 附加 JavaScript objects

概述

本节介绍Zabbix通过Duktape实现的JavaScript语言扩展功能,以及支持的全局JavaScript函数

在预处理JavaScript时请勿使用未声明的赋值操作。 应使用var来声明局部变量。

内置对象

Zabbix

Zabbix object 提供与Zabbix内部功能的交互接口。

方法 描述
log(loglevel, message) 使用<loglevel>日志级别将<message>写入Zabbix日志(参见配置参数file DebugLevel)。

示例:

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

可使用以下别名:

alias alias 对应
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))

所有日志消息的总大小限制为每个脚本执行8MB。

方法 描述
sleep(delay) 将JavaScript执行延迟delay毫秒。

示例(延迟执行15秒):

Zabbix.sleep(15000)

HttpRequest

这个 object 封装了 cURL 句柄,允许发起简单的 HTTP 请求。 错误将作为异常抛出。

多个 HttpRequest objects 的初始化被限制为每个脚本执行最多 10 个。

方法 描述
addHeader(value) 添加 HTTP 头字段。此字段将用于所有后续请求,直到通过 clearHeader() 方法清除。
可以添加到单个 HttpRequest object 的头字段总长度限制为 128 KB(包括特殊字符和头字段名称)。
clearHeader() 清除 HTTP 头。如果没有设置头字段,HttpRequest 将在发送的数据为 JSON 格式时设置 Content-Type 为 application/json;否则设置为 text/plain。
connect(url) 向 URL 发送 HTTP CONNECT 请求并返回响应。
customRequest(method, url, data) 允许在第一个参数中指定任意 HTTP 方法。使用可选的 data 数据负载向 URL 发送方法请求并返回响应。
delete(url, data) 向 URL 发送带有可选 data 数据负载的 HTTP DELETE 请求并返回响应。
getHeaders(<asArray>) 返回接收到的 HTTP 头字段的 object。
asArray 参数可以设置为 "true"(例如,getHeaders(true))、"false" 或未定义。如果设置为 "true",接收到的 HTTP 头字段值将作为数组返回;这应该用于检索多个同名头字段的值。
如果未设置或设置为 "false",接收到的 HTTP 头字段值将作为字符串返回。
get(url, data) 向 URL 发送带有可选 data 数据负载的 HTTP GET 请求并返回响应。
head(url) 向 URL 发送 HTTP HEAD 请求并返回响应。
options(url) 向 URL 发送 HTTP OPTIONS 请求并返回响应。
patch(url, data) 向 URL 发送带有可选 data 数据负载的 HTTP PATCH 请求并返回响应。
put(url, data) 向 URL 发送带有可选 data 数据负载的 HTTP PUT 请求并返回响应。
post(url, data) 向 URL 发送带有可选 data 数据负载的 HTTP POST 请求并返回响应。
getStatus() 返回最后一次 HTTP 请求的状态码。
setProxy(proxy) 将 HTTP proxy 设置为 "proxy" 值。如果此参数为空,则不使用 proxy。
setHttpAuth(bitmask, username, password) 在 'bitmask' 参数中设置启用的 HTTP 认证方法(HTTPAUTH_BASIC、HTTPAUTH_DIGEST、HTTPAUTH_NEGOTIATE、HTTPAUTH_NTLM、HTTPAUTH_NONE)。
HTTPAUTH_NONE flag 可用于禁用 HTTP 认证。
示例:
request.setHttpAuth(HTTPAUTH_NTLM | HTTPAUTH_BASIC, username, password)
request.setHttpAuth(HTTPAUTH_NONE)
trace(url, data) 向 URL 发送带有可选 data 数据负载的 HTTP TRACE 请求并返回响应。

示例:

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 object 允许在 监控项 以及低级发现预处理和webhooks中处理XML数据。

要使用XML object,server/proxy 必须编译时支持libxml2库。

方法 描述
XML.query(data, expression) 使用XPath获取节点内容。如果节点未找到则返回null。
expression - XPath表达式;
data - 作为 string 的XML数据。
XML.toJson(data) 将XML格式数据转换为JSON。
XML.fromJson(object) 将JSON格式数据转换为XML。

示例:

输入:

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

输出:

{
           "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"
           }
         }
       }

2. 自闭合元素(<foo/>)将被转换为具有'null'值。

示例:

输入:

<xml>
         <foo/>
       </xml>

输出:

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

3. 空属性(值为"")将被转换为具有空string('')值。

示例:

输入:

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

输出:

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

4. 具有相同元素名称的多个子节点将被转换为一个键,其值为值的array。

示例:

输入:

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

输出:

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

5. 如果文本元素没有属性且没有子元素,它将被转换为一个string。

示例:

输入:

<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函数

Duktape已实现以下额外的全局JavaScript函数:

  • btoa(data) - 将数据编码为Base64 string;
  • atob(base64_string) - 自version 7.0.1起,将Base64 string解码为Uint8Array缓冲区(在Zabbix 7.0.0中此函数返回解码后的string)。
try {
           b64 = btoa("test string");
           buffer = atob(b64);
       
           // Note that decoding logic depends on the data format of the buffer.
           decoded = String.fromCharCode.apply(this, [].slice.call(buffer));
       } 
       catch (error) {
           return {'error.name' : error.name, 'error.message' : error.message};
       }
  • md5(data) - 计算数据的MD5哈希值

  • sha256(data) - 计算数据的SHA256哈希值

  • hmac('<哈希类型>',key,data) - 返回十六进制格式的HMAC哈希string;支持MD5和SHA256哈希类型;key和data参数支持二进制数据。 示例:

    • hmac('md5',key,data)
    • hmac('sha256',key,data)
  • sign(hash,key,data) - 返回计算出的签名(使用SHA-256的RSA签名)作为string,其中:

    hash - only 'sha256' is allowed, otherwise an error is thrown;
    key - the private key. It should correspond to PKCS#1 or PKCS#8 standard. The key can be provided in different forms:

    • with spaces instead of newlines;
    • with escaped or non-escaped \n instead of newlines;
    • without any newlines as a single-line string;
    • as a JSON-formatted string.

\n 代替换行符; - 作为无任何换行的单行string; - 作为JSON格式的string。

密钥也可以从用户宏/秘密宏/保险库加载。

data - 将被签名的数据。 可以是string(也支持二进制数据)或缓冲区(Uint8Array/ArrayBuffer)。
使用OpenSSL或GnuTLS计算签名。 如果Zabbix构建时未包含这些加密库,将抛出错误('缺少OpenSSL或GnuTLS库')。