# 入力と出力

## 概要

PAMレコードの認証情報のローテーションが成功すると、関連するレコード、認証情報、ユーザーに関する情報を含むパラメータを使用して、添付されたポストローテーションスクリプトが実行されます。

## 入力 <a href="#inputs" id="inputs"></a>

KeeperゲートウェイでPAMスクリプトが実行され、stdinパラメータを介してスクリプトに入力を渡します。これらのパラメータはBase64でエンコードされたJSONオブジェクトに配置され、スクリプトにパイプされます。

たとえば、KeeperゲートウェイではLinuxマシン上で以下のようにスクリプトが実行されます。

```sh
history -c && echo "BASE64==......" | /path/to/script.sh
```

ウィンドウズでは以下となります。

```
"BASE64==......" | .\script.ps1; Clear-History
```

このbase64でエンコードされたJSONオブジェクトには以下のキーが含まれています。

<table><thead><tr><th width="250.37325349301392">キー</th><th>説明</th></tr></thead><tbody><tr><td><code>providerRecordUid</code></td><td>PAM設定レコードのUID</td></tr><tr><td><code>resourceRecordUid</code></td><td>PAMリソースレコードののUID</td></tr><tr><td><code>userRecordUid</code></td><td>PAMユーザーレコードのUID</td></tr><tr><td><code>newPassword</code></td><td>ユーザー向けに新しく生成されたパスワード</td></tr><tr><td><code>oldPassword</code></td><td>ユーザーの古いパスワード</td></tr><tr><td><code>user</code></td><td>ユーザーのユーザー名</td></tr><tr><td><code>records</code></td><td>Base64エンコードされたレコードディクショナリのJSON配列</td></tr></tbody></table>

#### `records`**フィールドに関する追加情報**

レコードのキー値は、Base64、ディクショナリのJSON配列です。この配列には以下のデータが含まれます。

* PAM設定情報
* 関連のPAMマシン、PAMデータベース、PAMディレクトリレコードデータ
* ポストローテーションスクリプトのアップロード時に供給される追加のレコードとローテーション認証情報
* ユーザーレコードデータ

各ディクショナリオブジェクトには以下が含まれます。

* `uid` - ボルトレコードのUID
* `title` - ボルトレコードのタイトル
* ディクショナリの残り部分には、レコードのデータのキー/値のペアが含まれれ、キーはフィールドのラベルになります。フィールドにラベルが含まれていない場合は、フィールドタイプが使用されます。キーがすでに存在する場合は、キーに番号が追加されます。

## 出力

PAMスクリプトが実行される際、実行された各スクリプトで`RotationResult`のインスタンスを含む配列が返されます。`RotationResult`クラスには、以下の属性があります。

* `uid` - スクリプトが添付されたKeeperボルトのレコードUID
* `command` - シェルに発行されたコマンド
* `system` - スクリプトが実行されるオペレーティングシステム
* `title` - Keeperボルトのレコードに添付されたスクリプトファイルのタイトル
* `name` - Keeperボルトのレコードに添付されたスクリプトの名前
* `success` - スクリプト実行の成功
  * LinuxおよびmacOSではリターンコード0を返したスクリプト
  * Windowsでは Trueステータスを返したスクリプト
* `stdout` - スクリプト実行結果の標準出力。
* `stderr` - スクリプト実行結果の標準エラー。

以下のメソッドを使用してスクリプト実行の成否を判断することもできます。

<table><thead><tr><th width="200.38578680203045">メソッド</th><th>説明</th></tr></thead><tbody><tr><td><code>was_failure</code></td><td>ブール値。失敗した場合はTrue、成功した場合はFalseを返します</td></tr><tr><td><code>was_success</code></td><td>ブール値。成功した場合はTrue、失敗した場合はFalseを返します</td></tr></tbody></table>

これにより、ログ出力をカスタマイズできます。

{% code title="Pythonでの例" %}

```python
for r in results:
    if r.was_failure:
        print(f"For record {r.uid}, the script {r.title} failed: {r.stderr}")
```

{% endcode %}

## エラー

`RotationResult`クラスには、スクリプトの実行によるエラーをログに記録する`stderr`属性があります。

## 注意事項

ポストローテーションスクリプトの結果と情報は、`RotationResult`クラスで取得できますが、スクリプトのエラーと出力は、スクリプトが実行されるシェルの種類によって異なります。Keeperには、ユーザーが制御するスクリプトのエラー定義の情報がないため、スクリプトの標準出力も標準エラーもチェックされません。

たとえば、BASHスクリプトに`set -e`が設定されていない場合、スクリプトの一部が失敗してもスクリプトは続行されます。スクリプトがリターンコード`0`で終了した場合、スクリプトは成功としてフラグが付けられます。

そのため、スクリプトの出力とエラーを適切な処理は、ユーザーに委ねられます。
