Files
hawkbit/hawkbit-compose/CURL-API.md
lingwei.kong 2a425196e6
Some checks failed
Mark & close stale issues / stale (push) Has been cancelled
Vulnerability Scan / trivy-scan (1.0) (push) Has been cancelled
Vulnerability Scan / trivy-scan (master) (push) Has been cancelled
License Scan / license-scan (push) Has been cancelled
提交api调用相关信息
2026-06-18 18:00:17 +08:00

747 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Hawkbit DDI API — curl 完整操作手册
基于实际验证的 Hawkbit DDI API v1 交互流程,所有命令均已跑通。
## 环境信息
```
Hawkbit Server: http://192.168.142.128:9090
Tenant: DEFAULT
Auth: GatewayToken my-gateway-key (DDI 接口)
admin:admin (Management 接口)
Controller ID: test-curl-001
DistributionSet: id=1 (r3576test:V1.0.0.0)
```
## 目录
1. [认证配置](#1-认证配置)
2. [自动注册与轮询](#2-自动注册与轮询)
3. [分配 Distribution Set](#3-分配-distribution-set)
4. [拉取部署详情](#4-拉取部署详情)
5. [上报设备属性](#5-上报设备属性)
6. [下载 artifact](#6-下载-artifact)
7. [SHA256 文件校验](#7-sha256-文件校验)
8. [上报执行状态](#8-上报执行状态)
9. [取消任务](#9-取消任务)
10. [确认任务流程](#10-确认任务流程)
11. [查询验证](#11-查询验证)
12. [完整流程速查](#12-完整流程速查)
---
## 1. 认证配置
### 1.1 开启 GatewayToken 认证(服务端,一次性)
```bash
# 设置 token key
curl -u admin:admin -X PUT \
-H "Content-Type: application/json" \
"http://192.168.142.128:9090/rest/v1/system/configs/authentication.gatewaytoken.key" \
-d '{"value": "my-gateway-key"}'
# 启用 gateway token 认证
curl -u admin:admin -X PUT \
-H "Content-Type: application/json" \
"http://192.168.142.128:9090/rest/v1/system/configs/authentication.gatewaytoken.enabled" \
-d '{"value": true}'
```
### 1.2 开启 TargetToken 认证(服务端,一次性)
```bash
curl -u admin:admin -X PUT \
-H "Content-Type: application/json" \
"http://192.168.142.128:9090/rest/v1/system/configs/authentication.targettoken.enabled" \
-d '{"value": true}'
```
### 1.3 查看当前所有认证配置
```bash
curl -s -u admin:admin \
"http://192.168.142.128:9090/rest/v1/system/configs" \
| python3 -m json.tool | grep -E "authentication\.(gateway|target)"
```
### 1.4 认证方式对比
```
DDI 请求头:
GatewayToken → Authorization: GatewayToken my-gateway-key
TargetToken → Authorization: TargetToken <设备securityToken>
Management API 请求头:
Basic Auth → -u admin:admin
```
---
## 2. 自动注册与轮询
### 2.1 首次轮询(自动注册)
```
GET /{tenant}/controller/v1/{controllerId}
```
设备 SN 在 Hawkbit 中不存在时,服务端自动调用 `findOrRegisterTargetIfItDoesNotExist()` 创建 target。
```bash
curl -v \
-H "Authorization: GatewayToken my-gateway-key" \
-H "Accept: application/json" \
"http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001"
```
**响应(无待处理 action**
```json
{
"config": {"polling": {"sleep": "00:05:00"}},
"_links": {
"configData": {
"href": "http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/configData"
}
}
}
```
**响应(有待处理 action**
```json
{
"config": {"polling": {"sleep": "00:05:00"}},
"_links": {
"deploymentBase": {
"href": "http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/deploymentBase/15?c=424529173"
},
"configData": {
"href": "http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/configData"
}
}
}
```
### 2.2 响应中的 HAL 链接含义
| 链接 rel | 含义 | 下一步动作 |
|----------|------|----------|
| `deploymentBase` | 有待执行的部署任务 | 拉取部署详情 → 下载 → 安装 |
| `cancelAction` | 有取消指令 | 确认取消 |
| `confirmationBase` | 有需要确认的任务 | 发送确认 |
| `configData` | 服务端要求上报属性 | PUT 属性数据 |
| `installedBase` | 有历史安装记录 | 可查询 |
---
## 3. 分配 Distribution Set
```
POST /rest/v1/distributionsets/{distributionSetId}/assignedTargets
```
> ⚠️ 这是 Management API用 `-u admin:admin` 认证。
```bash
curl -u admin:admin -X POST \
-H "Content-Type: application/json" \
"http://192.168.142.128:9090/rest/v1/distributionsets/1/assignedTargets" \
-d '[{"id": "test-curl-001"}]'
```
**可选参数(完整请求体)**
```json
{
"id": "test-curl-001",
"type": "forced",
"forcetime": 1682408575278,
"weight": 1000,
"maintenanceWindow": {
"schedule": "00:00-04:00",
"duration": "02:00:00",
"timezone": "+08:00"
},
"confirmationRequired": false
}
```
**响应**`200 OK`,返回 `MgmtTargetAssignmentResponseBody`
分配成功后,设备下次轮询就会拿到 `deploymentBase` 链接。
---
## 4. 拉取部署详情
```
GET /{tenant}/controller/v1/{controllerId}/deploymentBase/{actionId}
```
```bash
curl -H "Authorization: GatewayToken my-gateway-key" \
-H "Accept: application/json" \
"http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/deploymentBase/15"
```
**响应**
```json
{
"id": "15",
"deployment": {
"download": "forced",
"update": "forced",
"chunks": [
{
"part": "os",
"version": "V1.0.0.0",
"name": "r3576-OS-android",
"artifacts": [
{
"filename": "update.zip",
"hashes": {
"sha1": "223377ea691bd7fc47865cccfd802771ff1b3fca",
"md5": "28a17f5fb87d637756c0cc5d555d69b7",
"sha256": "438b8f9e2af3a3334dc72272d167e0deda8c6e65bb1585202151b3cb866bb530"
},
"size": 195411,
"_links": {
"download-http": {
"href": "http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/softwaremodules/1/artifacts/update.zip"
},
"md5sum-http": {
"href": "http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/softwaremodules/1/artifacts/update.zip.MD5SUM"
}
}
}
]
}
]
}
}
```
### 字段说明
| 字段 | 说明 |
|------|------|
| `id` | action ID后续反馈操作的关键参数 |
| `deployment.download` | `forced`=强制下载 / `attempt`=尝<><E5B09D><EFBFBD>下载 / `skip`=跳过 |
| `deployment.update` | `forced`=强制安装 / `attempt`=尝试安装 / `skip`=跳过 |
| `chunks[].part` | 软件模块类型os / app / …) |
| `chunks[].version` | 软件版本号 |
| `chunks[].artifacts[].filename` | 要下载的文件名 |
| `chunks[].artifacts[].hashes` | SHA1 / MD5 / SHA256 校验值 |
| `chunks[].artifacts[].size` | 文件大小bytes |
| `_links.download-http.href` | **下载地址** |
### download / update handlingType 组合
| download | update | 含义 |
|----------|--------|------|
| `forced` | `forced` | 立即下载并安装 |
| `attempt` | `attempt` | 设备自行决定是否下载/安装 |
| `forced` | `skip` | 只下载不安装download only |
| `skip` | `skip` | maintenance window 未到,等待下次轮询 |
---
## 5. 上报设备属性
```
PUT /{tenant}/controller/v1/{controllerId}/configData
```
> ⚠️ 必须先轮询一次让 target 自动注册,再上报属性,否则 404。
```bash
curl -H "Authorization: GatewayToken my-gateway-key" \
-H "Content-Type: application/json" -X PUT \
"http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/configData" \
-d '{
"mode": "merge",
"data": {
"osType": "linux",
"platform": "x86_64",
"kernel": "6.17.0-35-generic",
"hostname": "test-curl-001",
"hwRevision": "VMware Virtual Platform",
"manufacturer": "VMware, Inc.",
"swVersion": "V1.0.0.0"
}
}'
```
### mode 说明
| mode | 行为 |
|------|------|
| `merge` | 合并:只更新传入的 key保留已有属性推荐 |
| `replace` | 替换:完全覆盖已有属性 |
| `remove` | 删除:移除传入的 key |
**响应**`200 OK`(空 body
### 查询设备属性
```bash
curl -u admin:admin \
"http://192.168.142.128:9090/rest/v1/targets/test-curl-001/attributes"
```
---
## 6. 下载 artifact
```
GET /{tenant}/controller/v1/{controllerId}/softwaremodules/{softwareModuleId}/artifacts/{fileName}
```
### 6.1 完整下载
```bash
curl -H "Authorization: GatewayToken my-gateway-key" \
-o /tmp/test-update.zip \
"http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/softwaremodules/1/artifacts/update.zip"
```
**响应**`200 OK`,二进制流。
### 6.2 断点续传Range 请求)
```bash
# 续传:从 byte 1048576 开始
curl -H "Authorization: GatewayToken my-gateway-key" \
-H "Range: bytes=1048576-" \
-o /tmp/test-update.zip.part --append \
"http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/softwaremodules/1/artifacts/update.zip"
```
**响应**`206 Partial Content``Content-Range: bytes 1048576-195410/195411`
### 6.3 条件请求If-Match
```bash
curl -H "Authorization: GatewayToken my-gateway-key" \
-H "If-Match: 223377ea691bd7fc47865cccfd802771ff1b3fca" \
-o /tmp/test-update.zip \
"http://..."
# SHA1 不匹配 → 412 Precondition Failed
```
### 6.4 下载 MD5SUM
```bash
curl -H "Authorization: GatewayToken my-gateway-key" \
"http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/softwaremodules/1/artifacts/update.zip.MD5SUM"
```
**响应**`28a17f5fb87d637756c0cc5d555d69b7 update.zip`
### 6.5 从 HAL 链接提取下载地址
artifact 的 `_links` 中有两个下载链接,优先级:
```
download → HTTPS如果有首选
download-http → HTTP回退方案
md5sum-http → MD5 校验文件HTTP
```
---
## 7. SHA256 文件校验
### 7.1 计算本地文件 SHA256
```bash
sha256sum /tmp/test-update.zip
```
### 7.2 对比部署详情中的哈希值
```bash
# 部署详情中的 SHA256:
# "sha256": "438b8f9e2af3a3334dc72272d167e0deda8c6e65bb1585202151b3cb866bb530"
echo "438b8f9e2af3a3334dc72272d167e0deda8c6e65bb1585202151b3cb866bb530 /tmp/test-update.zip" | sha256sum -c
# → /tmp/test-update.zip: OK
```
---
## 8. 上报执行状态
```
POST /{tenant}/controller/v1/{controllerId}/deploymentBase/{actionId}/feedback
```
### 8.1 状态上报 JSON 格式
```json
{
"timestamp": 1750000000000,
"status": {
"execution": "download",
"result": {
"finished": "none",
"progress": {"cnt": 2, "of": 5}
},
"code": 200,
"details": ["Starting download"]
}
}
```
### 8.2 四步标准流程
```bash
# 定义变量,方便重复使用
D="http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/deploymentBase/15/feedback"
A="Authorization: GatewayToken my-gateway-key"
J="Content-Type: application/json"
# ① download — 开始下载
curl -H "$A" -H "$J" \
-d '{"status":{"execution":"download","result":{"finished":"none"},"details":["Starting download"]}}' \
"$D"
# ② downloaded — 下载完成
curl -H "$A" -H "$J" \
-d '{"status":{"execution":"downloaded","result":{"finished":"none"},"details":["Downloaded update.zip"]}}' \
"$D"
# ③ proceeding — 安装中
curl -H "$A" -H "$J" \
-d '{"status":{"execution":"proceeding","result":{"finished":"none"},"details":["Installing update"]}}' \
"$D"
# ④ closed — 最终结果
# 成功:
curl -H "$A" -H "$J" \
-d '{"status":{"execution":"closed","result":{"finished":"success"},"details":["Installation complete"],"code":200}}' \
"$D"
# 失败:
curl -H "$A" -H "$J" \
-d '{"status":{"execution":"closed","result":{"finished":"failure"},"details":["Installation failed"],"code":500}}' \
"$D"
```
### 8.3 execution 枚举值
| execution | Hawkbit Status | 说明 |
|-----------|---------------|------|
| `download` | `DOWNLOAD` | 开始下载 |
| `downloaded` | `DOWNLOADED` | 下载完成 |
| `proceeding` | `RUNNING` | 安装进行中 |
| `closed` | `FINISHED` / `ERROR` | 最终状态(配合 result.finished |
| `canceled` | `CANCELED` | 已取消 |
| `rejected` | `WARNING` | 已拒绝 |
| `scheduled` | `RUNNING` | 已计划 |
| `resumed` | `RUNNING` | 恢复执行 |
### 8.4 result.finished 枚举值
| finished | 含义 |
|----------|------|
| `none` | 尚未完成(中间状态) |
| `success` | 执行成功 |
| `failure` | 执行失败 |
### 8.5 带进度的上报
```bash
# 进度: 第2个/总共5个 artifact
curl -H "$A" -H "$J" \
-d '{"status":{"execution":"proceeding","result":{"finished":"none","progress":{"cnt":2,"of":5}},"details":["Downloading artifact 2/5"]}}' \
"$D"
```
### 8.6 取消反馈cancelAction feedback
```bash
curl -H "$A" -H "$J" \
-d '{"status":{"execution":"canceled","result":{"finished":"none"},"details":["Cancel acknowledged"]}}' \
"http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/cancelAction/15/feedback"
```
### 8.7 确认反馈confirmationBase feedback
```bash
curl -H "$A" -H "$J" \
-d '{"confirmation":"confirmed","code":200,"details":["Auto-confirmed"]}' \
"http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/confirmationBase/15/feedback"
```
### 8.8 常见错误
| HTTP 状态码 | 原因 | 解决 |
|------------|------|------|
| `401` | 认证未通过 | 检查 Authorization header 格式 |
| `404` | URL 路径错误或 target 不存在 | 确保 `/{tenant}/controller/v1/...` |
| `405` | feedback URL 带了 `?c=xxx` 参数 | POST 前剥离查询参数 |
| `410 Gone` | action 已不再活跃 | 已经 closed 或 canceled |
| `400 Body Not Readable` | JSON 格式错误 | `"final"` 应为 `"finished"``"progress":{}` 应为 `null` 或省略 |
---
## 9. 取消任务
### 9.1 服务端发起取消Management API
```bash
curl -u admin:admin -X DELETE \
"http://192.168.142.128:9090/rest/v1/targets/test-curl-001/actions/15"
```
### 9.2 设备端处理取消
```bash
# ① 轮询拿到 cancelAction
curl -H "Authorization: GatewayToken my-gateway-key" \
"http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001"
# → _links.cancelAction.href
# ② 确认取消
curl -H "Authorization: GatewayToken my-gateway-key" \
-H "Content-Type: application/json" \
-d '{"status":{"execution":"canceled","result":{"finished":"none"},"details":["Acknowledged"]}}' \
"http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/cancelAction/15/feedback"
```
---
## 10. 确认任务流程
### 10.1 开启确认流程(服务端)
```bash
curl -u admin:admin -X PUT \
-H "Content-Type: application/json" \
"http://192.168.142.128:9090/rest/v1/system/configs/user.confirmation.flow.enabled" \
-d '{"value": true}'
```
### 10.2 分配时要求确认
```bash
curl -u admin:admin -X POST \
-H "Content-Type: application/json" \
"http://192.168.142.128:9090/rest/v1/distributionsets/1/assignedTargets" \
-d '[{"id":"test-curl-001","confirmationRequired":true}]'
```
### 10.3 设备端自动确认
```bash
curl -H "Authorization: GatewayToken my-gateway-key" \
-H "Content-Type: application/json" \
-d '{"confirmation":"confirmed","code":200,"details":["Auto-confirmed"]}' \
"http://192.168.142.128:9090/DEFAULT/controller/v1/test-curl-001/confirmationBase/15/feedback"
```
---
## 11. 查询验证
### 11.1 查询 target 基本信息
```bash
curl -u admin:admin \
"http://192.168.142.128:9090/rest/v1/targets/test-curl-001"
```
### 11.2 查询 target 所有 action
```bash
curl -u admin:admin \
"http://192.168.142.128:9090/rest/v1/targets/test-curl-001/actions"
```
### 11.3 查询指定 action 详情
```bash
curl -u admin:admin \
"http://192.168.142.128:9090/rest/v1/targets/test-curl-001/actions/15"
```
### 11.4 查询 action 状态历史
```bash
curl -u admin:admin \
"http://192.168.142.128:9090/rest/v1/targets/test-curl-001/actions/15/status"
```
**响应示例(完成全流程后)**
```json
{
"content": [
{"id":58, "type": "finished", "messages": ["Installation complete"], ...},
{"id":57, "type": "running", "messages": ["Installing update"], ...},
{"id":56, "type": "downloaded","messages": ["Downloaded update.zip"], ...},
{"id":55, "type": "download", "messages": ["Starting download"], ...},
{"id":54, "type": "download", "messages": ["Target downloads ..."], ...},
{"id":53, "type": "retrieved", "messages": ["Target retrieved ..."], ...},
{"id":52, "type": "running", "messages": ["Assignment initiated ..."]}
],
"total": 7, "size": 7
}
```
### 11.5 查询 target 属性
```bash
curl -u admin:admin \
"http://192.168.142.128:9090/rest/v1/targets/test-curl-001/attributes"
```
### 11.6 查询所有 target
```bash
curl -u admin:admin \
"http://192.168.142.128:9090/rest/v1/targets"
```
### 11.7 查询所有 Distribution Set
```bash
curl -u admin:admin \
"http://192.168.142.128:9090/rest/v1/distributionsets"
```
---
## 12. 完整流程速查
### 12.1 一次完整的 OTA 生命周期(复制粘贴即用)
```bash
# ═══ 变量设置 ═══
HOST="http://192.168.142.128:9090"
TENANT="DEFAULT"
CID="test-curl-001"
AUTH="Authorization: GatewayToken my-gateway-key"
ADMIN="admin:admin"
# ═══ Step 1: 轮询(自动注册)═══════════════════════════════════════
curl -s -H "$AUTH" -H "Accept: application/json" \
"$HOST/$TENANT/controller/v1/$CID" | python3 -m json.tool
# ═══ Step 2: 分配 Distribution SetManagement API═════════════════
curl -u $ADMIN -X POST -H "Content-Type: application/json" \
"$HOST/rest/v1/distributionsets/1/assignedTargets" \
-d '[{"id": "'$CID'"}]'
# ═══ Step 3: 轮询(拿到 deploymentBase═════════════════════════════
RESP=$(curl -s -H "$AUTH" -H "Accept: application/json" \
"$HOST/$TENANT/controller/v1/$CID")
echo "$RESP" | python3 -m json.tool
# 提取 actionId假设第一次分配取 deploymentBase URL 中的数字)
DEPLOY_URL=$(echo "$RESP" | python3 -c "import sys,json; print(json.load(sys.stdin)['_links']['deploymentBase']['href'])")
AID=$(echo "$DEPLOY_URL" | grep -oP 'deploymentBase/\K\d+')
echo "Action ID: $AID"
# ═══ Step 4: 拉取部署详情 ══════════════════════════════════════════
DEPLOY=$(curl -s -H "$AUTH" -H "Accept: application/json" \
"$HOST/$TENANT/controller/v1/$CID/deploymentBase/$AID")
echo "$DEPLOY" | python3 -m json.tool
# 提取下载地址和 SHA256
DL_URL=$(echo "$DEPLOY" | python3 -c "
import sys,json
art = json.load(sys.stdin)['deployment']['chunks'][0]['artifacts'][0]
print(art['_links']['download-http']['href'])
")
SHA256=$(echo "$DEPLOY" | python3 -c "
import sys,json
print(json.load(sys.stdin)['deployment']['chunks'][0]['artifacts'][0]['hashes']['sha256'])
")
echo "Download: $DL_URL"
echo "SHA256: $SHA256"
# ═══ Step 5: 上报属性 ══════════════════════════════════════════════
curl -s -H "$AUTH" -H "Content-Type: application/json" -X PUT \
"$HOST/$TENANT/controller/v1/$CID/configData" \
-d '{"mode":"merge","data":{"osType":"linux","hostname":"'$CID'","swVersion":"V1.0.0.0"}}'
# ═══ Step 6: 下载 ══════════════════════════════════════════════════
curl -H "$AUTH" -o /tmp/update.zip "$DL_URL"
# ═══ Step 7: 校验 ══════════════════════════════════════════════════
echo "$SHA256 /tmp/update.zip" | sha256sum -c
# ═══ Step 8: 上报四步状态 ══════════════════════════════════════════
FB="$HOST/$TENANT/controller/v1/$CID/deploymentBase/$AID/feedback"
curl -s -H "$AUTH" -H "Content-Type: application/json" \
-d '{"status":{"execution":"download","result":{"finished":"none"},"details":["Starting"]}}' "$FB"
curl -s -H "$AUTH" -H "Content-Type: application/json" \
-d '{"status":{"execution":"downloaded","result":{"finished":"none"},"details":["Downloaded"]}}' "$FB"
curl -s -H "$AUTH" -H "Content-Type: application/json" \
-d '{"status":{"execution":"proceeding","result":{"finished":"none"},"details":["Installing"]}}' "$FB"
curl -s -H "$AUTH" -H "Content-Type: application/json" \
-d '{"status":{"execution":"closed","result":{"finished":"success"},"details":["Installation complete"],"code":200}}' "$FB"
# ═══ Step 9: 验证 ══════════════════════════════════════════════════
curl -s -u $ADMIN "$HOST/rest/v1/targets/$CID/actions/$AID/status" | python3 -m json.tool
echo "Done! Action $AID is now finished."
```
### 12.2 Hawkbit 状态流转图
```
管理员分配 DS
RUNNING WAITING_FOR_CONFIRMATION
│ │
▼ │ confirmed
RETRIEVED ◄─── deploymentBase ▼
│ (轮询返回) RUNNING
▼ │
DOWNLOAD ...
DOWNLOADED
PROCEEDING ──→ status: RUNNING
┌───┴───┐
▼ ▼
FINISHED ERROR ◄─── closed + success/failure
(成功) (失败)
任意阶段 ──cancel──→ CANCELING ──→ CANCELED
```
### 12.3 API 端点速查表
| 操作 | 方法 | 路径 | 认证 |
|------|------|------|------|
| 轮询 | GET | `/{tenant}/controller/v1/{controllerId}` | DDI |
| 部署详情 | GET | `/{tenant}/controller/v1/{controllerId}/deploymentBase/{actionId}` | DDI |
| 上报反馈 | POST | `.../deploymentBase/{actionId}/feedback` | DDI |
| 取消反馈 | POST | `.../cancelAction/{actionId}/feedback` | DDI |
| 确认反馈 | POST | `.../confirmationBase/{actionId}/feedback` | DDI |
| 上报属性 | PUT | `/{tenant}/controller/v1/{controllerId}/configData` | DDI |
| 下载文件 | GET | `/{tenant}/controller/v1/{controllerId}/softwaremodules/{id}/artifacts/{file}` | DDI |
| 下载MD5 | GET | `.../softwaremodules/{id}/artifacts/{file}.MD5SUM` | DDI |
| 分配 DS | POST | `/rest/v1/distributionsets/{id}/assignedTargets` | Basic |
| 查询 target | GET | `/rest/v1/targets/{controllerId}` | Basic |
| 查询 action | GET | `/rest/v1/targets/{controllerId}/actions/{id}` | Basic |
| 查询状态 | GET | `/rest/v1/targets/{controllerId}/actions/{id}/status` | Basic |
| 查询属性 | GET | `/rest/v1/targets/{controllerId}/attributes` | Basic |
| 取消 action | DELETE | `/rest/v1/targets/{controllerId}/actions/{id}` | Basic |
| 配置管理 | GET/PUT/DELETE | `/rest/v1/system/configs/{key}` | Basic |