scraketools

administrative aid for hosting multiple Killing Floor 1 dedicated servers
git clone git://git.boymiasma.net/scraketools
Log | Files | Refs | README

husk.sh (1255B)


      1 #!/bin/sh
      2 PROGNAME="$(basename "$0")"
      3 NC_TIMEOUT=1
      4 
      5 notify() { echo "$PROGNAME: $@"; }
      6 warn() { echo "$PROGNAME: $@" >&2; }
      7 fatal() {
      8         trap "exit 1" TERM
      9         echo "$PROGNAME: $@" >&2
     10         kill $$
     11 }
     12 clean() { true; }
     13 trap "clean" EXIT TERM INT
     14 
     15 fetch() {
     16 	typeset TARGET PORT
     17 	PORT=7717
     18 	if [ $# -lt 1 ]; then fatal "usage: fetch server_name [port]"; exit 1; fi
     19 	TARGET="$1"; shift
     20 	if [ ! -z "$1" ]; then PORT="$1"; fi
     21 
     22 	echo '\info\' | nc -w "$NC_TIMEOUT" -u "$TARGET" "$PORT" | awk -v RS='\\' \
     23 		'NR==1 { next } # empty field from leading \
     24 		/^final$/ { exit }
     25 		(NR%2) == 0 { key=$0; next }
     26 		{ print key" "$0 }'
     27 }
     28 
     29 format() {
     30 	typeset FMT
     31 	if [ $# -lt 1 ]; then fatal "usage: format format_string [string ...]"; exit 1; fi
     32 	FMT="$1"; shift
     33 
     34 	awk '{ key=$1; $1=""; $0=substr($0,2); pairs[key]=$0 } END { '"$(gen_printf "$FMT" $*)"' }'
     35 	echo
     36 }
     37 
     38 gen_printf() {
     39 	typeset FMT STRINGS
     40 	if [ $# -lt 1 ]; then fatal "usage: format format_string [string ...]"; exit 1; fi
     41 	FMT="$1"; shift
     42 
     43 	while [ $# -ge 1 ]; do
     44 		STRINGS="$STRINGS,pairs[\"$1\"]"
     45 		shift
     46 	done
     47 
     48 	echo "printf(\"$FMT\"$STRINGS)"
     49 }
     50 
     51 if [ $# -lt 1 ]; then fatal "usage: $PROGNAME server_name port"; fi
     52 fetch $* | format "%s on %s [%s/%s]" hostname mapname numplayers maxplayers