Add read-only MG4 ADB status collector

This commit is contained in:
2026-07-31 19:17:43 +02:00
parent 4970fda1b5
commit 3e3e0010d6
16 changed files with 411 additions and 20 deletions
+19 -2
View File
@@ -1,5 +1,6 @@
import { resolve } from "node:path";
import { z } from "zod";
import type { AdbConfig } from "./adb.js";
const booleanFromString = z
.enum(["true", "false"])
@@ -15,7 +16,11 @@ const schema = z.object({
COOKIE_SECURE: booleanFromString,
ALLOWED_ORIGINS: z.string().default("http://mg4pi.local:8787"),
UPDATE_STATUS_PATH: z.string().default("/var/lib/pi-car-companion/update-status.json"),
VERSION_FILE: z.string().default(resolve("REVISION"))
VERSION_FILE: z.string().default(resolve("REVISION")),
ADB_ENABLED: booleanFromString,
ADB_PATH: z.string().min(1).default("adb"),
ADB_SERIAL: z.string().max(128).regex(/^[a-zA-Z0-9._:-]*$/).default(""),
ADB_TIMEOUT_MS: z.coerce.number().int().min(500).max(15_000).default(3_000)
});
export type AppConfig = {
@@ -28,6 +33,7 @@ export type AppConfig = {
allowedOrigins: ReadonlySet<string>;
updateStatusPath: string;
versionFile: string;
adb: AdbConfig;
};
export function loadConfig(environment: NodeJS.ProcessEnv = process.env): AppConfig {
@@ -43,6 +49,11 @@ export function loadConfig(environment: NodeJS.ProcessEnv = process.env): AppCon
allowedOrigins.add("http://127.0.0.1:5173");
}
const adbSerial = parsed.ADB_SERIAL.trim() || null;
if (parsed.ADB_ENABLED && !adbSerial) {
throw new Error("ADB_SERIAL is required when ADB_ENABLED=true");
}
return {
nodeEnv: parsed.NODE_ENV,
host: parsed.HOST,
@@ -52,6 +63,12 @@ export function loadConfig(environment: NodeJS.ProcessEnv = process.env): AppCon
cookieSecure: parsed.COOKIE_SECURE,
allowedOrigins,
updateStatusPath: parsed.UPDATE_STATUS_PATH,
versionFile: parsed.VERSION_FILE
versionFile: parsed.VERSION_FILE,
adb: {
enabled: parsed.ADB_ENABLED,
executable: parsed.ADB_PATH,
serial: adbSerial,
timeoutMs: parsed.ADB_TIMEOUT_MS
}
};
}