- 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>
56 lines
1.8 KiB
TypeScript
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('')
|
|
}
|
|
}
|