diff --git a/session b/session index 25b15ac..4a14648 100755 --- a/session +++ b/session @@ -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")