working monitor-session-activity.sh, tmux plugin script untested
This commit is contained in:
commit
edf141cc8c
4 changed files with 110 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
*.log
|
10
README.md
Normal file
10
README.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# tmux-watcher-tmux
|
||||||
|
|
||||||
|
A [activity watcher](https://activitywatch.net) for tmux.
|
||||||
|
|
||||||
|
Watches for activity in multiple tmux sesstions and reports `session_name`, `window_name`, `pane_title`, `pane_current_command`, and `pane_current_path`.
|
||||||
|
|
||||||
|
## How to install
|
||||||
|
|
||||||
|
Intall the [Tmux Plugin Manager](https://github.com/tmux-plugins/tpm) and install `akohlbecker/aw-watcher-tmux` as tmux plugin. More detailed instructions are found in the tmp README.
|
||||||
|
|
4
aw-watcher-tmux.tmux
Normal file
4
aw-watcher-tmux.tmux
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
$CURRENT_DIR/scripts/monitor-session-activity.sh &
|
95
scripts/monitor-session-activity.sh
Executable file
95
scripts/monitor-session-activity.sh
Executable file
|
@ -0,0 +1,95 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
POLL_INTERVAL=10 # seconds
|
||||||
|
|
||||||
|
BUCKET_ID="aw-watcher-tmux"
|
||||||
|
HOST="localhost"
|
||||||
|
PORT="5600"
|
||||||
|
API_URL="http://$HOST:$PORT/api"
|
||||||
|
PULSETIME="120.0"
|
||||||
|
|
||||||
|
######
|
||||||
|
# Related documentation:
|
||||||
|
# * https://github.com/tmux/tmux/wiki/Formats
|
||||||
|
# * https://github.com/tmux/tmux/wiki/Advanced-Use#user-content-getting-information
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
### FUNCTIONS
|
||||||
|
|
||||||
|
DEBUG=0
|
||||||
|
TMP_FILE=$(mktemp)
|
||||||
|
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
|
||||||
|
echo "ERROR creating bucket"
|
||||||
|
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}\"}");
|
||||||
|
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
|
||||||
|
echo "Request failed"
|
||||||
|
cat $TMP_FILE
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$DEBUG" -eq "1" ]]; then
|
||||||
|
cat $TMP_FILE
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
### MAIN POLL LOOP
|
||||||
|
|
||||||
|
declare -A act_last
|
||||||
|
declare -A act_current
|
||||||
|
|
||||||
|
init_bucket
|
||||||
|
|
||||||
|
while [ true ]
|
||||||
|
do
|
||||||
|
#clear
|
||||||
|
sessions=$(tmux list-sessions | awk '{print $1}')
|
||||||
|
if (( $? != 0 )); 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
|
||||||
|
|
||||||
|
sleep $POLL_INTERVAL
|
||||||
|
done
|
Loading…
Add table
Reference in a new issue