From e6a363a331987703e577ff1e0382cac328adb994 Mon Sep 17 00:00:00 2001 From: anntnzrb Date: Wed, 4 Feb 2026 22:55:09 -0500 Subject: [PATCH] feat(generators): replace deprecated The project no longer relies on nixos-generators for virtual images, so the badge is misleading. fix(system): prefer special format handlers Ensure formats like iso and docker use their module-backed builders even when image variants exist. --- README.md | 1 - snowfall-lib/system/default.nix | 8 +- snowfall-lib/system/nixos-generate.nix | 192 +++++++++++++++++++++++++ 3 files changed, 196 insertions(+), 5 deletions(-) create mode 100644 snowfall-lib/system/nixos-generate.nix diff --git a/README.md b/README.md index 9202980..d9d3a0f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ Nix Flakes Ready Linux Ready macOS Ready - Generators Ready Ask DeepWiki

diff --git a/snowfall-lib/system/default.nix b/snowfall-lib/system/default.nix index 7a78d07..b815a23 100644 --- a/snowfall-lib/system/default.nix +++ b/snowfall-lib/system/default.nix @@ -17,6 +17,9 @@ let ; virtual-systems = import ./virtual-systems.nix; + nixos-generate = import ./nixos-generate.nix { + inherit core-inputs; + }; user-systems-root = snowfall-lib.fs.get-snowfall-file "systems"; user-modules-root = snowfall-lib.fs.get-snowfall-file "modules"; @@ -139,10 +142,7 @@ in virtual-system-type = get-virtual-system-type target; virtual-system-builder = args: - assert assertMsg ( - user-inputs ? nixos-generators - ) "In order to create virtual systems, you must include `nixos-generators` as a flake input."; - user-inputs.nixos-generators.nixosGenerate ( + nixos-generate ( args // { format = virtual-system-type; diff --git a/snowfall-lib/system/nixos-generate.nix b/snowfall-lib/system/nixos-generate.nix new file mode 100644 index 0000000..9f7cff4 --- /dev/null +++ b/snowfall-lib/system/nixos-generate.nix @@ -0,0 +1,192 @@ +{ core-inputs }: +args@{ + format, + modules ? [ ], + ... +}: +let + lib = core-inputs.nixpkgs.lib; + nixosModulesPath = core-inputs.nixpkgs + "/nixos/modules"; + + nixosArgs = builtins.removeAttrs args [ "format" ]; + + mkSystem = + extraModules: + lib.nixosSystem ( + nixosArgs + // { + modules = modules ++ extraModules; + } + ); + + mkBuild = extraModules: (mkSystem extraModules).config.system.build; + + getImages = + config: + assert lib.assertMsg ( + config.system.build ? images + ) "Virtual system images require nixpkgs with system.build.images (NixOS 25.05+)."; + config.system.build.images; + + imageVariants = { + amazon = "amazon"; + azure = "azure"; + cloudstack = "cloudstack"; + do = "digital-ocean"; + gce = "google-compute"; + hyperv = "hyperv"; + iso = "iso"; + kexec = "kexec"; + kubevirt = "kubevirt"; + lxc = "lxc"; + lxc-metadata = "lxc-metadata"; + openstack = "openstack"; + proxmox = "proxmox"; + proxmox-lxc = "proxmox-lxc"; + qcow = "qemu"; + qcow-efi = "qemu-efi"; + raw = "raw"; + raw-efi = "raw-efi"; + sd-aarch64 = "sd-card"; + sd-x86_64 = "sd-card"; + vagrant-virtualbox = "vagrant-virtualbox"; + virtualbox = "virtualbox"; + vmware = "vmware"; + }; + + getImageVariant = + variant: + let + config = (mkSystem [ ]).config; + images = getImages config; + in + assert lib.assertMsg (lib.hasAttr variant images) + "Virtual system format '${variant}' is not available in this nixpkgs."; + images.${variant}; + + dockerModule = + { lib, ... }: + { + imports = [ "${nixosModulesPath}/virtualisation/docker-image.nix" ]; + + boot.loader.grub.enable = lib.mkForce false; + boot.loader.systemd-boot.enable = lib.mkForce false; + services.journald.console = "/dev/console"; + }; + + vmModule = + { lib, ... }: + { + imports = [ "${nixosModulesPath}/virtualisation/qemu-vm.nix" ]; + virtualisation.diskSize = lib.mkDefault (2 * 1024); + }; + + vmBootloaderModule = + { ... }: + { + imports = [ vmModule ]; + virtualisation.useBootLoader = true; + }; + + vmNoGuiModule = + { pkgs, ... }: + let + resize = pkgs.writeScriptBin "resize" '' + if [ -e /dev/tty ]; then + old=$(stty -g) + stty raw -echo min 0 time 5 + printf '\033[18t' > /dev/tty + IFS=';t' read -r _ rows cols _ < /dev/tty + stty "$old" + stty cols "$cols" rows "$rows" + fi + ''; + in + { + imports = [ vmModule ]; + virtualisation.graphics = false; + virtualisation.qemu.options = [ "-serial mon:stdio" ]; + + environment.systemPackages = [ resize ]; + environment.loginShellInit = "${resize}/bin/resize"; + }; + + isoModule = + { ... }: + { + imports = [ "${nixosModulesPath}/installer/cd-dvd/iso-image.nix" ]; + + isoImage.makeEfiBootable = true; + isoImage.makeUsbBootable = true; + }; + + installIsoModule = + { lib, ... }: + { + imports = [ "${nixosModulesPath}/installer/cd-dvd/installation-cd-base.nix" ]; + + systemd.services.wpa_supplicant.wantedBy = lib.mkForce [ "multi-user.target" ]; + systemd.services.sshd.wantedBy = lib.mkForce [ "multi-user.target" ]; + }; + + installIsoHypervModule = + { lib, ... }: + { + imports = [ installIsoModule ]; + + systemd.services.wpa_supplicant.wantedBy = lib.mkOverride 40 [ ]; + virtualisation.hypervGuest.enable = true; + }; + + sdAarch64InstallerModule = + { ... }: + { + imports = [ "${nixosModulesPath}/installer/sd-card/sd-image-aarch64-installer.nix" ]; + }; + + kexecBundleModule = + { pkgs, config, ... }: + let + kexecTarballPath = "${config.system.build.kexecTarball}/${config.image.filePath}"; + selfExtract = pkgs.writeTextFile { + executable = true; + name = "kexec-nixos"; + text = '' + #!/bin/sh + set -eu + ARCHIVE=`awk '/^__ARCHIVE_BELOW__/ { print NR + 1; exit 0; }' $0` + + tail -n+$ARCHIVE $0 | tar xJ -C / + /kexec_nixos + + exit 1 + + __ARCHIVE_BELOW__ + ''; + }; + in + { + imports = [ "${nixosModulesPath}/installer/netboot/netboot-minimal.nix" ]; + + system.build.kexec_bundle = pkgs.runCommand "kexec_bundle" { } '' + cat ${selfExtract} ${kexecTarballPath} > $out + chmod +x $out + ''; + }; + + specialHandlers = { + docker = (mkBuild [ dockerModule ]).tarball; + vm = (mkBuild [ vmModule ]).vm; + vm-bootloader = (mkBuild [ vmBootloaderModule ]).vm; + vm-nogui = (mkBuild [ vmNoGuiModule ]).vm; + iso = (mkBuild [ isoModule ]).isoImage; + install-iso = (mkBuild [ installIsoModule ]).isoImage; + install-iso-hyperv = (mkBuild [ installIsoHypervModule ]).isoImage; + sd-aarch64-installer = (mkBuild [ sdAarch64InstallerModule ]).sdImage; + kexec-bundle = (mkBuild [ kexecBundleModule ]).kexec_bundle; + }; + + imageHandlers = lib.mapAttrs (_: variant: getImageVariant variant) imageVariants; + formatHandlers = imageHandlers // specialHandlers; +in +formatHandlers.${format} or (throw "Unsupported virtual system format '${format}'.")