## 结论:能,而且这是「控制端与被控端不可达」场景的正解 `deploy`(推送式)要求两者可达;本能力只要求**被控端能上网**,因此跨网段/NAT/异地都能更新。 GitHub Release / raw / 自建镜像 / 任意 http(s) 地址均可 —— 地址是参数,不写死。 ## 实现(apps/agent/src/capabilities/selfupdate.ts) 下载 → **校验 sha256** → 备份 → **原子替换**(同目录 rename)→ 受控重启(复用 v7)→ CLI 复核指纹 - 出口:CLI `nodeagent update --url <u> --sha256 <h> [--dry-run]` · MCP `na_agent_update` - 审计新增 `agent.update` 事件(记录 url / 前后指纹 / 字节数 / 备份路径) ## 安全底线(否则等于开放远程代码执行) 1. **sha256 必填**,且逐字节校验通过才替换;不符即丢弃并明确报错(未改动任何文件) 2. 只接受 http/https,拒绝 file:// 等其它 scheme 3. 大小上限 64MB + 下载超时(默认 120s) 4. **先备份再原子替换**,失败可回滚(返回 backup_path) 5. `dry_run` 只下载校验、不动文件 —— 用于「先确认能不能更」 6. 不用 fetch 的内置代理(Node 未暴露 undici):国内访问 GitHub 不稳时, 把 url 指向**自建镜像/加速地址**即可,能力本身接受任意 http(s) ## 真机/本地验证(全程真跑,非纸面) - e2e 新增:本地 HTTP 服务真跑下载 —— 正确哈希通过 / **错误哈希被拒** / 404 明确报错 / 非 http(s) scheme 被拒 / 缺 sha256 协议层拒绝 ✓ - 完整流程本地实测:`dry-run 预检` → `真更新`(966KB)→ 备份逐字节一致 → 重启 → **复核到新指纹** → 能力 42 项 ✓ - 顺带修:返回值漏 `incoming_hash` 导致 CLI 复核被跳过(真机踩过) - 单测 126 / e2e 28 全绿 ## 已知约束(写进文档) 1. **首次仍要一次性安装**(install.ps1)—— 自更新能力本身得先在机器上,鸡生蛋无解 2. `node.exe`(Node 运行时)不在自更新范围,只换 agent.mjs
35 lines
1.0 KiB
PowerShell
35 lines
1.0 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
nodeagent - uninstall the Windows agent.
|
|
|
|
.DESCRIPTION
|
|
Stops and removes the scheduled task and the firewall rule.
|
|
Keeps the config (~/.nodeagent/agent.json) unless -Purge is given.
|
|
#>
|
|
[CmdletBinding()]
|
|
param(
|
|
[int]$Port = 8765,
|
|
[switch]$Purge
|
|
)
|
|
|
|
$ErrorActionPreference = "SilentlyContinue"
|
|
|
|
$isAdmin = ([Security.Principal.WindowsPrincipal] `
|
|
[Security.Principal.WindowsIdentity]::GetCurrent()
|
|
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
|
|
if (-not $isAdmin) { Write-Host "[x] Please run as Administrator."; exit 1 }
|
|
|
|
Write-Host "[*] Stopping and removing scheduled task..."
|
|
Stop-ScheduledTask -TaskName "nodeagent"
|
|
Unregister-ScheduledTask -TaskName "nodeagent" -Confirm:$false
|
|
|
|
Write-Host "[*] Removing firewall rule..."
|
|
Get-NetFirewallRule -DisplayName "nodeagent (TCP $Port)" | Remove-NetFirewallRule
|
|
|
|
if ($Purge) {
|
|
Write-Host "[*] Purging config..."
|
|
Remove-Item -Recurse -Force (Join-Path $env:USERPROFILE ".nodeagent")
|
|
}
|
|
|
|
Write-Host "[+] Uninstalled."
|