1 追加のJavaScriptオブジェクト

概要

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

組込オブジェクト

Zabbix

ZabbixオブジェクトはZabbixの内部機能とのインタラクションを提供します。

メソッド 説明
log(loglevel, message) ログレベル<loglevel>を使用して<message>をZabbixログに書き込みます(設定ファイルのDebugLevelパラメータを参照)

例:

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

このオブジェクトは、単純な HttpRequest を行うための cURL ハンドルをカプセル化したものです。エラーは例外として投げられます

HttpRequestはZabbix 5.4から採用された新しい名称です。以前はCurlHttpRequestと呼ばれていました。 Zabbix 5.4からメソッド名も変更されました。旧オブジェクト/メソッド名は非推奨となり、Zabbix 6.0以降サポートは廃止となります。

Method Description
addHeader(value) HTTPヘッダーフィールドを追加します。このフィールドは、clearHeader()メソッドでクリアされるまで、以降のすべてのリクエストに使用されます。
単一のHttpRequestオブジェクトに追加できるヘッダーフィールドの合計長は、128KBに制限されています (特殊文字とヘッダー名を含む)。
clearHeader() HTTPヘッダーをクリアします。ヘッダーフィールドが設定されていない場合、HttpRequestは、投稿されるデータがJSON形式であればContent-Typeをapplication/jsonに設定し、それ以外の場合はtext/plainに設定します。
connect(url) HTTP CONNECT リクエストを URL に送信し、応答を返します。
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) 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) 'bitmask'パラメータで有効なHTTP認証方法(HTTPAUTH_BASIC、HTTPAUTH_DIGEST、HTTPAUTH_NEGOTIATE、HTTPAUTH_NTLM、HTTPAUTH_NONE)を設定します。
HTTPAUTH_NONEフラグを使用すると、HTTP認証を無効にできます。
例:
request.setHttpAuth(HTTPAUTH_NTLM \| HTTPAUTH_BASIC、ユーザー名、パスワード)
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オブジェクトは、item 内のXMLデータの処理と、ローレベルディスカバリープリプロセッシングおよびウェブフックを可能にします。

XMLオブジェクトを利用するためには,libxml2がサポートされた状態で server / proxy がコンパイルされている必要があります。

メソッド 説明
XML.query(data, expression) XPathを使用してノードコンテンツを取得します。ノードが見つからない場合はnullを返します。expression - XPath式
data - 文字列としてのXMLデータ
XML.toJson(data) XML形式のデータをJSONに変換
XML.fromJson(object) JSON形式のデータをXMLに変換

例:

Input:

<menu>
           <food type = "breakfast">
               <name>Chocolate</name>
               <price>$5.95</price>
               <description></description>
               <calories>650</calories>
           </food>
       </menu>

Output:

{
           "menu": {
               "food": {
                   "@type": "breakfast",
                   "name": "Chocolate",
                   "price": "$5.95",
                   "description": null,
                   "calories": "650"
               }
           }
       }
シリアライズ規則

XMLからJSONへの変換は、以下の規則に従って処理されます(JSONからXMLへの変換は、逆の規則が適用されます)。

1. XML の属性は、名前の先頭に '@' を付加したキーに変換されます。

例:

Input:

 <xml foo="FOO">
          <bar>
            <baz>BAZ</baz>
          </bar>
        </xml>

Output:

 {
          "xml": {
            "@foo": "FOO",
            "bar": {
              "baz": "BAZ"
            }
          }
        }

2. セルフクロージングの要素(<foo/>)は、'null'値を持つものとして変換されます。

例:

Input:

<xml>
         <foo/>
       </xml>

Output:

{
         "xml": {
           "foo": null
         }
       }

3. 空の属性(""の値)は、空文字列('')の値として変換されます。

例:

Input:

<xml>
         <foo bar="" />
       </xml>

Output:

{
         "xml": {
           "foo": {
             "@bar": ""
           }
         }
       }

4. 同じ要素名を持つ複数の子ノードは、値の配列を値とする1つのキーに変換されます。

例:

Input:

<xml>
         <foo>BAR</foo>
         <foo>BAZ</foo>
         <foo>QUX</foo>
       </xml>

Output:

{
         "xml": {
           "foo": ["BAR", "BAZ", "QUX"]
         }
       }

5. text 要素に属性がなく、子要素もない場合は、文字列として変換されます。

例:

Input:

<xml>
           <foo>BAZ</foo>
       </xml>

Output:

{
         "xml": {
           "foo": "BAZ"
          }
       }

6. text 要素に子がなく、属性がある場合、text の内容はキーが 'text'、値が content の要素に変換され、
属性はシリアライズ規則 1 のとおりに変換され ます。

例:

Input:

<xml>
         <foo bar="BAR">
           BAZ
         </foo>
       </xml>

Output:

{
         "xml": {
           "foo": {
             "@bar": "BAR",
             "#text": "BAZ"
           }
         }
       }

グローバル JavaScript 関数

Duktapeでは、追加のグローバルJavaScript関数が実装されています:

  • btoa(string) - データを base64文字列にエンコード
  • atob(base64_string) - base64文字列をデコード
try {
           b64 = btoa("utf8 string");
           utf8 = atob(b64);
       } 
       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 ハッシュ タイプがサポートされています。 キーとデータパラメータはバイナリデータをサポートします。例:

    • hmac('md5',key,data)
    • hmac('sha256',key,data)
  • sign(hash,key,data) - 計算された署名 (SHA-256 を使用した RSA 署名) を文字列として返します。ここで:
    hash - 'sha256' のみが許可され、それ以外の場合はエラーがスローされます。
    key - 秘密鍵。PKCS#1 または PKCS#8 標準に対応している必要があります。鍵はさまざまな形式で提供できます:

    • 改行の代わりにスペースを使用します。
    • 改行の代わりにエスケープされた、またはエスケープされていない '' を使用します。
    • 改行なしの単一行文字列として。
    • JSON形式の文字列として。

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

    data - 署名されるデータ。文字列 (バイナリ データもサポートされます) またはバッファ (Uint8Array/ArrayBuffer) にすることができます。
    署名の計算には OpenSSL または GnuTLS が使用されます。Zabbix がこれらの暗号化ライブラリなしでビルドされた場合、エラーが発生します (「OpenSSL または GnuTLS ライブラリがありません」)。
    この機能は、Zabbix 6.0.15 以降でサポートされています。