1 其他 JavaScript 对象

概述

本节介绍了 Zabbix 对使用 Duktape 实现的 JavaScript 语言所做的扩展,以及受支持的全局 JavaScript 函数

请勿在预处理 JavaScript 中使用未声明的赋值。 请使用 var 声明局部变量。

内置对象

Zabbix

Zabbix 对象提供与 Zabbix 内部功能的交互。

Method Description
log(loglevel, message) 使用 <loglevel> 日志级别将 <message> 写入 Zabbix 日志(请参见配置文件中的 DebugLevel 参数)。

示例:

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

您可以使用以下别名:

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

所有已记录消息的总大小在每次脚本执行时限制为 8 MB。

Method Description
sleep(delay) 将 JavaScript 执行延迟 delay 毫秒。

示例(将执行延迟 15 秒):

Zabbix.sleep(15000)

HttpRequest

该对象封装了 cURL 句柄,可用于发起简单的 HTTP 请求。 错误会以异常形式抛出。

每次脚本执行期间,最多只能初始化 10 个 HttpRequest 对象。

Method Description
addHeader(value) 添加 HTTP 头字段。该字段将用于之后的所有请求,直到通过 clearHeader() 方法清除为止。
可添加到单个 HttpRequest 对象的头字段总长度限制为 128 KB(包括特殊字符和头名称)。
clearHeader() 清除 HTTP 头。如果未设置任何头字段,HttpRequest 将在提交的数据为 JSON 格式时把 Content-Type 设置为 application/json,否则设置为 text/plain。
connect(url) 向该 URL 发送 HTTP CONNECT 请求并返回响应。
customRequest(method, url, data) 允许在第一个参数中指定任意 HTTP 方法。向该 URL 发送指定方法的请求,可附带可选的 data 负载,并返回响应。
delete(url, data) 向该 URL 发送 HTTP DELETE 请求,可附带可选的 data 负载,并返回响应。
getHeaders(<asArray>) 返回接收到的 HTTP 头字段对象。
asArray 参数可设置为 "true"(例如 getHeaders(true))、"false",或保持未定义。如果设置为 "true",接收到的 HTTP 头字段值将以数组形式返回;这应用于获取多个同名头字段的值。
如果未设置或设置为 "false",接收到的 HTTP 头字段值将以字符串形式返回。
get(url, data) 向该 URL 发送 HTTP GET 请求,可附带可选的 data 负载,并返回响应。
head(url) 向该 URL 发送 HTTP HEAD 请求并返回响应。
options(url) 向该 URL 发送 HTTP OPTIONS 请求并返回响应。
patch(url, data) 向该 URL 发送 HTTP PATCH 请求,可附带可选的 data 负载,并返回响应。
put(url, data) 向该 URL 发送 HTTP PUT 请求,可附带可选的 data 负载,并返回响应。
post(url, data) 向该 URL 发送 HTTP POST 请求,可附带可选的 data 负载,并返回响应。
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 标志可用于禁用 HTTP 身份验证。
示例:
request.setHttpAuth(HTTPAUTH_NTLM | HTTPAUTH_BASIC, username, password)
request.setHttpAuth(HTTPAUTH_NONE)
trace(url, data) 向该 URL 发送 HTTP TRACE 请求,可附带可选的 data 负载,并返回响应。

示例:

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

要使用 XML 对象,服务器/proxy 必须在编译时启用 libxml2 支持。

Method Description
XML.query(data, expression) 使用 XPath 检索节点内容。如果未找到节点,则返回 null。
expression - XPath 表达式;
data - 字符串形式的 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. 空属性(值为 "")将被转换为值为空字符串('')的属性。

示例:

输入:

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

输出:

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

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

示例:

输入:

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

输出:

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

5. 如果文本元素没有属性也没有子元素,它将被转换为字符串。

示例:

输入:

<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) - 将 base64 字符串解码为 Uint8Array 缓冲区。
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('<hash type>',key,data) - 以十六进制格式字符串形式返回 HMAC 哈希值;hash type 支持 md5sha256keydata 参数支持二进制数据。

    示例:

    • 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')。