Files
virtual-dsm/src/socket.sh
T

72 lines
1.3 KiB
Bash

#!/usr/bin/env bash
set -Eeuo pipefail
lastmsg=""
lastcmd=""
status="/run/shm/msg.html"
command="/run/shm/status.cmd"
dir=$(dirname -- "$status")
status_name=$(basename -- "$status")
command_name=$(basename -- "$command")
# websocketd clients use s: for status updates and c: for control commands.
refreshStatus() {
[ ! -f "$status" ] && return 0
[ ! -s "$status" ] && return 0
msg=$(< "$status") || return 0
msg="${msg%$'\n'}"
[ -z "$msg" ] && return 0
[[ "$msg" == "$lastmsg" ]] && return 0
lastmsg="$msg"
echo "s: $msg"
return 0
}
refreshCommand() {
[ ! -f "$command" ] && return 0
[ ! -s "$command" ] && return 0
cmd=$(< "$command") || return 0
cmd="${cmd%$'\n'}"
[ -z "$cmd" ] && return 0
[[ "$cmd" == "$lastcmd" ]] && return 0
lastcmd="$cmd"
echo "c: $cmd"
return 0
}
refreshStatus
refreshCommand
# Watch the directory because status and command updates use atomic rename.
inotifywait \
-m -q \
-e close_write,moved_to \
--format '%e %f' \
"$dir" |
while read -r event file; do
case "$file" in
"$status_name" )
case "${event,,}" in
"close_write"* | "moved_to"* )
refreshStatus ;;
esac ;;
"$command_name" )
case "${event,,}" in
"close_write"* | "moved_to"* )
refreshCommand ;;
esac ;;
esac
done