#!/usr/bin/env zsh # # must work as a standalone zsh script # eval "$(scwrypts --config)" \ && use omni --group remote \ && utils.check-environment \ || { echo 'scwrypts config error; aborting' >&2; sleep 5; return 1; } ##################################################################### OMNI_LOGFILE="${OMNI_LOGDIR}/omni.current.txt" [ -f "${OMNI_LOGFILE}" ] && { for x in {1..99} do [ ! -f "${OMNI_LOGDIR}/omni.${x}.txt" ] && { mv "${OMNI_LOGFILE}" "${OMNI_LOGDIR}/omni.${x}.txt" break } done } echo "OMNI MANAGER START : $(date)" > "${OMNI_LOGFILE}" ##################################################################### get-unique-window-id() { local MODE=use-default local WINDOW_ID="$(eval echo "\$WINDOW_ID__${REMOTE_NAME}")" : \ && [[ $(eval echo "\$CAN_CONNECT__${REMOTE_NAME}") =~ true ]] \ && [ ${WINDOW_ID} ] \ && echo ${WINDOW_ID} \ && return 0 \ ; unset WINDOW_ID__${REMOTE_NAME} &>>"${OMNI_LOGFILE}" WINDOW_ID="$1" WINDOW_ID=$(remote.config.yq .sessions.${REMOTE_NAME}.id) [ ${WINDOW_ID} ] && MODE=specify-preferred WINDOW_ID_IS_TAKEN() { : \ && [[ $(remote.omni.tmux list-windows -t=omni | grep "^${WINDOW_ID}:" | wc -l) -gt 0 ]] \ && [[ ! $(remote.omni.tmux list-windows -t=omni | grep "^${WINDOW_ID}:" | awk '{print $2;}' =~ ^${REMOTE_NAME}$) ]] \ ; } local FALLBACK_STARTING_POINT case ${MODE} in use-default ) FALLBACK_STARTING_POINT=42 ;; specify-preferred ) FALLBACK_STARTING_POINT=69 ;; esac local I=0 while WINDOW_ID_IS_TAKEN do echo "${REMOTE_NAME} tried to acquire window id ${WINDOW_ID}, but it is already in-use (trying $((${FALLBACK_STARTING_POINT}-${I})))" >&2 WINDOW_ID=$((${FALLBACK_STARTING_POINT}-${I})) ((I+=1)) [[ ${I} -gt 10 ]] && WINDOW_ID= && break done echo ${WINDOW_ID} } ##################################################################### remote.omni.tmux new-window -t=omni-manager -dn 'harakiri' " echo 'waiting for omni-manager to close' while true do sleep 5 tmux -L ${OMNI_SOCKET} list-sessions 2>/dev/null | grep -v omni-manager | grep -qi omni || { echo 'no active sessions detected; killing omni-manager session' tmux -L ${OMNI_SOCKET} kill-session -t omni-manager } done " while true do #clear for REMOTE_NAME in $(remote.config.yq '.sessions | keys | .[]') do WINDOW_ID=$(get-unique-window-id) export WINDOW_ID__${REMOTE_NAME}=${WINDOW_ID} remote.omni.tmux list-windows -t=omni | awk '{print $2;}' | grep -q ${REMOTE_NAME} \ && continue printf "testing connection ${REMOTE_NAME}..." echo "testing connection ${REMOTE_NAME}..." &>>"${OMNI_LOGFILE}" scwrypts --name test --group remote --type zsh \ -- \ --name ${REMOTE_NAME} \ --command 'command -v tmux' \ &>>"${OMNI_LOGFILE}" \ && export CAN_CONNECT__${REMOTE_NAME}=true \ || export CAN_CONNECT__${REMOTE_NAME}=false \ ; [[ $(eval echo "\$CAN_CONNECT__${REMOTE_NAME}") =~ true ]] \ && utils.colors.print bright-green " ✔\n" >&2 \ || { utils.colors.print bright-red " ✖\n" >&2; continue; } remote.omni.tmux new-window \ -t=omni:${WINDOW_ID} \ -dn ${REMOTE_NAME} " source ~/.zshrc &>/dev/null TMUX='' scwrypts -n connect/${REMOTE_NAME} -- --type tmux echo 'connection closed' sleep 2 " remote.omni.tmux list-window -t=omni | awk '{print $1;}' | grep -q '99:' && remote.omni.tmux kill-window -t omni:99 remote.omni.tmux list-windows -t=omni | awk '{print $2;}' | grep -q ${REMOTE_NAME} \ || export CAN_CONNECT__${REMOTE_NAME}=false done #clear echo "connections:\n" { for REMOTE_NAME in $(remote.config.yq '.sessions | keys | .[]') do [[ $(eval echo "\$CAN_CONNECT__${REMOTE_NAME}") =~ true ]] \ && echo "${REMOTE_NAME}^$(eval echo "\$WINDOW_ID__${REMOTE_NAME}")^$(utils.colors.print bright-green connected)" \ || echo "${REMOTE_NAME}^-^$(utils.colors.print bright-red disconnected)" \ ; done } | column -ts '^' echo "\nPress ENTER to search again now (checks every 60 seconds)" >&2 read -t 60 done