From 1ad92b7d32b872741b8f446bd19339f52a5bbf16 Mon Sep 17 00:00:00 2001 From: hheik <4469778+hheik@users.noreply.github.com> Date: Sat, 23 Sep 2023 20:23:00 +0300 Subject: [PATCH] Added build script --- .gitignore | 5 +++ build.sh | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100755 build.sh diff --git a/.gitignore b/.gitignore index 24920df..8994cb9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ hardware-configuration.nix + +# VM files +result +*.qcow2 + *.swp diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..9dc1681 --- /dev/null +++ b/build.sh @@ -0,0 +1,114 @@ +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