TLC for the scwrypts/remote library

This commit is contained in:
2024-04-13 16:57:22 -06:00
parent 3648f741e6
commit a130a3ed15
17 changed files with 546 additions and 323 deletions

View File

@ -0,0 +1,99 @@
#####################################################################
DEPENDENCIES+=(yq)
#####################################################################
REMOTE__GET_CONNECTION_STRING() {
local REMOTE_NAME="$1"
[ $(REMOTE__QUERY_CONNECTION .sessions.$REMOTE_NAME.host) ] \
|| ERROR "no such connection $REMOTE_NAME exists" \
|| return 1
local CONNECTION_HOST=$(REMOTE__QUERY_CONNECTION .sessions.$REMOTE_NAME.host)
[ $CONNECTION_HOST ] \
|| ERROR "connection $REMOTE_NAME is misconfigured; missing 'host' field" \
|| return 1
local CONNECTION_USER=$(REMOTE__QUERY_CONNECTION .sessions.$REMOTE_NAME.user)
[ $CONNECTION_USER ] || CONNECTION_USER=$(REMOTE__QUERY_CONNECTION .default.user)
[ $CONNECTION_USER ] \
&& CONNECTION_STRING="${CONNECTION_USER}@${CONNECTION_HOST}" \
|| CONNECTION_STRING="$CONNECTION_HOST" \
;
echo $CONNECTION_STRING
}
REMOTE__GET_SSH_ARGS() {
local REMOTE_NAME
local TYPE=ssh
local USE_TTY=true
while [[ $# -gt 0 ]]
do
case $1 in
-t | --type ) TYPE=$2; shift 1 ;;
--use-tty ) USE_TTY=$2; shift 1 ;;
--no-tty ) USE_TTY=false ;;
* )
[ $REMOTE_NAME ] && { ERROR "too many args :c"; return 1; }
REMOTE_NAME=$1
;;
esac
shift 1
done
local ARGS=()
[ $REMOTE_NAME ] || {
echo "${ARGS[@]}"
return 0
}
local PORT=$(REMOTE__QUERY_CONNECTION .sessions.$REMOTE_NAME.port)
[ $PORT ] && {
case $TYPE in
ssh | xserver | tmux ) ARGS+=(-p $PORT) ;;
scp ) ARGS+=(-P $PORT) ;; # not really in use, just a sample
* )
WARNING "
port is specified, but I'm not sure whether to use '-p' or '-P'
if this command fails, try adding your --type to the appropriate
list in '$SCWRYPTS_ROOT__remote/lib/config.module.zsh'
"
ARGS+=(-p $PORT)
;;
esac
}
ARGS+=($(REMOTE__QUERY_CONNECTION .session.$REMOTE_NAME.$TYPE.args))
[[ $USE_TTY =~ true ]] && ARGS+=(-t)
echo "${ARGS[@]}"
}
#####################################################################
REMOTE__QUERY_CONNECTION() {
YQ -oy -r $@ "$REMOTE_CONNECTIONS_FILE" \
| grep -v ^null$
}
REMOTE__QUERY_CONNECTION_WITH_FALLBACK() {
while [[ $# -gt 0 ]] && [ ! $QUERY_RESULT ]
do
case $1 in
.* ) QUERY_RESULT=$(REMOTE__QUERY_CONNECTION $1) ;;
* ) QUERY_RESULT="$1" ;; # allows raw default value
esac
shift 1
done
echo $QUERY_RESULT
}

View File

@ -1,47 +0,0 @@
#####################################################################
DEPENDENCIES+=()
REQUIRED_ENV+=()
#####################################################################
PARSE_CONNECTION() {
[ ! $CONNECTION ] && [ ! $REMOTE_NAME ] && {
ERROR 'cannot parse connection without specifying CONNECTION or REMOTE_NAME'
return 1
}
[ $REMOTE_NAME ] && CONNECTION=$(GET_CONNECTION $REMOTE_NAME)
[ ! $CONNECTION ] && {
ERROR "no such connection with name '$REMOTE_NAME'"
}
local CONNECTION_DETAILS=$(echo $CONNECTION | sed 's/|/ /g;')
REMOTE_ID=$(echo $CONNECTION_DETAILS | awk '{print $1;}')
REMOTE_NAME=$(echo $CONNECTION_DETAILS | awk '{print $2;}')
REMOTE_HOST=$(echo $CONNECTION_DETAILS | awk '{print $3;}')
REMOTE_ARGS+=($(echo $CONNECTION_DETAILS | awk '{$1=$2=$3="";}1'))
}
GET_CONNECTIONS() {
(
echo '0 | localhost | localhost'
echo "0 | $(hostnamectl --static) | localhost"
sed -n 's/#.*//;s/ \+$//;/./p' "$REMOTE_CONNECTIONS_FILE"
) | sort -u
}
GET_CONNECTION() {
[ ! $1 ] && return 1
GET_CONNECTIONS | grep "^[0-9]\+ *| *$1 *|" | head -n1
}
GET_CONNECTION_NAMES() {
echo ($(GET_CONNECTIONS | awk '{print $1;}'))
}
IS_VALID_CONNECTION_NAME() {
GET_CONNECTION $1 | grep -q '|'
}

View File

@ -1,45 +0,0 @@
#####################################################################
DEPENDENCIES+=(
ssh
)
REQUIRED_ENV+=()
use connection/parse --group remote
#####################################################################
[ ! $REMOTE_DEFAULT_SHELL ] && REMOTE_DEFAULT_SHELL=(zsh -l)
REMOTE__LOGIN() {
local READ_COMMAND=0
[ ! $REMOTE_NAME ] && {
REMOTE_NAME=$1
shift 1
}
[[ $# -gt 0 ]] && {
REMOTE_SHELL_ARGS+=(-c "'$@'")
}
[ $REMOTE_NAME ] && {
STATUS "connecting to $REMOTE_NAME"
}
PARSE_CONNECTION
[ ! $REMOTE_HOST ] && {
ERROR "could not parse REMOTE_HOST from REMOTE_NAME;
check the configuration file for errors"
return 1
}
[[ $REMOTE_HOST =~ ^localhost$ ]] && {
WARNING 'performing login to localhost'
eval "cd; "${REMOTE_DEFAULT_SHELL[@]} ${REMOTE_SHELL_ARGS[@]}
return $?
}
ssh -t ${REMOTE_ARGS[@]} $REMOTE_HOST "$REMOTE_DEFAULT_SHELL ${REMOTE_SHELL_ARGS[@]} $@"
}

View File

@ -1,36 +0,0 @@
#####################################################################
DEPENDENCIES+=(
tmux
)
REQUIRED_ENV+=()
use ssh --group remote
#####################################################################
REMOTE_CONNECT_TMUX() {
local REMOTE_NAME="$1"
local USAGE="
usage: REMOTE_NAME
Connect to remote tmux session on '$REMOTE_NAME'
"
local REMOTE_HOST
local REMOTE_ARGS=()
IS_VALID_CONNECTION_NAME $REMOTE_NAME || ERROR "invalid REMOTE_NAME '$REMOTE_NAME'"
CHECK_ERRORS
local TMUX_ARGS=()
# enforce UTF-8 if supported by host locale
TMUX_ARGS+=($(locale charmap | grep -q 'UTF-8' && echo '-u'))
# create or connect to session
TMUX_ARGS+=(new-session -As wryn)
REMOTE__LOGIN "tmux ${TMUX_ARGS[@]}"
}