# rtr_debug_client

`rtr_debug_client` 是用于 RTR 协议联调的命令行调试客户端，支持 `TCP`、`TLS`、`SSH` 三种传输。

它用于：
- 手动发送 `Reset Query`、`Serial Query`
- 持续接收并打印服务端 PDU
- 观察 `session_id`、`serial`、`EndOfData` timing hint、`ErrorReport` 等状态变化

## 构建

```sh
cargo build --bin rtr_debug_client
```

## 基本用法

```sh
cargo run --bin rtr_debug_client -- <addr> <version> [reset|serial <session_id> <serial>] [options]
```

默认值：
- `addr`: `127.0.0.1:323`
- `version`: `1`
- `mode`: `reset`
- `--timeout`: `30`
- `--poll`: `600`

## TCP 用法

```sh
cargo run --bin rtr_debug_client -- 127.0.0.1:323 1 reset
```

```sh
cargo run --bin rtr_debug_client -- 127.0.0.1:323 1 serial 42 100
```

## TLS 用法

仅校验服务端证书：

```sh
cargo run --bin rtr_debug_client -- \
  127.0.0.1:324 1 reset \
  --tls \
  --ca-cert tests/fixtures/tls/client-ca.crt \
  --server-name localhost
```

双向 TLS：

```sh
cargo run --bin rtr_debug_client -- \
  127.0.0.1:324 1 reset \
  --tls \
  --ca-cert tests/fixtures/tls/client-ca.crt \
  --server-name localhost \
  --client-cert tests/fixtures/tls/client-good.crt \
  --client-key tests/fixtures/tls/client-good.key
```

## SSH 用法（按 draft-ietf-sidrops-8210bis-25）

`rtr_debug_client --ssh` 采用以下流程：
- SSHv2 连接
- `session` channel
- 请求 `subsystem`，默认 `rpki-rtr`
- 使用 `publickey` 认证
- 强制服务端 host key 校验（`known_hosts` 或 pinned server key 二选一）

### 1. 使用 known_hosts 校验服务端

```sh
cargo run --bin rtr_debug_client -- \
  127.0.0.1:22 1 reset \
  --ssh \
  --ssh-user rpki-rtr \
  --ssh-key certs/rtr-client.key \
  --ssh-known-hosts certs/known_hosts
```

### 2. 使用固定服务端公钥校验

```sh
cargo run --bin rtr_debug_client -- \
  127.0.0.1:22 1 reset \
  --ssh \
  --ssh-user rpki-rtr \
  --ssh-key certs/rtr-client.key \
  --ssh-server-key certs/ssh_host_ed25519_key.pub
```

### 3. 自定义 subsystem 名称

```sh
cargo run --bin rtr_debug_client -- \
  127.0.0.1:22 1 reset \
  --ssh \
  --ssh-user rpki-rtr \
  --ssh-key certs/rtr-client.key \
  --ssh-known-hosts certs/known_hosts \
  --ssh-subsystem rpki-rtr
```

## 参数说明

通用参数：
- `--timeout <secs>`：读取 PDU 超时时间（秒）
- `--poll <secs>`：默认自动轮询间隔（秒）
- `--keep-after-error`：收到 `ErrorReport` 后不暂停自动轮询
- `--summary-only`：仅打印摘要，抑制 payload PDU 详细内容

TLS 参数：
- `--tls`
- `--ca-cert <path>`
- `--server-name <name>`
- `--client-cert <path>`
- `--client-key <path>`

SSH 参数：
- `--ssh`
- `--ssh-user <name>`
- `--ssh-key <path>`（OpenSSH 私钥）
- `--ssh-subsystem <name>`（默认 `rpki-rtr`）
- `--ssh-known-hosts <path>` 或 `--ssh-server-key <path>`（二选一，必须提供）

## SSH 连通性测试建议

如果你已经在 Docker 中启动了支持 SSH 的 RTR server，可按以下方式验证：

1. 先用 `ssh` 命令确认认证与 host key 配置正确（可连通）。
2. 再用 `rtr_debug_client --ssh` 发起连接并发送 `reset`。
3. 观察是否收到 `Cache Response` 和 `EndOfData`。

如果 `rtr_debug_client` 报 `failed to request SSH subsystem 'rpki-rtr'`，通常表示服务端未开启对应 subsystem 名称，或名称不一致。

## 运行时交互命令

客户端启动后可在标准输入中使用：
- `help`
- `state`
- `version` / `version <n>`
- `reset`
- `serial` / `serial <sid> <serial>`
- `timeout` / `timeout <secs>`
- `poll` / `poll <secs>` / `poll pause` / `poll resume`
- `keep-after-error`
- `output` / `output verbose` / `output summary`
- `quit`

## SSH Password Auth (Added)

`rtr_debug_client` now supports password auth in SSH mode.

- Use exactly one auth option in SSH mode:
  - `--ssh-key <path>`
  - `--ssh-password <value>`
- Host key verification is still required:
  - `--ssh-known-hosts <path>` or `--ssh-server-key <path>`

Example:

```sh
cargo run --bin rtr_debug_client -- \
  127.0.0.1:22 1 reset \
  --ssh \
  --ssh-user rpki-rtr \
  --ssh-password 'your-password' \
  --ssh-server-key certs/ssh_host_rsa_key.pub
```
