docs(agent): 修复计划未闭合代码块 + Task 6 改用常驻测试校验样例
未闭合的 ```go 让 Task 4-6 的标题落进代码块,task-brief 无法提取; Task 6 原用 go run 校验样例文件,该文件在 module 外无法解析 import, 改为常驻测试 TestACLExampleFileStaysValid,并断言样例 uuid 为占位符 以防真实 dp_uuid 入库。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -774,6 +774,7 @@ func buildRoute(acl *ACLConfig, warp *WarpConfig) map[string]any {
|
||||
// 访问权的 dp_uuid 白名单与对应的私有域名/端口。它仍不含任何账户身份(email/user_id),
|
||||
// 但确实让节点知道「这几个 dp_uuid 属于同一组权限」—— 知情接受的不变式弱化,
|
||||
// 设计与权衡见 docs/private-dest-acl-design.html §12。
|
||||
```
|
||||
|
||||
⑤ 修改 `server/internal/agentd/singbox.go` 第 326 行,补一个 nil 实参(Task 4 会替换成真实 ACL):
|
||||
|
||||
@@ -1119,6 +1120,7 @@ git commit -m "feat(agent): SIGHUP 重读节点本地配置并热重渲染,不
|
||||
|
||||
**Files:**
|
||||
- Create: `deploy/single-node/acl.json.example`
|
||||
- Modify: `server/internal/agentd/acl_test.go`(追加样例文件常驻校验测试)
|
||||
- Modify: `docs/private-dest-acl-design.html`(把 §8 runbook 里的占位符换成指向样例文件)
|
||||
|
||||
**Interfaces:**
|
||||
@@ -1153,32 +1155,45 @@ git commit -m "feat(agent): SIGHUP 重读节点本地配置并热重渲染,不
|
||||
|
||||
> `_comment` 字段会被 `encoding/json` 忽略(`ACLConfig` 无对应字段且未启用 `DisallowUnknownFields`),可安全保留作自文档。样例里的 `TODO-` 值是**样例文件**的占位,不是计划的占位——真实 uuid 属 PII 级标识,不入 git,由运维按 Step 2 的 SQL 现取现填。
|
||||
|
||||
- [ ] **Step 2: 验证样例能被解析且渲染出预期规则**
|
||||
- [ ] **Step 2: 加一条测试,锁死「样例文件永远可解析」**
|
||||
|
||||
```bash
|
||||
cd server && cat > /tmp/acl_example_check.go <<'EOF'
|
||||
package main
|
||||
样例文件会随需求漂移(改了 target 形状却忘了同步样例),靠人工 `go run` 检查一次没有约束力。改为一条常驻测试。追加到 `server/internal/agentd/acl_test.go`:
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/wangjia/pangolin/server/internal/agentd"
|
||||
)
|
||||
|
||||
func main() {
|
||||
ac, err := agentd.LoadACLConfig(os.Args[1])
|
||||
```go
|
||||
// 样例文件必须始终可被解析且产出预期规则,防止改了 ACLTarget 形状却忘了同步样例。
|
||||
func TestACLExampleFileStaysValid(t *testing.T) {
|
||||
path := filepath.Join("..", "..", "..", "deploy", "single-node", "acl.json.example")
|
||||
ac, err := LoadACLConfig(path)
|
||||
if err != nil {
|
||||
fmt.Println("FAIL:", err)
|
||||
os.Exit(1)
|
||||
t.Fatalf("样例文件解析失败 %s: %v", path, err)
|
||||
}
|
||||
if ac == nil {
|
||||
t.Fatalf("样例文件不存在: %s", path)
|
||||
}
|
||||
if !ac.active() {
|
||||
t.Error("样例文件应当是一份 active 的 ACL")
|
||||
}
|
||||
if len(ac.Targets) != 2 {
|
||||
t.Errorf("样例 targets = %d, want 2", len(ac.Targets))
|
||||
}
|
||||
// 样例里的 uuid 是占位符,不该是真实 uuid(真实 uuid 属标识信息,不入 git)
|
||||
for _, u := range ac.AllowDpUUIDs {
|
||||
if !strings.HasPrefix(u, "TODO-") {
|
||||
t.Errorf("样例文件混入了非占位 uuid %q —— 真实 dp_uuid 不得入 git", u)
|
||||
}
|
||||
}
|
||||
fmt.Printf("OK enabled=%v uuids=%d targets=%d\n", ac.Enabled, len(ac.AllowDpUUIDs), len(ac.Targets))
|
||||
}
|
||||
EOF
|
||||
go run /tmp/acl_example_check.go ../deploy/single-node/acl.json.example && rm /tmp/acl_example_check.go
|
||||
```
|
||||
|
||||
Expected: `OK enabled=true uuids=2 targets=2`
|
||||
跑:
|
||||
|
||||
```bash
|
||||
cd server && go test ./internal/agentd/ -run 'ExampleFileStaysValid' -v
|
||||
```
|
||||
|
||||
Expected: PASS。
|
||||
|
||||
> 注:`_comment` 字段会被 `encoding/json` 忽略(`ACLConfig` 无对应字段且未启用 `DisallowUnknownFields`),故样例里的自文档注释不影响解析——这条测试同时守着这个前提。
|
||||
|
||||
- [ ] **Step 3: 更新设计文档的 runbook 指向**
|
||||
|
||||
@@ -1192,10 +1207,12 @@ Expected: `OK enabled=true uuids=2 targets=2`
|
||||
|
||||
```bash
|
||||
cd server && go build ./... && go test ./internal/agentd/...
|
||||
git add deploy/single-node/acl.json.example docs/private-dest-acl-design.html
|
||||
git commit -m "docs(agent): 私有目的地 ACL 配置样例与 runbook 指向"
|
||||
git add deploy/single-node/acl.json.example server/internal/agentd/acl_test.go docs/private-dest-acl-design.html
|
||||
git commit -m "docs(agent): 私有目的地 ACL 配置样例与常驻校验测试"
|
||||
```
|
||||
|
||||
> `git add` 只列具体路径,**切勿 `git add -A`**:仓库里有未跟踪的 `pangolin-release.jks`(Android 签名密钥)与若干无关的本地改动,误提交会泄露密钥。
|
||||
|
||||
---
|
||||
|
||||
## 上线验收(人工,非代码任务)
|
||||
|
||||
Reference in New Issue
Block a user