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支持md5和sha256;key和data参数支持二进制数据。示例:
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')。