summaryrefslogtreecommitdiff
path: root/linux/srcds_run
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /linux/srcds_run
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'linux/srcds_run')
-rw-r--r--linux/srcds_run445
1 files changed, 445 insertions, 0 deletions
diff --git a/linux/srcds_run b/linux/srcds_run
new file mode 100644
index 0000000..69c838d
--- /dev/null
+++ b/linux/srcds_run
@@ -0,0 +1,445 @@
+#!/bin/sh
+#
+# Copyright (c) 2004, Valve LLC. All rights reserved.
+#
+# a wrapper script for the main Source engine dedicated server binary.
+# Performs auto-restarting of the server on crash. You can
+# extend this to log crashes and more.
+#
+
+# setup the libraries, local dir first!
+export LD_LIBRARY_PATH=".:bin:$LD_LIBRARY_PATH"
+
+init() {
+ # Initialises the various variables
+ # Set up the defaults
+ GAME=""
+ DEBUG=""
+ RESTART="yes"
+ HL=./srcds_i486
+ HL_LOCATION=./
+ HL_DETECT=1
+ TIMEOUT=10 # time to wait after a crash (in seconds)
+ CRASH_DEBUG_MSG="email debug.log to [email protected]"
+ GDB="gdb" # the gdb binary to run
+ DEBUG_LOG="debug.log"
+ PID_FILE="" # only needed it DEBUG is set so init later
+ STEAM=""
+ PID_FILE_SET=0
+ STEAMERR=""
+ SIGINT_ACTION="quit 0" # exit normally on sig int
+ NO_TRAP=0
+ AUTO_UPDATE=""
+ STEAM_USER=""
+ STEAM_PASSWORD=""
+ PARAMS=$*
+ SCRIPT_LOCATION=$PWD
+
+ # Remove any old default pid files
+ # Cant do this as they may be still running
+ #rm -f hlds.*.pid
+
+ # use the $FORCE environment variable if its set
+ if test -n "$FORCE" ; then
+ # Note: command line -binary will override this
+ HL=$FORCE
+ HL_DETECT=0
+ fi
+
+ while test $# -gt 0; do
+ case "$1" in
+ "-game")
+ GAME="$2"
+ shift ;;
+ "-debug")
+ DEBUG=1
+ # Ensure that PID_FILE is set
+ PID_FILE_SET=1
+ if test -z "$PID_FILE"; then
+ PID_FILE="hlds.$$.pid"
+ fi ;;
+ "-norestart")
+ RESTART="" ;;
+ "-pidfile")
+ PID_FILE="$2"
+ PID_FILE_SET=1
+ shift ;;
+ "-binary")
+ HL="$2"
+ HL_DETECT=0
+ shift ;;
+ "-timeout")
+ TIMEOUT="$2"
+ shift ;;
+ "-gdb")
+ GDB="$2"
+ shift ;;
+ "-debuglog")
+ DEBUG_LOG="$2"
+ shift ;;
+ "-autoupdate")
+ AUTO_UPDATE="yes"
+ STEAM="./steam"
+ RESTART="yes" ;;
+ "-steamerr")
+ STEAMERR=1 ;;
+ "-ignoresigint")
+ SIGINT_ACTION="" ;;
+ "-notrap")
+ NO_TRAP=1 ;;
+ "-steamuser")
+ STEAM_USER="$2";
+ shift ;;
+ "-steampass")
+ STEAM_PASSWORD="$2";
+ shift ;;
+ "-help")
+ # quit with syntax
+ quit 2
+ ;;
+ esac
+ shift
+ done
+
+ # Ensure we have a game specified - if none is then default to CSS
+ if test -z "$GAME"; then
+ GAME="cstrike"
+ PARAMS="$PARAMS -game $GAME"
+ fi
+
+ # If the game exists in the 'orangebox' directory then run that version instead
+ # of the one in ./
+ if test -f "orangebox/$GAME/gameinfo.txt"; then
+ HL_LOCATION=./orangebox/
+ else
+ HL_LOCATION=./
+ fi
+
+ # Ensure that the game directory exists at all
+ if test ! -d "$HL_LOCATION$GAME"; then
+ echo "Invalid game type '$GAME' sepecified."
+ quit 1
+ fi
+
+ if test 0 -eq "$NO_TRAP"; then
+ # Set up the int handler
+ # N.B. Dont use SIGINT symbolic value
+ # as its just INT under ksh
+ trap "$SIGINT_ACTION" 2
+ fi
+
+ # Only detect the CPU if it hasnt been set with
+ # either environment or command line
+ if test "$HL_DETECT" -eq 1; then
+ detectcpu
+ fi
+
+ if test ! -f "$HL_LOCATION$HL"; then
+ echo "Source Engine binary '$HL_LOCATION$HL' not found, exiting"
+ quit 1
+ elif test ! -x "$HL_LOCATION$HL"; then
+ # Could try chmod but dont know what we will be
+ # chmoding so just fail.
+ echo "Source engine binary '$HL_LOCATION$HL' not executable, exiting"
+ quit 1
+ fi
+
+ # Setup debugging
+ if test -n "$DEBUG" ; then
+ #turn on core dumps :) (if possible)
+ echo "Enabling debug mode"
+ if test "unlimited" != `ulimit -c` && test "`ulimit -c`" -eq 0 ; then
+ ulimit -c 2000
+ fi
+ GDB_TEST=`$GDB -v`
+ if test -z "$GDB_TEST"; then
+ echo "Please install gdb first."
+ echo "goto http://www.gnu.org/software/gdb/ "
+ DEBUG="" # turn off debugging cause gdb isn't installed
+ fi
+ fi
+
+ if test -n "$STEAM_PASSWORD" && test -z "$STEAM_USER"; then
+ echo "You must set both the steam username and password."
+ quit 1
+ fi
+
+ #if test 1 -eq $PID_FILE_SET && test -n "$PID_FILE"; then
+ # HL_CMD="$HL $PARAMS -pidfile $PID_FILE"
+ #else
+ HL_CMD="$HL $PARAMS"
+ #fi
+}
+
+syntax () {
+ # Prints script syntax
+
+ echo "Syntax:"
+ echo "$0 [-game <game>] [-debug] [-norestart] [-pidfile]"
+ echo " [-binary [srcds_i486]"
+ echo " [-timeout <number>] [-gdb <gdb>] [-autoupdate]"
+ echo " [-steamerr] [-ignoresigint] [-steamuser <username>]"
+ echo " [-steampass <password>] [-debuglog <logname>]"
+ echo "Params:"
+ echo "-game <game> Specifies the <game> to run."
+ echo "-debug Run debugging on failed servers if possible."
+ echo "-debuglog <logname> Log debug output to this file."
+ echo "-norestart Don't attempt to restart failed servers."
+ echo "-pidfile <pidfile> Use the specified <pidfile> to store the server pid."
+ echo "-binary <binary> Use the specified binary ( no auto detection )."
+ echo "-timeout <number> Sleep for <number> seconds before restarting"
+ echo " a failed server."
+ echo "-gdb <gdb> Use <dbg> as the debugger of failed servers."
+ echo "-steamerr Quit on steam update failure."
+ echo "-steamuser <username> Use this username for steam updates."
+ echo "-steampass <password> Use this password for steam updates"
+ echo " (-steamuser must be specified as well)."
+ echo "-ignoresigint Ignore signal INT ( prevents CTRL+C quitting"
+ echo " the script )."
+ echo "-notrap Don't use trap. This prevents automatic"
+ echo " removal of old lock files."
+ echo ""
+ echo "Note: All parameters specified as passed through to the server"
+ echo "including any not listed."
+}
+
+debugcore () {
+ # Debugs any core file if DEBUG is set and
+ # the exitcode is none 0
+
+ exitcode=$1
+
+ if test $exitcode -ne 0; then
+ if test -n "$DEBUG" ; then
+ echo "bt" > debug.cmds;
+ echo "info locals" >> debug.cmds;
+ echo "info sharedlibrary" >> debug.cmds
+ echo "info frame" >> debug.cmds; # works, but gives an error... must be last
+ echo "----------------------------------------------" >> $DEBUG_LOG
+ echo "CRASH: `date`" >> $DEBUG_LOG
+ echo "Start Line: $HL_CMD" >> $DEBUG_LOG
+
+ # check to see if a core was dumped
+ if test -f core ; then
+ CORE="core"
+ elif test -f core.`cat $PID_FILE`; then
+ CORE=core.`cat $PID_FILE`
+ elif test -f "$HL_LOCATION$HL.core" ; then
+ CORE="$HL_LOCATION$HL.core"
+ fi
+
+ if test -n "$CORE"; then
+ $GDB $HL_LOCATION$HL $CORE -x debug.cmds -batch >> $DEBUG_LOG
+ fi
+
+ echo "End of Source crash report" >> $DEBUG_LOG
+ echo "----------------------------------------------" >> $DEBUG_LOG
+ echo $CRASH_DEBUG_MSG
+ rm debug.cmds
+ else
+ echo "Add \"-debug\" to the $0 command line to generate a debug.log to help with solving this problem"
+ fi
+ fi
+}
+
+detectcpu() {
+ # Attempts to auto detect the CPU
+ echo "Auto detecting CPU"
+
+ if test -e /proc/cpuinfo; then
+ CPU_VERSION="`grep "cpu family" /proc/cpuinfo | cut -f2 -d":" | tr -d " " | uniq`";
+ if test $CPU_VERSION -lt 4; then
+ echo "Error: srcds REQUIRES a 486 CPU or better";
+ quit 1
+ elif test $CPU_VERSION -ge 6; then
+ FEATURES="`grep 'flags' /proc/cpuinfo`";
+ SSE2="`echo $FEATURES |grep -i SSE2`"
+ AMD="`grep AMD /proc/cpuinfo`";
+ if test -n "$AMD"; then
+ OPTERON="`grep Opteron /proc/cpuinfo`";
+ PLATFORM="`uname -m`"
+ if test -z "$OPTERON"; then
+ OPTERON="`grep "Athlon HX" /proc/cpuinfo`";
+ if test -z "$OPTERON"; then
+ OPTERON="`grep "Athlon(tm) 64" /proc/cpuinfo`";
+ fi
+ fi
+
+ if test -n "$OPTERON" && test "x86_64" = "$PLATFORM"; then
+ echo "Using AMD-Opteron (64 bit) Optimised binary."
+ HL=./srcds_amd
+ else
+ echo "Using AMD Optimised binary."
+ HL=./srcds_amd
+ fi
+ elif test -n "$SSE2"; then
+ # CPU supports SSE2 P4 +
+ echo "Using SSE2 Optimised binary."
+ HL=./srcds_i686
+ else
+ echo "Using default binary."
+ fi
+ else
+ echo "Using default binary."
+ fi
+
+ elif test "FreeBSD" = `uname`; then
+ CPU="`grep 'CPU:' /var/run/dmesg.boot`"
+ FEATURES="`grep 'Features=' /var/run/dmesg.boot`"
+ AMD="`echo $CPU |grep AMD`"
+ I686="`echo $CPU |grep 686`"
+ SSE2="`echo $FEATURES |grep -i SSE2`"
+ if test -n "$AMD"; then
+ echo "Using AMD Optimised binary."
+ HL=./srcds_amd
+ elif test -n "$SSE2" ; then
+ echo "Using SSE2 Optimised binary."
+ HL=./srcds_i686
+ else
+ echo "Using default binary."
+ fi
+ else
+ echo "Using default binary."
+ fi
+}
+
+update() {
+ updatesingle
+}
+
+updatesingle() {
+ # Run the steam update
+ # exits on failure if STEAMERR is set
+
+ if test -n "$AUTO_UPDATE"; then
+ if test -f "$STEAM"; then
+ echo "Updating server using Steam."
+
+ if test "$GAME" = "cstrike"; then
+ GAME="Counter-Strike Source";
+ fi
+ if test "$GAME" = "dod"; then
+ GAME="dods";
+ fi
+
+ CMD="$STEAM -command update -dir .";
+ if test -n "$STEAM_USER"; then
+ CMD="$CMD -username $STEAM_USER";
+ fi
+ if test -n "$STEAM_PASSWORD"; then
+ CMD="$CMD -password $STEAM_PASSWORD";
+ fi
+
+ $CMD -game "$GAME"
+ if test $? -ne 0; then
+ if test -n "$STEAMERR"; then
+ echo "`date`: Steam Update failed, exiting."
+ quit 1
+ else
+ echo "`date`: Steam Update failed, ignoring."
+ return 0
+ fi
+ fi
+ else
+ if test -n "$STEAMERR"; then
+ echo "Could not locate steam binary:$STEAM, exiting.";
+ quit 1
+ else
+ echo "Could not locate steam binary:$STEAM, ignoring.";
+ return 0
+ fi
+ fi
+ fi
+
+ return 1
+}
+
+run() {
+ # Runs the steam update and server
+ # Loops if RESTART is set
+ # Debugs if server failure is detected
+ # Note: if RESTART is not set then
+ # 1. DEBUG is set then the server is NOT exec'd
+ # 2. DEBUG is not set the the server is exec'd
+
+ if test -n "$RESTART" ; then
+ echo "Auto-restarting the server on crash"
+
+ #loop forever
+ while true
+ do
+ # Update if needed
+ update
+
+ # Run the server
+ cd $HL_LOCATION
+ $HL_CMD
+ retval=$?
+ cd $SCRIPT_LOCATION
+ if test $retval -eq 0 && test -z "$AUTO_UPDATE"; then
+ break; # if 0 is returned then just quit
+ fi
+
+ debugcore $retval
+
+ echo "`date`: Server restart in $TIMEOUT seconds"
+
+ # don't thrash the hard disk if the server dies, wait a little
+ sleep $TIMEOUT
+ done # while true
+ else
+ # Update if needed
+ update
+
+ # Run the server
+ if test -z "$DEBUG"; then
+ # debug not requested we can exec
+ exec $HL_CMD
+ else
+ # debug requested we can't exec
+ $HL_CMD
+ debugcore $?
+ fi
+ fi
+}
+
+quit() {
+ # Exits with the give error code, 1
+ # if none specified.
+ # exit code 2 also prints syntax
+ exitcode="$1"
+
+ # default to failure
+ if test -z "$exitcode"; then
+ exitcode=1
+ fi
+
+ case "$exitcode" in
+ 0)
+ echo "`date`: Server Quit" ;;
+ 2)
+ syntax ;;
+ *)
+ echo "`date`: Server Failed" ;;
+ esac
+
+ # Remove pid file
+ if test -n "$PID_FILE" && test -f "$PID_FILE" ; then
+ # The specified pid file
+ rm -f $PID_FILE
+ fi
+
+ # reset SIGINT and then kill ourselves properly
+ trap - 2
+ kill -2 $$
+}
+
+# Initialise
+init $*
+
+# Run
+run
+
+# Quit normally
+quit 0
+