195 lines
5.0 KiB
Plaintext
Raw Normal View History

2024-04-13 16:57:22 -06:00
#!/bin/zsh
use bastion --group remote
2024-04-13 16:57:22 -06:00
use config --group remote
#####################################################################
USAGE__options="
-c, --command override configured remote command
2025-02-19 21:58:02 -07:00
-s, --shell override configured remote login shell
2024-04-13 16:57:22 -06:00
-t, --type one of the following connection types:
- ssh (default) simple ssh execution
- xserver ssh connection with remote-xserver settings
- tmux connect directly to configured, remote tmux session
--no-rc disable loading the login RC for 'sh -c' commands
--no-tty don't request a tty connection
--force-local-login force login through ssh when working with localhost
--use-bastion true / false override for bastion preference
(default: session.name.bastion.preferred or 'false')
2024-04-13 16:57:22 -06:00
"
USAGE__description="
Connection / bastion wrapper for $REMOTE__TARGET. To configure,
use 'scwrypts remote configure'
"
#####################################################################
MAIN() {
[ $REMOTE__TARGET ] \
2025-02-19 21:58:02 -07:00
|| echo.error 'missing REMOTE__TARGET context; this must be run through scwrypts' \
2024-04-13 16:57:22 -06:00
|| return 1
local CONNECTION_TYPE=ssh
local REMOTE_NAME=$REMOTE__TARGET
local REMOTE_COMMAND LOGIN_SHELL
local LOAD_RC=true
local USE_TTY=true
local FORCE_LOCAL_LOGIN=false
local USE_BASTION
2024-04-13 16:57:22 -06:00
while [[ $# -gt 0 ]]
do
local _S=1
2024-04-13 16:57:22 -06:00
case $1 in
2025-02-19 21:58:02 -07:00
( -t | --type ) ((_S+=1)); CONNECTION_TYPE=$2 ;;
( -c | --command ) ((_S+=1)); REMOTE_COMMAND=$2 ;;
( -s | --shell ) ((_S+=1)); LOGIN_SHELL=$2 ;;
2024-04-13 16:57:22 -06:00
2025-02-19 21:58:02 -07:00
( --no-rc ) LOAD_RC=false ;;
( --no-tty ) USE_TTY=false ;;
2024-04-13 16:57:22 -06:00
2025-02-19 21:58:02 -07:00
( --use-bastion )
((_S+=1))
USE_BASTION=$2
case $USE_BASTION in
2025-02-19 21:58:02 -07:00
( true | false ) ;;
( * ) echo.error "invalid setting for '--use-bastion' (must be 'true' or 'false')" ;;
esac
;;
2025-02-19 21:58:02 -07:00
( --force-local-login ) FORCE_LOCAL_LOGIN=true ;;
2024-04-13 16:57:22 -06:00
2025-02-19 21:58:02 -07:00
* ) echo.error "unknown argument '$1'" ;;
2024-04-13 16:57:22 -06:00
esac
2024-08-14 19:07:00 -06:00
[[ $_S -le $# ]] \
&& shift $_S \
2025-02-19 21:58:02 -07:00
|| echo.error "missing argument for '$1'" \
2024-08-14 19:07:00 -06:00
|| shift $#
2024-04-13 16:57:22 -06:00
done
2025-02-19 21:58:02 -07:00
utils.check-errors --fail
2024-04-13 16:57:22 -06:00
##########################################
GET_SSH_ARGS() {
2025-02-19 21:58:02 -07:00
remote.config.get-ssh-args \
2024-04-13 16:57:22 -06:00
--type $CONNECTION_TYPE \
--use-tty $USE_TTY \
$REMOTE_NAME \
;
}
GET_SSH_ARGS >/dev/null \
&& local SSH_ARGS=($(GET_SSH_ARGS)) \
|| FAIL 1 'unable to load ssh args; aborting'
##########################################
2025-02-19 21:58:02 -07:00
local CONNECTION_STRING=$(remote.config.get-connection-string $REMOTE_NAME)
2024-04-13 16:57:22 -06:00
[ $CONNECTION_STRING ] \
|| FAIL 1 'unable to determine connection string'
##########################################
LOGIN_SHELL=$(\
2025-02-19 21:58:02 -07:00
remote.config.query-connection-with-fallback \
2024-04-13 16:57:22 -06:00
"$LOGIN_SHELL" \
".$REMOTE_NAME.shell" \
".default.shell" \
"zsh" \
)
REMOTE_COMMAND=$(\
2025-02-19 21:58:02 -07:00
remote.config.query-connection-with-fallback \
2024-04-13 16:57:22 -06:00
"$REMOTE_COMMAND" \
".sessions.$REMOTE_NAME.$CONNECTION_TYPE.command" \
".sessions.$REMOTE_NAME.command" \
2024-04-13 16:57:22 -06:00
".default.$CONNECTION_TYPE.command" \
".default.command" \
)
[ $REMOTE_COMMAND ] || {
case $CONNECTION_TYPE in
2025-02-19 21:58:02 -07:00
( tmux )
2024-04-13 16:57:22 -06:00
local TMUX_SESSION_NAME=$(
2025-02-19 21:58:02 -07:00
remote.config.query-connection-with-fallback \
2024-04-13 16:57:22 -06:00
".sessions.$REMOTE_NAME.tmux.session" \
".default.tmux.session" \
"wryn" \
)
local TMUX_ARGS=()
locale charmap 2>/dev/null | grep -qi 'UTF-8' \
&& TMUX_ARGS+=(-u)
REMOTE_COMMAND="tmux ${TMUX_ARGS[@]} new-session -As $TMUX_SESSION_NAME"
;;
esac
}
#####################################################################
[ $USE_BASTION ] || {
USE_BASTION=$(\
2025-02-19 21:58:02 -07:00
remote.config.query-connection-with-fallback \
".sessions.$REMOTE_NAME.bastion.preferred" \
'false' \
;
)
}
local BASTION_HOST
[[ $USE_BASTION =~ true ]] && {
BASTION_HOST=$(\
2025-02-19 21:58:02 -07:00
remote.config.query-connection-with-fallback \
".sessions.$REMOTE_NAME.bastion.session" \
)
}
[ $BASTION_HOST ] && {
2025-02-19 21:58:02 -07:00
echo.debug "REMOTE_COMMAND : $REMOTE_COMMAND"
PASSTHROUGH_COMMAND="$(remote.bastion.get-passthrough-prefix) connect $REMOTE_NAME --"
2024-08-14 19:07:00 -06:00
[ "$REMOTE_COMMAND" ] && PASSTHROUGH_COMMAND+=" -c $(printf "%q " "$REMOTE_COMMAND")"
BASTION_TARGET=$REMOTE_NAME REMOTE__TARGET=$BASTION_HOST MAIN --command "$PASSTHROUGH_COMMAND"
return $?
}
##########################################
2024-04-13 16:57:22 -06:00
[ $REMOTE_COMMAND ] && [[ $LOAD_RC =~ true ]] && {
REMOTE_COMMAND="$LOGIN_SHELL -l -c 'source ~/.$(basename $LOGIN_SHELL)rc &>/dev/null; $REMOTE_COMMAND'"
}
2025-02-19 21:58:02 -07:00
2024-04-13 16:57:22 -06:00
[ ! $REMOTE_COMMAND ] && {
[[ $LOAD_RC =~ true ]] \
&& REMOTE_COMMAND="$LOGIN_SHELL -l" \
|| REMOTE_COMMAND="$LOGIN_SHELL"
}
[ $BASTION_TARGET ] && CONNECTION_TYPE=bastion
2024-04-13 16:57:22 -06:00
2025-02-19 21:58:02 -07:00
echo.debug "
attempting execution:
netpath : $(hostnamectl --static) -> $([ $BASTION_TARGET ] && echo "$BASTION_TARGET -> ")$REMOTE_NAME
2024-04-13 16:57:22 -06:00
type : $CONNECTION_TYPE
connection : $REMOTE_NAME
command : \"$REMOTE_COMMAND\"
"
2025-02-19 21:58:02 -07:00
2024-04-13 16:57:22 -06:00
case $CONNECTION_STRING in
localhost | $USER@localhost )
2024-04-20 08:38:13 -06:00
eval "cd; $REMOTE_COMMAND"
2024-04-13 16:57:22 -06:00
return $?
;;
esac
2025-02-19 21:58:02 -07:00
echo.debug "ssh ${SSH_ARGS[@]} $CONNECTION_STRING \"$REMOTE_COMMAND\""
2024-04-13 16:57:22 -06:00
ssh ${SSH_ARGS[@]} $CONNECTION_STRING "$REMOTE_COMMAND"
}