1 追加のJavaScriptオブジェクト

概要

このセクションでは、Duktape で実装された JavaScript 言語に対する Zabbix の追加機能と、サポートされているグローバル JavaScript 関数について説明します。

前処理の JavaScript では、宣言されていない代入を使用しないでください。 ローカル変数の宣言には var を使用してください。

組込オブジェクト

Zabbix

Zabbixオブジェクトは、Zabbixの内部機能とのやり取りを提供します。

Method Description
log(loglevel, message) <message><loglevel> のログレベルを使用して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 リクエストを実行できるようにします。
エラーは例外としてスローされます。

複数の HttpRequest オブジェクトの初期化は、スクリプト実行ごとに 10 個までに制限されています。

Method Description
addHeader(value) HTTP ヘッダーフィールドを追加します。このフィールドは、clearHeader() メソッドでクリアされるまで、以降のすべてのリクエストで使用されます。
1 つの HttpRequest オブジェクトに追加できるヘッダーフィールドの合計長は、128 Kbytes に制限されています(特殊文字およびヘッダー名を含む)。
clearHeader() HTTP ヘッダーをクリアします。ヘッダーフィールドが設定されていない場合、HttpRequest は、送信されるデータが JSON 形式であれば Content-Type を application/json に設定し、それ以外の場合は text/plain に設定します。
connect(url) URL に HTTP CONNECT リクエストを送信し、レスポンスを返します。
customRequest(method, url, data) 最初のパラメータで任意の HTTP メソッドを指定できます。オプションの data ペイロード付きで、そのメソッドのリクエストを URL に送信し、レスポンスを返します。
delete(url, data) オプションの data ペイロード付きで URL に HTTP DELETE リクエストを送信し、レスポンスを返します。
getHeaders(<asArray>) 受信した HTTP ヘッダーフィールドのオブジェクトを返します。
asArray パラメータには "true"(例: getHeaders(true))、"false"、または未定義を設定できます。"true" に設定した場合、受信した HTTP ヘッダーフィールドの値は配列として返されます。これは、同じ名前の複数のヘッダーのフィールド値を取得する際に使用します。
設定しない場合、または "false" に設定した場合、受信した HTTP ヘッダーフィールドの値は文字列として返されます。
get(url, data) オプションの data ペイロード付きで URL に HTTP GET リクエストを送信し、レスポンスを返します。
head(url) URL に HTTP HEAD リクエストを送信し、レスポンスを返します。
options(url) URL に HTTP OPTIONS リクエストを送信し、レスポンスを返します。
patch(url, data) オプションの data ペイロード付きで URL に HTTP PATCH リクエストを送信し、レスポンスを返します。
put(url, data) オプションの data ペイロード付きで URL に HTTP PUT リクエストを送信し、レスポンスを返します。
post(url, data) オプションの data ペイロード付きで URL に HTTP POST リクエストを送信し、レスポンスを返します。
getStatus() 最後の HTTP リクエストのステータスコードを返します。
setProxy(proxy) HTTP プロキシを "proxy" の値に設定します。このパラメータが空の場合、プロキシは使用されません。
setHttpAuth(bitmask, username, password) 有効にする HTTP 認証方式(HTTPAUTH_BASIC、HTTPAUTH_DIGEST、HTTPAUTH_NEGOTIATE、HTTPAUTH_NTLM、HTTPAUTH_NONE)を 'bitmask' パラメータで設定します。
HTTPAUTH_NONE フラグを使用すると、HTTP 認証を無効にできます。
例:
request.setHttpAuth(HTTPAUTH_NTLM | HTTPAUTH_BASIC, username, password)
request.setHttpAuth(HTTPAUTH_NONE)
trace(url, data) オプションの data ペイロード付きで URL に HTTP TRACE リクエストを送信し、レスポンスを返します。

例:

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サポート付きでコンパイルされている必要があります。

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 ハッシュを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 形式の文字列

    鍵は、ユーザーマクロ/シークレットマクロ/vault から読み込むこともできます。

    data - 署名対象のデータです。 文字列(バイナリデータもサポート)またはバッファ(Uint8Array/ArrayBuffer)を指定できます。

    例:

    • sign('sha256',key,data)

    署名の計算には OpenSSL または GnuTLS が使用されます。 Zabbix がこれらの暗号化ライブラリのいずれも使用せずにビルドされている場合は、エラーがスローされます('missing OpenSSL or GnuTLS library')。