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 個までに制限されています。 :::

メソッド 説明
addHeader(value) HTTP ヘッダーフィールドを追加します。このフィールドは、clearHeader() メソッドでクリアされるまで、以降のすべてのリクエストで使用されます。
1 つの HttpRequest オブジェクトに追加できるヘッダーフィールドの合計長は、128 KB に制限されています(特殊文字とヘッダー名を含む)。
clearHeader() HTTP ヘッダーをクリアします。ヘッダーフィールドが設定されていない場合、POST されるデータが JSON 形式であれば、HttpRequest は Content-Type を application/json に設定します。それ以外の場合はtext/plainです。
connect(url) URLにHTTP CONNECTリクエストを送信し、レスポンスを返します。
customRequest(method, url, data) 最初のパラメータに任意のHTTPメソッドを指定できます。メソッドリクエストをURLに送信し、オプションのdataペイロードを指定し、レスポンスを返します。
delete(url, data) HTTP DELETEリクエストをURLに送信し、オプションのdataペイロードを指定し、レスポンスを返します。
getHeaders(<asArray>) 受信したHTTPヘッダーフィールドのオブジェクトを返します。
asArrayパラメータは、「true」(例:getHeaders(true))、「false」、またはundefinedに設定できます。「true」に設定した場合、受信したHTTPヘッダーフィールドの値は配列として返されます。これは、複数の同名ヘッダーのフィールド値を取得するために使用します。
設定されていない場合、または "false" に設定されている場合、受信した HTTP ヘッダーフィールド値は文字列として返されます。
get(url, data) オプションの data ペイロードを含む HTTP GET リクエストを URL に送信し、レスポンスを返します。
head(url) HTTP HEAD リクエストを URL に送信し、レスポンスを返します。
options(url) HTTP OPTIONS リクエストを URL に送信し、レスポンスを返します。
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) 有効な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) HTTP TRACEリクエストをURLに送信し、オプションの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オブジェクトを使用するには、サーバー/プロキシが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) - バージョン7.0.1以降では、Base64文字列を Uint8Array バッファとしてデコードします(Zabbix 7.0.0 では、この関数はデコードされた文字列を返します)。
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) - 16進形式の文字列として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 を使用
    • 改行を含まない1行の文字列
    • JSON形式の文字列

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

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

    例:

    • sign('sha256',key,data)

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