import { mkdir, mkdtemp } from "node:fs/promises"; import { tmpdir } from "node:os"; import path from "node:path"; import { cwd, exit } from "node:process"; import { Alpine } from "./alpine.js"; import { generateForgejoSecretsFile } from "./services/forgejo/secrets.js"; import { generateGrafanaSecretsFile } from "./services/grafana/secrets.js"; import { execFile } from "./helpers/better-api.js"; import { setupKernel } from "./kernel.js"; import { runQemu } from "./qemu.js"; import { Runit } from "./runit/index.js"; import { installFluentBit } from "./software/fluentbit"; import { setupForgejo } from "./services/forgejo/index.js"; import { setupDhcpcd } from "./services/dhcpcd.js"; import { setupNtpsec } from "./services/ntpsec.js"; import { setupGrafana } from "./services/grafana/index.js"; import { setupLoki } from "./services/loki/index.js"; import { generatePasswdSecretsFile } from "./passwd.js"; if (process.argv[2] === "generate-secrets") { await generateForgejoSecretsFile(); await generateGrafanaSecretsFile(); await generatePasswdSecretsFile(); exit(0); } async function timed(fn: () => Promise): Promise { console.time(fn.toString()); const r = await fn(); console.timeEnd(fn.toString()); return r; } { console.time("Building"); const artifactsDir = path.join(cwd(), "artifacts/"); const kernelDir = path.join(artifactsDir, "kernel"); await mkdir(artifactsDir, { recursive: true }); await mkdir(kernelDir, { recursive: true }); const rootfsDir = await mkdtemp(path.join(tmpdir(), "define-alpine-")); console.debug(rootfsDir); const alpine = await timed(() => Alpine.makeWorld({ dir: rootfsDir })); await alpine.addPackages(["helix", "htop", "iproute2-ss", "socat"]); await alpine.writeFile( "/root/.ash_history", ` socat tcp-listen:80,reuseaddr,fork tcp:localhost:3050 & `, { uid: 0, gid: 0 } ); await alpine.fstab.addMount("/dev/sda /persist ext4 defaults 0 0"); await timed(() => installFluentBit(alpine)); const runit = await timed(() => Runit.setup(alpine)); await timed(() => setupDhcpcd(alpine, runit)); await timed(() => setupNtpsec(alpine, runit)); await timed(() => setupForgejo(alpine, runit)); await timed(() => setupLoki(alpine, runit)); await timed(() => setupGrafana(alpine, runit)); const kernel = await timed(() => setupKernel(alpine, kernelDir)); await timed(() => alpine.actuallyInstallPackages()); const squashfs = path.join(artifactsDir, "image.squashfs"); await timed(() => execFile("mksquashfs", [ alpine.dir, squashfs, "-root-mode", "755", "-comp", "zstd", "-Xcompression-level", "1", "-noappend", "-quiet", ]) ); console.timeEnd("Building"); // runQemu(squashfs, kernel, { graphic: true }); }