115 lines
2.8 KiB
Bash
Executable File
115 lines
2.8 KiB
Bash
Executable File
set -euo pipefail
|
|
|
|
usage() {
|
|
echo "Usage: $(basename "$0") [-n <flake name>] [-fqwx] <nixos-rebuild args...>
|
|
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
|