Skip to content

BAAH:遗留安装事务支持人工确认恢复(旧方案) - #1911

Closed
youngslin wants to merge 6 commits into
AUTO-MAS-Project:devfrom
youngslin:fix/baah-transaction-recovery-prompt
Closed

youngslin wants to merge 6 commits into
AUTO-MAS-Project:devfrom
youngslin:fix/baah-transaction-recovery-prompt

Conversation

@youngslin

Copy link
Copy Markdown

问题

BAAH 使用 MAS 的通用事务安装器:正常退出的安装由事务自动恢复,但异常退出或用户用官方方式手动修复后,残留 .mas-update-*/transaction.json 可能让 MAS 永久阻止运行;关掉托管更新也不改变事务保护。

方案(独立 BAAH PR)

  • 保留原 recover_install 的优先级:先自动恢复,正常完成不弹窗、不重复安装。
  • 自动恢复失败时,在 BAAH 已有的同安装目录排队锁和跨进程安装访问锁内弹出全局确认,显示托管名称、安装目录、当前版本和托管开关。选择「重试恢复」「确认跳过」「取消」。前端中英日齐备;主动重连或掉线都使旧请求失效;超时 120 秒后保留现场。
  • 跳过只适用于没有 previous/ready 备份和暂存目录的残留事务:后端再次确认原 transaction.json 字节未变、没有相关 BAAH 更新进程、主程序架构与版本可读,并验证已有 MAS 安装回执。满足条件后原子重命名归档标记,最后执行原版启动前安装确认;失败尽力恢复原标记。只允许用户主动确认。
  • 存在原目录备份、待切换目录、损坏文件或回执不匹配时不能跳过;原生事务仍必须恢复或使用官方安装器修复。
  • 对已恢复的本轮安装不额外重复下载与覆盖。关闭自动托管不影响用户主动恢复。
  • 新增原生事务不完整、存在备份、标记变化、失败回执、无 GUI 和弹窗身份的回归测试。

安全界限

这是 BAAH 的事务异常恢复,不改变其他脚本的事务恢复器;只在原自动恢复无法完成时提供人工核对。对手工修复的附属资源仍显示风险说明。真实 Windows BAAH E2E 尚需检验,CI 检查成功前不合并。

@github-actions github-actions Bot added 专项: BAAH 按更新日志碎片自动设置 类型: 修复 按更新日志碎片自动设置 labels Nov 10, 2026

Copy link
Copy Markdown
Contributor

总体结论:修改后合并

AUTO-MAS-Project/AUTO-MAS #1911

宝宝,先自动恢复、保留备份时禁止跳过、归档前后再校验,这些保护都留住了喵。不过新入口把事务文件限制为 64 KiB,而现有安装器会往里面写整份目录清单,正常使用也能超过这个限制,结果还没看到选择就被拦下了。

BAAH 管理器持有目录锁并安排恢复,专项模块处理本次确认和标记归档,原有通用安装器仍负责事务恢复;无需另造一套安装机制,把恢复入口与现有事务格式对齐即可。

规格:必须处理

[逻辑 · P2] 64 KiB 限额会拒绝安装器正常生成的事务,重试和跳过都无法选择

位置:install_recovery.py:31–55;事务来源:script_install.py:280–294、602–608。

transaction.json 不是只有版本和状态的小标记。现有安装器把 files、original_files 和 package_files 三份路径到 SHA256 的映射写进去,前两份还包含安装目录里的配置和历史日志。以 400 个正常命名的 DATA/LOGS/log_YYYY-MM-DD-HH-MM-SS.txt 为例,仅前两份日志清单就超过 64 KiB,不需要异常文件或恶意输入。

可达的静态时序是:安装已写好回执、删掉 previous,恰在 删除 journal 之前退出;用户之后手动运行或修改原生配置。下次自动恢复因全树内容变化在 521–522 行拒绝,但主程序、版本与发行文件回执仍正常,previous/ready 也都不存在。这正是本 PR 想让用户核对后跳过的残留事务。

现在 ask_install_recovery() 在发送询问前就以“事务标记过大”抛错,重试和跳过均不可达;即使只放宽这里,confirm_snapshot() 中相同的限额仍会拒绝。原本拒绝未确认事务是保护措施,本项问题是新恢复入口不能处理旧安装器自己写出的合法记录,并不是要求绕过原保护呀。

