fix(agent): 卸载时指出该去哪删节点,而不是一律说 agents.json
agent 不持有运维令牌——节点不是运维,一个能删掉邻居的被控节点比它解决的问题更糟——所以 它不能自己从中继上摘掉自己。此前卸载的结束语对所有节点都写"the relay's agents.json still lists this node",而自注册的节点根本不在那里:它在中继的状态文件里,要从手机上删。运维照着 那句话去翻一个没有这条记录的文件。 现在节点在登记时把来历写进配置(`selfEnrolled`,带 `--code` 为真),卸载结束语据此给出 正确的那一句: - 自注册的 → "在中继的登记状态里,去 App 的「中继节点」移除" - 手工登记的 → "在 agents.json 里,删掉那条并重启中继" - 配置读不出来 → 两句都提,因为读不到不是让卸载失败的理由 测试两项:卸载打印的是它被告知的那一句(且不再对自注册节点说 agents.json)、登记时正确 记录来历(带码为真、不带码不写这个字段)。 Go 全包、Node 141 项、Swift 121 项通过。
This commit is contained in:
@@ -142,3 +142,27 @@ func TestMissingInputIsRefused(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The node records how it got into the relay, because `uninstall` cannot work it out any other way: the
|
||||
// agent holds no admin token, so it cannot remove its own entry, and the operator has to be told which
|
||||
// of the relay's two records mentions this node.
|
||||
func TestEnrollmentRecordsItsOwnProvenance(t *testing.T) {
|
||||
withCode, err := Generate(Options{
|
||||
RelayURL: "https://relay.example", LocalPort: 3000, AuditPath: "/a", SelfEnrolled: true,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !strings.Contains(string(withCode.Config), `"selfEnrolled": true`) {
|
||||
t.Fatal("a self-enrolled node does not say so")
|
||||
}
|
||||
// And a node an operator wrote into agents.json does not claim to have enrolled itself, or the
|
||||
// uninstall would send the operator to the app to remove an entry that is not there.
|
||||
manual, err := Generate(Options{RelayURL: "https://relay.example", LocalPort: 3000, AuditPath: "/a"})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if strings.Contains(string(manual.Config), "selfEnrolled") {
|
||||
t.Fatal("a manually registered node claims to be self-enrolled")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user