--- NetGamesUSA.com/ngStats/ngStatsUT.cfg Thu Oct 18 18:27:19 2001 +++ NetGamesUSA.com/ngStats/ngStatsUT.cfg Thu Oct 18 18:27:19 2001 @@ -93,7 +93,7 @@ # false = do not create graphs -SpawnBrowser true +SpawnBrowser false #SpawnBrowser = Advanced option for those running dedicated servers on which it #is undesirable to have ngStatsUT.exe automatically launch the default web browser --- NetGamesUSA.com/ngWorldStats/bin/bgWorldStats Thu Jan 1 01:00:00 1970 +++ NetGamesUSA.com/ngWorldStats/bin/bgWorldStats Thu Oct 18 18:27:19 2001 @@ -0,0 +1,277 @@ +#!/bin/bash +defopts=-vrl + +# bgWorldStats 1.2 +# Copyright (c) 2001 "Ouch@Schooner.COM" +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appear in all copies. +# The author makes no representations about the suitability of this +# software for any purpose. It is provided "as is" without express +# or implied warranty. +# +# http://illuminati.guildhappy.com/ +# +# This will run the NG stats sender in the background, immediately returning +# to UT. +# +# Installation: +# Put this script (chmod a+x) into same directory as the existing +# ngWorldStats binary: +# /NetGamesUSA.com/ngWorldStats/bin +# and call it "bgWorldStats" +# +# Change your server's .ini to include this: +# +# WorldBatcherURL=../NetGamesUSA.com/ngWorldStats/bin/bgWorldStats +# WorldBatcherParams=-vrl +# +# Or, edit the "defopts" line above to include "-vrl" +# +# NOTICE: +# This script has only been tested on FreeBSD with the Linux UT server +# started with the "-nohomedir" option. +# + +# +# Inspired by ngWorldStats.sh, originally by +# and modified (v1.2) by Leif Sawyer +# + +# +# Change history: +# 2001-02-26 1.2 released +# close leaked fd's (bash required), add -C and -R options +# 2001-01-30 1.1 released +# first public release + +Usage() { + echo 2>&1 Usage: `basename $0` '[-vlrDCR] [-s statsbin] [-d logsdir] [-g gametype] + Options: + -v verbose ngWorldStats output + -r carry forward last result code + -l direct output to transcript log (only saved if an error occurs) + + Debugging (only when needed): + -D enable debugging output + -C do not close leaked file descriptors + -R do not remove transcript logs of successful runs + + Change defaults: + -d logs directory path (if relative, must be from /System) + ["'$logs'"] + -g game type ["UT"] + -s ngWorldStats program to use ["ngWorldStats"] - not a pathname' + exit 2 +} + +# UT runs us as "../NetGamesUSA.com/ngWorldStats/bin/bgWorldStats" +# UT execs us from the "/System" directory. + +bin=`dirname $0` +logs=$bin/../logs + +args=`getopt DCRrvls:g:d: $defopts $*` +if [ $? != 0 ]; then Usage; fi +oargs=$@ +set -- $args +for i +do + case "$1" in + -D) debug=true ;; + -v) verbose=-v ;; + -r) doresults=true ;; + -l) dologfile=true ;; + -R) dontcleanlogs=true ;; + -C) dontclose=false ;; + -s) statsbin=$2; shift ;; + -d) logs=$2; shift ;; + -g) game=$2; shift ;; + --) shift; break ;; + esac + shift +done +case $# in +0) ;; +*) Usage;; +esac + +# +# Main variables +# + +# ngWorldStats executable +stats=$bin/${statsbin:-ngWorldStats} + +# game +game=${game:-UT} + +# Saved ngWorldStats result from last run +results=$logs/.lastresult + +# When we were run +now=`date +%y%m%d-%H%M` + +if ${dologfile-false} +then + # redirect stdout to log file of our run + logf=$logs/.ngrun.$now + exec > $logf 2>&1 +fi + +if ${debug-false} +then + echo Started at: `date` + echo Called as: $0 $oargs + echo In Directory: `pwd` + echo "" +fi + +# ngWorldStats exit codes +ngE=1 # error (?) +ngNoLog=83 # no logfiles +ngBusy=97 # ngWorldStats already running +ngOK=99 # ngWorldStats successful +ngSyntax=139 # Server Syntax error + +# +# Ugly shell locking code +# +# All systems don't have shlock(1) (from INN) or lockfile (1) (from procmail); +# FreeBSD has lockf(1) but it doesn't have the semantics I want here. +# So this makes up for it in a "somewhat" portable, safe fashion, under +# the assumption that there isn't going to be significant contention. +# +# Lock using file path $1, returning an error message +# (with original lock time and pid) if it fails. +# +# return 0 for OK; 1 for locked; 2 for lock file error +# Error message to stdout +# +Lock() { + l=$1 + if ! mkdir $l >/dev/null 2>&1 + then + if [ ! -d $l ] + then + echo "ERROR: $l not a lock dir" + return 2 + elif [ ! -r $l/lock ] + then + # race? + echo "ERROR: $l does not have a lock info file" + return 2 + fi + read p d < $l/lock + # still around? + if ps p$p >/dev/null 2>&1 + then + echo ALREADY LOCKED: by pid $p at $d + return 1 + fi + # must be stale, override it + echo 1>&2 "STALE LOCK REMOVED: by pid $p at $d" + fi + echo $$ `date` > $l/lock + return 0 +} +Unlock() { + l=$1 + rm -rf $l +} + +# +# Start the real work here +# + +# +# Take a lock, or return busy to the UT server +# + +lockf=$logs/.ngWS.lock +ret=`Lock $lockf` +if [ $? != 0 ] +then + echo Lock error: $ret + exit $ngBusy +fi + +# +# UT leaks file descriptors (including the listening socket) to us. +# If we don't close these, the next server instance won't be able to bind to +# the ServerQueryPort (i.e., 7778) and will pick the next available one +# (i.e., 7783), even if we are in the background +# +# How many leaked? Lots. On my server it was fds 3..70, with 8 of those +# sockets. I don't know if it varies, so I just close "a whole bunch". +# +close-fds() { + ${debug-false} && fstat -p$$ + fd=3 + while [ $fd -lt $1 ] + do + # this next line requires bash2 to work for fd>9 (damn) + eval "exec $fd<&-" + fd=$(($fd+1)) + done + ${debug-false} && fstat -p$$ +} + +# prevent fd leaks +# do this before forking child to avoid race conditions +${dontclose-false} || close-fds 200 + +# +# Start child process to send stats +# + +( + # Give parent a moment to go away + sleep 1 + + echo Exec: $stats -d $logs -g UT $verbose + echo Start: `date` + $stats -d $logs -g UT $verbose + ret=$? + echo End: `date` + + case "$ret" in + $ngNoLog) echo "No logfiles found" ;; + $ngBusy) echo "ngWorldStats already running" ;; + $ngOK) echo "ngWorldStats successful" ;; + $ngSyntax) echo "Server Syntax error" ;; + *) echo "ngWorldStats returned $ret" ;; + esac + + # remove transcript log if run was OK + if ${dologfile-false} + then + case "$ret" in + $ngOK) ${dontcleanlogs-false} || rm -f $logf;; + esac + fi + + if ${doresults-false} + then + echo $ret > $results + else + rm -f $results 2> /dev/null + fi + + Unlock $lockf +) & + +# +# Meanwhile, in the parent process, return result to UT +# + +# close the log file - the child will complete the output +exec >&- 2>&- + +if ${doresults-false} && [ -r $results ] +then + lastresults=`cat $results` +fi + +exit ${lastresults:-$ngOK} --- NetGamesUSA.com/ngWorldStats/bin/ngWorldStats.exe Thu Oct 18 18:27:19 2001 +++ NetGamesUSA.com/ngWorldStats/bin/ngWorldStats.exe Thu Oct 18 18:27:19 2001 @@ -1,56 +1,277 @@ -#!/bin/sh +#!/bin/bash +defopts=-vrl + +# bgWorldStats 1.2 +# Copyright (c) 2001 "Ouch@Schooner.COM" +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appear in all copies. +# The author makes no representations about the suitability of this +# software for any purpose. It is provided "as is" without express +# or implied warranty. # -# ngWorldStats.exe for linux -# version 0.3.0, 2000-10-06 -# abfackeln@abfackeln.com +# http://illuminati.guildhappy.com/ # -######################################## +# This will run the NG stats sender in the background, immediately returning +# to UT. # -# this file contains no user servicable parts. +# Installation: +# Put this script (chmod a+x) into same directory as the existing +# ngWorldStats binary: +# /NetGamesUSA.com/ngWorldStats/bin +# and call it "bgWorldStats" # -######################################## +# Change your server's .ini to include this: # -# the objective of this script was to execute the -# ngWorldStats batcher without hanging up the -# UT server by waiting for the NetGames server -# to respond (which sometimes may take a long -# time and force the UT server to switch ports -# which is obviously a bad thing) +# WorldBatcherURL=../NetGamesUSA.com/ngWorldStats/bin/bgWorldStats +# WorldBatcherParams=-vrl # -# a new objective is to support the home -# directory option introduced in loki games -# linux UT 4.25 server by searching for all -# possible locations for the ngWorldStats -# binary executable file +# Or, edit the "defopts" line above to include "-vrl" # -# comments and suggestions to enhance this -# script should be sent to abfackeln at -# abfackeln@abfackeln.com +# NOTICE: +# This script has only been tested on FreeBSD with the Linux UT server +# started with the "-nohomedir" option. +# + +# +# Inspired by ngWorldStats.sh, originally by +# and modified (v1.2) by Leif Sawyer +# + # -# as always, any comments are welcome and -# i hope that this script alleviates all of -# the ngWorldStats problems from the past +# Change history: +# 2001-02-26 1.2 released +# close leaked fd's (bash required), add -C and -R options +# 2001-01-30 1.1 released +# first public release + +Usage() { + echo 2>&1 Usage: `basename $0` '[-vlrDCR] [-s statsbin] [-d logsdir] [-g gametype] + Options: + -v verbose ngWorldStats output + -r carry forward last result code + -l direct output to transcript log (only saved if an error occurs) + + Debugging (only when needed): + -D enable debugging output + -C do not close leaked file descriptors + -R do not remove transcript logs of successful runs + + Change defaults: + -d logs directory path (if relative, must be from /System) + ["'$logs'"] + -g game type ["UT"] + -s ngWorldStats program to use ["ngWorldStats"] - not a pathname' + exit 2 +} + +# UT runs us as "../NetGamesUSA.com/ngWorldStats/bin/bgWorldStats" +# UT execs us from the "/System" directory. + +bin=`dirname $0` +logs=$bin/../logs + +args=`getopt DCRrvls:g:d: $defopts $*` +if [ $? != 0 ]; then Usage; fi +oargs=$@ +set -- $args +for i +do + case "$1" in + -D) debug=true ;; + -v) verbose=-v ;; + -r) doresults=true ;; + -l) dologfile=true ;; + -R) dontcleanlogs=true ;; + -C) dontclose=false ;; + -s) statsbin=$2; shift ;; + -d) logs=$2; shift ;; + -g) game=$2; shift ;; + --) shift; break ;; + esac + shift +done +case $# in +0) ;; +*) Usage;; +esac + # -# -abf. +# Main variables # -######################################## -WorldBatcherURL="../NetGamesUSA.com/ngWorldStats/bin/ngWorldStats" +# ngWorldStats executable +stats=$bin/${statsbin:-ngWorldStats} -if [ ! -x "$WorldBatcherURL" ]; then - INSTALL_DIR=`cat $HOME/.loki/ut/install_dir` - HomeBatcherURL="$INSTALL_DIR/NetGamesUSA.com/ngWorldStats/bin/ngWorldStats" +# game +game=${game:-UT} - if [ ! -x "$HomeBatcherURL" ]; then - echo "ngWS ERROR: can not exec: $WorldBatcherURL or $HomeBatcherURL" - exit 0 +# Saved ngWorldStats result from last run +results=$logs/.lastresult + +# When we were run +now=`date +%y%m%d-%H%M` + +if ${dologfile-false} +then + # redirect stdout to log file of our run + logf=$logs/.ngrun.$now + exec > $logf 2>&1 +fi + +if ${debug-false} +then + echo Started at: `date` + echo Called as: $0 $oargs + echo In Directory: `pwd` + echo "" +fi + +# ngWorldStats exit codes +ngE=1 # error (?) +ngNoLog=83 # no logfiles +ngBusy=97 # ngWorldStats already running +ngOK=99 # ngWorldStats successful +ngSyntax=139 # Server Syntax error + +# +# Ugly shell locking code +# +# All systems don't have shlock(1) (from INN) or lockfile (1) (from procmail); +# FreeBSD has lockf(1) but it doesn't have the semantics I want here. +# So this makes up for it in a "somewhat" portable, safe fashion, under +# the assumption that there isn't going to be significant contention. +# +# Lock using file path $1, returning an error message +# (with original lock time and pid) if it fails. +# +# return 0 for OK; 1 for locked; 2 for lock file error +# Error message to stdout +# +Lock() { + l=$1 + if ! mkdir $l >/dev/null 2>&1 + then + if [ ! -d $l ] + then + echo "ERROR: $l not a lock dir" + return 2 + elif [ ! -r $l/lock ] + then + # race? + echo "ERROR: $l does not have a lock info file" + return 2 + fi + read p d < $l/lock + # still around? + if ps p$p >/dev/null 2>&1 + then + echo ALREADY LOCKED: by pid $p at $d + return 1 fi + # must be stale, override it + echo 1>&2 "STALE LOCK REMOVED: by pid $p at $d" + fi + echo $$ `date` > $l/lock + return 0 +} +Unlock() { + l=$1 + rm -rf $l +} + +# +# Start the real work here +# + +# +# Take a lock, or return busy to the UT server +# - WorldBatcherURL="$HomeBatcherURL" +lockf=$logs/.ngWS.lock +ret=`Lock $lockf` +if [ $? != 0 ] +then + echo Lock error: $ret + exit $ngBusy fi -$WorldBatcherURL $* & -echo "ngWS OK: $WorldBatcherURL $* &" +# +# UT leaks file descriptors (including the listening socket) to us. +# If we don't close these, the next server instance won't be able to bind to +# the ServerQueryPort (i.e., 7778) and will pick the next available one +# (i.e., 7783), even if we are in the background +# +# How many leaked? Lots. On my server it was fds 3..70, with 8 of those +# sockets. I don't know if it varies, so I just close "a whole bunch". +# +close-fds() { + ${debug-false} && fstat -p$$ + fd=3 + while [ $fd -lt $1 ] + do + # this next line requires bash2 to work for fd>9 (damn) + eval "exec $fd<&-" + fd=$(($fd+1)) + done + ${debug-false} && fstat -p$$ +} + +# prevent fd leaks +# do this before forking child to avoid race conditions +${dontclose-false} || close-fds 200 + +# +# Start child process to send stats +# -exit 99 +( + # Give parent a moment to go away + sleep 1 + + echo Exec: $stats -d $logs -g UT $verbose + echo Start: `date` + $stats -d $logs -g UT $verbose + ret=$? + echo End: `date` + + case "$ret" in + $ngNoLog) echo "No logfiles found" ;; + $ngBusy) echo "ngWorldStats already running" ;; + $ngOK) echo "ngWorldStats successful" ;; + $ngSyntax) echo "Server Syntax error" ;; + *) echo "ngWorldStats returned $ret" ;; + esac + + # remove transcript log if run was OK + if ${dologfile-false} + then + case "$ret" in + $ngOK) ${dontcleanlogs-false} || rm -f $logf;; + esac + fi + + if ${doresults-false} + then + echo $ret > $results + else + rm -f $results 2> /dev/null + fi + + Unlock $lockf +) & + +# +# Meanwhile, in the parent process, return result to UT +# + +# close the log file - the child will complete the output +exec >&- 2>&- + +if ${doresults-false} && [ -r $results ] +then + lastresults=`cat $results` +fi +exit ${lastresults:-$ngOK}