#!/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 [user@]namespace [--no-tmux|-t] [--dry-run|-n] [-- ]" >&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 "$@"