#!/usr/bin/env bash # TODO: support automatic levitation when the rebuild counts does not fit in the target. # TODO: support preflight checks where we detect the environment we are booted in (this requires the levitation to write a special file). # TODO: use colmena to know the target host and focus on the node name. set -Eeuo pipefail ssh_command=${SSH_COMMAND-ssh} root_prefix=${ROOT_PREFIX-/} reboot="reboot" case "$1" in "--no-reboot") unset reboot shift ;; "--fast") reboot="soft" shift ;; "--live") echo "Root prefix changed from $root_prefix to /mnt" root_prefix="/mnt" shift ;; esac target_host=$1 shift if [ -z "$target_host" ] ; then echo Usage: liminix-rebuild \[--no-reboot\] target-host params exit 1 fi if toplevel="$(nom-build $(colmena eval -E "{ nodes, ... }: nodes.$@.config.system.outputs.systemConfiguration" --instantiate))"; then echo systemConfiguration $toplevel aimed at $root_prefix sleep 3 min-copy-closure --root "$root_prefix" $target_host $toplevel $ssh_command $target_host "$root_prefix/$toplevel/bin/install" "$root_prefix" case "$reboot" in reboot) $ssh_command $target_host "sync; source /etc/profile; reboot" ;; soft) $ssh_command $target_host $toplevel/bin/restart-services ;; *) ;; esac else echo Rebuild failed fi