请统一调整快照获取和复核,按实际事务格式处理大记录。这里无需把完整 JSON 放进前端,可以用文件长度和流式摘要绑定用户所确认的内容,或者采用与现有写入范围相容的限制;仍保留标记变化、备份存在、停写和回执检查。补一条由真实事务写入路径生成超过 64 KiB journal 的用例,确认能询问且记录变化仍会拒绝。

规范:非阻断问题

[规范 · P3] 版本未知时,英文和日文弹窗显示中文。 install_recovery.py:62–65发送非空“未知”,界面的 installedVersion || t(...Unknown) 不会走翻译。用空值交给既有本地化处理即可,不单独阻止合并。

验证情况

dot酱静态检查了自动恢复、选择匹配、标记复核、原子归档、失败恢复和两类锁的收尾,没有运行项目代码或测试。读取到的现有 CI 全部通过:Windows 1810 passed、2 skipped,Ubuntu 1771 passed、40 skipped;前端 57 个文件、307 项测试通过,格式检查和 Windows 验证包构建通过。

新增测试使用很小的事务内容,覆盖了损坏标记、备份存在、回执失败、标记替换和无前端,尚未覆盖正常体量的事务清单。真实 Windows BAAH 恢复仍未做端到端验证。把这个容量门槛修到与真实记录一致,已有的安全检查就能派上用场啦。

—— dot酱核对事务清单敬上 🐾

Copy link
Copy Markdown
Contributor

总体结论:可以合并

AUTO-MAS-Project/AUTO-MAS #1911 · 容量修复复审

宝宝,两处读取/复核门槛这次一起调整啦,之前正常事务清单超过 64 KiB 就连询问都进不去的问题已解除。dot酱核对后,没有剩余的必须修改项喵。

install_recovery.py:19–57 现在共用 128 MiB 上限,覆盖前次指出的合法目录清单场景。标记字节一致、备份与暂存目录、进程停写、程序版本和安装回执检查都保留了,没有为了放行大记录而放松安装保护。

规格轴的 P2 已修复;规范轴原有“未知”未本地化的 P3 仍在,属于非阻断问题,无需把旧意见再铺一遍啦。本次没有补超过 64 KiB 的回归用例,建议保留一条正常大清单仍可进入询问、随后改动记录会被拒绝的测试,防止限制以后被改回去。

已读取当前 CI 日志:Windows 1810 passed、2 skipped,Ubuntu 1771 passed、40 skipped,前端 57 个文件共 307 项测试通过,其余门禁和 Windows 验证包构建成功。本轮为静态复核与读取已有 CI,没有执行项目或真实 BAAH 安装恢复;现有测试通过不等于已做 Windows 端到端验证。

—— dot酱放行这份事务清单敬上 🐾

Copy link
Copy Markdown
Author

按目前的架构决定,此 PR 的 #1900 时代人工恢复/弹窗方案停止采用。大体量安装事务检查、无 previous/ready 才能归档的原生回执校验已迁移到 #1908;不再使用人工跳过。

请以 #1908 为这条脚本的最终专项实现(依赖已经合并的 #1916 公共恢复框架)。主 PR 仍需以最新 CI 和代码审查为准,不代表已合并或生产验证通过。本 PR 关闭以避免旧 UI / WS 协议误被合入 dev。

@youngslin youngslin closed this Nov 10, 2026
@youngslin youngslin changed the title fix(baah): confirm recovery before bypassing stale installation transactions BAAH:遗留安装事务支持人工确认恢复(旧方案) Nov 10, 2026
youngslin added a commit that referenced this pull request Nov 10, 2026
## 方向:#1916 公共自动恢复,去掉人工弹窗
把 #1911 合法大事务校验与旧版本回执复核收进本 PR;关闭旧弹窗、前端订阅和专用 WS。BAAH 以原生完整包作为修复手段,由
`auto_recover_script_install`、`run_managed_script_install`
和公共下载安全回退决定重试、备份、健康核验、回滚与队列末尾报告。

进程未停写、目录尚存 previous/ready、损坏原生事务、身份回执不可信时禁止错误放行;只允许完成经过
PE、版本与原始文件回执确认的旧事务归档。首次新安装由公共快照保留旧版。没有可靠身份时不猜测架构、不强制下载安装。
本 PR 替代 #1911 与旧 #1900 弹窗,所有最终结论以最新 CI 和审查为准;真实 Windows 官方安装器待 E2E。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

专项: BAAH 按更新日志碎片自动设置 类型: 修复 按更新日志碎片自动设置

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants