TLC for the scwrypts/remote library
This commit is contained in:
99
scwrypts/ssh/lib/config.module.zsh
Normal file
99
scwrypts/ssh/lib/config.module.zsh
Normal 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
|
||||
}
|
@ -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 '|'
|
||||
}
|
@ -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[@]} $@"
|
||||
}
|
@ -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[@]}"
|
||||
}
|
||||
|
Reference in New Issue
Block a user