1 附加 JavaScript objects

概述

本节介绍Zabbix通过Duktape实现的JavaScript语言扩展及支持的全局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))

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

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

示例(延迟执行15秒):

Zabbix.sleep(15000)

HttpRequest

"HttpRequest"是自Zabbix 5.4起对该object的新命名。 先前它被称为"CurlHttpRequest"。 方法名称在Zabbix 5.4中也已变更。 旧的object/方法名称现已弃用,其支持将在Zabbix 6.0之后停止。

该object封装了cURL句柄,允许发起简单的HTTP请求。 错误将以异常形式抛出。

每个脚本执行过程中HttpRequest objects的初始化数量限制为10个。

方法 描述
addHeader(value) 添加HTTP头字段。该字段将用于所有后续请求,直到通过clearHeader()方法清除。
单个HttpRequest object可添加的HTTP头字段总长度限制为128KB(含特殊字符和头字段名称)。
clearHeader() 清除HTTP头。若未设置任何头字段,当POST数据为JSON格式时HttpRequest将自动设置Content-Type为application/json;否则设为text/plain。
connect(url) 向URL发送HTTP CONNECT请求并返回响应。
customRequest(method, url, data) 允许在第一个参数中指定任意HTTP方法。向URL发送带可选data负载的方法请求并返回响应。
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 6.0.31起,将Base64 string解码为Uint8Array缓冲区(在Zabbix 6.0.0 - 6.0.30版本中返回解码后的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 - 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 ''s instead of newlines;
    • without any newlines as a single-line string;
    • as a JSON-formatted string.

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

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