#!/usr/bin/env bash set -euo pipefail showUsage() { cat <&2 exit 1 fi case $2 in format) diskoAttr=diskoScript ;; mount) diskoAttr=mountScript ;; *) echo "Invalid mode: $2" >&2 echo "Valid modes are: format, mount" >&2 exit 1 ;; esac mode=$2 shift ;; --extra-files) if [[ $# -lt 3 ]]; then echo "Option $1 requires two arguments: source, destination" >&2 exit 1 fi extraFiles[$2]=$3 shift shift ;; --option) if [[ $# -lt 3 ]]; then echo "Option $1 requires an argument" >&2 exit 1 fi nix_args+=(--option "$2" "$3") shift shift ;; --disk) if [[ $# -lt 3 ]]; then echo "Option $1 requires two arguments: disk_name, device_path" >&2 exit 1 fi # shellcheck disable=SC2034 diskMappings[$2]=$3 shift shift ;; *) echo "Unknown option: $1" >&2 showUsage exit 1 ;; esac shift done } cleanupMountPoint() { mountPoint=$1 if mountpoint -q "${mountPoint}"; then umount -R "${mountPoint}" fi rmdir "${mountPoint}" } main() { parseArgs "$@" if [[ -z ${flake-} ]]; then echo "Please specify the flake-uri with --flake to use for installation." >&2 exit 1 fi if [[ $flake =~ ^(.*)\#([^\#\"]*)$ ]]; then flake="${BASH_REMATCH[1]}" flakeAttr="${BASH_REMATCH[2]}" fi if [[ -z ${flakeAttr-} ]]; then echo "Please specify the name of the NixOS configuration to be installed, as a URI fragment in the flake-uri." >&2 echo 'For example, to use the output nixosConfigurations.foo from the flake.nix, append "#foo" to the flake-uri.' >&2 exit 1 fi mountPoint=$(mktemp -d) chmod 755 "${mountPoint}" # bchachefs wants 755 escapeMountPoint=$(printf '%q' "$mountPoint") # shellcheck disable=SC2064 trap "cleanupMountPoint ${escapeMountPoint}" EXIT IFS=$'\n' mapfile -t artifacts < <(nix-build "${libexec_dir}"/install-cli.nix \ "${nix_args[@]}" \ --no-out-link \ --impure \ --argstr flake "$flake" \ --argstr flakeAttr "$flakeAttr" \ --argstr rootMountPoint "$mountPoint" \ --arg writeEfiBootEntries "$writeEfiBootEntries" \ --arg diskMappings "$(serialiaseArrayToNix diskMappings)" \ -A installToplevel \ -A "$diskoAttr") nixos_system=${artifacts[0]} disko_script=${artifacts[1]} if [[ -n ${dry_run-} ]]; then echo "Would run: $disko_script" echo "Would run: nixos-install --system '$nixos_system' --root '$mountPoint'" exit 0 fi "$disko_script" for source in "${!extraFiles[@]}"; do destination=${extraFiles[$source]} mkdir -p "$mountPoint/$(dirname "$destination")" cp -ar "$source" "$mountPoint/$destination" done nixos-install --no-root-password --system "$nixos_system" --root "$mountPoint" } main "$@"