89 lines
2.7 KiB
Bash
Executable File
89 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -Eeuo pipefail
|
|
|
|
WM_LOCAL_DEPLOY_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
WM_LOCAL_ROOT_DIR="$(cd "$WM_LOCAL_DEPLOY_DIR/.." && pwd)"
|
|
WM_LOCAL_INFRA_DIR="${WATERMAPS_INFRA_DIR:-$WM_LOCAL_ROOT_DIR/infra/opentofu}"
|
|
|
|
wm_local_die() {
|
|
printf 'Fehler: %s\n' "$*" >&2
|
|
exit 1
|
|
}
|
|
|
|
wm_local_iac_command() {
|
|
if command -v tofu >/dev/null 2>&1; then
|
|
command -v tofu
|
|
elif command -v terraform >/dev/null 2>&1; then
|
|
command -v terraform
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
wm_local_resolve_ssh() {
|
|
local requested_server="${1:-}"
|
|
local requested_identity="${2:-}"
|
|
local iac_command
|
|
|
|
WM_SERVER_IPV4="${requested_server:-${WATERMAPS_SERVER_IPV4:-}}"
|
|
if [[ -z "$WM_SERVER_IPV4" ]]; then
|
|
iac_command="$(wm_local_iac_command)" ||
|
|
wm_local_die "OpenTofu/Terraform fehlt und WATERMAPS_SERVER_IPV4 wurde nicht gesetzt."
|
|
[[ -d "$WM_LOCAL_INFRA_DIR" ]] ||
|
|
wm_local_die "OpenTofu-Verzeichnis fehlt: $WM_LOCAL_INFRA_DIR"
|
|
WM_SERVER_IPV4="$("$iac_command" -chdir="$WM_LOCAL_INFRA_DIR" output -raw server_ipv4)"
|
|
fi
|
|
[[ "$WM_SERVER_IPV4" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] ||
|
|
wm_local_die "Ungültige Server-IPv4: $WM_SERVER_IPV4"
|
|
|
|
WM_SSH_IDENTITY="${requested_identity:-${WATERMAPS_SSH_KEY:-}}"
|
|
if [[ -z "$WM_SSH_IDENTITY" ]]; then
|
|
candidate_identity="$HOME/.ssh/watermaps_deploy_ed25519"
|
|
if [[ -f "$candidate_identity" ]]; then
|
|
WM_SSH_IDENTITY="$candidate_identity"
|
|
fi
|
|
fi
|
|
if [[ -n "$WM_SSH_IDENTITY" && ! -f "$WM_SSH_IDENTITY" ]]; then
|
|
wm_local_die "SSH-Keydatei nicht gefunden: $WM_SSH_IDENTITY"
|
|
fi
|
|
|
|
WM_SSH_USER="${WATERMAPS_SSH_USER:-deploy}"
|
|
[[ "$WM_SSH_USER" =~ ^[a-z_][a-z0-9_-]{0,30}$ ]] ||
|
|
wm_local_die "Ungültiger SSH-Benutzer: $WM_SSH_USER"
|
|
if [[ -n "${WATERMAPS_REMOTE_SUDO+x}" ]]; then
|
|
WM_REMOTE_SUDO="$WATERMAPS_REMOTE_SUDO"
|
|
elif [[ "$WM_SSH_USER" == "root" ]]; then
|
|
WM_REMOTE_SUDO=""
|
|
else
|
|
WM_REMOTE_SUDO="sudo"
|
|
fi
|
|
case "$WM_REMOTE_SUDO" in
|
|
""|sudo) ;;
|
|
*) wm_local_die "WATERMAPS_REMOTE_SUDO darf nur leer oder 'sudo' sein." ;;
|
|
esac
|
|
|
|
WM_SSH_TARGET="$WM_SSH_USER@$WM_SERVER_IPV4"
|
|
WM_SSH_OPTIONS=(-o BatchMode=yes -o StrictHostKeyChecking=accept-new)
|
|
if [[ -n "$WM_SSH_IDENTITY" ]]; then
|
|
WM_SSH_OPTIONS+=(-i "$WM_SSH_IDENTITY" -o IdentitiesOnly=yes)
|
|
fi
|
|
}
|
|
|
|
wm_local_wait_for_ssh() {
|
|
local timeout_seconds="${WATERMAPS_SSH_WAIT_SECONDS:-600}"
|
|
local deadline=$((SECONDS + timeout_seconds))
|
|
|
|
while ((SECONDS < deadline)); do
|
|
if ssh "${WM_SSH_OPTIONS[@]}" \
|
|
-o ConnectTimeout=5 \
|
|
"$WM_SSH_TARGET" true >/dev/null 2>&1; then
|
|
return 0
|
|
fi
|
|
printf '[watermaps] Warte auf SSH und Cloud-init-Benutzer %s …\n' "$WM_SSH_TARGET"
|
|
sleep 5
|
|
done
|
|
|
|
wm_local_die "SSH war nach ${timeout_seconds}s nicht erreichbar: $WM_SSH_TARGET"
|
|
}
|