#!/bin/bash # Half-Life Linux dedicated server initscript # Code by: Tomas Janousek # This is GPL code. if [ -z "$HLDS_CONF" ]; then . `dirname \`readlink -f "$0"\``/hlds.conf else . $HLDS_CONF fi load_conf() { unload_conf ID=$2 . $1 unset ID } unload_conf() { unset SERVER_CFG EXEC_CFG LIBLIST_GAM HLDS_OPTS PRELOADS } update() { pushd $GAMEDIR >/dev/null ./steam -command update -game $GAME -dir . -username $STEAM_USERNAME -password $STEAM_PASS find . -maxdepth 1 -mindepth 1 -! '-(' -name dev -or -name etc -or -name lib '-)' -print0 | xargs -0 chown -R $USER:$USER find . -iregex '.*'/$GAME/$GAME'[0-9]+\.cfg' -maxdepth 2 -print0 | xargs -0 chown root:root popd >/dev/null } start() { if [ -f "$GAMEDIR/$GAME/$GAME$1.cfg" ]; then if [ -f "$GAMEDIR/$GAME$1.pid" ]; then if [ -d "/proc/`cat $GAMEDIR/$GAME$1.pid`/" ]; then echo "This server is already running" return else rm -f "$GAMEDIR/$GAME$1.pid" echo "Deleting pidfile" fi fi echo "Starting HLDS #$1" load_conf "$GAMEDIR/$GAME/$GAME$1.cfg" "$1" # strace -f -o $GAME$1.trace \ # pushd $GAMEDIR >/dev/null LD_LIBRARY_PATH="." \ LD_PRELOAD="$DEDTOOLS/hlds/hlds_chroot.so $DEDTOOLS/hlds/hlds_custom_liblist.so $PRELOADS_GLOBAL $PRELOADS" \ HLDS_USER="$USER" \ HLDS_LOG="$GAME$1.log" \ HLDS_LIBLIST_GAM="$LIBLIST_GAM" \ HLDS_PORT=$[$BASEPORT - 1 + $1] \ ./hlds_i686 -game $GAME -port $[$BASEPORT - 1 + $1] -pidfile "$GAME$1.pid" $HLDS_GLOBAL_OPTS $HLDS_OPTS +servercfgfile "$SERVER_CFG" +exec "$EXEC_CFG" popd >/dev/null unload_conf else echo "This server does not have config" fi } startall() { I=1 while [ -f "$GAMEDIR/$GAME/$GAME$I.cfg" ]; do start $I echo "Sleeping 5 seconds" sleep 5 I=$[$I+1] done } stop() { if [ -f "$GAMEDIR/$GAME$1.pid" ]; then echo "Stopping HLDS #$1" kill `cat "$GAMEDIR/$GAME$1.pid"` rm -f "$GAMEDIR/$GAME$1.pid" else echo "This server does not seem to be running" fi } stopall() { I=1 while [ -f "$GAMEDIR/$GAME$I.pid" ]; do stop $I I=$[$I+1] done } conf() { vim "$GAMEDIR/$GAME/$GAME$1.cfg" } check() { if $DEDTOOLS/hlds/hlds_check $[$BASEPORT - 1 + $1]; then echo "$GAME #$1 does not respond, restarting" stop $1 >/dev/null 2>&1 start $1 >/dev/null 2>&1 fi } checkall() { I=1 while [ -f "$GAMEDIR/$GAME/$GAME$I.cfg" ]; do check $I I=$[$I+1] done } case "$1" in update) update ;; start) start $2 ;; stop) stop $2 ;; startall) startall ;; stopall) stopall ;; restartall) stopall startall ;; restart) stop $2 start $2 ;; conf) conf $2 ;; check) check $2 ;; checkall) checkall ;; *) echo "Usage: $0 {{start|stop|restart|conf|check} |{startall|stopall|restartall|update|checkall}}" ;; esac