#!/usr/bin/env bash set -euo pipefail readonly libexec_dir="${0%/*}" # a file with the disko config declare disko_config # mount was chosen as the default mode because it's less destructive mode=mount nix_args=() showUsage() { cat <&2 exit 1 } ## Main ## [[ $# -eq 0 ]] && { showUsage exit 1 } while [[ $# -gt 0 ]]; do case "$1" in --debug) set -x ;; -m | --mode) mode=$2 shift ;; -f | --flake) flake=$2 shift ;; --argstr | --arg) nix_args+=("$1" "$2" "$3") shift shift ;; -h | --help) showUsage exit 0 ;; --dry-run) dry_run=y ;; --root-mountpoint) nix_args+=(--argstr rootMountPoint "$2") shift ;; --no-deps) nix_args+=(--arg noDeps true) ;; --show-trace) nix_args+=("$1") ;; *) if [ -z ${disko_config+x} ]; then disko_config=$1 else showUsage exit 1 fi ;; esac shift done nixBuild() { if command -v nom-build > /dev/null; then nom-build "$@" else nix-build "$@" fi } if ! { [[ $mode = "format" ]] || [[ $mode = "mount" ]] || [[ $mode = "disko" ]] || [[ $mode = "create" ]] || [[ $mode = "zap_create_mount" ]] ; }; then abort "mode must be either format, mount or disko" fi if [[ -n "${flake+x}" ]]; then 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." echo "For example, to use the output diskoConfigurations.foo from the flake.nix, append \"#foo\" to the flake-uri." exit 1 fi if [[ -e "$flake" ]]; then flake=$(realpath "$flake") fi nix_args+=("--arg" "flake" "\"$flake\"") nix_args+=("--argstr" "flakeAttr" "$flakeAttr") nix_args+=(--extra-experimental-features flakes) elif [[ -n "${disko_config+x}" ]] && [[ -e "$disko_config" ]]; then nix_args+=("--arg" "diskoFile" "$disko_config") else abort "disko config must be an existing file or flake must be set" fi # The "--impure" is still pure, as the path is within the nix store. script=$(nixBuild "${libexec_dir}"/cli.nix \ --no-out-link \ --impure \ --argstr mode "$mode" \ "${nix_args[@]}" ) if [[ -n "${dry_run+x}" ]]; then echo "$script" else exec "$script" fi