Files
DbusSmsForward/.hermes/plans/2026-04-24_192822-dbussmsforward-debian-status-and-checklist.md

14 KiB
Raw Permalink Blame History

DbusSmsForward Debian 重构状态报告与下一步落地清单

For Hermes: Use subagent-driven-development skill to implement this plan task-by-task.

Goal: 基于当前仓库实际状态,给出一份 Debian-first 的真实重构进度报告,并列出后续最小可落地的执行清单,避免再把方向带回 OpenWRT。

Architecture: 当前仓库处于双轨状态:保留 C# Worker 主线,同时新增 Python 重构线。Python 线已经形成可测试的运行时核心,但 Web 管理层和 Debian 交付闭环尚未完成;C# 线则有 Debian 友好的部分配置改造,但还不是完整的 Web 化交付形态。

Tech Stack: Python 3.11、unittest、CLI runtime、ModemManager/DBus 抽象、C# .NET 8 Worker、Systemd-oriented configuration


一、结论摘要

1. 当前方向应明确为 Debian-first

本项目当前应围绕:

  • Debian 运行
  • ModemManager/DBus 短信接收
  • Web 管理
  • 不要求在 Debian 目标机上编译源码

不应再把“下一步推进目标”描述为 OpenWRT 部署。

2. 当前重构不是没进展,但也还没到 Debian Web 成品

仓库里的 Python 重构线已经完成了“核心运行层”的大量工作:

  • 配置模型
  • 短信来源抽象
  • 文件源/ModemManager 源
  • sender 分发
  • AutmanPush 错误结构化
  • 轮询、去重、fetch issue 统计
  • CLI 基本闭环
  • 自动化测试覆盖

Debian Web 管理版本身尚未完成,因为还缺:

  • HTTP 服务入口
  • Web API
  • 前端页面
  • 配置读写 API
  • 状态 API
  • systemd/service 交付文件
  • Debian 部署说明与目录规范

3. C# 主线仍存在,但并非当前可直接交付的 Debian Web 版本

C# 线保留了较多历史功能与 Debian 友好的配置思路,但从当前文件状态看,它仍然是 Worker 应用,不是完整 Web 项目,且存在引用类与当前可见文件状态不完全一致的问题,因此不适合作为“已完成的 Debian Web 版”来对外描述。


二、实际检查到的仓库状态

仓库路径:/Users/chick/.Hermes/workspace/DbusSmsForward

目录结构观察

  • C# 主线目录:DbusTest/
  • Python 重构目录:src/dbussmsforward/
  • Python 测试目录:tests/
  • READMEREADME.md

粗略文件数量

  • DbusTest/ 文件数:35
  • src/dbussmsforward/ 文件数:14
  • tests/ 文件数:9

这说明仓库现在不是“只剩一个新实现”,而是明确的双轨并存状态。


三、Python 重构线:已完成内容

1. 配置模型已成型

已检查文件:

  • src/dbussmsforward/config.py

已具备:

  • DaemonConfig
  • ForwardingConfig
  • AutmanPushConfig
  • SmsSourceConfig
  • NotificationChannels
  • AppConfig
  • legacy appSettings/appsettings 到新模型的兼容映射

说明:Python 线已经不是零散脚本,而是具备明确配置边界的可持续实现。

2. 短信源抽象已成型

已检查文件:

  • src/dbussmsforward/source.py

已具备:

  • FileSmsSource
  • ModemManagerSmsSource
  • PythonDbusModemManagerProxy
  • FetchIssue

说明:

  • modemmanager source 是 Debian-first 能力,不是 OpenWRT 专属。
  • 当前 Python 线已经具备在 Debian + ModemManager 环境继续推进的正确技术基础。

3. 通知分发核心已成型

已检查文件:

  • src/dbussmsforward/notifications.py
  • src/dbussmsforward/app.py

已具备:

  • console sender
  • AutmanPush sender
  • DispatchOutcome
  • SenderDispatchResult
  • sender 级别失败记录
  • HTTP/timeout/network/unknown 分类
  • HTTP 响应片段摘录
  • partial success 保留
  • dedupe
  • 轮询统计
  • fetch issue 聚合

4. CLI 基本闭环已经存在

已检查文件:

  • src/dbussmsforward/cli.py

当前命令:

  • run
  • send
  • validate-config
  • print-sample-config

说明:

  • 这已经满足“核心运行原型”的最低闭环。
  • 但还不是 Web 管理闭环。

四、Python 重构线:验证状态

1. CLI 测试

命令:

PYTHONPATH=src python3 -m unittest tests.test_cli -v

结果:10/10 通过

2. 运行时流程测试

命令:

PYTHONPATH=src python3 -m unittest tests.test_runtime_flow -v

结果:16/16 通过

3. 配置模型测试

命令:

PYTHONPATH=src python3 -m unittest tests.test_config_model -v

结果:4/4 通过

4. 关于“全量测试”口径的注意事项

如果直接运行:

python3 -m unittest discover -s tests -v

