2 Commits
Author SHA1 Message Date
liuzhuohua 8303fa3359 fix(update): 更新前自动备份以 drouter 身份跑时写不进备份目录
真机报错:更新功能「备份失败,已中止更新」——
[Errno 13] Permission denied: /opt/drouter/backups/xxx.part。

根因:/opt/drouter/backups 是 root:root drwxr-xr-x,而「更新前备份」这条链
由 drouter-web(drouter 用户)spawn drouter-backupd.py --run-now,backupd 的
call() 用 subprocess 直接跑 helper、没提权 → helper 继承 drouter 身份 →
写备份包 .part 被拒。定时器那条链是 root 跑的,所以平时备份正常,
只有「更新触发的备份」踩雷。

修法:backupd 的 call() 里 helper 调用加 sudo -n 前缀。sudoers 已放行
drouter 免密跑 helper 白名单,root(定时器)/ drouter(更新)两种身份都通。

判据:t-update.py 新增「backupd call() 用 sudo -n 提权」(查命令数组语义),
t-update-inject.py 加对应反向验证注入(34 例 0 异常)。
真机验收:sudo -u drouter backupd --run-now → BK_CREATED files=21 size=23767。
2026-10-10 16:29:19 +08:00
liuzhuohua b7ca9c89e8 feat(i18n/layout): 全站中英双语 + 四轮排版修复收官 + 修 boot_id 重启检测
v1.0.10 两件大事:

1. 界面中英双语(英文界面无中文残留)
   - 新增 web/i18n.js(约 4200 条词条),零依赖零构建
   - 后端下发中文数据走 bt4() 查表翻译;独立模块(upstream/netdetail/
     realtime/update)纳入翻译并注册切语言重绘钩子
   - 后端「状态/聚合」接口只回稳定枚举+原始数值,不下发中文文案
   - 顺带修一个真实 XSS:顶层 const 不挂 window,独立脚本 esc 静默退化成零转义

2. 修掉「文字竖着排/错位」(多分辨率反复暴露)
   - 单元格 min-content 只有 1 字宽 → word-break:keep-all + 表头 nowrap
   - 依赖卡片正文被标签/按钮挤成 27px → .dep-body{flex:1 1 200px} + flex-wrap
   - 裸 flex:1(下限为0)给正文 → 一律改 flex:1 1 <px>
   - .dep-item 横向容器直接塞块级子项 → 退回块级
   - 关键陷阱:auto-fill 布局屏越宽列数越多单卡越窄,窄屏反而测不出来,
     真机审计推进到「逐视图点按钮 + 1920/2560 宽视口 + 中英双语」
   - 守卫 t-layout.py 扩到 35 条,12 处反向验证全红

3. 修真缺陷:_link_since() 重启检测被误改成 if False:(注释还写着「已修」),
   uptime 归零后相减得负数 → 恢复比对 boot_id

附带:新增 25 个检查器(t-*.py)、排版审计工具链(shot-*/ocr-*/live-*)、
版本号兜底值同步到 1.0.10、.gitignore 收纳 i18n/排版排查的一次性脚本。
2026-10-10 04:50:32 +08:00