追加の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')。