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 字符串。
  • atob(base64_string) - 自 7.0.1 版本起,将 Base64 字符串解码为 Uint8Array 缓冲区(在 Zabbix 7.0.0 中,此函数返回解码后的字符串)。
try {
    b64 = btoa("test string");
    buffer = atob(b64);

    // 请注意,解码逻辑取决于缓冲区的数据格式。
    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('<hash type>',key,data) - 返回 HMAC 哈希值,格式为十六进制字符串;支持的 hash typemd5sha256keydata 参数支持二进制数据。

    示例:

    • hmac('md5',key,data)
    • hmac('sha256',key,data)
  • sign(hash,key,data) - 返回计算出的签名(使用 SHA-256 的 RSA 签名)作为字符串,其中:
    hash - 仅允许 sha256,否则会抛出错误。
    key - 私钥。 它应符合 PKCS#1 或 PKCS#8 标准。 密钥可以采用不同形式提供:

    • 使用空格代替换行
    • 使用转义或未转义的 \n 代替换行
    • 不包含任何换行,作为单行字符串
    • 作为 JSON 格式字符串

    密钥也可以从用户宏/秘密宏/vault 中加载。

    data - 要签名的数据。 它可以是字符串(也支持二进制数据)或缓冲区(Uint8Array/ArrayBuffer)。

    示例:

    • sign('sha256',key,data)

    签名使用 OpenSSL 或 GnuTLS 计算。 如果 Zabbix 在编译时未包含这些加密库中的任何一个,将抛出错误('missing OpenSSL or GnuTLS library')。