import { mkdir, mkdtemp } from "node:fs/promises"; import { tmpdir } from "node:os"; import path from "node:path"; import { cwd } from "node:process"; import { Alpine } from "./alpine.js"; import { execFile } from "./helpers/better-api.js"; import { sudoChownToRunningUser } from "./helpers/sudo.js"; import { setupKernel } from "./kernel.js"; import { runQemu } from "./qemu.js"; import { Runit } from "./runit/index.js"; { 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 Alpine.makeWorld({ dir: rootfsDir }); const runit = await Runit.setup(alpine); const kernel = await setupKernel(alpine, kernelDir); const squashfs = path.join(artifactsDir, "image.squashfs"); await execFile("sudo", [ "mksquashfs", alpine.dir, squashfs, "-comp", "zstd", "-Xcompression-level", "3", "-noappend", "-quiet", ]); await sudoChownToRunningUser(squashfs); console.timeEnd("Building"); runQemu(squashfs, kernel, { graphic: true }); // await makeService({ // parentDir: rootfsDir, // name: "grafana", // packages: ["grafana"], // setup: async (dir) => {}, // initScript: async (dir) => {}, // }); // try { // await spawn("sudo", ["chroot", rootfsDir], { stdio: "inherit" }); // } catch {} } // interface Service {} // async function makeService({ // parentDir, // name, // packages, // setup, // initScript: _initScript, // }: { // parentDir: string; // name: string; // packages?: string[]; // setup: (dir: string) => Promise; // initScript: (dir: string) => Promise; // }) { // const rootsDir = path.join(parentDir, "/nulo/roots/"); // await mkdir(rootsDir, { recursive: true }); // const alpine = await Alpine.makeWorld({ // dir: path.join(rootsDir, name), // packages, // }); // await setup(alpine.dir); // // const initScript = await _initScript(rootfsDir); // }