Commit Graph

1 Commits

Author SHA1 Message Date
53950e0388 test(pluginmgr): 钉住「插件必须走 plugin_install,不能手工替换二进制」
## 我犯的错(2026-10-18)

改完 commondev 后我是这么"部署"的:

	python3 -c "zipfile...extractall('/tmp/x')"
	install -m 0755 /tmp/x/plugin.bin <插件目录>/plugin.bin
	install -m 0644 /tmp/x/rawfile/runtime/pi/sidecar.mjs <插件目录>/...
	systemctl restart homeagent

用户一句「为什么不打包为 hmap 安装,而是手动替换」点破了问题。

## 手动替换丢了什么

换成标准 plugin_install 后,返回:

	action: "reinstalled",  checksum: "13a46f87161d37c8…",
	config_kept: true,  skills_registered: 1,  reload_required: true

这个 checksum 正是 .hmap 的 sha256(实测一致)。而手工 cp 拿不到的东西:

 · **整包校验和** —— 包与落盘结果之间没有任何可核对的凭据
 · **备份 + 失败回滚** —— 手工 install 半途失败会留下半新半旧的目录,
   比彻底失败更难查(插件能加载、某个功能诡异失效)
 · **全量路径校验** —— validatePackage 遍历**所有**条目拒 `..`/绝对路径
   (该循环曾因 break 漏检 rawfile,已修)
 · **rawfile 全量解包** —— 我只覆盖了 2 个 sidecar,其余(node/pi 运行时)
   仍是旧的。证据:替换后 `rawfile/` 目录 mtime 停在 10-16,
   标准安装后整个目录 mtime 才变成 10-49
 · **配置保留与 skill 注册** —— config_kept / skills_registered 在返回值里

## 判据(2 条)

代码无法禁止人手工 cp,但可以把**唯一正确入口**钉住:

 · TestInstallKeepsBackupAndRollback:installFromData 必须仍有
   「备份旧目录 → extractPackage → 失败回滚」三件事
 · TestValidatePackageChecksAllEntries:路径校验必须遍历全部条目,
   且所在循环里不能有 break(历史缺陷:manifest 之后的条目漏检)

## 变异

去掉备份            → 咬("安装不再备份旧目录 —— 失败就没法回滚")
去掉回滚            → 咬
2026-10-18 10:51:46 +08:00