#! /usr/bin/env sh set -e base_dir="$(git rev-parse --show-toplevel)" user="$USER" set_hosts="" branch="main" direct=false while [ "$#" -ne 0 ]; do case "$1" in --user) shift 1 user="$1" ;; --host) shift 1 set_hosts="$set_hosts $1" ;; --hosts) shift 1 if [ -n "$set_hosts" ]; then echo "Warning: --hosts overrides --host" fi set_hosts="$1" ;; --branch) shift 1 branch="$1" ;; --direct) direct=true ;; *) echo "Arg '$1' not known." exit 2 ;; esac shift 1 done hosts="${set_hosts-"server2 server3"}" echo "update_hosts.sh --user '$user' --hosts '$hosts' --branch '$branch' --direct '$direct'" for host in $hosts; do echo "Updating '$user@$host.vhack.eu' ..." printf "Deploying remote side script ..\n" scp "$base_dir/scripts/update_hosts.remote" "$user@$host.vhack.eu:update_host.remote" flake_path="" if [ "$direct" = true ]; then printf "Deploying git config ..\n" flake_path="path:$(git archive --format=tar.gz HEAD | ssh "$user@$host.vhack.eu" \ 'flake_path=$(mktemp -d -t update_hosts_XXXXX); cd $flake_path && tar -xz; echo $flake_path')" fi tmp="$(mktemp -d -t "server_build_script_XXXXX")" trap 'rm -r "$tmp"' EXIT if [ "$direct" = true ]; then git archive --format=tar.gz HEAD | { cd "$tmp" tar -xz } else git clone "git.foss-syndicate.org" --branch="$branch" "$tmp" fi cd "$tmp" printf "Copying closure ..\n" nix copy --substitute-on-destination --to "ssh://$user@$host.vhack.eu" ".#nixosConfigurations.$host.config.system.build.toplevel" printf "Executing remote side script ..\n" ssh -t "$user@$host.vhack.eu" "chmod +x update_host.remote; ./update_host.remote '$branch' '$flake_path'" done # Give the servers some time to reboot sleep 5 ping_hosts.sh "$user" "$hosts" # vim: ft=sh