set -euo pipefail usage() { echo "Usage: $(basename "$0") [-n ] [-fqwx] This script is a wrapper around nixos-rebuild, designed to simplify applying configurations and testing in vm. Requires super-user privileges. examples: $(basename "$0") -n nixos switch - switch configuration to flake named nixos $(basename "$0") -f switch - switch configuration and don't ask confirmation $(basename "$0") -fwx - build a fresh vm image and run it -f Don't ask for confirmation about deleting the /etc/nixos directory. -n name Flake name. Defaults to your hostname. -q Don't output messages from this script. -w Wipes the vm disk file before running qemu, has no effect if not using the -x option. Building the vm after making changes to configs lead to errors without this. -x Run the vm automatically after build. This implies 'build-vm' argument. Also forwards host port 2222 to quest port 22." 1>&2 exit 1 } log() { if [ "$quiet" != true ]; then echo "[$(basename "$0")] $@" fi } die() { echo "$@" exit 1 } [ "$#" -eq 0 ] && usage original_dir="$(realpath ./)" source_dir="$(realpath "$(dirname "$0")")" name="$(hostname)" wipe_vm="" execute_vm="" force="" quiet="" while getopts ":n::fqwx" o; do case "${o}" in n) name="$OPTARG" ;; f) force=true ;; q) quiet=true ;; w) wipe_vm=true ;; x) execute_vm=true ;; *) usage ;; esac done shift $((OPTIND-1)) if [ ! -d "$source_dir" ]; then die "$source_dir is not a directory" fi dest_dir="/etc/nixos" if [ "$(realpath "$dest_dir")" != "$(realpath "$source_dir")" ]; then if [ "$force" != true ]; then confirm="n" read -p "This will remove your /etc/nixos directory! Do you want to proceed? (y/n) " confirm case "$confirm" in y) ;; *) die "aborting...";; esac fi log "Clearing /etc/nixos" rm -rf "$dest_dir" log "Copying $source_dir to $dest_dir" cp -r "$source_dir" "$dest_dir" cd "$dest_dir" || exit 1 else log "WARNING: It's recommended to clone this repo somewhere else than $dest_dir" fi sed -Ei 's;^(hardware-configuration.nix)$;#\1;' .gitignore [ ! -f 'hardware-configuration.nix' ] && log "Adding hardware-configuration.nix" && nixos-generate-config --show-hardware-config > hardware-configuration.nix git add hardware-configuration.nix cd "$original_dir" || exit 1 if [ "$execute_vm" = true ]; then # Run the vm and forward ports [ "$wipe_vm" = true ] && rm -f *.qcow2 log "Running: nixos-rebuild --flake \"$dest_dir/#${name}\" $@ build-vm && QEMU_NET_OPTS=\"hostfwd=tcp::2222-:22\" ./result/bin/run-${name}-vm" nixos-rebuild --flake "$dest_dir/#${name}" "$@" build-vm && QEMU_NET_OPTS="hostfwd=tcp::2222-:22" ./result/bin/run-${name}-vm else log "Running: nixos-rebuild --flake \"$dest_dir/#${name}\" $@" nixos-rebuild --flake "$dest_dir/#${name}" "$@" fi