#!/bin/sh

_verbose=false
_logit=false

# Set CLIENT and EMPIREDIR to work on your local machine.

CLIENT=/home/zabel/emp/emp2/EMP2.0/bin/emp_client
tbase=/tmp/empcheck.$$
EMPIREDIR=/home/zabel/emp/emp2/EMP2.0

trap 'rm -f $FNAMES ; exit' 0 1 2 3 15

putmsg() {
    if [ "$_verbose" = "true" ]; then
	echo $*
    fi
}


ERR0="Server EOF"
ERR1="connect: Connection refused"
ERR2="Expecting 2, got unix socket connect: No such file or directory"
MDOWN="The game is down"

killit() {
    PROC=$1

    FK=${tbase}.kill
    FNAMES="$FNAMES ${FK}.L ${FK}.P"
    rm -f ${FK}.L ${FK}.P

    ps -aux >${FK}.L
    egrep "$PROC" ${FK}.L | egrep "$USER" >${FK}.P

    SZ="`wc -l ${FK}.P | awk '{print $1}' -`"
    if [ $SZ -gt 0 ]; then
	PIDS=`awk '{rec = rec " " $2} END {print rec}' ${FK}.P`
	putmsg "Found pids " $PIDS " to kill for" '$PROC'
	kill $PIDS
    fi
    rm -f ${FK}.L ${FK}.P
}

kill9it() {
    PROC=$1

    FK=${tbase}.kill
    FNAMES="$FNAMES ${FK}.L ${FK}.P"
    rm -f ${FK}.L ${FK}.P

    ps -aux >${FK}.L
    egrep "$PROC" ${FK}.L | egrep "$USER" >${FK}.P

    SZ="`wc -l ${FK}.P | awk '{print $1}' -`"
    if [ $SZ -gt 0 ]; then
	PIDS=`awk '{rec = rec " " $2} END {print rec}' ${FK}.P`
	putmsg "Found pids " $PIDS " to kill for" '$PROC'
	kill -9 $PIDS
    fi
    rm -f ${FK}.L ${FK}.P
}

restartgame() {
    DIR=$1
    UNIQ=$2

    killit "emp_tm $UNIQ"
    kill9it "emp_login $UNIQ"
    rm -f $DIR/data/tm_port
    cd $DIR/bin
    emp_tm $UNIQ
    emp_login $UNIQ
    echo "restarted $UNIQ"
    cd $HOME
}

checkgame() {
    PORT=$1
    COUN=$2
    PASS=$3

    EMPIREHOST=`/bin/hostname`
    EMPIREPORT=$PORT
    COUNTRY=$COUN
    PLAYER=$PASS
    export EMPIREHOST EMPIREPORT COUNTRY PLAYER

    FN=${tbase}.client
    rm -f ${FN}.I  ${FN}.1 ${FN}.2
    FNAMES="$FNAMES ${FN}.I ${FN}.1 ${FN}.2"
    echo "quit" >${FN}.I
    echo "quit" >${FN}.I

    $CLIENT >${FN}.1 2>${FN}.2  <${FN}.I
    STAT=$?
    ER=`head -1 ${FN}.2`
    NORM=`head -1 ${FN}.1`

    if [ "$STAT" = "0" ]; then
	ALLOK=true
	putmsg "All Ok"
    elif [ "$ER" = "$ERR0" ]; then
	ALLOK=true
	putmsg "All Ok, but bad return status"
    elif [ "$ER" = "$ERR1" ]; then
	ALLOK=false
	LOGINDOWN=true
	putmsg "At least emp_login is dead"
    elif [ "$ER" = "$ERR2" ]; then
	ALLOK=false
	TMDOWN=true
	putmsg "emp_tm is dead"
    else
	ALLOK=false
	putmsg "Something unknown is wrong"
    fi
    rm -f ${FN}.I  ${FN}.1 ${FN}.2
}


while [ $# -gt 0 ]; do
    case "$1" in
	# -kill game
	"-kill") shift
	    if [ $# -lt 1 ]; then
		echo "Expecting -kill <game>"
		exit 1
	    fi
	    killit "emp_tm $1"
	    kill9it "emp_login $1"
	    shift ;;
	# -start game dir
	"-start") shift
	    if [ $# -lt 2 ]; then
		echo "Expecting -start <game> <dir>"
		exit 1
	    fi
	    restartgame $2 $1
	    shift ;shift;;
	# -check game dir port country user
	"-check") shift
	    if [ $# -lt 5 ]; then
		echo "Expecting -check <game> <dir> <port> <tcoun> <tuser>"
		exit 1
	    fi
	    checkgame $3 $4 $5
	    if [ "$ALLOK" != "true" ]; then
		restartgame $2 $1
	    fi
	    shift ; shift ; shift ; shift ; shift ;;
	*) echo "Unknown parameter found in: $*."
	    echo "Aborting."
	    exit 1 ;;
    esac
done

