You are viewing documentation for the development version, it may be incomplete.
Join our translation project and help translate Zabbix documentation into your native language.

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リクエストを実行できるようにします。 エラーは例外としてスローされます。

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

メソッド 説明
addHeader(value) HTTPヘッダーフィールドを追加します。このフィールドは、clearHeader()メソッドでクリアされるまで、以降のすべてのリクエストで使用されます。
1つのHttpRequestオブジェクトに追加できるヘッダーフィールドの合計長は128Kバイトに制限されています(特殊文字およびヘッダー名を含む)。
clearHeader() HTTPヘッダーをクリアします。ヘッダーフィールドが設定されていない場合、HttpRequestは、投稿されるデータがJSON形式の場合はContent-Typeをapplication/jsonに、それ以外の場合はtext/plainに設定します。
connect(url) URLにHTTP CONNECTリクエストを送信し、レスポンスを返します。
customRequest(method, url, data) 最初のパラメータで任意のHTTPメソッドを指定できます。URLにメソッドリクエストをオプションのdataペイロードとともに送信し、レスポンスを返します。
delete(url, data) URLにHTTP DELETEリクエストをオプションのdataペイロードとともに送信し、レスポンスを返します。
getHeaders(<asArray>) 受信したHTTPヘッダーフィールドのオブジェクトを返します。
asArrayパラメータは"true"(例:getHeaders(true))、"false"、または未定義に設定できます。"true"に設定すると、受信したHTTPヘッダーフィールド値は配列として返されます。これは、同じ名前の複数のヘッダーのフィールド値を取得する場合に使用します。
未設定または"false"に設定した場合、受信したHTTPヘッダーフィールド値は文字列として返されます。
get(url, data) URLにHTTP GETリクエストをオプションのdataペイロードとともに送信し、レスポンスを返します。
head(url) URLにHTTP HEADリクエストを送信し、レスポンスを返します。
options(url) URLにHTTP OPTIONSリクエストを送信し、レスポンスを返します。
patch(url, data) URLにHTTP PATCHリクエストをオプションのdataペイロードとともに送信し、レスポンスを返します。
put(url, data) URLにHTTP PUTリクエストをオプションのdataペイロードとともに送信し、レスポンスを返します。
post(url, data) URLにHTTP POSTリクエストをオプションのdataペイロードとともに送信し、レスポンスを返します。
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) URLにHTTP TRACEリクエストをオプションの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サポート付きでコンパイルする必要があります。

メソッド 説明
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進数形式の文字列で返します。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)で指定できます。
    署名の計算にはOpenSSLまたはGnuTLSが使用されます。 これらの暗号化ライブラリのいずれも組み込まれていない場合、エラーがスローされます('missing OpenSSL or GnuTLS library')。