Files
nix/home/modules/deploy/colmena-wrapper.bash
T

69 lines
1.7 KiB
Bash

# `colmena` wrapper script that opens a short-lived SSH master process for
# `colmena` to use so it works with hardware-backed key touch+PIN. assumes
# ControlPath ~/.ssh/control/%C (see ../ssh/default.nix)
selector=""
want_on=0
on_given=0
deploy_cmd=0
nodes=()
on_nodes=()
master_processes=()
# build node list from `--on` value, a comma-separated string (e.g. "host-01,host-02")
for arg in "$@"; do
if ((want_on)); then
selector="$arg"
want_on=0
continue
fi
case "$arg" in
--on=*)
selector="${arg#--on=}"
on_given=1
;;
--on) want_on=1 on_given=1 ;;
apply | exec | upload-keys) deploy_cmd=1 ;;
esac
done
# shellcheck disable=SC2154
if ((deploy_cmd)) && ! ((on_given)); then
on_nodes=("${!_colmena_node_tags[@]}")
else
IFS=',' read -ra nodes <<< "$selector"
for node in "${nodes[@]}"; do
for node_tag in "${!_colmena_node_tags[@]}"; do
if [[ "$node" == @* ]]; then
for tag in ${_colmena_node_tags[$node_tag]}; do
# shellcheck disable=SC2053
[[ "$tag" == ${node#@} ]] && on_nodes+=("$node_tag")
done
else
# shellcheck disable=SC2053
[[ "$node_tag" == $node ]] && on_nodes+=("$node_tag")
fi
done
done
fi
for node in "${on_nodes[@]}"; do
# check if master process is running (see `man ssh`)
ssh -O check "$node" 2>/dev/null && continue
# place ssh client into "master" mode for connection sharing (see `man ssh`)
if ssh -fNM "$node"; then
master_processes+=("$node")
fi
done
rc=0
@colmena@ "$@" || rc=$?
# request master processes to exit (see `man ssh`)
for process in "${master_processes[@]}"; do
ssh -O exit "$process" 2>/dev/null || true
done
exit "$rc"