69 lines
1.7 KiB
Bash
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"
|