1 附加 JavaScript objects

概述

本节描述了使用 Duktape 实现并支持的 JavaScript 语言的 Zabbix 扩展,以及支持的全局 JavaScript 函数

内置对象

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

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

方法 描述
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 支持在 监控项 中处理 XML 数据,并可用于低级别自动发现预处理和 Webhook。

要使用 XML object,必须使用带有 libxml2 支持的 server/proxy 编译。

方法 描述
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"
               }
           }
       }

{HEADER_62547088}

XML 到 JSON 的转换version将根据以下规则进行处理(对于 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('<hash type>',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 - 仅允许 'sha256',否则将抛出错误;
    key - 私钥。应符合 PKCS#1 或 PKCS#8 标准。密钥可以以不同形式提供:

    • 使用空格代替换行符;
    • 使用转义或非转义的 \n 代替换行符;
    • 不使用任何换行符,作为单行 string;
    • 作为 JSON 格式的 string。

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

    data - 将被签名的数据。可以是 string(也支持二进制数据)或缓冲区(Uint8Array/ArrayBuffer)。
    使用 OpenSSL 或 GnuTLS 计算签名。如果 Zabbix 在没有这些加密库的情况下构建,则会抛出错误('missing OpenSSL or GnuTLS library')。