91 lines
4.3 KiB
Bash
91 lines
4.3 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
TOKEN="${1:-}"
|
|
ENC_COMMAND="${2:-}"
|
|
if [[ -z "${TOKEN}" ]]; then
|
|
echo "Missing token."
|
|
exit 1
|
|
fi
|
|
|
|
API_BASE="${PI_CONTROL_API_URL:-http://gui_nexus}"
|
|
API_BASE="${API_BASE%/}"
|
|
INFO_URL="${API_BASE}/module/pi_control/terminal_info?token=${TOKEN}"
|
|
|
|
AUTH_HEADER=()
|
|
if [[ -n "${STAGING_AUTH_USER:-}" && -n "${STAGING_AUTH_PASS:-}" ]]; then
|
|
BASIC="$(printf "%s:%s" "${STAGING_AUTH_USER}" "${STAGING_AUTH_PASS}" | base64)"
|
|
AUTH_HEADER=(-H "Authorization: Basic ${BASIC}")
|
|
fi
|
|
if [[ -n "${PI_CONTROL_SHARED_SECRET:-}" ]]; then
|
|
AUTH_HEADER+=(-H "X-Terminal-Secret: ${PI_CONTROL_SHARED_SECRET}")
|
|
fi
|
|
|
|
JSON="$(curl -sS "${AUTH_HEADER[@]}" "${INFO_URL}")"
|
|
OK="$(echo "${JSON}" | jq -r '.ok')"
|
|
if [[ "${OK}" != "true" ]]; then
|
|
echo "Invalid or expired token."
|
|
exit 1
|
|
fi
|
|
|
|
HOST="$(echo "${JSON}" | jq -r '.host.host')"
|
|
PORT="$(echo "${JSON}" | jq -r '.host.port')"
|
|
USER="$(echo "${JSON}" | jq -r '.host.username')"
|
|
AUTH_TYPE="$(echo "${JSON}" | jq -r '.host.auth_type')"
|
|
KEY_PATH="$(echo "${JSON}" | jq -r '.host.key_path')"
|
|
PASSWORD="$(echo "${JSON}" | jq -r '.host.password')"
|
|
STRICT_HOSTKEY="$(echo "${JSON}" | jq -r '.strict_hostkey // false')"
|
|
TMUX_SESSION_JSON="$(echo "${JSON}" | jq -r '.tmux_session // ""')"
|
|
|
|
COMMAND="$(echo "${JSON}" | jq -r '.command // ""')"
|
|
if [[ -z "${COMMAND}" && -n "${ENC_COMMAND}" ]]; then
|
|
COMMAND="$(printf '%s' "${ENC_COMMAND}" | base64 -d 2>/dev/null || true)"
|
|
fi
|
|
|
|
if [[ -z "${HOST}" || -z "${USER}" ]]; then
|
|
echo "Host data incomplete."
|
|
exit 1
|
|
fi
|
|
|
|
SSH_OPTS=()
|
|
if [[ "${STRICT_HOSTKEY}" == "true" || "${PI_CONTROL_STRICT_HOSTKEY:-}" == "1" ]]; then
|
|
SSH_OPTS=(-o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/root/.ssh/known_hosts)
|
|
else
|
|
SSH_OPTS=(-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null)
|
|
fi
|
|
|
|
SSH_TARGET="${USER}@${HOST}"
|
|
TMUX_SESSION="${TMUX_SESSION_JSON:-}"
|
|
if [[ -z "${TMUX_SESSION}" ]]; then
|
|
TMUX_SESSION="${PI_CONTROL_TMUX_SESSION:-nexus}"
|
|
fi
|
|
if [[ -n "${COMMAND}" ]]; then
|
|
COMMAND_B64="$(printf '%s' "${COMMAND}" | base64)"
|
|
REMOTE_CMD="CMD_B64='${COMMAND_B64}'; CMD=\"\$(printf '%s' \"\$CMD_B64\" | base64 -d)\"; if command -v tmux >/dev/null 2>&1; then SESSION=\"${TMUX_SESSION}\"; tmux has-session -t \"\$SESSION\" 2>/dev/null || tmux new-session -d -s \"\$SESSION\"; tmux send-keys -t \"\$SESSION\" \"\$CMD\" C-m; exec tmux attach -t \"\$SESSION\"; else eval \"\$CMD\"; exec /bin/bash -il; fi"
|
|
REMOTE_CMD_Q=$(printf "%s" "$REMOTE_CMD" | sed "s/'/'\\\\''/g")
|
|
if [[ "${AUTH_TYPE}" == "key" && -n "${KEY_PATH}" ]]; then
|
|
ssh "${SSH_OPTS[@]}" -i "${KEY_PATH}" -p "${PORT:-22}" -tt "${SSH_TARGET}" -- /bin/bash -lc "'${REMOTE_CMD_Q}'" || \
|
|
ssh "${SSH_OPTS[@]}" -i "${KEY_PATH}" -p "${PORT:-22}" -tt "${SSH_TARGET}" -- /bin/sh -lc "'${REMOTE_CMD_Q}'"
|
|
elif [[ "${AUTH_TYPE}" == "pass" && -n "${PASSWORD}" ]]; then
|
|
sshpass -p "${PASSWORD}" ssh "${SSH_OPTS[@]}" -p "${PORT:-22}" -tt "${SSH_TARGET}" -- /bin/bash -lc "'${REMOTE_CMD_Q}'" || \
|
|
sshpass -p "${PASSWORD}" ssh "${SSH_OPTS[@]}" -p "${PORT:-22}" -tt "${SSH_TARGET}" -- /bin/sh -lc "'${REMOTE_CMD_Q}'"
|
|
else
|
|
ssh "${SSH_OPTS[@]}" -p "${PORT:-22}" -tt "${SSH_TARGET}" -- /bin/bash -lc "'${REMOTE_CMD_Q}'" || \
|
|
ssh "${SSH_OPTS[@]}" -p "${PORT:-22}" -tt "${SSH_TARGET}" -- /bin/sh -lc "'${REMOTE_CMD_Q}'"
|
|
fi
|
|
exit $?
|
|
else
|
|
REMOTE_CMD="if command -v tmux >/dev/null 2>&1; then exec tmux new -A -s \"${TMUX_SESSION}\"; else exec /bin/bash -il; fi"
|
|
REMOTE_CMD_Q=$(printf "%s" "$REMOTE_CMD" | sed "s/'/'\\\\''/g")
|
|
if [[ "${AUTH_TYPE}" == "key" && -n "${KEY_PATH}" ]]; then
|
|
exec ssh "${SSH_OPTS[@]}" -i "${KEY_PATH}" -p "${PORT:-22}" -tt "${SSH_TARGET}" -- /bin/bash -lc "'${REMOTE_CMD_Q}'" || \
|
|
exec ssh "${SSH_OPTS[@]}" -i "${KEY_PATH}" -p "${PORT:-22}" -tt "${SSH_TARGET}" -- /bin/sh -lc "'${REMOTE_CMD_Q}'"
|
|
elif [[ "${AUTH_TYPE}" == "pass" && -n "${PASSWORD}" ]]; then
|
|
exec sshpass -p "${PASSWORD}" ssh "${SSH_OPTS[@]}" -p "${PORT:-22}" -tt "${SSH_TARGET}" -- /bin/bash -lc "'${REMOTE_CMD_Q}'" || \
|
|
exec sshpass -p "${PASSWORD}" ssh "${SSH_OPTS[@]}" -p "${PORT:-22}" -tt "${SSH_TARGET}" -- /bin/sh -lc "'${REMOTE_CMD_Q}'"
|
|
else
|
|
exec ssh "${SSH_OPTS[@]}" -p "${PORT:-22}" -tt "${SSH_TARGET}" -- /bin/bash -lc "'${REMOTE_CMD_Q}'" || \
|
|
exec ssh "${SSH_OPTS[@]}" -p "${PORT:-22}" -tt "${SSH_TARGET}" -- /bin/sh -lc "'${REMOTE_CMD_Q}'"
|
|
fi
|
|
fi
|