Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

fake_acs

用于单台 CPE 深度联调的 TR-069 / CWMP ACS 模拟器。统一 ACS 常驻监听 9090,设备周期 Inform 与参数读取、配置、诊断、重启等主动操作共用同一个会话队列;设备日志文件由独立的 9000 服务接收。

当前项目适合实验室协议联调和单设备 TR-069 功能验证,不是生产级、多租户或完整标准认证 ACS。

快速启动

环境要求:Python 3.11+。Windows 时区转换依赖 tzdata,请统一安装项目依赖:

python -m pip install -r requirements.txt

双击根目录的 start_simulator.bat。它只打开一个 Web 控制台窗口;统一平台会同时启动 9090 ACS 和 9000 日志接收,不再额外打开日志观察 CMD。监听状态在页面顶部查看,收到的文件和完整 HTTP 请求在“上传捕获”页查看。

首次启动会从 acs_local_config.example.json 创建本机专用的 acs_local_config.json。请先把其中的 ACS 对外地址和 CPE Connection Request 地址改为实际局域网地址;本机配置不会提交到 Git。

也可以手工运行:

python web_acs.py

服务地址:

服务 默认地址
Web 控制台 http://127.0.0.1:5000
CPE ACS 地址 http://<本机地址>:9090/acs
日志上传 http://<本机地址>:9000/log-upload
Download 文件服务 http://<本机地址>:8001

端口可在 acs_local_config.json 修改,修改后需要重启。

页面使用

监控工作台

默认页只突出参数树和交互日志:

  • 参数树刷新时保留已展开节点和滚动位置。
  • 交互日志最新记录在最上方,点击记录查看完整 SOAP;刷新时保留已展开详情和内部滚动位置。
  • 顶部保留读取参数、设置单参数、Ping 三个高频快捷入口。
  • “清空交互日志”有二次确认,只删除结构化交互记录。

参数工具页包含 3 个相互独立的视图:

  • “完整参数树”累计合并历史采集结果。
  • “最近一次探测”只保留本次 GPN/GPV 结果,便于定位失败位置。
  • “V1.7 能力矩阵”对照 206 个参数、26 个对象和 17 个 RPC。矩阵支持按状态、分组和关键词过滤;“未验证”不会显示为通过,规范权限或类型与设备证据不一致时显示为“冲突”。

能力矩阵只汇总 Profile、GPN/GPV 和 GetRPCMethods 证据,不保存或显示参数值。敏感参数仅展示“敏感参数”约束,不显示实际内容。

设备操作

左侧选择任务,中间只显示该任务需要的字段,下面显示该任务最近状态、结果、Fault 和关联事件。主要任务包括:

分类 任务
参数与采集 单参数读取、递归参数树、设备信息、累计流量、上下行速率、LAN 口速率、CPU/内存、RSRP、动态下联终端
配置 单参数设置、NTP、Wi-Fi、MAC 白名单、告警阈值、日志上报
远程管理 管理概览、ACS 接入、周期上报、连接请求认证、升级托管、UDP Connection Request、STUN、动态可管理设备
诊断 Ping、TraceRoute
协议与对象 GetRPCMethods、Get/SetParameterAttributes、Add/DeleteObject、RequestDownload
传输与控制 Upload、Download、Reboot、FactoryReset

每个任务都可以先点击“预览 RPC”。预览只生成 XML,不会启动服务、排队或唤醒设备。Reboot 必须输入 REBOOT,Download 必须输入 DOWNLOAD,提交时还会再次确认。

远程管理操作按职责拆分。配置 ACS 接入时不会夹带周期、Connection Request、升级或 STUN 参数;关闭 STUN 时只下发关闭开关。密码会进入实际下发 SOAP,但 RPC 预览、任务 metadata 和结构化交互存储统一显示为 <redacted>

兼容工具

旧版固定场景保留在“兼容工具”页,只用于历史流程回归和排障。旧 ACS 场景与统一 ACS 都使用 9090,因此统一服务运行时不能启动旧 ACS 场景。

任务执行流程

普通读取:

queued -> sent -> GetParameterValuesResponse -> completed

配置任务会自动回读:

SetParameterValues -> SetParameterValuesResponse
-> reading_back -> GetParameterValues -> completed / failed

诊断和控制任务:

Ping/TraceRoute -> waiting_event -> 8 DIAGNOSTICS COMPLETE -> 结果回读
Reboot          -> waiting_event -> 1 BOOT -> completed
Download        -> waiting_transfer -> TransferComplete -> completed / failed

