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')。