From f3cc7bda8646d7343195b1e31baee7155bc44906 Mon Sep 17 00:00:00 2001 From: Ryan Lahfa Date: Sun, 8 Dec 2024 23:45:51 +0100 Subject: [PATCH] feat(scripts/liminix): add a basic liminix rebuild This script requires manual efforts on the operator end not to fuck up too hard. This adds min-copy-closure and min-garbage-collect to the development shell. Signed-off-by: Ryan Lahfa --- default.nix | 4 +++ scripts/liminix-rebuild.sh | 53 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100755 scripts/liminix-rebuild.sh diff --git a/default.nix b/default.nix index 2041484..5294372 100644 --- a/default.nix +++ b/default.nix @@ -116,6 +116,10 @@ in pkgs.freeradius pkgs.picocom # for serial access + # Daemon-less copy closure for Liminix systems. + (pkgs.callPackage (sources.liminix + "/pkgs/min-copy-closure") { nix = pkgs.lix; }) + # Daemon-less garbage collection for Liminix systems. + (pkgs.callPackage (sources.liminix + "/pkgs/min-collect-garbage") { nix = pkgs.lix; }) (pkgs.callPackage ./lib/colmena { colmena = pkgs.callPackage "${sources.colmena}/package.nix" { }; }) diff --git a/scripts/liminix-rebuild.sh b/scripts/liminix-rebuild.sh new file mode 100755 index 0000000..5dd9c2b --- /dev/null +++ b/scripts/liminix-rebuild.sh @@ -0,0 +1,53 @@ +#!/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