同一设备可以连续执行多次 Ping 或 TraceRoute。每次 Event 8 只关联当前等待的诊断任务,不再受历史任务记录影响。TraceRoute 会自动读取状态、发现 RouteHops. 动态实例并读取所有跳点。

设备已在 Inform 中提供 ManagementServer.ConnectionRequestURL 时,任务提交后会尝试异步唤醒设备;没有该地址时,任务保留在队列中等待下一次 Inform。

普通读取、参数探测和幂等配置遇到暂态 Fault 时会在后续合法 CWMP 会话中按 5s -> 10s -> 20s 方式有上限退避,默认最多尝试 3 次。永久 Fault 立即失败;Upload、Download、Reboot、FactoryReset、AddObject 和 DeleteObject 等有副作用 RPC 不自动重试,避免设备已执行但响应异常时重复操作。重试等待中的任务不会阻塞同一设备的其他任务。

主动 RPC、诊断完成事件、BOOT 和 TransferComplete 都有独立 UTC deadline,默认分别为 60 秒、300 秒、300 秒和 3600 秒。后台监控会把超时任务明确标记为 rpc_response_timeoutdiagnostic_event_timeoutboot_event_timeouttransfer_complete_timeout,只清理对应根任务。服务重启时,仍可仅凭持久化状态恢复的等待任务会继续使用原 deadline;无法安全重建 XML 的 queued/sent/in-progress 任务会明确失败,不会留在页面上永久等待。

TLS 与认证

本地 TLS 模拟环境

双击 start_tls_lab.bat 可在不影响默认 HTTP 服务的情况下启动一套独立 HTTPS 环境:ACS 使用 9443,日志上传使用 9444,文件下载使用 9445。首次启动会在 runtime/tls/t12/ 生成本地测试 CA、服务端证书、私钥和隔离配置;这些文件不会进入 Git 或发布包。

服务端证书的 SAN 包含 192.168.8.197127.0.0.1localhost。设备测试前,需要把 runtime/tls/t12/ca.crt.pem 安装为设备信任 CA,再把 ACS 地址改为 https://192.168.8.197:9443/acs。当前实验环境默认不要求客户端证书,即验证单向 TLS;HTTP Digest 仍可配置在 TLS 通道内使用。

统一平台从 configs/default.json 加载非敏感安全配置。密码不要写入该文件,使用环境变量传给启动进程:

用途 环境变量
CPE 访问 ACS 认证 FAKE_ACS_ACS_AUTH_MODEFAKE_ACS_ACS_USERNAMEFAKE_ACS_ACS_PASSWORD
ACS 访问 CPE Connection Request FAKE_ACS_CONNECTION_REQUEST_AUTH_MODEFAKE_ACS_CONNECTION_REQUEST_USERNAMEFAKE_ACS_CONNECTION_REQUEST_PASSWORD
上传/下载文件服务认证 FAKE_ACS_FILE_AUTH_MODEFAKE_ACS_FILE_USERNAMEFAKE_ACS_FILE_PASSWORD
TLS FAKE_ACS_TLS_ENABLEDFAKE_ACS_TLS_CERTFILEFAKE_ACS_TLS_KEYFILEFAKE_ACS_TLS_CAFILEFAKE_ACS_TLS_MINIMUM_VERSION

认证模式支持 nonebasicdigest。启用 TLS 后,9090 ACS、9000 上传和 8001 下载三个监听都会切换为 HTTPS;证书或私钥无效会阻止平台启动,不会静默退回 HTTP。最低版本支持 TLSv1_2TLSv1_3;需要双向 TLS 时再设置 FAKE_ACS_TLS_REQUIRE_CLIENT_CERTIFICATE=true 并提供 CA 文件。

CPE 偶尔会错误发送已废弃且方向不合法的 HoldRequests。平台会在 events.jsonl 中记录 invalid_cpe_hold_requests,但为兼容 easycwmp 不会据此暂停任务或断开 Inform。

测试报告覆盖边界

平台可直接驱动或记录:注册 Inform、周期配置/校验、分类参数采集、动态终端实例、Ping、TraceRoute、MAC/NTP/Wi-Fi/告警/日志配置、ALARM、日志文件上传、Reboot 和 Download/TransferComplete。

