94 lines
3.0 KiB
JavaScript
94 lines
3.0 KiB
JavaScript
#!/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)
|
|
})
|