Geräte-Agent für lokale Scan-Aufträge anlegen
This commit is contained in:
93
agents/fedeo-device-agent/src/main.ts
Normal file
93
agents/fedeo-device-agent/src/main.ts
Normal file
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env node
|
||||
import os from "node:os"
|
||||
import { FedeoApi } from "./api.js"
|
||||
import { loadConfig } from "./config.js"
|
||||
import { log } from "./logger.js"
|
||||
import { listPrinters } from "./print/cups.js"
|
||||
import { hasSane, listScanners, runScan } from "./scan/sane.js"
|
||||
|
||||
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
|
||||
|
||||
const stringifyError = (error: unknown) => {
|
||||
if (error instanceof Error) return error.message
|
||||
return String(error)
|
||||
}
|
||||
|
||||
const main = async () => {
|
||||
const config = loadConfig()
|
||||
const api = new FedeoApi(config)
|
||||
|
||||
log.info("FEDEO Geräte-Agent startet", {
|
||||
platform: process.platform,
|
||||
workDir: config.workDir,
|
||||
pollSeconds: config.pollSeconds,
|
||||
})
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
const scannerNames = await listScanners()
|
||||
const printerNames = await listPrinters()
|
||||
const scanAvailable = await hasSane()
|
||||
|
||||
const heartbeat = await api.heartbeat({
|
||||
capabilities: {
|
||||
scan: scanAvailable,
|
||||
print: printerNames.length > 0,
|
||||
platform: process.platform,
|
||||
},
|
||||
scannerNames,
|
||||
printerNames,
|
||||
debugInfo: {
|
||||
hostname: os.hostname(),
|
||||
release: os.release(),
|
||||
arch: os.arch(),
|
||||
node: process.version,
|
||||
uptimeSeconds: Math.round(os.uptime()),
|
||||
},
|
||||
})
|
||||
|
||||
if (heartbeat.pendingScanJobs > 0) {
|
||||
log.info(`${heartbeat.pendingScanJobs} Scan-Auftrag/Aufträge warten`)
|
||||
}
|
||||
|
||||
const next = await api.nextScanJob()
|
||||
if (!next.job) {
|
||||
await sleep(config.pollSeconds * 1000)
|
||||
continue
|
||||
}
|
||||
|
||||
log.info("Scan-Auftrag wird ausgeführt", {
|
||||
jobId: next.job.id,
|
||||
tenantId: next.job.tenantId,
|
||||
scannerName: next.job.scannerName || config.scannerName || "default",
|
||||
})
|
||||
|
||||
try {
|
||||
await api.updateScanJobStatus(next.job.id, "running")
|
||||
const scanResult = await runScan(config, next.job)
|
||||
await api.uploadScan(next.job.id, scanResult)
|
||||
|
||||
log.info("Scan-Auftrag abgeschlossen", {
|
||||
jobId: next.job.id,
|
||||
file: scanResult.filename,
|
||||
})
|
||||
} catch (error) {
|
||||
const message = stringifyError(error)
|
||||
log.error("Scan-Auftrag fehlgeschlagen", {
|
||||
jobId: next.job.id,
|
||||
message,
|
||||
})
|
||||
|
||||
await api.updateScanJobStatus(next.job.id, "failed", message)
|
||||
}
|
||||
} catch (error) {
|
||||
log.error("Agent-Schleife fehlgeschlagen", stringifyError(error))
|
||||
await sleep(config.pollSeconds * 1000)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
main().catch((error) => {
|
||||
log.error("Agent konnte nicht gestartet werden", stringifyError(error))
|
||||
process.exit(1)
|
||||
})
|
||||
Reference in New Issue
Block a user