From 847da1cdf5d163a7deaa757a14218990923ed236 Mon Sep 17 00:00:00 2001 From: Kevin L'Hereec Date: Mon, 1 Jun 2026 12:07:07 +0200 Subject: [PATCH] feat: per-device TR-069 SOAP trace logging - Tr069TraceService: in-memory Map O(1) lookup, Promise-queue per device for sequential file writes, 10MB rotation (5 files kept) - config/tr069-trace.json: persisted list of traced devices (atomic write) - CwmpLoggerMiddleware: buffers request+response, writes to device log file after next() once ctx.cwmpDeviceId is set by controller - CwmpController: sets ctx.cwmpDeviceId on all code paths (Inform + others) - StateMachineManager: getHashIdForRemote() for non-Inform messages - REST API: GET/POST/DELETE /api/v1/tr069-trace - UI: Tr069Trace Vue page with device search, add/remove tracing - 8 new unit tests (192 total, all passing) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .gitignore | 1 + .serena/.gitignore | 2 + .serena/memories/project_overview.md | 1 + .serena/memories/style_and_conventions.md | 1 + .serena/memories/suggested_commands.md | 12 + .serena/memories/task_completion.md | 1 + .serena/project.yml | 154 ++++++++++ adonisrc.ts | 16 +- app/controllers/cwmp_controller.ts | 59 +++- app/controllers/pages_controller.ts | 18 +- app/controllers/tr069_trace_controller.ts | 55 ++++ app/middleware/cwmp_logger_middleware.ts | 54 ++-- app/services/cwmp/state_machine_manager.ts | 41 ++- app/services/tr069_trace_service.ts | 134 +++++++++ config/tr069-trace.json | 3 + inertia/components/TitleBar.vue | 5 +- inertia/layouts/MainLayout.vue | 44 ++- inertia/locales/en.json | 8 +- inertia/locales/fr.json | 8 +- inertia/pages/Tr069Trace.vue | 282 ++++++++++++++++++ start/routes.ts | 80 ++--- .../unit/services/tr069_trace_service.spec.ts | 148 +++++++++ types/cwmp_context.ts | 7 + 23 files changed, 1024 insertions(+), 110 deletions(-) create mode 100644 .serena/.gitignore create mode 100644 .serena/memories/project_overview.md create mode 100644 .serena/memories/style_and_conventions.md create mode 100644 .serena/memories/suggested_commands.md create mode 100644 .serena/memories/task_completion.md create mode 100644 .serena/project.yml create mode 100644 app/controllers/tr069_trace_controller.ts create mode 100644 app/services/tr069_trace_service.ts create mode 100644 config/tr069-trace.json create mode 100644 inertia/pages/Tr069Trace.vue create mode 100644 tests/unit/services/tr069_trace_service.spec.ts create mode 100644 types/cwmp_context.ts diff --git a/.gitignore b/.gitignore index dd7579a..3ec2506 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Dependencies and AdonisJS build node_modules build +logs tmp/* !tmp/.gitkeep diff --git a/.serena/.gitignore b/.serena/.gitignore new file mode 100644 index 0000000..2e510af --- /dev/null +++ b/.serena/.gitignore @@ -0,0 +1,2 @@ +/cache +/project.local.yml diff --git a/.serena/memories/project_overview.md b/.serena/memories/project_overview.md new file mode 100644 index 0000000..9c1d1f6 --- /dev/null +++ b/.serena/memories/project_overview.md @@ -0,0 +1 @@ +ADAM ACS is a TR-069 Auto-Configuration Server built with AdonisJS + TypeScript on the backend and Vue 3 + Inertia on the frontend. It manages devices, commands, configurations, firmware catalog flows, and CWMP/TR-069 SOAP handling. Main server code lives in app/, routes in start/routes.ts, frontend pages in inertia/pages/, shared localization in inertia/locales/, tests in tests/unit, tests/functional, tests/integration, and tests/property. Mongo-backed models live under app/models with domain objects under app/domain. \ No newline at end of file diff --git a/.serena/memories/style_and_conventions.md b/.serena/memories/style_and_conventions.md new file mode 100644 index 0000000..ba21f32 --- /dev/null +++ b/.serena/memories/style_and_conventions.md @@ -0,0 +1 @@ +Codebase uses TypeScript/ESM with .js import extensions in source files. Prefer strong typing, small service/controller methods, and existing AdonisJS patterns such as lazy controller imports in routes and class-based middleware/controllers. Frontend uses Vue 3