scwrypts v4.4 config adjustments; added os dependencies; removed dotwryn.env.vim references from setup; generate i3 config on setup
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
#!/bin/zsh
|
||||
use bastion --group remote
|
||||
use config --group remote
|
||||
#####################################################################
|
||||
|
||||
@ -14,6 +15,9 @@ USAGE__options="
|
||||
--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')
|
||||
"
|
||||
|
||||
USAGE__description="
|
||||
@ -35,22 +39,33 @@ MAIN() {
|
||||
local LOAD_RC=true
|
||||
local USE_TTY=true
|
||||
local FORCE_LOCAL_LOGIN=false
|
||||
local USE_BASTION
|
||||
|
||||
while [[ $# -gt 0 ]]
|
||||
do
|
||||
local _S=1
|
||||
case $1 in
|
||||
-t | --type ) CONNECTION_TYPE=$2; shift 1 ;;
|
||||
-c | --command ) REMOTE_COMMAND=$2; shift 1 ;;
|
||||
-s | --shell ) LOGIN_SHELL=$2; shift 1 ;;
|
||||
-t | --type ) ((_S+=1)); CONNECTION_TYPE=$2 ;;
|
||||
-c | --command ) ((_S+=1)); REMOTE_COMMAND=$2 ;;
|
||||
-s | --shell ) ((_S+=1)); LOGIN_SHELL=$2 ;;
|
||||
|
||||
--no-rc ) LOAD_RC=false ;;
|
||||
--no-tty ) USE_TTY=false ;;
|
||||
|
||||
--use-bastion )
|
||||
((_S+=1))
|
||||
USE_BASTION=$2
|
||||
case $USE_BASTION in
|
||||
true | false ) ;;
|
||||
* ) ERROR "invalid setting for '--use-bastion' (must be 'true' or 'false')" ;;
|
||||
esac
|
||||
;;
|
||||
|
||||
--force-local-login ) FORCE_LOCAL_LOGIN=true ;;
|
||||
|
||||
* ) ERROR "unknown argument '$1'" ;;
|
||||
esac
|
||||
shift 1
|
||||
shift $_S
|
||||
done
|
||||
|
||||
CHECK_ERRORS
|
||||
@ -88,8 +103,8 @@ MAIN() {
|
||||
REMOTE_COMMAND=$(\
|
||||
REMOTE__QUERY_CONNECTION_WITH_FALLBACK \
|
||||
"$REMOTE_COMMAND" \
|
||||
".$REMOTE_NAME.$CONNECTION_TYPE.command" \
|
||||
".$REMOTE_NAME.command" \
|
||||
".sessions.$REMOTE_NAME.$CONNECTION_TYPE.command" \
|
||||
".sessions.$REMOTE_NAME.command" \
|
||||
".default.$CONNECTION_TYPE.command" \
|
||||
".default.command" \
|
||||
)
|
||||
@ -113,6 +128,35 @@ MAIN() {
|
||||
esac
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
|
||||
[ $USE_BASTION ] || {
|
||||
USE_BASTION=$(\
|
||||
REMOTE__QUERY_CONNECTION_WITH_FALLBACK \
|
||||
".sessions.$REMOTE_NAME.bastion.preferred" \
|
||||
'false' \
|
||||
;
|
||||
)
|
||||
}
|
||||
|
||||
local BASTION_HOST
|
||||
[[ $USE_BASTION =~ true ]] && {
|
||||
BASTION_HOST=$(\
|
||||
REMOTE__QUERY_CONNECTION_WITH_FALLBACK \
|
||||
".sessions.$REMOTE_NAME.bastion.session" \
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
[ $BASTION_HOST ] && {
|
||||
PASSTHROUGH_COMMAND="$(GET_PASSTHROUGH_PREFIX) connect $REMOTE_NAME -- -c $(printf "%q " "$REMOTE_COMMAND")"
|
||||
|
||||
BASTION_TARGET=$REMOTE_NAME REMOTE__TARGET=$BASTION_HOST MAIN --command "$PASSTHROUGH_COMMAND"
|
||||
return $?
|
||||
}
|
||||
|
||||
##########################################
|
||||
|
||||
[ $REMOTE_COMMAND ] && [[ $LOAD_RC =~ true ]] && {
|
||||
REMOTE_COMMAND="$LOGIN_SHELL -l -c 'source ~/.$(basename $LOGIN_SHELL)rc &>/dev/null; $REMOTE_COMMAND'"
|
||||
}
|
||||
@ -123,10 +167,11 @@ MAIN() {
|
||||
|| REMOTE_COMMAND="$LOGIN_SHELL"
|
||||
}
|
||||
|
||||
##########################################
|
||||
[ $BASTION_TARGET ] && CONNECTION_TYPE=bastion
|
||||
|
||||
STATUS "
|
||||
attempting execution on $REMOTE_NAME
|
||||
DEBUG "
|
||||
attempting execution:
|
||||
netpath : $(hostnamectl --static) -> $([ $BASTION_TARGET ] && echo "$BASTION_TARGET -> ")$REMOTE_NAME
|
||||
type : $CONNECTION_TYPE
|
||||
connection : $REMOTE_NAME
|
||||
command : \"$REMOTE_COMMAND\"
|
3
scwrypts/remote/lib/bastion.module.zsh
Normal file
3
scwrypts/remote/lib/bastion.module.zsh
Normal file
@ -0,0 +1,3 @@
|
||||
GET_PASSTHROUGH_PREFIX() {
|
||||
echo "SUBSCWRYPT=$((SUBSCWRYPT+1)) SCWRYPTS_LOG_LEVEL=$SCWRYPTS_LOG_LEVEL scwrypts"
|
||||
}
|
@ -2,7 +2,7 @@ SCWRYPTS_GROUPS+=(remote)
|
||||
[ $DOTWRYN ] || source "$HOME/.config/wryn/env.zsh"
|
||||
|
||||
export SCWRYPTS_TYPE__remote=zsh
|
||||
export SCWRYPTS_ROOT__remote="$DOTWRYN/scwrypts/ssh"
|
||||
export SCWRYPTS_ROOT__remote="$DOTWRYN/scwrypts/remote"
|
||||
export SCWRYPTS_COLOR__remote='\033[0;34m'
|
||||
|
||||
DEPENDENCIES+=(yq)
|
@ -1,4 +1,5 @@
|
||||
#!/bin/zsh
|
||||
use bastion --group remote
|
||||
use config --group remote
|
||||
|
||||
DEPENDENCIES+=(timeout ssh)
|
||||
@ -9,6 +10,9 @@ USAGE__options='
|
||||
-s, --connection-string explicit session host / ssh connection string to test
|
||||
-t, --maximum-timeout maximum connection timeout before failure (in seconds)
|
||||
-c, --command testing command; performs echo by default
|
||||
|
||||
--use-bastion true / false override for bastion preference
|
||||
(default: session.name.bastion.preferred or "false")
|
||||
'
|
||||
|
||||
USAGE__description='
|
||||
@ -22,45 +26,86 @@ MAIN() {
|
||||
local CONNECTION_STRING REMOTE_NAME
|
||||
local TIMEOUT_SECONDS=3
|
||||
local COMMAND='echo OK &>/dev/null'
|
||||
local USE_BASTION
|
||||
while [[ $# -gt 0 ]]
|
||||
do
|
||||
local _S=1
|
||||
case $1 in
|
||||
-n | --name )
|
||||
((_S+=1))
|
||||
REMOTE_NAME=$2
|
||||
CONNECTION_STRING=$(REMOTE__GET_CONNECTION_STRING $REMOTE_NAME)
|
||||
shift 1
|
||||
;;
|
||||
-s | --connection_string )
|
||||
((_S+=1))
|
||||
CONNECTION_STRING="$2"
|
||||
shift 1
|
||||
;;
|
||||
-t | --maximum-timout )
|
||||
((_S+=1))
|
||||
TIMEOUT_SECONDS=$2
|
||||
[[ $TIMEOUT_SECONDS -gt 0 ]] \
|
||||
|| ERROR "invalid timeout seconds '$TIMEOUT_SECONDS'"
|
||||
shift 1
|
||||
;;
|
||||
-c | --command )
|
||||
((_S+=1))
|
||||
COMMAND=$2
|
||||
shift 1
|
||||
;;
|
||||
--use-bastion )
|
||||
((_S+=1))
|
||||
USE_BASTION=$2
|
||||
case $USE_BASTION in
|
||||
true | false ) ;;
|
||||
* ) ERROR "invalid setting for '--use-bastion' (must be 'true' or 'false')" ;;
|
||||
esac
|
||||
;;
|
||||
* ) ERROR "unrecognized argument '$1'" ;;
|
||||
esac
|
||||
shift 1
|
||||
shift $_S
|
||||
done
|
||||
|
||||
[ $CONNECTION_STRING ] \
|
||||
|| ERROR "unable to determine connection string"
|
||||
|
||||
|
||||
[ $USE_BASTION ] || {
|
||||
USE_BASTION=$(\
|
||||
REMOTE__QUERY_CONNECTION_WITH_FALLBACK \
|
||||
".sessions.$REMOTE_NAME.bastion.preferred" \
|
||||
'false' \
|
||||
;
|
||||
)
|
||||
}
|
||||
|
||||
CHECK_ERRORS
|
||||
|
||||
|
||||
##########################################
|
||||
|
||||
local BASTION_HOST
|
||||
[[ $USE_BASTION =~ true ]] && {
|
||||
BASTION_HOST=$(\
|
||||
REMOTE__QUERY_CONNECTION_WITH_FALLBACK \
|
||||
".sessions.$REMOTE_NAME.bastion.session" \
|
||||
)
|
||||
}
|
||||
|
||||
[[ $USE_BASTION =~ true ]] && {
|
||||
[ $BASTION_HOST ] \
|
||||
|| ERROR "cannot connect to $REMOTE_NAME; no configured bastion host" \
|
||||
|| return 1
|
||||
}
|
||||
|
||||
case $CONNECTION_STRING in
|
||||
localhost | $USER@localhost )
|
||||
CONNECTION_TEST() { return 0; } # current user on local machine can always connect
|
||||
;;
|
||||
* )
|
||||
[[ $USE_BASTION =~ true ]] && {
|
||||
DEBUG "MAIN -n $BASTION_HOST -c \"$(GET_PASSTHROUGH_PREFIX) remote test -- -n $REMOTE_NAME -c \"$COMMAND\"\""
|
||||
BASTION_TARGET="$REMOTE_NAME" MAIN -n $BASTION_HOST -c "$(GET_PASSTHROUGH_PREFIX) remote test -- -n $REMOTE_NAME -c \"$COMMAND\""
|
||||
return $?
|
||||
}
|
||||
|
||||
CONNECTION_TEST() {
|
||||
[ $REMOTE_NAME ] && {
|
||||
[[ $(REMOTE__QUERY_CONNECTION .sessions.$REMOTE_NAME) =~ false ]] && {
|
||||
@ -68,16 +113,16 @@ MAIN() {
|
||||
}
|
||||
}
|
||||
local REMOTE_ARGS=()
|
||||
REMOTE_ARGS+=($(REMOTE__GET_SSH_ARGS --type ssh --no-tty $REMOTE_NAME))
|
||||
REMOTE_ARGS+=($(REMOTE__GET_SSH_ARGS --type ssh $REMOTE_NAME))
|
||||
REMOTE_ARGS+=(-o BatchMode=yes)
|
||||
DEBUG "attempting\nssh ${REMOTE_ARGS[@]} \"$CONNECTION_STRING\" \"$COMMAND\""
|
||||
timeout $TIMEOUT_SECONDS ssh ${REMOTE_ARGS[@]} "$CONNECTION_STRING" "$COMMAND" >&2
|
||||
DEBUG "attempting\ntimeout $TIMEOUT_SECONDS ssh $REMOTE_ARGS $CONNECTION_STRING "'\'"\"$COMMAND"'\'"\"" >&2
|
||||
timeout --foreground $TIMEOUT_SECONDS ssh ${REMOTE_ARGS[@]} "$CONNECTION_STRING" "$COMMAND" >&2
|
||||
}
|
||||
;;
|
||||
esac
|
||||
|
||||
[ $REMOTE_NAME ] || REMOTE_NAME=explicit
|
||||
STATUS "testing connection $CONNECTION_STRING ($REMOTE_NAME)" \
|
||||
STATUS "testing connection $CONNECTION_STRING ($REMOTE_NAME$([ $BASTION_TARGET ] && echo " -> $BASTION_TARGET"))" \
|
||||
&& CONNECTION_TEST \
|
||||
&& SUCCESS "successfully connected to '$CONNECTION_STRING' ($REMOTE_NAME)" \
|
||||
|| ERROR "connection to '$CONNECTION_STRING ($REMOTE_NAME)' failed" \
|
@ -7,6 +7,22 @@
|
||||
|
||||
CONNECTIONS_FILE="$HOME/.config/wryn/remote-connections.toml"
|
||||
|
||||
OMNI_LOGDIR="$HOME/.local/share/scwrypts/dotwryn"
|
||||
OMNI_LOGFILE="$HOME/.local/share/scwrypts/dotwryn/omni.current.txt"
|
||||
|
||||
[ ! -d "$OMNI_LOGDIR" ] && mkdir -p "$OMNI_LOGDIR"
|
||||
|
||||
[ -f "$OMNI_LOGFILE" ] && {
|
||||
for x in {1..99}
|
||||
do
|
||||
[ ! -f "$OMNI_LOGDIR/omni.$x.txt" ] && break
|
||||
done
|
||||
|
||||
[ ! -f "$OMNI_LOGDIR/omni.$x.txt" ] && mv "$OMNI_LOGFILE" "$OMNI_LOGDIR/omni.$x.txt"
|
||||
}
|
||||
|
||||
echo "OMNI MANAGER START : $(date)" > "$OMNI_LOGFILE"
|
||||
|
||||
OMNI_SOCKET="omni.socket"
|
||||
OMNI_TMUX() { tmux -L $OMNI_SOCKET $@; }
|
||||
|
||||
@ -30,7 +46,7 @@ GET_UNIQUE_WINDOW_ID() {
|
||||
&& return 0 \
|
||||
;
|
||||
|
||||
unset WINDOW_ID__$REMOTE_NAME &>/dev/null
|
||||
unset WINDOW_ID__$REMOTE_NAME &>>"$OMNI_LOGFILE"
|
||||
|
||||
WINDOW_ID="$1"
|
||||
WINDOW_ID=$(CONFIG_QUERY .sessions.$REMOTE_NAME.id)
|
||||
@ -86,11 +102,12 @@ do
|
||||
&& continue
|
||||
|
||||
printf "testing connection $REMOTE_NAME..."
|
||||
scwrypts -n --name test --group remote --type zsh \
|
||||
echo "testing connection $REMOTE_NAME..." &>>"$OMNI_LOGFILE"
|
||||
scwrypts --name test --group remote --type zsh \
|
||||
-- \
|
||||
--name $REMOTE_NAME \
|
||||
--command 'command -v tmux' \
|
||||
&>/dev/null \
|
||||
&>>"$OMNI_LOGFILE" \
|
||||
&& export CAN_CONNECT__$REMOTE_NAME=true \
|
||||
|| export CAN_CONNECT__$REMOTE_NAME=false \
|
||||
;
|
Reference in New Issue
Block a user