[comment]: # translation:outdated

[comment]: # ({96feb912-d3accdff})
# 1 追加のJavaScriptオブジェクト

[comment]: # ({/96feb912-d3accdff})

[comment]: # ({dfa8c394-ab8bd378})
### 概要

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

[comment]: # ({/dfa8c394-ab8bd378})

[comment]: # ({c73f2449-c73f2449})
### 組込オブジェクト

[comment]: # ({/c73f2449-c73f2449})

[comment]: # ({500e2fca-e5dc8dd0})
#### 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))|

::: noteimportant
ログに記録されるすべてのメッセージの合計サイズは、スクリプト実行ごとに8MBに制限されます。
:::

|メソッド|説明|
|------|-----------|
|`sleep(delay)`|JavaScriptの実行を`delay`ミリ秒遅らせます。|

例（実行を15秒遅らせる）:

    Zabbix.sleep(15000)
  

[comment]: # ({/500e2fca-e5dc8dd0})

[comment]: # ({8e20dc66-51c5ca42})
#### HttpRequest

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

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

|Method|Description|
|--|--------|
|`addHeader(value)`|HTTPヘッダーフィールドを追加します。このフィールドは、`clearHeader()`メソッドでクリアされるまで、以降のすべてのリクエストに使用されます。<br>単一の`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ヘッダーフィールドのオブジェクトを返します。<br>`asArray`パラメータは、"true"(例: `getHeaders(true)`)、"false"、または未定義に設定できます。"true"に設定すると、受信したHTTPヘッダーフィールドの値は配列として返されます。これは、複数の同じ名前のヘッダーのフィールド値を取得するために使用する必要があります。<br>設定されていないか、"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)を設定します。<br>HTTPAUTH\_NONEフラグを使用すると、HTTP認証を無効にできます。<br>例:<br>`request.setHttpAuth(HTTPAUTH_NTLM \| HTTPAUTH_BASIC、ユーザー名、パスワード)`<br>`request.setHttpAuth(HTTPAUTH_NONE)`|
|`trace(url, data)`|オプションの*data*ペイロードを含むHTTP TRACE要求をURLに送信し、応答を返します。|

例:

``` {.java}
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);
```

[comment]: # ({/8e20dc66-51c5ca42})

[comment]: # ({73df7bc5-06cac1ca})
#### XML

XMLオブジェクトは、item 内のXMLデータの処理と、ローレベルディスカバリープリプロセッシングおよびウェブフックを可能にします。

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

|メソッド|説明|
|------|-----------|
|`XML.query(data, expression)`|XPathを使用してノードコンテンツを取得します。ノードが見つからない場合はnullを返します。**expression** - XPath式<br>**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:*

``` {.java}
{
    "menu": {
        "food": {
            "@type": "breakfast",
            "name": "Chocolate",
            "price": "$5.95",
            "description": null,
            "calories": "650"
        }
    }
}
```

[comment]: # ({/73df7bc5-06cac1ca})

[comment]: # ({9e03c929-a12fbdc2})
##### シリアライズ規則

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

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

例:

*Input:*

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

*Output:*

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

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

例:

*Input:*

    <xml>
      <foo/>
    </xml>

*Output:*

``` {.java}
{
  "xml": {
    "foo": null
  }
}
```

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

例:

*Input:*

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

*Output:*

``` {.java}
{
  "xml": {
    "foo": {
      "@bar": ""
    }
  }
}
```

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

例:

*Input:*

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

*Output:*

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

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

例:

*Input:*

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

*Output:*

``` {.java}
{
  "xml": {
    "foo": "BAZ"
   }
}
```

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

例:

*Input:*

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

*Output:*

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

[comment]: # ({/9e03c929-a12fbdc2})

[comment]: # ({37bf26f7-1368a2b0})
### グローバル JavaScript 関数

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

-   btoa(string) - データを base64文字列にエンコード
-   atob(base64\_string) - base64文字列をデコード

``` {.java}
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 署名) を文字列として返します。ここで:<br>
    **hash** - 'sha256' のみが許可され、それ以外の場合はエラーがスローされます。<br>
    **key** - 秘密鍵。PKCS#1 または PKCS#8 標準に対応している必要があります。鍵はさまざまな形式で提供できます:<br>
    -    改行の代わりにスペースを使用します。
    -    改行の代わりにエスケープされた、またはエスケープされていない '\n' を使用します。
    -    改行なしの単一行文字列として。
    -    JSON形式の文字列として。

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

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

[comment]: # ({/37bf26f7-1368a2b0})
