136 lines
2.8 KiB
Bash
Executable File
136 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ATTACH_TMUX=1
|
|
DRY_RUN=0
|
|
TMUX_SESSION_DEFAULT="default"
|
|
|
|
df_platform=""
|
|
df_namespace=""
|
|
df_user=""
|
|
|
|
ssh_identity=""
|
|
ssh_host=""
|
|
ssh_args=()
|
|
|
|
usage() {
|
|
local prog
|
|
prog=$(basename "$0")
|
|
echo "Usage: $prog <platform> [user@]namespace [--no-tmux|-t] [--dry-run|-n] [-- <ssh args...>]" >&2
|
|
echo
|
|
echo "Examples:"
|
|
echo " $prog orb namespace"
|
|
echo " $prog utm user@namespace --no-tmux"
|
|
echo " $prog core user@namespace --dry-run -- -v -p 2222"
|
|
exit 1
|
|
}
|
|
|
|
parse_args() {
|
|
if [[ $# -lt 2 ]]; then
|
|
usage
|
|
fi
|
|
|
|
df_platform="$1"
|
|
local user_namespace_arg="$2"
|
|
shift 2
|
|
|
|
# Extract df_user and df_namespace
|
|
if [[ "$user_namespace_arg" == *@* ]]; then
|
|
df_user="${user_namespace_arg%@*}"
|
|
df_namespace="${user_namespace_arg#*@}"
|
|
else
|
|
df_user="$USER"
|
|
df_namespace="$user_namespace_arg"
|
|
fi
|
|
|
|
# Parse remaining flags and ssh args
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
-t|--no-tmux)
|
|
ATTACH_TMUX=0
|
|
shift
|
|
;;
|
|
-n|--dry-run)
|
|
DRY_RUN=1
|
|
shift
|
|
;;
|
|
--)
|
|
shift
|
|
ssh_args+=("$@")
|
|
break
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1" >&2
|
|
usage
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
resolve_host() {
|
|
case "$df_platform" in
|
|
orb)
|
|
# orb-stack handles user@namespace internally
|
|
ssh_host="${df_namespace}@orb"
|
|
;;
|
|
utm)
|
|
ssh_host="${df_namespace}.utm.local"
|
|
ssh_identity="$HOME/.ssh/id_ed25519_internal"
|
|
;;
|
|
core)
|
|
ssh_host="${df_namespace}.core.lan"
|
|
ssh_identity="$HOME/.ssh/id_ed25519_internal"
|
|
;;
|
|
ec2)
|
|
ssh_host="${df_namespace}.ec2.internal"
|
|
;;
|
|
hetzner)
|
|
ssh_host="${df_namespace}.hetzner.test"
|
|
;;
|
|
*)
|
|
echo "Error: unknown platform '$df_platform'" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
build_ssh_cmd() {
|
|
local cmd=(ssh -tt)
|
|
|
|
if [[ -n "$ssh_identity" ]]; then
|
|
cmd+=(-i "$ssh_identity" -o IdentitiesOnly=yes)
|
|
fi
|
|
|
|
if [[ ${#ssh_args[@]} -gt 0 ]]; then
|
|
cmd+=("${ssh_args[@]}")
|
|
fi
|
|
|
|
cmd+=("${df_user}@${ssh_host}")
|
|
|
|
if [[ $ATTACH_TMUX -eq 1 ]]; then
|
|
cmd+=("tmux" "new-session" "-As" "$TMUX_SESSION_DEFAULT"
|
|
"-e" "DF_NAMESPACE=$df_namespace"
|
|
"-e" "DF_PLATFORM=$df_platform")
|
|
fi
|
|
|
|
echo "${cmd[@]}"
|
|
}
|
|
|
|
main() {
|
|
parse_args "$@"
|
|
resolve_host
|
|
ssh_cmd=($(build_ssh_cmd))
|
|
|
|
if [[ $DRY_RUN -eq 1 ]]; then
|
|
echo "Dry run command:"
|
|
printf '%q ' "${ssh_cmd[@]}"
|
|
echo
|
|
exit 0
|
|
fi
|
|
|
|
exec "${ssh_cmd[@]}"
|
|
}
|
|
|
|
main "$@"
|
|
|