54 lines
1.3 KiB
Bash
54 lines
1.3 KiB
Bash
|
#!/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
|