From d6528c247af211c1ed675c87b19e7714be4d875c Mon Sep 17 00:00:00 2001 From: fz0x1 Date: Fri, 11 Apr 2025 14:55:58 +0200 Subject: [PATCH] - code refactor - security fixes --- scripts/monitor-session-activity.sh | 84 +++++++++++++---------------- 1 file changed, 38 insertions(+), 46 deletions(-) diff --git a/scripts/monitor-session-activity.sh b/scripts/monitor-session-activity.sh index 7cd692b..bcb0140 100755 --- a/scripts/monitor-session-activity.sh +++ b/scripts/monitor-session-activity.sh @@ -1,8 +1,9 @@ #!/usr/bin/env bash get_tmux_option() { - local option_value=$(tmux show-option -gqv "$1"); - echo ${option_value:-$2} + local option_value + option_value=$(tmux show-option -gqv "$1") + echo "${option_value:-$2}" } ###### @@ -24,44 +25,40 @@ API_URL="http://$HOST:$PORT/api" # * https://github.com/tmux/tmux/wiki/Advanced-Use#user-content-getting-information # - ### FUNCTIONS DEBUG=0 TMP_FILE=$(mktemp) -echo $TMP_FILE +echo "$TMP_FILE" init_bucket() { - HTTP_CODE=$(curl -X GET "${API_URL}/0/buckets/$BUCKET_ID" -H "accept: application/json" -s -o /dev/null -w %{http_code}) - if (( $HTTP_CODE == 404 )) # not found - then - JSON="{\"client\":\"$BUCKET_ID\",\"type\":\"tmux.sessions\",\"hostname\":\"$(hostname)\"}" - HTTP_CODE=$(curl -X POST "${API_URL}/0/buckets/$BUCKET_ID" -H "accept: application/json" -H "Content-Type: application/json" -d "$JSON" -s -o /dev/null -w %{http_code}) - if (( $HTTP_CODE != 200 )) - then + HTTP_CODE=$(curl -X GET "${API_URL}/0/buckets/$BUCKET_ID" -H "accept: application/json" -s -o /dev/null -w "%{http_code}") + if ((HTTP_CODE == 404)); then # not found + JSON="{\"client\":\"$BUCKET_ID\",\"type\":\"tmux.sessions\",\"hostname\":\"$(uname -n)\"}" + HTTP_CODE=$(curl -X POST "${API_URL}/0/buckets/$BUCKET_ID" -H "accept: application/json" -H "Content-Type: application/json" -d "$JSON" -s -o /dev/null -w "%{http_code}") + if ((HTTP_CODE != 200)); then echo "ERROR creating bucket" - exit -1 + exit 1 fi fi } log_to_bucket() { sess=$1 - DATA=$(tmux display -t $sess -p "{\"title\":\"#{session_name}\",\"session_name\":\"#{session_name}\",\"window_name\":\"#{window_name}\",\"pane_title\":\"#{pane_title}\",\"pane_current_command\":\"#{pane_current_command}\",\"pane_current_path\":\"#{pane_current_path}\"}"); + DATA=$(tmux display -t "$sess" -p "{\"title\":\"#{session_name}\",\"session_name\":\"#{session_name}\",\"window_name\":\"#{window_name}\",\"pane_title\":\"#{pane_title}\",\"pane_current_command\":\"#{pane_current_command}\",\"pane_current_path\":\"#{pane_current_path}\"}") PAYLOAD="{\"timestamp\":\"$(date -Is)\",\"duration\":0,\"data\":$DATA}" echo "$PAYLOAD" - HTTP_CODE=$(curl -X POST "${API_URL}/0/buckets/$BUCKET_ID/heartbeat?pulsetime=$PULSETIME" -H "accept: application/json" -H "Content-Type: application/json" -d "$PAYLOAD" -s -o $TMP_FILE -w %{http_code}) - if (( $HTTP_CODE != 200 )); then + HTTP_CODE=$(curl -X POST "${API_URL}/0/buckets/$BUCKET_ID/heartbeat?pulsetime=$PULSETIME" -H "accept: application/json" -H "Content-Type: application/json" -d "$PAYLOAD" -s -o "$TMP_FILE" -w "%{http_code}") + if ((HTTP_CODE != 200)); then echo "Request failed" - cat $TMP_FILE + cat "$TMP_FILE" fi if [[ "$DEBUG" -eq "1" ]]; then - cat $TMP_FILE + cat "$TMP_FILE" fi } - ### MAIN POLL LOOP declare -A act_last @@ -69,36 +66,31 @@ declare -A act_current init_bucket -while [ true ] -do +while true; do #clear - sessions=$(tmux list-sessions | awk '{print $1}') - if (( $? != 0 )); then + sessions=$(tmux list-sessions | awk '{print $1}') + if ! tmux list-sessions &>/dev/null; then echo "tmux list-sessions ERROR: $?" fi - if (( $? == 0 )); then - LAST_IFS=$IFS - IFS=' -' - for sess in ${sessions}; do - act_time=$(tmux display -t $sess -p '#{session_activity}') - if [[ ! -v "act_last[$sess]" ]]; then - act_last[$sess]='0' - fi - if (( $act_time > ${act_last[$sess]} )); then - # echo "###> "$sess' '$(date -Iseconds)' '$act_time' '$act_last[$sess] ## >> tmux-sess-act.log - log_to_bucket $sess - fi - act_current[$sess]=$act_time - done - IFS=$LAST_IFS - # copy arrays - unset R - declare -A act_last - for sess in "${!act_current[@]}"; do - act_last[$sess]=${act_current[$sess]} - done - fi + LAST_IFS=$IFS + IFS=$'\n' - sleep $POLL_INTERVAL + readarray -t session_list <<<"$sessions" + for sess in "${session_list[@]}"; do + act_time=$(tmux display -t "$sess" -p '#{session_activity}') + if [[ ! -v "act_last[$sess]" ]]; then + act_last[$sess]='0' + fi + if ((act_time > ${act_last[$sess]})); then + # echo "###> "$sess' '$(date -Iseconds)' '$act_time' '$act_last[$sess] ## >> tmux-sess-act.log + log_to_bucket "$sess" + fi + act_current[$sess]=$act_time + done + IFS=$LAST_IFS + for sess in "${!act_current[@]}"; do + act_last[$sess]=${act_current[$sess]} + done + + sleep "$POLL_INTERVAL" done