mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2024-12-28 09:58:30 +01:00
191 lines
4.7 KiB
Bash
191 lines
4.7 KiB
Bash
|
#!/bin/bash
|
||
|
|
||
|
NGAMES=${NGAMES:-20}
|
||
|
ROOM=${ROOM:-room}
|
||
|
DICT=./dict.xwd
|
||
|
HOST=localhost
|
||
|
PORT=10999
|
||
|
XWORDS=obj_linux_memdbg/xwords
|
||
|
WAIT=10
|
||
|
LAUNCH_WAIT=30
|
||
|
|
||
|
RUN_NAME=$(basename $0)/_$$
|
||
|
|
||
|
usage() {
|
||
|
cat <<EOF
|
||
|
usage: $0
|
||
|
[--ngames <n>] # default: $NGAMES
|
||
|
[--room <s>] # default: $ROOM
|
||
|
[--port <n>] # default: $PORT
|
||
|
[--host <s>] # default: $HOST
|
||
|
[--wait <d>] # max wait time between moves; default: $WAIT
|
||
|
[--launch-wait <d>] # max wait time before launching; default: $LAUNCH_WAIT
|
||
|
[--nuke] # remove old logs; default: $NUKE
|
||
|
[--save-good] # don't nuke logs for games that complete; default: $SAVE_GOOD
|
||
|
Run a bunch of games all with the same name.
|
||
|
EOF
|
||
|
exit 0
|
||
|
}
|
||
|
|
||
|
while [ -n "$1" ]; do
|
||
|
case $1 in
|
||
|
--room)
|
||
|
ROOM=$2
|
||
|
shift
|
||
|
;;
|
||
|
--ngames)
|
||
|
NGAMES=$2
|
||
|
shift
|
||
|
;;
|
||
|
--port)
|
||
|
PORT=$2
|
||
|
shift
|
||
|
;;
|
||
|
--host)
|
||
|
HOST=$2
|
||
|
shift
|
||
|
;;
|
||
|
--wait)
|
||
|
WAIT=$2
|
||
|
shift
|
||
|
;;
|
||
|
--launch-wait)
|
||
|
LAUNCH_WAIT=$2
|
||
|
shift
|
||
|
;;
|
||
|
--nuke)
|
||
|
NUKE=1
|
||
|
;;
|
||
|
--save-good)
|
||
|
SAVE_GOOD=1
|
||
|
;;
|
||
|
*)
|
||
|
usage
|
||
|
;;
|
||
|
esac
|
||
|
shift
|
||
|
done
|
||
|
|
||
|
launch_game() {
|
||
|
ROOM=$1
|
||
|
LOG=$2
|
||
|
N_GUESTS=$3
|
||
|
N_ON_HOST=$4
|
||
|
|
||
|
[ "$LAUNCH_WAIT" -gt 0 ] && sleep $(($RANDOM % $LAUNCH_WAIT))
|
||
|
|
||
|
G=""
|
||
|
|
||
|
if [ "$N_ON_HOST" -gt 0 ]; then # I'm server
|
||
|
S="-s"
|
||
|
for II in $(seq $N_GUESTS); do G="$G -N"; done
|
||
|
for II in $(seq $N_ON_HOST); do S="$S -r Eric"; done
|
||
|
else
|
||
|
S=""
|
||
|
for II in $(seq $N_GUESTS); do G="$G -r Eric"; done
|
||
|
fi
|
||
|
|
||
|
exec $XWORDS -u -0 -z 0:$WAIT -d $DICT -C $ROOM -q 2 -a $HOST -p $PORT $S $G 2>$LOG >/dev/null < /dev/null
|
||
|
}
|
||
|
|
||
|
r_safe_mod() {
|
||
|
NUM=$1
|
||
|
[ $NUM -eq 0 ] || NUM=$(( RANDOM % $NUM ))
|
||
|
echo $NUM
|
||
|
}
|
||
|
|
||
|
log_name() {
|
||
|
INDX=${1:-0}
|
||
|
echo "/tmp/$RUN_NAME/log_${INDX}.txt"
|
||
|
}
|
||
|
|
||
|
fill_room() {
|
||
|
INDX=$1
|
||
|
NPLAYERS=$2
|
||
|
|
||
|
while [ $NPLAYERS -ge 2 ]; do
|
||
|
NTHISGAME=$((2 + $(($RANDOM % 3))))
|
||
|
[ $NTHISGAME -le $NPLAYERS ] || NTHISGAME=$NPLAYERS
|
||
|
NPLAYERS=$(( $NPLAYERS - $NTHISGAME ))
|
||
|
GAME_STR=""
|
||
|
|
||
|
NPLAYERS_HOST=$(( 1+ $(r_safe_mod $((NTHISGAME - 1))) ))
|
||
|
NPLAYERS_GUESTS=$(( NTHISGAME - NPLAYERS_HOST ))
|
||
|
for II in $(seq $NPLAYERS_HOST); do GAME_STR="${GAME_STR}H"; done
|
||
|
|
||
|
launch_game $ROOM $(log_name $INDX) $NPLAYERS_GUESTS $NPLAYERS_HOST &
|
||
|
INDX=$((1+INDX))
|
||
|
while [ $NPLAYERS_GUESTS -gt 0 ]; do
|
||
|
GAME_STR="${GAME_STR}:"
|
||
|
NTHISGUEST=$(( 1 + $( r_safe_mod $((NPLAYERS_GUESTS - 1))) ))
|
||
|
for II in $(seq $NTHISGUEST); do GAME_STR="${GAME_STR}G"; done
|
||
|
NPLAYERS_GUESTS=$((NPLAYERS_GUESTS - NTHISGUEST))
|
||
|
launch_game $ROOM $(log_name $INDX) $NTHISGUEST 0 &
|
||
|
INDX=$((1+INDX))
|
||
|
done
|
||
|
echo $GAME_STR
|
||
|
done
|
||
|
}
|
||
|
|
||
|
# Problem is we don't know what games will wind up together. We match
|
||
|
# by seeds: all the games together will have the same seed. If all
|
||
|
# ended properly that's a good game. Save it (for now; delete later
|
||
|
# when that's the norm.)
|
||
|
check_logs() {
|
||
|
DIR=$(dirname $(log_name))
|
||
|
|
||
|
mkdir -p $DIR/bad
|
||
|
CONNAMES=$(grep 'relayPreProcess: connName' $DIR/* | sed 's,^.*connName: "\(.*\) eehouse.org.*$,\1,' | sort -u)
|
||
|
for CONNAME in $CONNAMES; do
|
||
|
NFILES=$((${#CONNAME}/4))
|
||
|
SEEDS=""
|
||
|
GOOD_FILES=""
|
||
|
FOUND=0
|
||
|
while [ -n "$CONNAME" ]; do
|
||
|
SEED=${CONNAME:0:4}
|
||
|
FPATH=$(grep "channelSeed: $SEED" $DIR/* | sed 's,:.*,,')
|
||
|
if [ -f "$FPATH" ]; then
|
||
|
if grep -q XWPROTO_END_GAME $FPATH; then
|
||
|
FOUND=$((FOUND+1))
|
||
|
GOOD_FILES="$GOOD_FILES $FPATH"
|
||
|
fi
|
||
|
fi
|
||
|
SEEDS="$SEEDS ${CONNAME:0:4}"
|
||
|
CONNAME=${CONNAME:4}
|
||
|
done
|
||
|
if [ $FOUND -eq $NFILES ]; then
|
||
|
if [ -n "$SAVE_GOOD" ]; then
|
||
|
mkdir -p $DIR/good
|
||
|
mv $GOOD_FILES $DIR/good
|
||
|
else
|
||
|
rm -f $GOOD_FILES
|
||
|
fi
|
||
|
echo "game with${SEEDS} completed successfully" 1>&2
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
if [ 0 -eq $(ls -l $DIR | grep '\-rw-r--r--' | wc -l) ]; then
|
||
|
echo "no more log files; done?"
|
||
|
return 0
|
||
|
else
|
||
|
return 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
watch_and_wait() {
|
||
|
while :; do
|
||
|
sleep 10
|
||
|
check_logs && break
|
||
|
done
|
||
|
}
|
||
|
|
||
|
|
||
|
[ -n "$NUKE" ] && rm -rf $(dirname $(dirname $(log_name)))
|
||
|
mkdir -p $(dirname $(log_name))
|
||
|
|
||
|
INDX=0
|
||
|
fill_room $INDX $NGAMES
|
||
|
INDX=$((INDX+NGAMES))
|
||
|
|
||
|
watch_and_wait
|