Profile sind deklarative Schritte je Distributionsfamilie; der Adapter übersetzt sie in ein idempotentes Shell-Skript. Ein neuer Adapter (rhel, alpine) ist eine Datei und ein Eintrag in der Registry. Variablen werden typisiert geprüft, in run-Schritten jeder Wert für die Shell gequotet. SSH-Härtung läuft zuletzt, damit sich eine Provisionierung per SSH nicht selbst aussperrt. Geprüft mit shellcheck und echt in Containern (Debian 12/13, Ubuntu 22.04/24.04/26.04) inklusive zweitem Lauf. Dabei aufgefallen: frische Images haben keine Paketlisten – der Vorspann macht jetzt apt-get update. Closes #005 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
43 lines
1.6 KiB
TypeScript
43 lines
1.6 KiB
TypeScript
/**
|
||
* Rendert Profile für eine Distribution auf stdout – zum Ansehen und für die Integrationsprüfung
|
||
* in einem Container: `pnpm exec tsx scripts/profil-rendern.ts debian-13 base,docker server=zbx.local`
|
||
*/
|
||
import { adapterFuer } from "@/engine/adapter";
|
||
import { katalogLaden } from "@/engine/katalog/laden";
|
||
import { profileAufloesen } from "@/engine/profile/aufloesen";
|
||
import { profileRendern } from "@/engine/profile/rendern";
|
||
|
||
const [distroId = "debian-13", auswahl = "base", ...zuweisungen] = process.argv.slice(2);
|
||
const katalog = await katalogLaden("catalog");
|
||
const distro = katalog.distributionen.find((d) => d.eintrag.id === distroId)?.eintrag;
|
||
if (!distro) throw new Error(`Unbekannte Distribution ${distroId}`);
|
||
const profile = new Map(katalog.profile.map((p) => [p.eintrag.id, p.eintrag]));
|
||
const eingaben: Record<string, Record<string, string>> = {};
|
||
for (const z of zuweisungen) {
|
||
const [name, wert] = z.split("=");
|
||
for (const p of profile.values())
|
||
if (p.variables.some((v) => v.name === name)) (eingaben[p.id] ??= {})[name!] = wert!;
|
||
}
|
||
const aufloesung = profileAufloesen(auswahl.split(","), profile, distro.family, eingaben);
|
||
if (!aufloesung.ok) {
|
||
console.error(aufloesung.fehler);
|
||
process.exit(1);
|
||
}
|
||
const adapter = adapterFuer(distro.family)!;
|
||
const { skript } = profileRendern(
|
||
aufloesung.profile,
|
||
adapter,
|
||
{
|
||
os: distro.os,
|
||
gast: { name: "testgast", benutzer: "florian" },
|
||
},
|
||
[
|
||
adapter.benutzerAnlegen({
|
||
name: "florian",
|
||
sshSchluessel: ["ssh-ed25519 AAAAtest florian@test"],
|
||
sudo: true,
|
||
}),
|
||
],
|
||
);
|
||
process.stdout.write(skript);
|