会失败,原因不是测试逻辑本身坏了,而是当前仓库还没有把 PYTHONPATH=src 或等价安装流程固化到默认测试入口里,导致:

  • test_config_model
  • test_runtime_flow 在 discover 模式下导入 dbussmsforward 失败

这说明:

  • 测试内容本身大体可用
  • 但仓库级测试入口还没标准化

这属于 Debian 交付前必须补齐的一环。


五、C# 主线:当前真实状态

1. 仍是 Worker,不是 Web 项目

已检查文件:

  • DbusTest/DbusSmsForward.csproj

当前项目 SDK

<Project Sdk="Microsoft.NET.Sdk.Worker">

说明:

  • 这不是 Microsoft.NET.Sdk.Web
  • 当前 C# 主线不能被称为“已完成 Web 化”

2. 有 Debian 友好的配置痕迹

已检查文件:

  • DbusTest/Helper/ConfigHelper.cs

确认存在:

  • /etc/dbussmsforward/appsettings.json 的优先加载路径
  • DBUSSMSFORWARD_CONFIG_PATH 环境变量支持
  • SaveOptions / LoadOptions
  • 旧配置与新配置转换

说明:

  • C# 线并非完全无效,已经有面向 Debian 服务运行的配置设计。
  • 但这只是“服务化/配置化能力”,不是完整 Web 管理版。

3. Program.cs 依赖的若干类当前未直接看到实现文件

DbusTest/Program.cs 中可见引用:

  • SampleConfigFactory
  • LegacyConfigurationBridge
  • CommandLineConfigurationApplier
  • ConfigurationValidator

但本轮目录巡检中未直接发现对应文件,说明至少有以下一种情况:

  • 文件缺失
  • 尚未提交完整
  • 放在当前未显式识别的位置
  • 或重构过程中断过

因此,当前不应把 C# 主线描述为“已稳定可构建的 Debian Web 版”。

4. README 仍是旧交付叙事

已检查文件:

  • README.md

当前 README 仍主要描述:

  • 直接运行旧二进制
  • -fE/-fP/-fW/... 旧参数模式
  • Native AOT 交叉编译

没有覆盖:

  • Python 重构线的运行方式
  • Debian-first Web 管理目标
  • 统一部署方式
  • systemd 落地方式

这意味着:

  • 仓库文档叙事仍停留在旧时代
  • 这会持续误导后续判断与交付方向

六、当前最准确的项目分层判断

