summaryrefslogtreecommitdiffstats
path: root/disko
diff options
context:
space:
mode:
Diffstat (limited to 'disko')
-rwxr-xr-xdisko125
1 files changed, 125 insertions, 0 deletions
diff --git a/disko b/disko
new file mode 100755
index 0000000..7e4f0bf
--- /dev/null
+++ b/disko
@@ -0,0 +1,125 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+readonly libexec_dir="${0%/*}"
+
+# a file with the disko config
+declare disko_config
+
+# a flake uri, if present disko config is relative to the flake root
+declare from_flake
+
+# mount was chosen as the default mode because it's less destructive
+mode=mount
+nix_args=()
+
+showUsage() {
+ cat <<USAGE
+Usage: $0 [options] disk-config.nix
+or $0 [options] --flake github:somebody/somewhere
+
+Options:
+
+* -m, --mode mode
+ set the mode, either create or mount
+* -f, --flake uri
+ fetch the disko config relative to this flake's root
+* --arg name value
+ pass value to nix-build. can be used to set disk-names for example
+* --argstr name value
+ pass value to nix-build as string
+* --dry-run
+ just show the path to the script instead of running it
+* --debug
+ run with set -x
+USAGE
+}
+
+abort() {
+ echo "aborted: $*" >&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
+ ;;
+ --help)
+ showUsage
+ exit 0
+ ;;
+ --dry-run)
+ dry_run=y
+ ;;
+ --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
+
+if ! ([[ $mode = "create" ]] || [[ $mode = "mount" ]] || [[ $mode = "zap_create_mount" ]]); then
+ abort "mode must be either create, mount or zap_create_mount"
+fi
+
+if [[ ! -z "${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
+ nix_args+=("--arg" "flake" "$flake")
+ nix_args+=("--argstr" "flakeAttr" "$flakeAttr")
+ nix_args+=(--extra-experimental-features flakes)
+elif [[ ! -z "${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
+
+script=$(nix-build "${libexec_dir}"/cli.nix \
+ --no-out-link \
+ --argstr mode "$mode" \
+ "${nix_args[@]}"
+)
+if [[ ! -z "${dry_run+x}" ]]; then
+ echo "$script"
+else
+ exec "$script"
+fi