2022 Zabbix中国峰会
2022 Zabbix中国峰会

其他 JavaScript 对象

概述

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

内置对象

Zabbix

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

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

示例:

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

您可以使用以下别名:

别名 别名为
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) 延迟delay毫秒执行JavaScript。

示例(延迟15秒执行):

Zabbix.sleep(15000)

HttpRequest

该对象封装了cURL句柄,允许进行简单的HTTP请求。 错误会被作为异常抛出。

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

方法 描述
addHeader(value) 添加HTTP头字段。该字段将用于所有后续请求,直到使用clearHeader()方法清除。
可以向单个HttpRequest对象添加的所有头字段的总长度限制为128 K字节(包括特殊字符和头名称)。
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"值。如果此参数为空,则不使用代理。
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对象,服务器/代理必须编译支持libxml2。

方法 描述
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"
            }
          }
        }
  1. 自闭合元素(<foo/>)将被转换为值为'null'的元素。

示例:

输入:

<xml>
         <foo/>
       </xml>

输出:

{
         "xml": {
           "foo": null
         }
       }
  1. 空属性(具有""值的属性)将转换为具有空字符串('')值的属性。

示例:

输入:

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

输出:

{
         "xml": {
           "foo": {
             "@bar": ""
           }
         }
       }
  1. 具有相同元素名称的多个子节点将转换为具有值数组的单个键。

示例:

输入:

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

输出:

{
         "xml": {
           "foo": ["BAR", "BAZ", "QUX"]
         }
       }
  1. 如果文本元素既没有属性也没有子节点,则将其转换为字符串。

示例:

输入:

<xml>
           <foo>BAZ</foo>
       </xml>

输出:

{
         "xml": {
           "foo": "BAZ"
          }
       }
  1. 如果文本元素没有子节点但有属性,则将文本内容转换为键为'#text'且内容为值的元素;属性将转换为序列化规则1中描述的属性。

示例:

输入:

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

输出:

{
         "xml": {
           "foo": {
             "@bar": "BAR",
             "#text": "BAZ"
           }
         }
       }

全局 JavaScript 函数

使用Duktape引擎实现了额外的全局 JavaScript 函数,使得在预处理步骤中可以执行更复杂的操作:

  • btoa(string): 将字符串编码为 base64 字符串。
  • atob(base64_string): 对 base64 字符串进行解码。

示例用法如下:

try {
           var b64 = btoa("utf8 string");
           var utf8 = atob(b64);
       } catch (error) {
           return {'error.name': error.name, 'error.message': error.message};
       }

在这个示例中,btoa 函数将 "utf8 string" 编码为 base64 格式,然后使用 atob 函数将其解码回原始的 UTF-8 字符串。如果发生错误,将捕获并返回错误的名称和消息。

此外,还有以下哈希函数:

  • md5(string): 计算字符串的 MD5 哈希。
  • sha256(string): 计算字符串的 SHA256 哈希。

这些函数可用于安全性需求更高的应用中,例如身份验证或数据完整性验证。示例用法如下:

var md5hash = md5("data to hash");
       var sha256hash = sha256("data to hash");

还有一个支持 HMAC 哈希的函数:

  • hmac(hash_type, key, string): 返回 HMAC 哈希作为十六进制格式的字符串。支持 MD5 和 SHA256 哈希类型。键和字符串参数支持二进制数据。

示例用法如下:

var hmac_md5 = hmac('md5', 'secret_key', 'data to hash');
       var hmac_sha256 = hmac('sha256', 'secret_key', 'data to hash');

这些全局函数扩展了JavaScript预处理的功能,使其能够处理更复杂的数据转换和加密操作。