#!/usr/bin/env bash # scripts/onboard/lib/remote.sh — SSH helpers for remote node operations # Requires: ONBOARD_SSH_USER, ONBOARD_SSH_HOST to be set by the caller. # Inherits: DRY_RUN (boolean string "true"/"false") set -euo pipefail : "${ONBOARD_SSH_USER:?remote.sh: ONBOARD_SSH_USER is not set}" : "${ONBOARD_SSH_HOST:?remote.sh: ONBOARD_SSH_HOST is not set}" : "${DRY_RUN:=false}" _SSH_OPTS=( -o StrictHostKeyChecking=accept-new -o ConnectTimeout=10 -o BatchMode=yes ) # rrun CMD [ARGS…] — run a command on the remote node via SSH rrun() { if [[ "$DRY_RUN" == "true" ]]; then dryrun "ssh ${ONBOARD_SSH_USER}@${ONBOARD_SSH_HOST} -- $*" return 0 fi ssh "${_SSH_OPTS[@]}" "${ONBOARD_SSH_USER}@${ONBOARD_SSH_HOST}" -- "$@" } # rcopy LOCAL_PATH REMOTE_PATH — copy a file to the remote node via scp rcopy() { local src="$1" dst="$2" if [[ "$DRY_RUN" == "true" ]]; then dryrun "scp $src ${ONBOARD_SSH_USER}@${ONBOARD_SSH_HOST}:$dst" return 0 fi scp "${_SSH_OPTS[@]}" "$src" "${ONBOARD_SSH_USER}@${ONBOARD_SSH_HOST}:$dst" } # rsync_dir LOCAL_DIR REMOTE_DIR [EXTRA_RSYNC_ARGS…] rsync_dir() { local src="$1" dst="$2" shift 2 if [[ "$DRY_RUN" == "true" ]]; then dryrun "rsync -az $src ${ONBOARD_SSH_USER}@${ONBOARD_SSH_HOST}:$dst" return 0 fi rsync -az -e "ssh ${_SSH_OPTS[*]}" "$src" "${ONBOARD_SSH_USER}@${ONBOARD_SSH_HOST}:$dst" "$@" } # rcheck — verify SSH connectivity; returns 0 if reachable rcheck() { ssh "${_SSH_OPTS[@]}" -o ConnectTimeout=5 "${ONBOARD_SSH_USER}@${ONBOARD_SSH_HOST}" -- true 2>/dev/null }