refactor: 砍掉非刚需功能,修若干静默失败,新增 Sub-Store 模块

订阅的聚合、改名、筛选交给 Sub-Store 承担,脚本收窄为「管内核 + 管服务 +
生成一份最小可用配置」。1579 → 1542 行,但配置相关的多行 YAML 手术全部消失。

砍掉:
- 入站端口 listeners 全套、多订阅与订阅管理菜单、GEO 菜单、地区分组、
  局域网开关、备份还原菜单、URL 导入;管理接口那项改成只读显示密钥
- 配置菜单从 11 项减到 5 项,剩下的 YAML 改写只有顶层单键

修:
- ERR trap 在写操作里其实是失效的: `func || true` 会关掉整个函数体的
  errexit 且无法在内部恢复。所以改为逐条显式检查,并给所有写操作补
  require_root —— die 的 exit 是当前唯一还能可靠中止的机制
- cfg_set 用 sed 替换会损坏数据: 替换文本里 & 代表整条匹配,值含 & 时
  旧行会被塞进新值;| 和 \ 还会被改写成 &。改用 awk 整行重建,值走
  环境变量传入(-v 会解释转义序列,吃掉反斜杠)
- 订阅地址含 # 时会被正则截断,导致列表与改写的计数口径不一致、改错行、
  静默丢订阅。改用 awk 取最后一个标记位置来切
- cfg_backup 的 cp 失败仍返回 0 并吐出不存在的路径,让「改坏了就还原」
  整条链路空转
- do_update 里 install 失败被吞掉,然后拿旧二进制启动并报升级成功
- svc_state 的 list-unit-files|grep -q 撞 SIGPIPE + pipefail,装了也判为未装
- svc_enabled 对 disabled 单元输出两行
- latest_version 缺 --max-time,网络被挂住时菜单无限等
- 向导端口输错直接 die 掉整个菜单;重启失败没有任何提示

新增 Sub-Store(可选,不进一键安装):
- 原生 Node + systemd,装到 /opt/sub-store;不替你装 Node,只检测并给命令
- 更新走和内核升级同款闸门: node --check 验后端、unzip -t 验前端,
  备份 → 换上 → 起服务,起不来自动回滚
- 后端 API 无鉴权,随机路径就是唯一凭据,故默认绑 127.0.0.1 并打印 SSH 隧道命令
- 卸载 mihomo 不连带删除它,订阅数据在里面

验证: 三场景 × 9 项严格回归(保留 set -Eeuo pipefail 和 ERR trap)全过;
三种规则模式生成的配置用 PyYAML 解析通过;含 # 的订阅地址往返无损;
cfg_set 对 & | \ 五种输入均原样写入;两个 Sub-Store 资产地址经 API 确认存在。
This commit is contained in:
2026-08-09 22:22:18 +08:00
parent ce8623ccb9
commit c9b410c65e
2 changed files with 463 additions and 535 deletions
+434 -471
View File
File diff suppressed because it is too large Load Diff