/** * POST /api/print-agent/enroll (no session — called once by a fresh agent) * Body: { code, name?, hostname?, platform?, version? } * → { ok, agentId, token, name, clientId, orgId, instance, poll } * * The code comes from Settings → Printers → Print-Agent ("Enrolment-Code erzeugen"), is valid * 24 h and single-use. The token is returned exactly once; the agent stores it in * /etc/logship-print-agent/agent.env. */ import { enrollAgent } from '../../utils/printSpoolDb' import { rateLimit, clientIp, instanceOrigin } from '../../utils/printAgentAuth' export default defineEventHandler(async (event) => { if (!rateLimit('enroll:' + clientIp(event), 10, 60_000)) { setResponseStatus(event, 429) return { ok: false, message: 'too many enrolment attempts, try again in a minute' } } const body = await readBody(event).catch(() => ({})) || {} const code = String(body.code || '').trim() if (!code) { setResponseStatus(event, 400); return { ok: false, message: 'code is required' } } const res = enrollAgent(code, { name: body.name ? String(body.name).slice(0, 80) : undefined, hostname: body.hostname ? String(body.hostname).slice(0, 120) : undefined, platform: body.platform ? String(body.platform).slice(0, 120) : undefined, version: body.version ? String(body.version).slice(0, 40) : undefined }) if ('error' in res) { console.warn(`[print-agent] enrolment refused from ${clientIp(event)}: ${res.error}`) setResponseStatus(event, 403) return { ok: false, message: res.error } } const config: any = useRuntimeConfig() console.log(`[print-agent] enrolled agent #${res.agentId} "${res.name}" (client ${res.clientId}, org ${res.orgId}) from ${clientIp(event)}`) return { ok: true, agentId: res.agentId, token: res.token, name: res.name, clientId: res.clientId, orgId: res.orgId, instance: { name: config.public?.solutionname || 'LogShip', url: instanceOrigin(event) }, poll: { waitSeconds: 25, maxJobs: 50, heartbeatSeconds: 60, inlineFileLimit: 300 * 1024 } } })