#!/bin/bash # 在 dsh.service 离线窗口内执行 spliced-id 修复,并用**生产真读路径**验收。 # # 为什么需要这个 driver: # - repair 脚本的 `--apply` 要写 ~/.dsh/sessions,而 pi 会话自身跑在 # Landlock 沙箱里(只允许写工作区 + /tmp),所以必须由 systemd-run # 起的临时单元来做写盘。 # - 停 dsh.service **不会**杀掉执行者:pi 会话跑在 pi-mail-bridge.service 下 # (两个独立单元),这一点是实测确认的,不是推断。 # - 脚本自检走 `sessionFormatCatalog.createRestore`(解码器口径), # 与 dsh 桥实际用的 `JsonlSessionPersistence.open` 不是同一条路。 # 所以验收一律以 verify-mail-sessions-readable.mjs 为准。 set -uo pipefail cd /home/program/agentmail STAMP=$(date +%Y%m%d-%H%M%S) LOG=".tmp/repair-apply-$STAMP.log" exec > >(tee "$LOG") 2>&1 echo "### BEGIN $(date -Is)" echo "### 执行者 cgroup: $(cat /proc/self/cgroup)" echo "### dsh 处理前: $(systemctl is-active dsh.service)" echo; echo "### [1/5] 停 dsh.service(会话日志单写者,必须离线)" systemctl stop dsh.service sleep 2 echo "dsh 处理后: $(systemctl is-active dsh.service)" echo; echo "### [2/5] 修复前:生产真读路径基线" node scripts/verify-mail-sessions-readable.mjs --only session.jsonl.zstd | tail -6 echo; echo "### [3/5] --apply 写盘" node scripts/repair-legacy-spliced-ids.mjs --only session.jsonl.zstd --apply 2>&1 | tail -25 echo; echo "### [4/5] 修复后:生产真读路径验收" node scripts/verify-mail-sessions-readable.mjs --only session.jsonl.zstd > .tmp/verify-after-$STAMP.log 2>&1 AFTER_RC=$? tail -6 .tmp/verify-after-$STAMP.log echo "verify 退出码: $AFTER_RC" echo; echo "### [5/5] 起 dsh.service" systemctl start dsh.service sleep 6 echo "dsh: $(systemctl is-active dsh.service) dsh-lan: $(systemctl is-active dsh-lan.service)" echo; echo "### 残留检查(应为 0):" echo " .repair-staged: $(find /root/.dsh/sessions -name '*.repair-staged' | wc -l)" echo " .bak-*: $(find /root/.dsh/sessions -name '*.bak-*' | wc -l)" echo "### END $(date -Is)" echo "### LOG: $LOG"