improved session quit -> alias of exit

This commit is contained in:
Michael Krayer 2021-05-12 11:37:55 +02:00
parent 63662d1e38
commit 0b34009594
1 changed files with 109 additions and 89 deletions

198
session
View File

@ -89,65 +89,29 @@ print_help() {
echo >&2 "and logs of terminated sessions may be cleared using '$(basename $0) clean log'."
}
get_available_sessions() {
socket_names=($(abduco | tail +2 | awk '{ print $(NF) }'))
echo ${socket_names[@]}
execute_command(){
local session_name="$1"
shift
local command="$@"
echo "$command" | abduco -p $session_name
}
get_session_path() {
local session_name=$1
echo "${SOCKET_DIR}/${session_name}@${HOSTNAME}"
enable_log(){
local session_name=$1
local log_path=$(get_log_path $session_name)
local fifo_path=$(get_fifo_path $session_name)
touch $log_path && chmod 600 $log_path
mkfifo $fifo_path
cat $fifo_path | abduco -r -S -a $session_name &> $log_path && rm $log_path $fifo_path & disown
execute_command $session_name "alias exit='session quit'"
}
get_log_path() {
local session_name=$1
echo "${LOG_DIR}${session_name}.log"
}
get_fifo_path() {
local session_name=$1
echo "${LOG_DIR}${session_name}.fifo"
}
get_session_pid() {
local session_name=$1
abduco | tail +2 | grep "\b${session_name}\$" | awk '{ print $(NF-1) }'
}
get_session_subpid() {
local session_name=$1
local ppid=$(get_session_pid $session_name)
ps --ppid=$ppid | awk 'NR==2 {print $1; exit}'
}
is_existing_session_path() {
if [ -S $1 ]; then
true
else
false
fi
}
is_logging() {
local session_name=$1
local fifo_path=$(get_fifo_path $session_name)
if [ -a $fifo_path ]; then
true
else
false
fi
}
is_existing_session_name() {
is_existing_session_path $(get_session_path $1)
}
get_new_session_name() {
local ii=1
while is_existing_session_name $ii; do
ii=$((ii+1))
done
echo $ii
disable_log(){
local session_name=$1
local log_path=$(get_log_path $session_name)
local fifo_path=$(get_fifo_path $session_name)
echo > $fifo_path
execute_command $session_name "unalias exit"
}
exit_if_in_session() {
@ -178,27 +142,65 @@ exit_if_nonexisting_session() {
fi
}
select_session() {
sessions_avail=($(get_available_sessions))
if [ ${#sessions_avail[@]} -eq 0 ]; then
exit $EXIT_SUCCESS
fi
echo >&2 "Select a session (q to quit)"
select session_name in ${sessions_avail[@]}
do
if [ -z "$session_name" ]; then
exit $EXIT_SUCCESS
fi
exit_if_nonexisting_session $session_name
break
done
get_available_sessions() {
socket_names=($(abduco | tail +2 | awk '{ print $(NF) }'))
echo ${socket_names[@]}
}
print_scrollback() {
get_fifo_path() {
local session_name=$1
local log_path=$(get_log_path $session_name)
printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' -
tail -n ${config[scrollback]} $log_path
echo "${LOG_DIR}${session_name}.fifo"
}
get_log_path() {
local session_name=$1
echo "${LOG_DIR}${session_name}.log"
}
get_new_session_name() {
local ii=1
while is_existing_session_name $ii; do
ii=$((ii+1))
done
echo $ii
}
get_session_path() {
local session_name=$1
echo "${SOCKET_DIR}/${session_name}@${HOSTNAME}"
}
get_session_pid() {
local session_name=$1
abduco | tail +2 | grep "\b${session_name}\$" | awk '{ print $(NF-1) }'
}
get_session_subpid() {
local session_name=$1
local ppid=$(get_session_pid $session_name)
ps --ppid=$ppid | awk 'NR==2 {print $1; exit}'
}
is_existing_session_path() {
if [ -S $1 ]; then
true
else
false
fi
}
is_existing_session_name() {
is_existing_session_path $(get_session_path $1)
}
is_logging() {
local session_name=$1
local fifo_path=$(get_fifo_path $session_name)
if [ -a $fifo_path ]; then
true
else
false
fi
}
kill_recursively() {
@ -218,10 +220,32 @@ kill_recursively() {
fi
}
print_scrollback() {
local session_name=$1
local log_path=$(get_log_path $session_name)
printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' -
tail -n ${config[scrollback]} $log_path
}
select_session() {
sessions_avail=($(get_available_sessions))
if [ ${#sessions_avail[@]} -eq 0 ]; then
exit $EXIT_SUCCESS
fi
echo >&2 "Select a session (q to quit)"
select session_name in ${sessions_avail[@]}
do
if [ -z "$session_name" ]; then
exit $EXIT_SUCCESS
fi
exit_if_nonexisting_session $session_name
break
done
}
## Parse first argument (= mode argument)
mode=$1
shift
## Now enter mode specific code
case $mode in
"")
@ -262,8 +286,7 @@ case $mode in
#echo $CMD
eval $CMD
if [[ "${config[log_session]}" == "yes" ]]; then
CMD="echo 'session log on' | abduco -p $session_name"
eval $CMD
execute_command $session_name "session log on"
fi
CMD="abduco -a -S -e ${config[detach_char]} $session_name"
eval $CMD
@ -285,24 +308,20 @@ case $mode in
session_name=$2
exit_if_nonexisting_session $session_name
fi
log_path=$(get_log_path $session_name)
fifo_path=$(get_fifo_path $session_name)
case "$1" in
"on")
if is_logging $session_name; then
echo >&2 "Already logging session $session_name."
exit $EXIT_ALREADY_LOGGING
fi
touch $log_path && chmod 600 $log_path
mkfifo $fifo_path
cat $fifo_path | abduco -r -S -a $session_name &> $log_path && rm $log_path $fifo_path & disown
enable_log $session_name
;;
"off")
if ! is_logging $session_name; then
echo 2> "Currently not logging session $session_name."
exit $EXIT_NOT_LOGGING
fi
echo > $fifo_path
disable_log $session_name
;;
"status")
if is_logging $session_name; then
@ -314,9 +333,9 @@ case $mode in
;;
"reset")
if is_logging $session_name; then
session log off $session_name
disable_log $session_name
fi
session log on $session_name
enable_log $session_name
;;
esac
exit $EXIT_SUCCESS
@ -371,11 +390,12 @@ case $mode in
"list"|"ls"|"l")
sessions_avail=($(get_available_sessions))
for sname in ${sessions_avail[@]}; do
printf "$sname"
if [[ "$sname" == "$DTACH_SESSION_NAME" ]]; then
if [[ "$sname" == "$ABDUCO_SESSION" ]]; then
printf "*"
else
printf " "
fi
printf "\n"
printf "$sname\n"
done
exit $EXIT_SUCCESS
;;
@ -387,9 +407,9 @@ case $mode in
exit_if_not_in_session
session_name=$ABDUCO_SESSION
if is_logging $session_name; then
session log off
disable_log $session_name
fi
echo "exit" | abduco -p $session_name
execute_command $session_name "exit"
exit $EXIT_SUCCESS
;;
"help"|"h")