已完成层

  1. Python 核心配置模型
  2. Python 短信源抽象(含 ModemManager
  3. Python 通知分发运行时
  4. Python CLI 基本闭环
  5. 单元/流程级测试覆盖的大部分核心行为

半完成层

  1. C# Debian 服务化配置思路
  2. legacy -> 新配置兼容桥接思路
  3. 多通知渠道的旧实现保留

明显未完成层

  1. Debian Web API
  2. Debian Web 前端
  3. Web 管理配置读写
  4. 服务状态查看接口
  5. 消息查看/发送 API
  6. systemd/service 交付物
  7. Debian 安装/升级/目录规范
  8. 统一测试入口
  9. README/部署文档重写

七、建议的方向收敛

建议主路线

以 Python 线作为 Debian-first 主实现继续推进。

原因:

  1. Python 线目前已经具备可测试、可迭代的核心运行时
  2. 已有 ModemManager 抽象,技术方向与 Debian 目标一致
  3. 当前 Web 化缺口更适合作为 Python 层增量补齐
  4. C# 线当前更适合做“参考/兼容来源”,不适合作为当前主交付叙事

C# 线建议定位

短期内将 C# 线定义为:

  • 历史主线
  • 兼容配置与行为参考来源
  • 功能映射对照对象

而不是当前 Debian Web 交付主线。


八、下一步落地清单(按优先级排序)

下面这份清单按“最小可落地 Debian Web 版”来排,不再发散。

阶段 0:先把工程入口和叙事统一(高优先级,半天内可做)

Task 0.1:补统一测试入口

Objective: 让仓库级测试命令不依赖手工写 PYTHONPATH=src

Files:

  • Create: pyproject.tomlpytest.ini / tox.ini(择一)
  • Optionally modify: README.md

Expected outcome: 以下命令之一可直接工作:

python3 -m unittest discover -s tests -v

python3 -m pytest -q

Task 0.2:补 Python 运行入口说明

Objective: 把当前 Python 线的实际运行方式写清楚

Files:

  • Modify: README.md

Must include:

  • Python CLI 启动方式
  • PYTHONPATH/安装方式
  • validate-config / run / send
  • file source 与 modemmanager source 的示例配置

Task 0.3:明确仓库主线状态说明

Objective: 在 README 顶部写明当前仓库是 C# 历史主线 + Python Debian 重构线并存

Files:

  • Modify: README.md

Must include:

  • 当前推荐继续投入的是 Python Debian-first 线
  • C# 线主要用于兼容参考,不宣称已完成 Web 化

阶段 1:补最小 Debian Web API(最高业务优先级)

Task 1.1:新增 Web 服务入口模块

Objective: 在 Python 线增加最小 HTTP 服务,而不破坏 CLI

Files:

  • Create: src/dbussmsforward/web.py
  • Modify: src/dbussmsforward/cli.py
  • Modify: src/dbussmsforward/config.py

API baseline:

  • GET /api/health
  • GET /api/system/status
  • GET /api/settings
  • POST /api/settings
  • POST /api/sms/send

Task 1.2:补 Web 层测试

Files:

  • Create: tests/test_web.py

Validation:

  • 健康检查返回 200
  • 设置读取/写入生效
  • send API 能触发 dispatcher
  • 错误配置返回结构化 4xx

Task 1.3:定义配置文件持久化位置

Objective: 对齐 Debian 运行约定

Files:

  • Modify: src/dbussmsforward/cli.py
  • Modify: src/dbussmsforward/web.py
  • Create: appsettings.example.json

Recommended path order:

  1. --config
  2. DBUSSMSFORWARD_CONFIG_PATH
  3. /etc/dbussmsforward/appsettings.json
  4. 项目内默认示例路径

阶段 2:补最小前端管理页(次高优先级)

Task 2.1:加纯静态前端

Files:

  • Create: wwwroot/index.html
  • Create: wwwroot/app.js
  • Create: wwwroot/app.css

UI minimum scope:

  • 当前运行状态
  • 当前配置查看
  • 基础配置编辑保存
  • 手工发送短信/测试通知

Task 2.2:把前端挂到 Web 服务

Files:

  • Modify: src/dbussmsforward/web.py

Validation:

  • 浏览器可直接打开管理页
  • 前端能调用 settings / status / send

阶段 3:补 Debian 部署闭环

Task 3.1:新增 systemd service 文件

Files:

  • Create: deploy/dbussmsforward.service

Must include:

  • Environment=DBUSSMSFORWARD_CONFIG_PATH=/etc/dbussmsforward/appsettings.json
  • WorkingDirectory=/opt/dbussmsforward
  • ExecStart= 指向 Python 启动方式或打包后的启动方式
  • Restart=always

Task 3.2:新增 Debian 部署说明

Files:

  • Modify: README.md
  • Optionally create: docs/debian-deploy.md

Must include:

  • 依赖安装
  • 目录布局
  • 配置文件位置
  • systemd 安装与启动
  • 日志查看方式
  • 升级步骤

Task 3.3:明确“不在 Debian 目标机编译”的交付方式

推荐选项二选一:

  1. Python wheel / source bundle + venv 安装
  2. 打包好的独立运行目录(含依赖)

建议优先: Python venv + requirements/pip install 方案,先求稳。


阶段 4:补运维与可观察性

Task 4.1:统一日志输出格式

Files:

  • Modify: src/dbussmsforward/cli.py
  • Modify: src/dbussmsforward/app.py
  • Modify: src/dbussmsforward/web.py

Need:

  • 标准 INFO/WARN/ERROR
  • sender failure / fetch issue 结构化输出
  • Web API 错误统一 JSON

Task 4.2:补状态页指标

API suggested:

  • 最近一次 poll 时间
  • 最近 dispatch failures 数量
  • 最近 fetch issues
  • 启用的通知渠道
  • 当前 source kind

Task 4.3:补消息历史持久化(可选)

这项不是第一阶段必须,但如果要做 Web 查看“最近短信”,就需要:

  • SQLite 或轻量 JSONL 存储
  • 最近 N 条消息与失败记录查询

建议放到 Web API 稳定之后再做。


九、推荐执行顺序(最务实版本)

最小 4 步路线

  1. 统一测试入口 + README 重写
  2. 补 Python Web API 最小闭环
  3. 补静态前端最小页面
  4. 补 systemd + Debian 部署说明

这样完成后,项目才能第一次比较诚实地对外说:

已具备 Debian-first 的可运行 Web 管理版本雏形。


十、风险与注意事项

风险 1:双轨并存会继续制造误判

如果不尽快在 README 和目录说明里明确:

  • 哪条线是当前主线
  • 哪条线只是历史参考

后续任何人都可能再次把方向带偏。

风险 2:测试入口不统一会导致“看起来坏了”

目前 unittest discover 直接跑会误报导入失败,这会让人误以为 Python 重构质量不稳定。

风险 3:如果先补太多高级功能,会拖慢最小交付

比如:

  • 历史消息数据库
  • 权限系统
  • 多用户管理
  • 完整前端框架重构

这些都不该排在 Debian 最小可交付之前。


十一、最终建议

推荐的下一动作

直接进入:

Phase 0 + Phase 1

  • 统一测试入口
  • 重写 README 的 Debian-first 叙事
  • 增加最小 Web API

这是最短路径,也最能避免继续空转。

不建议的动作

  • 继续把目标描述为 OpenWRT 部署
  • 先做复杂前端重构
  • 先追求完整数据库历史功能
  • 继续把 C# Worker 当成当前 Web 主交付线

十二、执行准备说明

如果下一步进入实现,建议采用以下节奏:

  1. 先修测试入口与 README
  2. 再加 web.pytests/test_web.py
  3. API 稳定后再加 wwwroot/
  4. 最后补 deploy/dbussmsforward.service

这样每一步都可验证,也不会再跑偏。