当前已建立独立的 V1.7、V3 和 compatible 参数 Profile。V1.7 覆盖 206 个叶子和 26 个对象,V3 覆盖 150 个叶子和 20 个对象;路径、类型、读写属性、约束、敏感标记、动态实例规则和兼容别名均由共享 Registry 管理。参数读取和递归树探测不会隐式创建实例;只有 Profile 标记为可创建的平台管理对象才执行标准 AddObject -> SPV -> GPV 流程。

所有普通配置均执行三道检查:Profile 权限校验、设备 GPN Writable=1 校验、SPV 后 GPV 回读比较。非敏感参数缺失或不一致会失败;密码等敏感参数只在进程内比较,落盘结果仅保留 <redacted> 和匹配标志。远程管理和 LAN 合规工具还包含 TR-098/TR-181 管理根探测、LAN/Hosts 动态遍历、ParameterKey 预期 9008 及非法 LAN 实例预期 9005 检查。

当前代码已具备 Get/SetParameterAttributes、通用对象事务、GetRPCMethods、Upload/RequestDownload/FactoryReset、标准 SOAP 1.1 Fault、TLS、HTTP Basic/Digest、暂态 Fault 有上限退避、异常会话超时恢复以及 V1.7/V3/compatible 三种 Profile。干净发布包 smoke,以及单台真实 CPE 的 HTTP 控制/传输和 HTTPS Inform/GPV 验收均已通过;RequestDownload 仍缺少设备主动触发证据。它仍不是完整认证级 ACS。本项目明确只精做单设备,不以同 NAT 多设备隔离作为完成门槛。

许可证

本项目采用 MIT License

以下结果必须配合真实 CPE 和网络人工确认:

  • MAC 白名单是否真的阻断或允许下联终端。
  • NTP 是否真实同步、Wi-Fi 是否确实不可开启。
  • CPU、内存、流量、速率、RSRP 是否与设备管理页面一致。
  • 下联终端实际接入情况、日志内容完整性和网络诊断结果合理性。
  • Reboot/Download 后设备的真实运行状态。

运行数据路径

内容 路径
结构化交互 runtime/state/interactions.jsonl
平台事件 runtime/state/events.jsonl
任务索引 runtime/state/indexes/acs_tasks.json
参数树结果 runtime/state/parameter_result.json
GPN/GPV 能力证据 runtime/state/indexes/runtime_capabilities.json
ACS 原始报文 runtime/captures/acs/
日志上传原始请求 runtime/captures/upload/
日志上传文件内容 runtime/captures/upload_body/
旧场景日志 runtime/logs/

设备上传的原始 filename 保留在 .http 请求中,文件内容使用 UUID 文件名保存。工作台的“清空交互日志”只删除结构化交互;“清空全部历史”经过两次确认后,会短暂停止服务并删除参数树、最近探测、交互、任务、会话、告警、Fault、能力证据、上传捕获和旧场景业务日志,然后恢复清理前正在运行的服务。

全部历史重置不会删除 acs_local_config.jsonconfigs/runtime/downloads/runtime/screenshots/runtime/logs/web_console*.log。Web 控制台日志由当前进程占用并作为启动故障证据保留,需要打包或手工清理时先关闭整个模拟器。

打包

双击 package_simulator.bat 即可在 dist/ 生成 ZIP。脚本使用 Python 标准库,不依赖 WinRAR 或 7-Zip,也不会读取正在使用的 runtime/ 文件,因此模拟器运行时也可以打包。

发布包采用明确白名单,只包含运行所需源码、页面、默认配置和启动工具。它不会包含 acs_local_config.jsonruntime/messages/analysis/.codex/、测试文件、日志、HTTP 抓包、证书私钥或旧压缩包。

发布前可在命令行执行以下隔离 smoke;它会复制源码到临时目录并自动选择空闲端口,不影响当前运行的服务:

start_simulator.bat --smoke

在页面点击“停止平台”会停止 ACS、日志上传和下载服务,但保留 Web 控制台。要停止整个模拟器,在 fake_acs Web Console 窗口按 Ctrl+C,等待进程退出后再关闭窗口。

启动失败时先查看 fake_acs Web Console 窗口中的明确错误;常见原因是 Python/依赖缺失或端口被占用。隔离 smoke 会直接打印失败的服务和端口。平台运行记录保存在 runtime/logs/,完整 HTTP 报文保存在 runtime/captures/

About

Single-device TR-069 (CWMP) ACS simulator for CPE development and compliance testing.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages