disclosure-bureau/infra/disclosure-stack/scripts/_lib.sh

70 lines
2.1 KiB
Bash
Executable file

#!/usr/bin/env bash
# Shared library: loads .env and exposes SSH helpers.
# Sourced by every script in this directory.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
STACK_DIR="$(dirname "$SCRIPT_DIR")"
ENV_FILE="${STACK_DIR}/.env"
if [ ! -f "$ENV_FILE" ]; then
echo "$ENV_FILE not found. Copy .env.example to .env and fill it in." >&2
exit 1
fi
# Load .env without leaking variables to the shell history
set -a
# shellcheck disable=SC1090
source "$ENV_FILE"
set +a
: "${VPS_HOST:?VPS_HOST not set in .env}"
: "${VPS_USER:?VPS_USER not set in .env}"
: "${VPS_PORT:=22}"
: "${VPS_AUTH:=password}"
# ssh wrapper — uses password (sshpass) OR key, transparently
vps_ssh() {
local cmd="${1:-}"
if [ "$VPS_AUTH" = "password" ]; then
if ! command -v sshpass >/dev/null; then
echo "❌ sshpass not installed. Install with: brew install hudochenkov/sshpass/sshpass" >&2
exit 1
fi
if [ -n "$cmd" ]; then
SSHPASS="$VPS_PASSWORD" sshpass -e \
ssh -o StrictHostKeyChecking=accept-new -o ConnectTimeout=10 \
-p "$VPS_PORT" "${VPS_USER}@${VPS_HOST}" "$cmd"
else
SSHPASS="$VPS_PASSWORD" sshpass -e \
ssh -o StrictHostKeyChecking=accept-new \
-p "$VPS_PORT" "${VPS_USER}@${VPS_HOST}"
fi
else
local key="${VPS_SSH_KEY/#\~/$HOME}"
if [ -n "$cmd" ]; then
ssh -o StrictHostKeyChecking=accept-new -o ConnectTimeout=10 \
-p "$VPS_PORT" -i "$key" "${VPS_USER}@${VPS_HOST}" "$cmd"
else
ssh -o StrictHostKeyChecking=accept-new \
-p "$VPS_PORT" -i "$key" "${VPS_USER}@${VPS_HOST}"
fi
fi
}
# rsync wrapper
vps_rsync() {
local src="$1" dst="$2"
if [ "$VPS_AUTH" = "password" ]; then
SSHPASS="$VPS_PASSWORD" sshpass -e \
rsync -avz --progress \
-e "ssh -o StrictHostKeyChecking=accept-new -p $VPS_PORT" \
"$src" "${VPS_USER}@${VPS_HOST}:${dst}"
else
local key="${VPS_SSH_KEY/#\~/$HOME}"
rsync -avz --progress \
-e "ssh -o StrictHostKeyChecking=accept-new -p $VPS_PORT -i $key" \
"$src" "${VPS_USER}@${VPS_HOST}:${dst}"
fi
}