Files
adam-acs/app/controllers/tr069_trace_controller.ts
T
Kevin L'HereecandCopilot 847da1cdf5 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>
2026-06-01 12:07:07 +02:00

56 lines
1.8 KiB
TypeScript

import type { HttpContext } from '@adonisjs/core/http'
import logger from '@adonisjs/core/services/logger'
import DeviceModel from '#models/device'
import { Tr069TraceService } from '#services/tr069_trace_service'
export default class Tr069TraceController {
private get service(): Tr069TraceService {
return Tr069TraceService.getInstance()
}
async index({ response }: HttpContext) {
return response.status(200).json({ entries: this.service.list() })
}
async store({ request, response }: HttpContext) {
const deviceId = request.input('deviceId') as string | undefined
if (!deviceId) {
return response.status(422).json({ error: 'deviceId is required' })
}
if (this.service.isTraced(deviceId)) {
return response.status(409).json({ error: 'Device is already being traced' })
}
const record = await DeviceModel.findByIdentifier(deviceId)
if (!record) {
return response.status(404).json({ error: `Device ${deviceId} not found` })
}
await this.service.addDevice({
deviceId,
manufacturer: record.deviceId?.manufacturer ?? '',
oui: record.deviceId?.oui ?? '',
productClass: record.deviceId?.productClass ?? '',
serialNumber: record.deviceId?.serialNumber ?? '',
})
logger.info({ deviceId }, 'TR-069 trace enabled for device')
const entry = this.service.list().find((traceEntry) => traceEntry.deviceId === deviceId)
return response.status(201).json({ entry })
}
async destroy({ params, response }: HttpContext) {
const removed = await this.service.removeDevice(params.id)
if (!removed) {
return response.status(404).json({ error: `Device ${params.id} is not being traced` })
}
logger.info({ deviceId: params.id }, 'TR-069 trace disabled for device')
return response.status(204).send('')
}
}