From 1087715a1b16522b38f601d44e112d77c7261fc3 Mon Sep 17 00:00:00 2001
From: clerie <git@clerie.de>
Date: Sun, 26 Feb 2023 22:32:26 +0100
Subject: [PATCH] hosts/_iso: add auto install script

---
 hosts/_iso/configuration.nix | 72 +++++++++++++++++++++++++++++++++++-
 1 file changed, 71 insertions(+), 1 deletion(-)

diff --git a/hosts/_iso/configuration.nix b/hosts/_iso/configuration.nix
index f2c62a5..937276a 100644
--- a/hosts/_iso/configuration.nix
+++ b/hosts/_iso/configuration.nix
@@ -1,10 +1,80 @@
 { pkgs, lib, modulesPath, ... }:
 
-{
+let
+  nixfiles-auto-install = pkgs.writeScriptBin "nixfiles-auto-install" ''
+    #!${pkgs.bash}/bin/bash
+    set -euo pipefail
+
+    hostname=host''${RANDOM}
+
+    echo "[I] Deploying with hostname ''${hostname}"
+
+    device=""
+    for dev in ("/dev/vda" "/dev/sda"); do
+      if [[ -b $dev ]]; then
+        device=$dev
+        break
+      fi
+    done
+
+    while [[ $# -gt 0 ]]; do
+      case $1 in
+        --hostname)
+          hostname=$2
+          shift
+          shift
+          ;;
+        *)
+          echo "unknown option: $1"
+          exit 1
+          ;;
+      esac
+    done
+
+    echo "[I] Formatting disk"
+
+    if [[ -z $device ]]; then
+      echo "[E] No device to install to"
+      exit 1
+    fi
+
+    echo "[I] Using ''${device}"
+
+    parted --script $device mklabel gpt
+    parted --script $device disk_set pmbr_boot on
+
+    parted --script $device mkpart boot 0% 512M
+    parted --script $device set 1 bios_grub on
+
+    parted --script $device mkpart root 512M 100%
+
+    echo "[I] Creating file system"
+
+    mkfs.ext4 -F ''${device}2
+
+    echo "[I] Mount file system"
+
+    mount ''${device}2 /mnt
+
+    echo "[I] Generate NixOS configuration"
+
+    nixfiles-generate-config --root /mnt --hostname ''${hostname}
+
+    sed -i "s/\# boot\.loader\.grub\.device = \"/dev/sda\";/boot\.loader\.grub\.device = \"''${device}\";/g" /mnt/etc/nixos/hosts/''${hostname}/configuration.nix
+
+    echo "[I] Install NixOS"
+
+    nixos-install --flake /mnt/etc/nixos#''${hostname} --root /mnt --no-root-password
+  '';
+in {
   imports = [
     (modulesPath + "/installer/cd-dvd/installation-cd-base.nix")
   ];
 
   networking.hostName = "isowo";
   isoImage.isoBaseName = "nixos-isowo";
+
+  environment.systemPackages = [
+    nixfiles-auto-install
+  ];
 }