commit b5547fc04c7380eb69e81969058a13b70052bf44 parent 84216d86cb683bcb8c0a9f8dd05f45feea64f765 Author: giygas <giygas@boymiasma.net> Date: Mon, 13 Oct 2025 02:18:22 +0200 server status query script query script Diffstat:
| A | husk.sh | | | 51 | +++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 51 insertions(+), 0 deletions(-)
diff --git a/husk.sh b/husk.sh @@ -0,0 +1,51 @@ +#!/bin/sh +PROGNAME="$(basename "$0")" +NC_TIMEOUT=1 + +notify() { echo "$PROGNAME: $@"; } +warn() { echo "$PROGNAME: $@" >&2; } +fatal() { + trap "exit 1" TERM + echo "$PROGNAME: $@" >&2 + kill $$ +} +clean() { true; } +trap "clean" EXIT TERM INT + +fetch() { + typeset TARGET PORT + PORT=7717 + if [ $# -lt 1 ]; then fatal "usage: fetch server_name [port]"; exit 1; fi + TARGET="$1"; shift + if [ ! -z "$1" ]; then PORT="$1"; fi + + echo '\info\' | nc -w "$NC_TIMEOUT" -u "$TARGET" "$PORT" | awk -v RS='\\' \ + 'NR==1 { next } # empty field from leading \ + /^final$/ { exit } + (NR%2) == 0 { key=$0; next } + { print key" "$0 }' +} + +format() { + typeset FMT + if [ $# -lt 1 ]; then fatal "usage: format format_string [string ...]"; exit 1; fi + FMT="$1"; shift + + awk '{ key=$1; $1=""; $0=substr($0,2); pairs[key]=$0 } END { '"$(gen_printf "$FMT" $*)"' }' +} + +gen_printf() { + typeset FMT STRINGS + if [ $# -lt 1 ]; then fatal "usage: format format_string [string ...]"; exit 1; fi + FMT="$1"; shift + + while [ $# -ge 1 ]; do + STRINGS="$STRINGS,pairs[\"$1\"]" + shift + done + + echo "printf(\"$FMT\"$STRINGS)" +} + +if [ $# -lt 1 ]; then fatal "usage: $PROGNAME server_name port"; fi +fetch $* | format "%s on %s [%s/%s]\n" hostname mapname numplayers maxplayers