1 追加のJavaScriptオブジェクト
概要
このセクションでは、Duktapeで実装されたJavaScript言語へのZabbixの追加機能と、サポートされているグローバルJavaScript関数について説明します。
プリプロセスのJavaScriptでは、宣言されていない代入を使用しないでください。
ローカル変数を宣言するにはvarを使用してください。
組込オブジェクト
Zabbix
Zabbixオブジェクトは、Zabbixの内部機能との連携を提供します。
| メソッド | 説明 |
|---|---|
log(loglevel, message) |
<loglevel>のログレベル(設定ファイルのDebugLevelパラメータを参照)で<message>をZabbixログに書き込みます。 |
例:
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)) |
スクリプト実行ごとに記録されるすべてのメッセージの合計サイズは8MBに制限されています。
| メソッド | 説明 |
|---|---|
sleep(delay) |
JavaScriptの実行をdelayミリ秒遅延させます。 |
例(15秒遅延):
Zabbix.sleep(15000)
HttpRequest
このオブジェクトはcURLハンドルをカプセル化し、簡単なHTTPリクエストを実行できるようにします。 エラーは例外としてスローされます。
1回のスクリプト実行で初期化できる HttpRequest オブジェクトは10個までに制限されています。
| Method | Description |
|---|---|
addHeader(value) |
HTTPヘッダーフィールドを追加します。このフィールドは、clearHeader() メソッドでクリアされるまで、後続のすべてのリクエストで使用されます。1つの HttpRequest オブジェクトに追加できるヘッダーフィールドの合計長は、128 Kbytes(特殊文字およびヘッダー名を含む)に制限されています。 |
clearHeader() |
HTTPヘッダーをクリアします。ヘッダーフィールドが設定されていない場合、投稿するデータがJSON形式であれば HttpRequest はContent-Typeをapplication/jsonに設定し、それ以外の場合はtext/plainに設定します。 |
connect(url) |
URLにHTTP CONNECTリクエストを送信し、レスポンスを返します。 |
customRequest(method, url, data) |
最初のパラメータで任意のHTTPメソッドを指定できます。オプションの data ペイロードとともに指定されたメソッドのリクエストをURLに送信し、レスポンスを返します。 |
delete(url, data) |
オプションの data ペイロードとともにHTTP DELETEリクエストをURLに送信し、レスポンスを返します。 |
getHeaders(<asArray>) |
受信したHTTPヘッダーフィールドのオブジェクトを返します。asArray パラメータには、"true"(例: getHeaders(true))、"false"、または未定義を指定できます。"true"に設定すると、受信したHTTPヘッダーフィールドの値が配列として返されます。同じ名前の複数のヘッダーのフィールド値を取得する場合に使用してください。設定しない場合、または "false" に設定した場合、受信したHTTPヘッダーフィールドの値は文字列として返されます。 |
get(url, data) |
オプションの data ペイロードとともにHTTP GETリクエストをURLに送信し、レスポンスを返します。 |
head(url) |
URLにHTTP HEADリクエストを送信し、レスポンスを返します。 |
options(url) |
URLにHTTP OPTIONSリクエストを送信し、レスポンスを返します。 |
patch(url, data) |
オプションの data ペイロードとともにHTTP PATCHリクエストをURLに送信し、レスポンスを返します。 |
put(url, data) |
オプションの data ペイロードとともにHTTP PUTリクエストをURLに送信し、レスポンスを返します。 |
post(url, data) |
オプションの data ペイロードとともにHTTP POSTリクエストをURLに送信し、レスポンスを返します。 |
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) |
オプションの data ペイロードとともにHTTP TRACEリクエストをURLに送信し、レスポンスを返します。 |
例:
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"
}
}
}
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);
// デコードロジックはバッファのデータフォーマットに依存することに注意してください。
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ハッシュを16進数形式の文字列として返します。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を使用 - 改行なしの1行の文字列
- JSON形式の文字列
鍵はユーザーマクロ/シークレットマクロ/ボールトからロードすることもできます。
data - 署名されるデータ。 文字列(バイナリデータもサポート)またはバッファ(Uint8Array/ArrayBuffer)で指定できます。
例:
sign('sha256',key,data)
署名の計算にはOpenSSLまたはGnuTLSが使用されます。 これらの暗号化ライブラリのいずれかが組み込まれていない場合、エラーがスローされます('missing OpenSSL or GnuTLS library')。