added 'clean' command to cleanup leftovers

This commit is contained in:
Michael Krayer 2021-03-26 16:17:49 +01:00
parent 5d98199bf9
commit 67845a10a0
1 changed files with 59 additions and 27 deletions

66
session
View File

@ -36,8 +36,9 @@ EXIT_INVALID_SUBMODE=2
EXIT_SESSION_EXISTS=3 EXIT_SESSION_EXISTS=3
EXIT_SESSION_NOT_EXIST=4 EXIT_SESSION_NOT_EXIST=4
EXIT_ALREADY_IN_SESSION=5 EXIT_ALREADY_IN_SESSION=5
EXIT_CONFIG_NOT_GENERATED=6 EXIT_NOT_ATTACHED=6
EXIT_INVALID_CHOICE=7 EXIT_CONFIG_NOT_GENERATED=7
EXIT_INVALID_CHOICE=8
## Functions ## Functions
print_help() { print_help() {
@ -82,7 +83,7 @@ print_help() {
echo >&2 "non-existent, can be initialized with '$(basename $0) config generate'." echo >&2 "non-existent, can be initialized with '$(basename $0) config generate'."
echo >&2 "All sessions are logged by default in order to provide a scrollback" echo >&2 "All sessions are logged by default in order to provide a scrollback"
echo >&2 "buffer at attaching. The logs are located in '${config[socket_dir]}'" echo >&2 "buffer at attaching. The logs are located in '${config[socket_dir]}'"
echo >&2 "and logs of terminated sessions may be cleared using '$(basename $0) log clear'." echo >&2 "and logs of terminated sessions may be cleared using '$(basename $0) clean log'."
} }
get_available_sessions() { get_available_sessions() {
@ -108,11 +109,18 @@ get_available_logs() {
} }
get_session_path() { get_session_path() {
echo "${SOCKET_PREFIX}${1}${SOCKET_SUFFIX}" local session_name=$1
echo "${SOCKET_PREFIX}${session_name}${SOCKET_SUFFIX}"
} }
get_log_path() { get_log_path() {
echo "${SOCKET_PREFIX}${1}${LOG_SUFFIX}" local session_name=$1
echo "${SOCKET_PREFIX}${session_name}${LOG_SUFFIX}"
}
get_session_pid() {
local session_name=$1
fuser $(get_session_path $session_name) 2> /dev/null
} }
is_existing_session_path() { is_existing_session_path() {
@ -142,6 +150,13 @@ exit_if_in_session() {
fi fi
} }
exit_if_not_in_session() {
if [ -z $DTACH_SOCKET_PATH ]; then
echo >&2 "Currently not attached to any session."
exit $EXIT_NOT_ATTACHED
fi
}
exit_if_existing_session() { exit_if_existing_session() {
if is_existing_session_name $session_name; then if is_existing_session_name $session_name; then
echo >&2 "Session '$session_name' already exists." echo >&2 "Session '$session_name' already exists."
@ -177,13 +192,9 @@ shift
## Now enter mode specific code ## Now enter mode specific code
case $mode in case $mode in
"") "")
if [ -z "$DTACH_SESSION_NAME" ];then exit_if_not_in_session
echo "Currently not attached."
exit $EXIT_NOT_ATTACHED
else
echo "Currently attached to '$DTACH_SESSION_NAME'." echo "Currently attached to '$DTACH_SESSION_NAME'."
exit $EXIT_SUCCESS exit $EXIT_SUCCESS
fi
;; ;;
"attach"|"att"|"a") "attach"|"att"|"a")
exit_if_in_session exit_if_in_session
@ -214,6 +225,14 @@ case $mode in
eval $CMD eval $CMD
exit $EXITSUCCESS exit $EXITSUCCESS
;; ;;
# "detach"|"det"|"d")
# exit_if_not_in_session
# PID=$(get_session_pid $DTACH_SESSION_NAME)
# echo $PID
# kill -SIGHUP $PID
# #echo -e "" > $(tty)
# exit $EXIT_SUCCESS
# ;;
"new"|"n") "new"|"n")
exit_if_in_session exit_if_in_session
#PROMPT_COMMAND="echo -ne \"\033]0;$1 (on $HOSTNAME)\007\"" #PROMPT_COMMAND="echo -ne \"\033]0;$1 (on $HOSTNAME)\007\""
@ -266,16 +285,15 @@ case $mode in
exit_if_nonexisting_session $session_name exit_if_nonexisting_session $session_name
fi fi
for sname in ${session_name[@]}; do for sname in ${session_name[@]}; do
spath=$(get_session_path $sname)
logpath=$(get_log_path $sname) logpath=$(get_log_path $sname)
PID=$(fuser $spath 2> /dev/null) PID=$(get_session_pid $sname)
if [ ! -z "$PID" ]; then if [ ! -z "$PID" ]; then
CMD="kill $SIGNAL $PID" CMD="kill $SIGNAL $PID"
eval $CMD eval $CMD
else # this seems to be an orphan else # this seems to be an orphan
CLEANUP=1 CLEANUP=1
fi fi
[[ "$CLEANUP" -eq 1 ]] && rm $spath [[ "$CLEANUP" -eq 1 ]] && rm $(get_session_path $sname)
done done
exit $EXIT_SUCCESS exit $EXIT_SUCCESS
;; ;;
@ -322,11 +340,9 @@ case $mode in
done done
exit $EXIT_SUCCESS exit $EXIT_SUCCESS
;; ;;
"clean")
case "$1" in
"log") "log")
if [[ "$1" != "clear" ]]; then
echo >&2 "Use '$(basename $0) log clear' to clear all unused log files."
exit $EXIT_INVALID_SUBMODE
fi
logs_avail=($(get_available_logs)) logs_avail=($(get_available_logs))
for sname in ${logs_avail[@]}; do for sname in ${logs_avail[@]}; do
if ! is_existing_session_name $sname; then if ! is_existing_session_name $sname; then
@ -335,6 +351,22 @@ case $mode in
done done
exit $EXIT_SUCCESS exit $EXIT_SUCCESS
;; ;;
"socket")
sessions_avail=($(get_available_sessions))
for sname in ${sessions_avail[@]}; do
PID=$(get_session_pid $sname)
if [ -z "$PID" ]; then
rm $(get_session_path $sname)
fi
done
exit $EXIT_SUCCESS
;;
*)
echo >&2 "'$(basename $0) clean' accepts:"
echo >&2 " log, socket"
exit $EXIT_INVALID_SUBMODE
esac
;;
*) *)
echo >&2 "Invalid mode: ${mode}" echo >&2 "Invalid mode: ${mode}"
print_help print_help