アーキテクチャ
CLI が引数と表示を担当し、ホスト一覧、認証情報、通信、実行、組み込み操作を 個別のパッケージに分けています。
| パス | 役割 |
|---|---|
cmd/fleetsh/ |
起動処理、バージョン、割り込みによるキャンセル |
internal/cli/ |
Cobra コマンド、入力確認、JSON と端末出力 |
internal/config/ |
既存ファイルを上書きしない設定の初期化 |
internal/inventory/ |
厳密な TOML 解析、検証、対象選択、ロック付きアトミック保存 |
internal/credentials/ |
OS の認証情報ストア、端末の非表示入力、既知の秘密値のマスキング |
internal/transport/ |
SSH 認証、Agent、踏み台、SOCKS5/HTTP/HTTPS プロキシ、known_hosts、接続維持 |
internal/executor/ |
ワーカープール、期限、出力制限、PTY、sudo |
internal/actions/ |
Linux のリソース確認、OS に応じた更新、検証付き再起動 |
internal/forwarding/ |
ローカル・リモート・動的転送、接続数制限とキャンセル |
internal/testutil/ |
ローカルの SSH、Agent、プロキシのテスト環境 |
docs/ |
Jekyll のソース。gh-pages から公開 |
接続のライフサイクル
入力確認が混在しないように、並列処理の前に認証情報と Agent の鍵を取得します。 各接続先は独自の SSH クライアントと踏み台チェーンを持ちます。 すべてのネットワーク処理にキャンセルと接続期限を適用します。 未知のホスト鍵は確認を求め、変更された鍵は拒否します。 15 秒ごとに接続維持を確認し、応答しない接続を閉じます。
接続後、コマンド用の期限を別に開始します。キャンセル時は SSH クライアントを閉じ、 stdout、stderr、リモート終了状態を保持します。 各出力ストリームは 4 MiB に制限し、切り詰めを報告します。 ワーカープールが同時処理数を制限します。並べ替えたホスト一覧により、 結果の表示順を安定させます。
状態の変更
プロセス間のアドバイザリーロックで、協調する書き込みを保護します。 検証済み TOML を非公開の一時ファイルに書き、同期後に名前を変更します。 CLI の編集はコメントを書き直します。ホスト鍵の信頼には別のロックを使い、 並行した変更に対応するため、承認後に身元を再確認します。
更新は、すべての実行対象の事前確認が完了してから実行します。 再起動は元の起動 ID を記録し、再起動コマンドを送信して再接続を繰り返します。 起動 ID の変化と正常性の確認の両方を検証します。
終了コード
- 0:すべての実行対象が成功。コンソール専用ホストはスキップ可能。
- 1:リモートコマンド失敗、実行タイムアウト、キャンセル。
- 2:ローカルの引数、設定、認証情報の準備エラー。
- 3:接続、認証、プロキシ、ホスト鍵の失敗。接続タイムアウトも含む。
複数種類のリモート失敗がある場合は 1 を 3 より優先します。 対話シェルの非ゼロ終了状態は 1 を返します。コマンドの自動再試行はありません。
依存関係と検証
Cobra、go-toml/v2、x/crypto/ssh、x/net/proxy、x/term、go-keyring、
go-winio、flock のバージョンを go.mod と go.sum で固定します。
SSH の基本機能は OpenSSH 実行ファイルを呼び出しません。
macOS Keychain は標準の security に秘密値を stdin で渡し、
Linux は Secret Service と D-Bus を使います。
ローカル SSH サーバー、暗号化した鍵、Unix ソケットと Windows Agent パイプ、 厳密な信頼検証、接続先と踏み台の身元、認証付きプロキシ、期限、sudo 入力、 並列数、出力制限、更新の承認、再起動 ID をテストします。 CI では競合検出テストと CGO 不要の 6 種類のクロスビルドを実行します。 OS ストアの統合テストには、隔離した認証情報ストアの一時項目を使います。