From e2165fd7a21782f69b325fecd0cc44f60301393a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 4 Oct 2013 00:13:22 +0100 Subject: [PATCH] Major update 011013 New Feature: Backup New Feature: Console Depreciated: SCREEN command Added: Tmux to replace SCREEN Improved: Logging Improved: UI changes --- CounterStrike/csserver | 541 ++++++++++-------- CounterStrikeGlobalOffensive/csgoserver | 541 ++++++++++-------- CounterStrikeSource/cssserver | 535 ++++++++++-------- DayOfDefeatSource/dodsserver | 532 ++++++++++-------- HalfLife2Deathmatch/hl2dmserver | 536 ++++++++++-------- KillingFloor/kfserver | 678 +++++++++++++--------- Left4Dead2/l4d2server | 534 ++++++++++-------- RedOrchestra/roserver | 714 ++++++++++++++---------- TeamFortress2/tf2server | 536 ++++++++++-------- TheHiddenSource/thsserver | 529 ++++++++++-------- UnrealTournament2004/ut2k4server | 604 ++++++++++++-------- UnrealTournament99/ut99server | 637 ++++++++++++--------- 12 files changed, 4057 insertions(+), 2860 deletions(-) diff --git a/CounterStrike/csserver b/CounterStrike/csserver index 2a7ef391d..5e6f6a9ad 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -3,18 +3,19 @@ # Server Management Script # Author: Daniel Gibbs # Website: http://danielgibbs.co.uk -# Version: 310813 +# Version: 011013 #### Variables #### # Notification Email # (on|off) -emailnotification="off" -email="email@example.com" +emailnotification="on" +email="me@danielgibbs.co.uk" # Start vars defaultmap="de_aztec" port="27015" + clientport="27005" parms="-game cstrike +map ${defaultmap} -strictportbind -port ${port} +clientport ${clientport}" @@ -28,20 +29,28 @@ rootdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" selfname="$0" filesdir="${rootdir}/serverfiles" servercfg="${filesdir}/cstrike/server.cfg" +backupdir="${rootdir}/backups" # Server names servicename="cs-server" gamename="Counter Strike 1.6" + engine="goldsource" servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` # Logging -logdir="${rootdir}/log/script" -gamelogdir="${filesdir}/cstrike/logs" -logfile="${logdir}/${servicename}.log" -logfiledate="${logdir}/${servicename}-$( date '+%d-%m-%Y-%H-%M-%S').log" logdays="7" +gamelogdir="${filesdir}/cstrike/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" ##### Script ##### # Do not edit @@ -62,49 +71,184 @@ if [ ! -e ${filesdir} ];then fi } -fn_serverquery(){ -# uses serverquery.py to directly query the server -# detects if the server locks up -if [ -f serverquery.py ];then - echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${logfile} - serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` +fn_runcheck(){ +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + fn_serverquery + echo -en "\r[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${scriptlog} + sleep 0.5 + echo -en "\n" + exit +fi +} + +fn_logmanager(){ +# log manager will active if finds logs older than ${logdays} +if [ `find ${scriptlogdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then + echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${scriptlog} + echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${scriptlog} + find ${scriptlogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + find ${consolelogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + scriptcount=`find ${scriptlogdir}/* -mtime +${logdays}|wc -l` + consolecount=`find ${consolelogdir}/* -mtime +${logdays}|wc -l` + count=$((${scriptcount} + ${consolecount})) + find ${scriptlogdir}/* -mtime +${logdays} -exec rm {} \; + find ${consolelogdir}/* -mtime +${logdays} -exec rm {} \; + echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${scriptlog} +fi +} + +fn_debugserver(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode" +echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +fn_stopserver +echo -en "[ .... ] Starting ${servicename}: ${servername} debug mode" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\n" +cd ${filesdir} +./hlds_run ${parms} -debug +} + +fn_console(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console" +echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +echo -en "\r[ .... ] Starting ${servicename} console" +sleep 0.5 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\r[\e[0;32m OK \e[0;39m] Starting ${servicename} console" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} console accessed" >> ${scriptlog} sleep 1 - if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then - echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${logfile} - sleep 1 - fn_restartserver - else - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - fi + tmux attach-session -t $(tmux list-sessions|awk '{print $1}') +else + echo -e "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running" + sleep 0.5 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) fn_startserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi } -fn_runcheck(){ -# already running check -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 1 ];then - fn_serverquery - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${logfile} - exit -# multiple of same instance check -elif [ ${pidwc} -ge 2 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: ${servername} is running ${pidwc} times" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is running ${pidwc} times" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] ${servicename}: Stopping ${pidwc} instances of ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${pidwc} instances of ${servername}" >> ${logfile} - fn_stopserver - exit +fn_backupserver(){ +fn_rootcheck +fn_syscheck +backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" +echo "" +echo "${gamename} Backup" +echo "============================" +echo "" +echo "The following backup will be created." +echo "" +echo "${backupdir}/${backupname}.tar.gz" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running" + while true; do + read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) fn_stopserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi +echo -en "[ .... ] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} backup" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} backup" >> ${scriptlog} +sleep 1 +echo -en "\n" +cd ${rootdir} +mkdir ${backupdir} > /dev/null 2>&1 +tar -cvzf ${backupdir}/${backupname}.tar.gz --exclude '${backupdir}' ${rootdir} +echo -en "\r${servicename} backup complete" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: backup complete" >> ${scriptlog} +} + +fn_details(){ +echo "" +echo "${gamename} Server Details" +echo "============================" +echo "" +echo "${servername} Ports" +echo "=======================" +servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` +rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` +echo "Ports the server is currently using" +echo "" +echo "DIRECTION DESCRIPTION PORT" +echo "INBOUND Game/Rcon Port ${port}" +if [ "${engine}" = "source" ];then + echo "INBOUND SourceTV Port ${sourcetvport}" +fi +echo "OUTBOUND Client Port ${clientport}" +echo "" +echo "You can change ports by editing the" +echo "start parameters in ${selfname}" +echo "" +echo "${servername} Details" +echo "=======================" +echo "Server name: ${servername}" +echo "Rcon Password: ${rcon}" +echo "" +echo "Config file:" +echo "${servercfg}" +echo "" } fn_distro(){ @@ -138,7 +282,13 @@ fn_distro fn_uptime fn_load { -echo -e "=========================================\nServer information\n=========================================\n" +echo -e "========================================\n${servicename} details\n========================================\n" +echo -e "Service: ${servicename}" +echo -e "Game: ${gamename}" +echo -e "Server: ${servername}" +echo -e "Failure reason: ${failurereason}" +echo -e "Action Taken: ${actiontaken}\n" +echo -e "========================================\nServer details\n========================================\n" echo -e "Date: $(date)" echo -e "Distro: ${os}" echo -e "Arch: ${arch}" @@ -146,139 +296,95 @@ echo -e "Kernel: ${kernel}" echo -e "Hostname: $HOSTNAME" echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" echo -e "Avg Load${load}\n" -echo -e "=========================================\n${servicename} statistics\n=========================================\n" -echo -e "Service: ${servicename}" -echo -e "Server: ${servername}" -echo -e "Failure reason: ${failurereason}" -echo -e "Action Taken: ${actiontaken}\n" -echo -e "=========================================\n${servicename} log summary\n=========================================\n" -}|tee ${logdir}/${servicename}-email.log > /dev/null 2>&1 -tail -50 ${logfile} >> /${logdir}/${servicename}-email.log -mail -s "${subject}" ${email} < /${logdir}/${servicename}-email.log -echo -e "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: sent email notification to ${email}" >> ${logfile} +echo -e "========================================\nLogs\n========================================\n" +echo -e "Script log\n===================\n" +}|tee ${scriptlogdir}/${servicename}-email.log > /dev/null 2>&1 +tail -25 ${scriptlog} >> ${emaillog} +if [ ! -z ${consolelog} ];then + echo -e "\n\nConsole log\n====================\n" >> ${emaillog} + tail -25 ${consolelog} >> ${emaillog} +fi +if [ ! -z ${gamelogdir} ];then + echo -e "\n\nServer log\n====================\n" >> ${emaillog} + tail ${gamelogdir}/*|grep -v "==>"|sed '/^$/d'|tail -25 >> ${emaillog} +fi +mail -s "${subject}" ${email} < ${emaillog} +echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" +echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Sent email notification to ${email}" >> ${scriptlog} } fn_emailtest(){ fn_rootcheck fn_syscheck -echo -e "[\e[0;32m OK \e[0;39m] Emailing test notification" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Email Test Notification - Testing ${servername}" failurereason="Testing ${servicename} email notification" actiontaken="Sent test email...hello is this thing on?" fn_emailnotification else - echo -e "[\e[0;31m FAIL \e[0;39m] Email notificaion not enabled" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notificaion not enabled" >> ${logfile} -fi -} - -fn_logmanager(){ -# log manager will active if finds logs older than $logdays -if [ `find ${logdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then - echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${logfile} - echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${logfile} - find ${logdir}/* -mtime +${logdays} |tee >> ${logfile} - count=`find ${logdir}/* -mtime +${logdays}|wc -l` - find ${logdir}/* -mtime +${logdays} -exec rm {} \; - echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${logfile} + echo -e "[\e[0;31m FAIL \e[0;39m] Email notification not enabled" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notification not enabled" >> ${scriptlog} fi +sleep 0.5 +echo -en "\n" } -fn_restartserver(){ - echo -e "[\e[0;32m OK \e[0;39m] Restarting ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${logfile} - fn_stopserver +fn_serverquery(){ +# uses serverquery.py to directly query the server +# detects if the server locks up +if [ -f serverquery.py ];then + echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${scriptlog} + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${scriptlog} + serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` sleep 1 - fn_startserver -} - -fn_startserver(){ -fn_rootcheck -fn_syscheck -fn_runcheck -fn_logmanager -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${logfile} -cp ${logfile} ${logfiledate} -screen -d -m -S ${servicename} ./hlds_run ${parms} -sleep 1 -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 0 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: Failed to start ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${logfile} -fi -} - -fn_stopserver(){ -fn_rootcheck -fn_syscheck -pid=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` -if [ -z ${pid} ];then - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already stopped" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${logfile} -else - echo -e "[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${logfile} - kill `screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` - screen -wipe > /dev/null 2>&1 + if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then + echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${scriptlog} + sleep 1 + fn_restartserver + else + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + fi fi } -fn_debugserver(){ -fn_rootcheck -fn_syscheck -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} in debug mode!" -sleep 0.5 -echo -e "" -echo -e "Use for identifying server issues only!" -while true; do - echo "If server is already running it will be stopped" - read -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; -esac -done -fn_stopserver -sleep 1 -echo -e "[\e[0;36m INFO \e[0;39m] Press CTRL+C to drop out of debug mode" -sleep 3 -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -./hlds_run ${parms} -debug -} - fn_monitorserver(){ fn_rootcheck fn_syscheck fn_logmanager -echo -e "[\e[0;32m OK \e[0;39m] Checking ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Checking ${servername}" >> ${logfile} +echo -en "[ .... ] Monitor is checking ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is checking ${servername}" >> ${scriptlog} +sleep 0.5 updatecheck=`ps -ef|grep "${selfname} update"|grep -v grep|wc -l` if [ "${updatecheck}" = "0" ];then fn_runcheck - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${logfile} + echo -en "\r[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Monitor - Starting ${servername}" - failurereason="${servername} had stopped" - actiontaken="restarted ${servername}" + failurereason="${servicename} process was not running" + actiontaken="restarted ${servicename}" + sleep 0.5 + echo -en "\n" fn_emailnotification fi + sleep 0.5 + echo -en "\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is starting ${servername}" >> ${scriptlog} fn_startserver else echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: Monitor detected ${servername} is currently checking for updates!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${scriptlog} echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} will start when updating is complete" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${scriptlog} fi } @@ -286,80 +392,60 @@ fn_updateserver(){ fn_rootcheck fn_syscheck echo -e "[\e[0;32m OK \e[0;39m] Updating ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${scriptlog} cd ${rootdir} cd steamcmd -./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${logfile} +./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${scriptlog} } -fn_details(){ -echo "" -echo "${gamename} Server Details" -echo "============================" -echo "" -echo "${servername} Ports" -echo "=======================" -if [ "${engine}" = "unreal2" ];then - gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') - queryport=$((${gameport} + 1)) - gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') - webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') - webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') - webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT INI VARIABLE" - echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" - echo "INBOUND Query Port ${queryport} UDP n/a" - if [ "${appid}" != "223250" ];then - echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ];then - echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" - else - echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" - fi - if [ "${appid}" ];then - if [ "${appid}" == "223250" ];then - echo "OUTBOUND Steam Port 20610 UDP n/a" - else - echo "OUTBOUND Steam Port 20660 UDP n/a" - fi - fi - echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" - echo "" - echo "${servername} WebAdmin" - echo "=======================" - echo "WebAdmin URL: http://localhost:${webadminport}" - echo "WebAdmin Username: ${webadminuser}" - echo "WebAdmin Password: ${webadminpass}" - echo "" - echo "Config file" - echo "${systemdir}/${ini}" -elif [ "${engine}" = "source" ]||[ "${engine}" = "goldsource" ];then - servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` - rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT" - echo "INBOUND Game/Rcon Port ${port}" - if [ "${engine}" = "source" ];then - echo "INBOUND SourceTV Port ${sourcetvport}" - fi - echo "OUTBOUND Client Port ${clientport}" - echo "" - echo "You can change ports by editing the" - echo "start parameters in ${selfname}" - echo "" - echo "${servername} Details" - echo "=======================" - echo "Server name: ${servername}" - echo "Rcon Password: ${rcon}" - echo "" - echo "Config file:" - echo "${servercfg}" +fn_restartserver(){ +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${scriptlog} +fn_stopserver +fn_startserver +} + +fn_stopserver(){ +fn_rootcheck +fn_syscheck +pid=$(tmux list-sessions 2>&1|awk '{print $1}') +echo -en "[ .... ] Stopping ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${scriptlog} +sleep 0.5 +if [ "${pid}" == "failed" ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${scriptlog} +else + tmux kill-session -t ${servicename} + echo -en "\r[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopped ${servername}" >> ${scriptlog} fi -echo "" +sleep 0.5 +echo -en "\n" +} + +fn_startserver(){ +fn_rootcheck +fn_syscheck +echo -en "[ .... ] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${scriptlog} +sleep 0.5 +fn_runcheck +fn_logmanager +mv ${scriptlog} ${scriptlogdate} +mv ${consolelog} ${consolelogdate} +cd ${filesdir} +tmux new-session -d -s ${servicename} "./hlds_run ${parms} |tee -a ${consolelog}" +tmuxwc=`tmux list-sessions 2>&1|awk '{print $1}'|wc -l` +sleep 1 +if [ ${tmuxwc} -eq 0 ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${scriptlog} +else + echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername}" >> ${scriptlog} +fi +sleep 0.5 +echo -en "\n" } # @@ -440,8 +526,6 @@ echo "=================================" rm -f ${servercfg} cd ${rootdir}/steamcmd mkdir -v ${filesdir} - mkdir -v ${rootdir}/log - mkdir -v ${logdir} touch install.txt chmod 0600 install.txt echo "login anonymous" > install.txt @@ -482,6 +566,7 @@ echo "=================================" echo -e "pausable 0" echo -e "" echo -e "// default server name. Change to \"Bob's Server\", etc." + echo -e "hostname \"${servername}\"" echo -e "" echo -e "// maximum client movement speed " @@ -512,7 +597,11 @@ echo "=================================" }|tee ${servercfg} > /dev/null 2>&1 sleep 1 echo "" - echo "Setting up logging" + echo "Creating log directorys" + mkdir -v ${rootdir}/log + mkdir -v ${scriptlogdir} + mkdir -v ${consolelogdir} + touch ${consolelog} if [ ! -h ${rootdir}/log/server ]; then ln -sv ${gamelogdir} ${rootdir}/log/server else @@ -548,16 +637,20 @@ case "$1" in fn_startserver;; monitor) fn_monitorserver;; - install) - fn_install;; - debug) - fn_debugserver;; email-test) fn_emailtest;; details) fn_details;; + backup) + fn_backupserver;; + console) + fn_console;; + debug) + fn_debugserver;; + install) + fn_install;; *) - echo "Usage: $0 {start|stop|restart|update|monitor|install|debug|email-test|details}" - exit 1;; + echo "Usage: $0 {start|stop|restart|update|monitor|email-test|details|backup|console|debug|install}" + exit 1;; esac exit \ No newline at end of file diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 744c78c03..0207e32af 100644 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -3,14 +3,14 @@ # Server Management Script # Author: Daniel Gibbs # Website: http://danielgibbs.co.uk -# Version: 310813 +# Version: 011013 #### Variables #### # Notification Email # (on|off) -emailnotification="off" -email="email@example.com" +emailnotification="on" +email="me@danielgibbs.co.uk" # Start vars defaultmap="de_dust" @@ -29,20 +29,28 @@ rootdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" selfname="$0" filesdir="${rootdir}/serverfiles" servercfg="${filesdir}/csgo/cfg/server.cfg" +backupdir="${rootdir}/backups" -# Server names +# Server Details servicename="csgo-server" gamename="Counter Strike: Global Offensive" + engine="source" servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` # Logging -logdir="${rootdir}/log/script" -gamelogdir="${filesdir}/csgo/logs" -logfile="${logdir}/${servicename}.log" -logfiledate="${logdir}/${servicename}-$( date '+%d-%m-%Y-%H-%M-%S').log" logdays="7" +gamelogdir="${filesdir}/csgo/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" ##### Script ##### # Do not edit @@ -63,49 +71,184 @@ if [ ! -e ${filesdir} ];then fi } -fn_serverquery(){ -# uses serverquery.py to directly query the server -# detects if the server locks up -if [ -f serverquery.py ];then - echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${logfile} - serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` +fn_runcheck(){ +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + fn_serverquery + echo -en "\r[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${scriptlog} + sleep 0.5 + echo -en "\n" + exit +fi +} + +fn_logmanager(){ +# log manager will active if finds logs older than ${logdays} +if [ `find ${scriptlogdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then + echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${scriptlog} + echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${scriptlog} + find ${scriptlogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + find ${consolelogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + scriptcount=`find ${scriptlogdir}/* -mtime +${logdays}|wc -l` + consolecount=`find ${consolelogdir}/* -mtime +${logdays}|wc -l` + count=$((${scriptcount} + ${consolecount})) + find ${scriptlogdir}/* -mtime +${logdays} -exec rm {} \; + find ${consolelogdir}/* -mtime +${logdays} -exec rm {} \; + echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${scriptlog} +fi +} + +fn_debugserver(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode" +echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +fn_stopserver +echo -en "[ .... ] Starting ${servicename}: ${servername} debug mode" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\n" +cd ${filesdir} +./srcds_run ${parms} -debug +} + +fn_console(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console" +echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +echo -en "\r[ .... ] Starting ${servicename} console" +sleep 0.5 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\r[\e[0;32m OK \e[0;39m] Starting ${servicename} console" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} console accessed" >> ${scriptlog} sleep 1 - if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then - echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${logfile} - sleep 1 - fn_restartserver - else - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - fi + tmux attach-session -t $(tmux list-sessions|awk '{print $1}') +else + echo -e "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running" + sleep 0.5 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) fn_startserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi } -fn_runcheck(){ -# already running check -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 1 ];then - fn_serverquery - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${logfile} - exit -# multiple of same instance check -elif [ ${pidwc} -ge 2 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: ${servername} is running ${pidwc} times" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is running ${pidwc} times" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] ${servicename}: Stopping ${pidwc} instances of ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${pidwc} instances of ${servername}" >> ${logfile} - fn_stopserver - exit +fn_backupserver(){ +fn_rootcheck +fn_syscheck +backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" +echo "" +echo "${gamename} Backup" +echo "============================" +echo "" +echo "The following backup will be created." +echo "" +echo "${backupdir}/${backupname}.tar.gz" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running" + while true; do + read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) fn_stopserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi +echo -en "[ .... ] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} backup" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} backup" >> ${scriptlog} +sleep 1 +echo -en "\n" +cd ${rootdir} +mkdir ${backupdir} > /dev/null 2>&1 +tar -cvzf ${backupdir}/${backupname}.tar.gz --exclude '${backupdir}' ${rootdir} +echo -en "\r${servicename} backup complete" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: backup complete" >> ${scriptlog} +} + +fn_details(){ +echo "" +echo "${gamename} Server Details" +echo "============================" +echo "" +echo "${servername} Ports" +echo "=======================" +servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` +rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` +echo "Ports the server is currently using" +echo "" +echo "DIRECTION DESCRIPTION PORT" +echo "INBOUND Game/Rcon Port ${port}" +if [ "${engine}" = "source" ];then + echo "INBOUND SourceTV Port ${sourcetvport}" +fi +echo "OUTBOUND Client Port ${clientport}" +echo "" +echo "You can change ports by editing the" +echo "start parameters in ${selfname}" +echo "" +echo "${servername} Details" +echo "=======================" +echo "Server name: ${servername}" +echo "Rcon Password: ${rcon}" +echo "" +echo "Config file:" +echo "${servercfg}" +echo "" } fn_distro(){ @@ -139,7 +282,13 @@ fn_distro fn_uptime fn_load { -echo -e "=========================================\nServer information\n=========================================\n" +echo -e "========================================\n${servicename} details\n========================================\n" +echo -e "Service: ${servicename}" +echo -e "Game: ${gamename}" +echo -e "Server: ${servername}" +echo -e "Failure reason: ${failurereason}" +echo -e "Action Taken: ${actiontaken}\n" +echo -e "========================================\nServer details\n========================================\n" echo -e "Date: $(date)" echo -e "Distro: ${os}" echo -e "Arch: ${arch}" @@ -147,139 +296,95 @@ echo -e "Kernel: ${kernel}" echo -e "Hostname: $HOSTNAME" echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" echo -e "Avg Load${load}\n" -echo -e "=========================================\n${servicename} statistics\n=========================================\n" -echo -e "Service: ${servicename}" -echo -e "Server: ${servername}" -echo -e "Failure reason: ${failurereason}" -echo -e "Action Taken: ${actiontaken}\n" -echo -e "=========================================\n${servicename} log summary\n=========================================\n" -}|tee ${logdir}/${servicename}-email.log > /dev/null 2>&1 -tail -50 ${logfile} >> /${logdir}/${servicename}-email.log -mail -s "${subject}" ${email} < /${logdir}/${servicename}-email.log -echo -e "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: sent email notification to ${email}" >> ${logfile} +echo -e "========================================\nLogs\n========================================\n" +echo -e "Script log\n===================\n" +}|tee ${scriptlogdir}/${servicename}-email.log > /dev/null 2>&1 +tail -25 ${scriptlog} >> ${emaillog} +if [ ! -z ${consolelog} ];then + echo -e "\n\nConsole log\n====================\n" >> ${emaillog} + tail -25 ${consolelog} >> ${emaillog} +fi +if [ ! -z ${gamelogdir} ];then + echo -e "\n\nServer log\n====================\n" >> ${emaillog} + tail ${gamelogdir}/*|grep -v "==>"|sed '/^$/d'|tail -25 >> ${emaillog} +fi +mail -s "${subject}" ${email} < ${emaillog} +echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" +echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Sent email notification to ${email}" >> ${scriptlog} } fn_emailtest(){ fn_rootcheck fn_syscheck -echo -e "[\e[0;32m OK \e[0;39m] Emailing test notification" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Email Test Notification - Testing ${servername}" failurereason="Testing ${servicename} email notification" actiontaken="Sent test email...hello is this thing on?" fn_emailnotification else - echo -e "[\e[0;31m FAIL \e[0;39m] Email notificaion not enabled" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notificaion not enabled" >> ${logfile} -fi -} - -fn_logmanager(){ -# log manager will active if finds logs older than $logdays -if [ `find ${logdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then - echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${logfile} - echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${logfile} - find ${logdir}/* -mtime +${logdays} |tee >> ${logfile} - count=`find ${logdir}/* -mtime +${logdays}|wc -l` - find ${logdir}/* -mtime +${logdays} -exec rm {} \; - echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${logfile} + echo -e "[\e[0;31m FAIL \e[0;39m] Email notification not enabled" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notification not enabled" >> ${scriptlog} fi +sleep 0.5 +echo -en "\n" } -fn_restartserver(){ - echo -e "[\e[0;32m OK \e[0;39m] Restarting ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${logfile} - fn_stopserver +fn_serverquery(){ +# uses serverquery.py to directly query the server +# detects if the server locks up +if [ -f serverquery.py ];then + echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${scriptlog} + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${scriptlog} + serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` sleep 1 - fn_startserver -} - -fn_startserver(){ -fn_rootcheck -fn_syscheck -fn_runcheck -fn_logmanager -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${logfile} -cp ${logfile} ${logfiledate} -screen -d -m -S ${servicename} ${filesdir}/srcds_run ${parms} -sleep 1 -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 0 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: Failed to start ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${logfile} -fi -} - -fn_stopserver(){ -fn_rootcheck -fn_syscheck -pid=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` -if [ -z ${pid} ];then - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already stopped" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${logfile} -else - echo -e "[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${logfile} - kill `screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` - screen -wipe > /dev/null 2>&1 + if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then + echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${scriptlog} + sleep 1 + fn_restartserver + else + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + fi fi } -fn_debugserver(){ -fn_rootcheck -fn_syscheck -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} in debug mode!" -sleep 0.5 -echo -e "" -echo -e "Use for identifying server issues only!" -while true; do - echo "If server is already running it will be stopped" - read -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; -esac -done -fn_stopserver -sleep 1 -echo -e "[\e[0;36m INFO \e[0;39m] Press CTRL+C to drop out of debug mode" -sleep 3 -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -${filesdir}/srcds_run ${parms} -debug -} - fn_monitorserver(){ fn_rootcheck fn_syscheck fn_logmanager -echo -e "[\e[0;32m OK \e[0;39m] Checking ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Checking ${servername}" >> ${logfile} +echo -en "[ .... ] Monitor is checking ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is checking ${servername}" >> ${scriptlog} +sleep 0.5 updatecheck=`ps -ef|grep "${selfname} update"|grep -v grep|wc -l` if [ "${updatecheck}" = "0" ];then fn_runcheck - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${logfile} + echo -en "\r[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Monitor - Starting ${servername}" - failurereason="${servername} had stopped" - actiontaken="restarted ${servername}" + failurereason="${servicename} process was not running" + actiontaken="restarted ${servicename}" + sleep 0.5 + echo -en "\n" fn_emailnotification fi + sleep 0.5 + echo -en "\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is starting ${servername}" >> ${scriptlog} fn_startserver else echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: Monitor detected ${servername} is currently checking for updates!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${scriptlog} echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} will start when updating is complete" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${scriptlog} fi } @@ -287,80 +392,60 @@ fn_updateserver(){ fn_rootcheck fn_syscheck echo -e "[\e[0;32m OK \e[0;39m] Updating ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${scriptlog} cd ${rootdir} cd steamcmd -./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${logfile} +./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${scriptlog} } -fn_details(){ -echo "" -echo "${gamename} Server Details" -echo "============================" -echo "" -echo "${servername} Ports" -echo "=======================" -if [ "${engine}" = "unreal2" ];then - gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') - queryport=$((${gameport} + 1)) - gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') - webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') - webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') - webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT INI VARIABLE" - echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" - echo "INBOUND Query Port ${queryport} UDP n/a" - if [ "${appid}" != "223250" ];then - echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ];then - echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" - else - echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" - fi - if [ "${appid}" ];then - if [ "${appid}" == "223250" ];then - echo "OUTBOUND Steam Port 20610 UDP n/a" - else - echo "OUTBOUND Steam Port 20660 UDP n/a" - fi - fi - echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" - echo "" - echo "${servername} WebAdmin" - echo "=======================" - echo "WebAdmin URL: http://localhost:${webadminport}" - echo "WebAdmin Username: ${webadminuser}" - echo "WebAdmin Password: ${webadminpass}" - echo "" - echo "Config file" - echo "${systemdir}/${ini}" -elif [ "${engine}" = "source" ]||[ "${engine}" = "goldsource" ];then - servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` - rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT" - echo "INBOUND Game/Rcon Port ${port}" - if [ "${engine}" = "source" ];then - echo "INBOUND SourceTV Port ${sourcetvport}" - fi - echo "OUTBOUND Client Port ${clientport}" - echo "" - echo "You can change ports by editing the" - echo "start parameters in ${selfname}" - echo "" - echo "${servername} Details" - echo "=======================" - echo "Server name: ${servername}" - echo "Rcon Password: ${rcon}" - echo "" - echo "Config file:" - echo "${servercfg}" +fn_restartserver(){ +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${scriptlog} +fn_stopserver +fn_startserver +} + +fn_stopserver(){ +fn_rootcheck +fn_syscheck +pid=$(tmux list-sessions 2>&1|awk '{print $1}') +echo -en "[ .... ] Stopping ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${scriptlog} +sleep 0.5 +if [ "${pid}" == "failed" ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${scriptlog} +else + tmux kill-session -t ${servicename} + echo -en "\r[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopped ${servername}" >> ${scriptlog} fi -echo "" +sleep 0.5 +echo -en "\n" +} + +fn_startserver(){ +fn_rootcheck +fn_syscheck +echo -en "[ .... ] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${scriptlog} +sleep 0.5 +fn_runcheck +fn_logmanager +mv ${scriptlog} ${scriptlogdate} +mv ${consolelog} ${consolelogdate} +cd ${filesdir} +tmux new-session -d -s ${servicename} "./srcds_run ${parms} |tee -a ${consolelog}" +tmuxwc=`tmux list-sessions 2>&1|awk '{print $1}'|wc -l` +sleep 1 +if [ ${tmuxwc} -eq 0 ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${scriptlog} +else + echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername}" >> ${scriptlog} +fi +sleep 0.5 +echo -en "\n" } # @@ -440,8 +525,6 @@ echo "Installing ${gamename} Server" echo "=================================" cd ${rootdir}/steamcmd mkdir -v ${filesdir} - mkdir -v ${rootdir}/log - mkdir -v ${logdir} touch install.txt chmod 0600 install.txt echo "login anonymous" > install.txt @@ -488,7 +571,11 @@ echo "=================================" }|tee ${servercfg} > /dev/null 2>&1 sleep 1 echo "" - echo "Setting up logging" + echo "Creating log directorys" + mkdir -v ${rootdir}/log + mkdir -v ${scriptlogdir} + mkdir -v ${consolelogdir} + touch ${consolelog} if [ ! -h ${rootdir}/log/server ]; then ln -sv ${gamelogdir} ${rootdir}/log/server else @@ -524,16 +611,20 @@ case "$1" in fn_startserver;; monitor) fn_monitorserver;; - install) - fn_install;; - debug) - fn_debugserver;; email-test) fn_emailtest;; details) fn_details;; + backup) + fn_backupserver;; + console) + fn_console;; + debug) + fn_debugserver;; + install) + fn_install;; *) - echo "Usage: $0 {start|stop|restart|update|monitor|install|debug|email-test|details}" - exit 1;; + echo "Usage: $0 {start|stop|restart|update|monitor|email-test|details|backup|console|debug|install}" + exit 1;; esac exit \ No newline at end of file diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index 61b952f49..ec0c75ff4 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -3,7 +3,7 @@ # Server Management Script # Author: Daniel Gibbs # Website: http://danielgibbs.co.uk -# Version: 310813 +# Version: 011013 #### Variables #### @@ -29,21 +29,27 @@ rootdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" selfname="$0" filesdir="${rootdir}/serverfiles" servercfg="${filesdir}/cstrike/cfg/server.cfg" +backupdir="${rootdir}/backups" # Server Details servicename="css-server" gamename="Counter Strike: Source" - engine="source" servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` # Logging -logdir="${rootdir}/log/script" -gamelogdir="${filesdir}/cstrike/logs" -logfile="${logdir}/${servicename}.log" -logfiledate="${logdir}/${servicename}-$( date '+%d-%m-%Y-%H-%M-%S').log" logdays="7" +gamelogdir="${filesdir}/cstrike/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" ##### Script ##### # Do not edit @@ -64,49 +70,184 @@ if [ ! -e ${filesdir} ];then fi } -fn_serverquery(){ -# uses serverquery.py to directly query the server -# detects if the server locks up -if [ -f serverquery.py ];then - echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${logfile} - serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` +fn_runcheck(){ +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + fn_serverquery + echo -en "\r[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${scriptlog} + sleep 0.5 + echo -en "\n" + exit +fi +} + +fn_logmanager(){ +# log manager will active if finds logs older than ${logdays} +if [ `find ${scriptlogdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then + echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${scriptlog} + echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${scriptlog} + find ${scriptlogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + find ${consolelogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + scriptcount=`find ${scriptlogdir}/* -mtime +${logdays}|wc -l` + consolecount=`find ${consolelogdir}/* -mtime +${logdays}|wc -l` + count=$((${scriptcount} + ${consolecount})) + find ${scriptlogdir}/* -mtime +${logdays} -exec rm {} \; + find ${consolelogdir}/* -mtime +${logdays} -exec rm {} \; + echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${scriptlog} +fi +} + +fn_debugserver(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode" +echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +fn_stopserver +echo -en "[ .... ] Starting ${servicename}: ${servername} debug mode" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\n" +cd ${filesdir} +./srcds_run ${parms} -debug +} + +fn_console(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console" +echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +echo -en "\r[ .... ] Starting ${servicename} console" +sleep 0.5 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\r[\e[0;32m OK \e[0;39m] Starting ${servicename} console" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} console accessed" >> ${scriptlog} sleep 1 - if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then - echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${logfile} - sleep 1 - fn_restartserver - else - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - fi + tmux attach-session -t $(tmux list-sessions|awk '{print $1}') +else + echo -e "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running" + sleep 0.5 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) fn_startserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi } -fn_runcheck(){ -# already running check -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 1 ];then - fn_serverquery - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${logfile} - exit -# multiple of same instance check -elif [ ${pidwc} -ge 2 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: ${servername} is running ${pidwc} times" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is running ${pidwc} times" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] ${servicename}: Stopping ${pidwc} instances of ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${pidwc} instances of ${servername}" >> ${logfile} - fn_stopserver - exit +fn_backupserver(){ +fn_rootcheck +fn_syscheck +backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" +echo "" +echo "${gamename} Backup" +echo "============================" +echo "" +echo "The following backup will be created." +echo "" +echo "${backupdir}/${backupname}.tar.gz" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running" + while true; do + read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) fn_stopserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi +echo -en "[ .... ] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} backup" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} backup" >> ${scriptlog} +sleep 1 +echo -en "\n" +cd ${rootdir} +mkdir ${backupdir} > /dev/null 2>&1 +tar -cvzf ${backupdir}/${backupname}.tar.gz --exclude '${backupdir}' ${rootdir} +echo -en "\r${servicename} backup complete" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: backup complete" >> ${scriptlog} +} + +fn_details(){ +echo "" +echo "${gamename} Server Details" +echo "============================" +echo "" +echo "${servername} Ports" +echo "=======================" +servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` +rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` +echo "Ports the server is currently using" +echo "" +echo "DIRECTION DESCRIPTION PORT" +echo "INBOUND Game/Rcon Port ${port}" +if [ "${engine}" = "source" ];then + echo "INBOUND SourceTV Port ${sourcetvport}" +fi +echo "OUTBOUND Client Port ${clientport}" +echo "" +echo "You can change ports by editing the" +echo "start parameters in ${selfname}" +echo "" +echo "${servername} Details" +echo "=======================" +echo "Server name: ${servername}" +echo "Rcon Password: ${rcon}" +echo "" +echo "Config file:" +echo "${servercfg}" +echo "" } fn_distro(){ @@ -140,7 +281,13 @@ fn_distro fn_uptime fn_load { -echo -e "=========================================\nServer information\n=========================================\n" +echo -e "========================================\n${servicename} details\n========================================\n" +echo -e "Service: ${servicename}" +echo -e "Game: ${gamename}" +echo -e "Server: ${servername}" +echo -e "Failure reason: ${failurereason}" +echo -e "Action Taken: ${actiontaken}\n" +echo -e "========================================\nServer details\n========================================\n" echo -e "Date: $(date)" echo -e "Distro: ${os}" echo -e "Arch: ${arch}" @@ -148,139 +295,95 @@ echo -e "Kernel: ${kernel}" echo -e "Hostname: $HOSTNAME" echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" echo -e "Avg Load${load}\n" -echo -e "=========================================\n${servicename} statistics\n=========================================\n" -echo -e "Service: ${servicename}" -echo -e "Server: ${servername}" -echo -e "Failure reason: ${failurereason}" -echo -e "Action Taken: ${actiontaken}\n" -echo -e "=========================================\n${servicename} log summary\n=========================================\n" -}|tee ${logdir}/${servicename}-email.log > /dev/null 2>&1 -tail -50 ${logfile} >> /${logdir}/${servicename}-email.log -mail -s "${subject}" ${email} < /${logdir}/${servicename}-email.log -echo -e "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: sent email notification to ${email}" >> ${logfile} +echo -e "========================================\nLogs\n========================================\n" +echo -e "Script log\n===================\n" +}|tee ${scriptlogdir}/${servicename}-email.log > /dev/null 2>&1 +tail -25 ${scriptlog} >> ${emaillog} +if [ ! -z ${consolelog} ];then + echo -e "\n\nConsole log\n====================\n" >> ${emaillog} + tail -25 ${consolelog} >> ${emaillog} +fi +if [ ! -z ${gamelogdir} ];then + echo -e "\n\nServer log\n====================\n" >> ${emaillog} + tail ${gamelogdir}/*|grep -v "==>"|sed '/^$/d'|tail -25 >> ${emaillog} +fi +mail -s "${subject}" ${email} < ${emaillog} +echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" +echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Sent email notification to ${email}" >> ${scriptlog} } fn_emailtest(){ fn_rootcheck fn_syscheck -echo -e "[\e[0;32m OK \e[0;39m] Emailing test notification" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Email Test Notification - Testing ${servername}" failurereason="Testing ${servicename} email notification" actiontaken="Sent test email...hello is this thing on?" fn_emailnotification else - echo -e "[\e[0;31m FAIL \e[0;39m] Email notificaion not enabled" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notificaion not enabled" >> ${logfile} -fi -} - -fn_logmanager(){ -# log manager will active if finds logs older than $logdays -if [ `find ${logdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then - echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${logfile} - echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${logfile} - find ${logdir}/* -mtime +${logdays} |tee >> ${logfile} - count=`find ${logdir}/* -mtime +${logdays}|wc -l` - find ${logdir}/* -mtime +${logdays} -exec rm {} \; - echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${logfile} + echo -e "[\e[0;31m FAIL \e[0;39m] Email notification not enabled" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notification not enabled" >> ${scriptlog} fi +sleep 0.5 +echo -en "\n" } -fn_restartserver(){ - echo -e "[\e[0;32m OK \e[0;39m] Restarting ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${logfile} - fn_stopserver +fn_serverquery(){ +# uses serverquery.py to directly query the server +# detects if the server locks up +if [ -f serverquery.py ];then + echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${scriptlog} + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${scriptlog} + serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` sleep 1 - fn_startserver -} - -fn_startserver(){ -fn_rootcheck -fn_syscheck -fn_runcheck -fn_logmanager -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${logfile} -cp ${logfile} ${logfiledate} -screen -d -m -S ${servicename} ${filesdir}/srcds_run ${parms} -sleep 1 -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 0 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: Failed to start ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${logfile} -fi -} - -fn_stopserver(){ -fn_rootcheck -fn_syscheck -pid=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` -if [ -z ${pid} ];then - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already stopped" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${logfile} -else - echo -e "[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${logfile} - kill `screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` - screen -wipe > /dev/null 2>&1 + if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then + echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${scriptlog} + sleep 1 + fn_restartserver + else + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + fi fi } -fn_debugserver(){ -fn_rootcheck -fn_syscheck -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} in debug mode!" -sleep 0.5 -echo -e "" -echo -e "Use for identifying server issues only!" -while true; do - echo "If server is already running it will be stopped" - read -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; -esac -done -fn_stopserver -sleep 1 -echo -e "[\e[0;36m INFO \e[0;39m] Press CTRL+C to drop out of debug mode" -sleep 3 -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -${filesdir}/srcds_run ${parms} -debug -} - fn_monitorserver(){ fn_rootcheck fn_syscheck fn_logmanager -echo -e "[\e[0;32m OK \e[0;39m] Checking ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Checking ${servername}" >> ${logfile} +echo -en "[ .... ] Monitor is checking ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is checking ${servername}" >> ${scriptlog} +sleep 0.5 updatecheck=`ps -ef|grep "${selfname} update"|grep -v grep|wc -l` if [ "${updatecheck}" = "0" ];then fn_runcheck - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${logfile} + echo -en "\r[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Monitor - Starting ${servername}" - failurereason="${servername} had stopped" - actiontaken="restarted ${servername}" + failurereason="${servicename} process was not running" + actiontaken="restarted ${servicename}" + sleep 0.5 + echo -en "\n" fn_emailnotification fi + sleep 0.5 + echo -en "\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is starting ${servername}" >> ${scriptlog} fn_startserver else echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: Monitor detected ${servername} is currently checking for updates!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${scriptlog} echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} will start when updating is complete" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${scriptlog} fi } @@ -288,80 +391,60 @@ fn_updateserver(){ fn_rootcheck fn_syscheck echo -e "[\e[0;32m OK \e[0;39m] Updating ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${scriptlog} cd ${rootdir} cd steamcmd -./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${logfile} +./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${scriptlog} } -fn_details(){ -echo "" -echo "${gamename} Server Details" -echo "============================" -echo "" -echo "${servername} Ports" -echo "=======================" -if [ "${engine}" = "unreal2" ];then - gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') - queryport=$((${gameport} + 1)) - gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') - webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') - webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') - webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT INI VARIABLE" - echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" - echo "INBOUND Query Port ${queryport} UDP n/a" - if [ "${appid}" != "223250" ];then - echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ];then - echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" - else - echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" - fi - if [ "${appid}" ];then - if [ "${appid}" == "223250" ];then - echo "OUTBOUND Steam Port 20610 UDP n/a" - else - echo "OUTBOUND Steam Port 20660 UDP n/a" - fi - fi - echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" - echo "" - echo "${servername} WebAdmin" - echo "=======================" - echo "WebAdmin URL: http://localhost:${webadminport}" - echo "WebAdmin Username: ${webadminuser}" - echo "WebAdmin Password: ${webadminpass}" - echo "" - echo "Config file" - echo "${systemdir}/${ini}" -elif [ "${engine}" = "source" ]||[ "${engine}" = "goldsource" ];then - servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` - rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT" - echo "INBOUND Game/Rcon Port ${port}" - if [ "${engine}" = "source" ];then - echo "INBOUND SourceTV Port ${sourcetvport}" - fi - echo "OUTBOUND Client Port ${clientport}" - echo "" - echo "You can change ports by editing the" - echo "start parameters in ${selfname}" - echo "" - echo "${servername} Details" - echo "=======================" - echo "Server name: ${servername}" - echo "Rcon Password: ${rcon}" - echo "" - echo "Config file:" - echo "${servercfg}" +fn_restartserver(){ +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${scriptlog} +fn_stopserver +fn_startserver +} + +fn_stopserver(){ +fn_rootcheck +fn_syscheck +pid=$(tmux list-sessions 2>&1|awk '{print $1}') +echo -en "[ .... ] Stopping ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${scriptlog} +sleep 0.5 +if [ "${pid}" == "failed" ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${scriptlog} +else + tmux kill-session -t ${servicename} + echo -en "\r[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopped ${servername}" >> ${scriptlog} fi -echo "" +sleep 0.5 +echo -en "\n" +} + +fn_startserver(){ +fn_rootcheck +fn_syscheck +echo -en "[ .... ] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${scriptlog} +sleep 0.5 +fn_runcheck +fn_logmanager +mv ${scriptlog} ${scriptlogdate} +mv ${consolelog} ${consolelogdate} +cd ${filesdir} +tmux new-session -d -s ${servicename} "./srcds_run ${parms} |tee -a ${consolelog}" +tmuxwc=`tmux list-sessions 2>&1|awk '{print $1}'|wc -l` +sleep 1 +if [ ${tmuxwc} -eq 0 ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${scriptlog} +else + echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername}" >> ${scriptlog} +fi +sleep 0.5 +echo -en "\n" } # @@ -441,8 +524,6 @@ echo "Installing ${gamename} Server" echo "=================================" cd ${rootdir}/steamcmd mkdir -v ${filesdir} - mkdir -v ${rootdir}/log - mkdir -v ${logdir} touch install.txt chmod 0600 install.txt echo "login anonymous" > install.txt @@ -489,7 +570,11 @@ echo "=================================" }|tee ${servercfg} > /dev/null 2>&1 sleep 1 echo "" - echo "Setting up logging" + echo "Creating log directorys" + mkdir -v ${rootdir}/log + mkdir -v ${scriptlogdir} + mkdir -v ${consolelogdir} + touch ${consolelog} if [ ! -h ${rootdir}/log/server ]; then ln -sv ${gamelogdir} ${rootdir}/log/server else @@ -525,16 +610,20 @@ case "$1" in fn_startserver;; monitor) fn_monitorserver;; - install) - fn_install;; - debug) - fn_debugserver;; email-test) fn_emailtest;; details) fn_details;; + backup) + fn_backupserver;; + console) + fn_console;; + debug) + fn_debugserver;; + install) + fn_install;; *) - echo "Usage: $0 {start|stop|restart|update|monitor|install|debug|email-test|details}" - exit 1;; + echo "Usage: $0 {start|stop|restart|update|monitor|email-test|details|backup|console|debug|install}" + exit 1;; esac exit \ No newline at end of file diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 00606877e..0153056d0 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -3,7 +3,7 @@ # Server Management Script # Author: Daniel Gibbs # Website: http://danielgibbs.co.uk -# Version: 310813 +# Version: 011013 #### Variables #### @@ -29,6 +29,7 @@ rootdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" selfname="$0" filesdir="${rootdir}/serverfiles" servercfg="${filesdir}/dod/cfg/server.cfg" +backupdir="${rootdir}/backups" # Server Details servicename="dods-server" @@ -38,11 +39,17 @@ servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` # Logging -logdir="${rootdir}/log/script" -gamelogdir="${filesdir}/dod/logs" -logfile="${logdir}/${servicename}.log" -logfiledate="${logdir}/${servicename}-$( date '+%d-%m-%Y-%H-%M-%S').log" logdays="7" +gamelogdir="${filesdir}/dod/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" ##### Script ##### # Do not edit @@ -63,49 +70,184 @@ if [ ! -e ${filesdir} ];then fi } -fn_serverquery(){ -# uses serverquery.py to directly query the server -# detects if the server locks up -if [ -f serverquery.py ];then - echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${logfile} - serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` +fn_runcheck(){ +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + fn_serverquery + echo -en "\r[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${scriptlog} + sleep 0.5 + echo -en "\n" + exit +fi +} + +fn_logmanager(){ +# log manager will active if finds logs older than ${logdays} +if [ `find ${scriptlogdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then + echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${scriptlog} + echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${scriptlog} + find ${scriptlogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + find ${consolelogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + scriptcount=`find ${scriptlogdir}/* -mtime +${logdays}|wc -l` + consolecount=`find ${consolelogdir}/* -mtime +${logdays}|wc -l` + count=$((${scriptcount} + ${consolecount})) + find ${scriptlogdir}/* -mtime +${logdays} -exec rm {} \; + find ${consolelogdir}/* -mtime +${logdays} -exec rm {} \; + echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${scriptlog} +fi +} + +fn_debugserver(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode" +echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +fn_stopserver +echo -en "[ .... ] Starting ${servicename}: ${servername} debug mode" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\n" +cd ${filesdir} +./srcds_run ${parms} -debug +} + +fn_console(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console" +echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +echo -en "\r[ .... ] Starting ${servicename} console" +sleep 0.5 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\r[\e[0;32m OK \e[0;39m] Starting ${servicename} console" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} console accessed" >> ${scriptlog} sleep 1 - if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then - echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${logfile} - sleep 1 - fn_restartserver - else - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - fi + tmux attach-session -t $(tmux list-sessions|awk '{print $1}') +else + echo -e "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running" + sleep 0.5 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) fn_startserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi } -fn_runcheck(){ -# already running check -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 1 ];then - fn_serverquery - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${logfile} - exit -# multiple of same instance check -elif [ ${pidwc} -ge 2 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: ${servername} is running ${pidwc} times" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is running ${pidwc} times" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] ${servicename}: Stopping ${pidwc} instances of ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${pidwc} instances of ${servername}" >> ${logfile} - fn_stopserver - exit +fn_backupserver(){ +fn_rootcheck +fn_syscheck +backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" +echo "" +echo "${gamename} Backup" +echo "============================" +echo "" +echo "The following backup will be created." +echo "" +echo "${backupdir}/${backupname}.tar.gz" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running" + while true; do + read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) fn_stopserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi +echo -en "[ .... ] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} backup" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} backup" >> ${scriptlog} +sleep 1 +echo -en "\n" +cd ${rootdir} +mkdir ${backupdir} > /dev/null 2>&1 +tar -cvzf ${backupdir}/${backupname}.tar.gz --exclude '${backupdir}' ${rootdir} +echo -en "\r${servicename} backup complete" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: backup complete" >> ${scriptlog} +} + +fn_details(){ +echo "" +echo "${gamename} Server Details" +echo "============================" +echo "" +echo "${servername} Ports" +echo "=======================" +servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` +rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` +echo "Ports the server is currently using" +echo "" +echo "DIRECTION DESCRIPTION PORT" +echo "INBOUND Game/Rcon Port ${port}" +if [ "${engine}" = "source" ];then + echo "INBOUND SourceTV Port ${sourcetvport}" +fi +echo "OUTBOUND Client Port ${clientport}" +echo "" +echo "You can change ports by editing the" +echo "start parameters in ${selfname}" +echo "" +echo "${servername} Details" +echo "=======================" +echo "Server name: ${servername}" +echo "Rcon Password: ${rcon}" +echo "" +echo "Config file:" +echo "${servercfg}" +echo "" } fn_distro(){ @@ -139,7 +281,13 @@ fn_distro fn_uptime fn_load { -echo -e "=========================================\nServer information\n=========================================\n" +echo -e "========================================\n${servicename} details\n========================================\n" +echo -e "Service: ${servicename}" +echo -e "Game: ${gamename}" +echo -e "Server: ${servername}" +echo -e "Failure reason: ${failurereason}" +echo -e "Action Taken: ${actiontaken}\n" +echo -e "========================================\nServer details\n========================================\n" echo -e "Date: $(date)" echo -e "Distro: ${os}" echo -e "Arch: ${arch}" @@ -147,139 +295,93 @@ echo -e "Kernel: ${kernel}" echo -e "Hostname: $HOSTNAME" echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" echo -e "Avg Load${load}\n" -echo -e "=========================================\n${servicename} statistics\n=========================================\n" -echo -e "Service: ${servicename}" -echo -e "Server: ${servername}" -echo -e "Failure reason: ${failurereason}" -echo -e "Action Taken: ${actiontaken}\n" -echo -e "=========================================\n${servicename} log summary\n=========================================\n" -}|tee ${logdir}/${servicename}-email.log > /dev/null 2>&1 -tail -50 ${logfile} >> /${logdir}/${servicename}-email.log -mail -s "${subject}" ${email} < /${logdir}/${servicename}-email.log -echo -e "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: sent email notification to ${email}" >> ${logfile} +echo -e "========================================\nLogs\n========================================\n" +echo -e "Script log\n===================\n" +}|tee ${scriptlogdir}/${servicename}-email.log > /dev/null 2>&1 +tail -25 ${scriptlog} >> ${emaillog} +echo -e "\n\nConsole log\n====================\n" >> ${emaillog} +tail -25 ${consolelog} >> ${emaillog} +if [ ! -z ${gamelogdir} ];then + echo -e "\n\nServer log\n====================\n" >> ${emaillog} + tail ${gamelogdir}/*|grep -v "==>"|sed '/^$/d' >> ${emaillog} +fi +mail -s "${subject}" ${email} < ${emaillog} +echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Sent email notification to ${email}" >> ${scriptlog} } fn_emailtest(){ fn_rootcheck fn_syscheck -echo -e "[\e[0;32m OK \e[0;39m] Emailing test notification" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Email Test Notification - Testing ${servername}" failurereason="Testing ${servicename} email notification" actiontaken="Sent test email...hello is this thing on?" fn_emailnotification else - echo -e "[\e[0;31m FAIL \e[0;39m] Email notificaion not enabled" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notificaion not enabled" >> ${logfile} -fi -} - -fn_logmanager(){ -# log manager will active if finds logs older than $logdays -if [ `find ${logdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then - echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${logfile} - echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${logfile} - find ${logdir}/* -mtime +${logdays} |tee >> ${logfile} - count=`find ${logdir}/* -mtime +${logdays}|wc -l` - find ${logdir}/* -mtime +${logdays} -exec rm {} \; - echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${logfile} + echo -e "[\e[0;31m FAIL \e[0;39m] Email notification not enabled" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notification not enabled" >> ${scriptlog} fi +sleep 0.5 +echo -en "\n" } -fn_restartserver(){ - echo -e "[\e[0;32m OK \e[0;39m] Restarting ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${logfile} - fn_stopserver +fn_serverquery(){ +# uses serverquery.py to directly query the server +# detects if the server locks up +if [ -f serverquery.py ];then + echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${scriptlog} + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${scriptlog} + serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` sleep 1 - fn_startserver -} - -fn_startserver(){ -fn_rootcheck -fn_syscheck -fn_runcheck -fn_logmanager -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${logfile} -cp ${logfile} ${logfiledate} -screen -d -m -S ${servicename} ${filesdir}/srcds_run ${parms} -sleep 1 -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 0 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: Failed to start ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${logfile} -fi -} - -fn_stopserver(){ -fn_rootcheck -fn_syscheck -pid=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` -if [ -z ${pid} ];then - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already stopped" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${logfile} -else - echo -e "[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${logfile} - kill `screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` - screen -wipe > /dev/null 2>&1 + if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then + echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${scriptlog} + sleep 1 + fn_restartserver + else + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + fi fi } -fn_debugserver(){ -fn_rootcheck -fn_syscheck -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} in debug mode!" -sleep 0.5 -echo -e "" -echo -e "Use for identifying server issues only!" -while true; do - echo "If server is already running it will be stopped" - read -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; -esac -done -fn_stopserver -sleep 1 -echo -e "[\e[0;36m INFO \e[0;39m] Press CTRL+C to drop out of debug mode" -sleep 3 -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -${filesdir}/srcds_run ${parms} -debug -} - fn_monitorserver(){ fn_rootcheck fn_syscheck fn_logmanager -echo -e "[\e[0;32m OK \e[0;39m] Checking ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Checking ${servername}" >> ${logfile} +echo -en "[ .... ] Monitor is checking ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is checking ${servername}" >> ${scriptlog} +sleep 0.5 updatecheck=`ps -ef|grep "${selfname} update"|grep -v grep|wc -l` if [ "${updatecheck}" = "0" ];then fn_runcheck - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${logfile} + echo -en "\r[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Monitor - Starting ${servername}" - failurereason="${servername} had stopped" - actiontaken="restarted ${servername}" + failurereason="${servicename} process was not running" + actiontaken="restarted ${servicename}" + sleep 0.5 + echo -en "\n" fn_emailnotification fi + sleep 0.5 + echo -en "\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is starting ${servername}" >> ${scriptlog} fn_startserver else echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: Monitor detected ${servername} is currently checking for updates!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${scriptlog} echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} will start when updating is complete" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${scriptlog} fi } @@ -287,80 +389,60 @@ fn_updateserver(){ fn_rootcheck fn_syscheck echo -e "[\e[0;32m OK \e[0;39m] Updating ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${scriptlog} cd ${rootdir} cd steamcmd -./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${logfile} +./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${scriptlog} } -fn_details(){ -echo "" -echo "${gamename} Server Details" -echo "============================" -echo "" -echo "${servername} Ports" -echo "=======================" -if [ "${engine}" = "unreal2" ];then - gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') - queryport=$((${gameport} + 1)) - gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') - webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') - webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') - webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT INI VARIABLE" - echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" - echo "INBOUND Query Port ${queryport} UDP n/a" - if [ "${appid}" != "223250" ];then - echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ];then - echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" - else - echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" - fi - if [ "${appid}" ];then - if [ "${appid}" == "223250" ];then - echo "OUTBOUND Steam Port 20610 UDP n/a" - else - echo "OUTBOUND Steam Port 20660 UDP n/a" - fi - fi - echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" - echo "" - echo "${servername} WebAdmin" - echo "=======================" - echo "WebAdmin URL: http://localhost:${webadminport}" - echo "WebAdmin Username: ${webadminuser}" - echo "WebAdmin Password: ${webadminpass}" - echo "" - echo "Config file" - echo "${systemdir}/${ini}" -elif [ "${engine}" = "source" ]||[ "${engine}" = "goldsource" ];then - servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` - rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT" - echo "INBOUND Game/Rcon Port ${port}" - if [ "${engine}" = "source" ];then - echo "INBOUND SourceTV Port ${sourcetvport}" - fi - echo "OUTBOUND Client Port ${clientport}" - echo "" - echo "You can change ports by editing the" - echo "start parameters in ${selfname}" - echo "" - echo "${servername} Details" - echo "=======================" - echo "Server name: ${servername}" - echo "Rcon Password: ${rcon}" - echo "" - echo "Config file:" - echo "${servercfg}" +fn_restartserver(){ +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${scriptlog} +fn_stopserver +fn_startserver +} + +fn_stopserver(){ +fn_rootcheck +fn_syscheck +pid=$(tmux list-sessions 2>&1|awk '{print $1}') +echo -en "[ .... ] Stopping ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${scriptlog} +sleep 0.5 +if [ "${pid}" == "failed" ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${scriptlog} +else + tmux kill-session -t ${servicename} + echo -en "\r[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopped ${servername}" >> ${scriptlog} fi -echo "" +sleep 0.5 +echo -en "\n" +} + +fn_startserver(){ +fn_rootcheck +fn_syscheck +echo -en "[ .... ] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${scriptlog} +sleep 0.5 +fn_runcheck +fn_logmanager +mv ${scriptlog} ${scriptlogdate} +mv ${consolelog} ${consolelogdate} +cd ${filesdir} +tmux new-session -d -s ${servicename} "./srcds_run ${parms} |tee -a ${consolelog}" +tmuxwc=`tmux list-sessions 2>&1|awk '{print $1}'|wc -l` +sleep 1 +if [ ${tmuxwc} -eq 0 ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${scriptlog} +else + echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername}" >> ${scriptlog} +fi +sleep 0.5 +echo -en "\n" } # @@ -440,8 +522,6 @@ echo "Installing ${gamename} Server" echo "=================================" cd ${rootdir}/steamcmd mkdir -v ${filesdir} - mkdir -v ${rootdir}/log - mkdir -v ${logdir} touch install.txt chmod 0600 install.txt echo "login anonymous" > install.txt @@ -488,7 +568,11 @@ echo "=================================" }|tee ${servercfg} > /dev/null 2>&1 sleep 1 echo "" - echo "Setting up logging" + echo "Creating log directorys" + mkdir -v ${rootdir}/log + mkdir -v ${scriptlogdir} + mkdir -v ${consolelogdir} + touch ${consolelog} if [ ! -h ${rootdir}/log/server ]; then ln -sv ${gamelogdir} ${rootdir}/log/server else @@ -524,16 +608,20 @@ case "$1" in fn_startserver;; monitor) fn_monitorserver;; - install) - fn_install;; - debug) - fn_debugserver;; email-test) fn_emailtest;; details) fn_details;; + backup) + fn_backupserver;; + console) + fn_console;; + debug) + fn_debugserver;; + install) + fn_install;; *) - echo "Usage: $0 {start|stop|restart|update|monitor|install|debug|email-test|details}" - exit 1;; + echo "Usage: $0 {start|stop|restart|update|monitor|email-test|details|backup|console|debug|install}" + exit 1;; esac exit \ No newline at end of file diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index eb8d9137c..94378d89f 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -3,7 +3,7 @@ # Server Management Script # Author: Daniel Gibbs # Website: http://danielgibbs.co.uk -# Version: 310813 +# Version: 011013 #### Variables #### @@ -29,22 +29,27 @@ rootdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" selfname="$0" filesdir="${rootdir}/serverfiles" servercfg="${filesdir}/hl2mp/cfg/server.cfg" - +backupdir="${rootdir}/backups" # Server Details servicename="hl2dm-server" gamename="Half Life 2: Deathmatch" engine="source" - servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` # Logging -logdir="${rootdir}/log/script" -gamelogdir="${filesdir}/hl2mp/logs" -logfile="${logdir}/${servicename}.log" -logfiledate="${logdir}/${servicename}-$( date '+%d-%m-%Y-%H-%M-%S').log" logdays="7" +gamelogdir="${filesdir}/hl2mp/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" ##### Script ##### # Do not edit @@ -65,49 +70,184 @@ if [ ! -e ${filesdir} ];then fi } -fn_serverquery(){ -# uses serverquery.py to directly query the server -# detects if the server locks up -if [ -f serverquery.py ];then - echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${logfile} - serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` +fn_runcheck(){ +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + fn_serverquery + echo -en "\r[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${scriptlog} + sleep 0.5 + echo -en "\n" + exit +fi +} + +fn_logmanager(){ +# log manager will active if finds logs older than ${logdays} +if [ `find ${scriptlogdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then + echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${scriptlog} + echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${scriptlog} + find ${scriptlogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + find ${consolelogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + scriptcount=`find ${scriptlogdir}/* -mtime +${logdays}|wc -l` + consolecount=`find ${consolelogdir}/* -mtime +${logdays}|wc -l` + count=$((${scriptcount} + ${consolecount})) + find ${scriptlogdir}/* -mtime +${logdays} -exec rm {} \; + find ${consolelogdir}/* -mtime +${logdays} -exec rm {} \; + echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${scriptlog} +fi +} + +fn_debugserver(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode" +echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +fn_stopserver +echo -en "[ .... ] Starting ${servicename}: ${servername} debug mode" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\n" +cd ${filesdir} +./srcds_run ${parms} -debug +} + +fn_console(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console" +echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +echo -en "\r[ .... ] Starting ${servicename} console" +sleep 0.5 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\r[\e[0;32m OK \e[0;39m] Starting ${servicename} console" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} console accessed" >> ${scriptlog} sleep 1 - if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then - echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${logfile} - sleep 1 - fn_restartserver - else - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - fi + tmux attach-session -t $(tmux list-sessions|awk '{print $1}') +else + echo -e "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running" + sleep 0.5 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) fn_startserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi } -fn_runcheck(){ -# already running check -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 1 ];then - fn_serverquery - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${logfile} - exit -# multiple of same instance check -elif [ ${pidwc} -ge 2 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: ${servername} is running ${pidwc} times" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is running ${pidwc} times" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] ${servicename}: Stopping ${pidwc} instances of ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${pidwc} instances of ${servername}" >> ${logfile} - fn_stopserver - exit +fn_backupserver(){ +fn_rootcheck +fn_syscheck +backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" +echo "" +echo "${gamename} Backup" +echo "============================" +echo "" +echo "The following backup will be created." +echo "" +echo "${backupdir}/${backupname}.tar.gz" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running" + while true; do + read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) fn_stopserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi +echo -en "[ .... ] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} backup" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} backup" >> ${scriptlog} +sleep 1 +echo -en "\n" +cd ${rootdir} +mkdir ${backupdir} > /dev/null 2>&1 +tar -cvzf ${backupdir}/${backupname}.tar.gz --exclude '${backupdir}' ${rootdir} +echo -en "\r${servicename} backup complete" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: backup complete" >> ${scriptlog} +} + +fn_details(){ +echo "" +echo "${gamename} Server Details" +echo "============================" +echo "" +echo "${servername} Ports" +echo "=======================" +servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` +rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` +echo "Ports the server is currently using" +echo "" +echo "DIRECTION DESCRIPTION PORT" +echo "INBOUND Game/Rcon Port ${port}" +if [ "${engine}" = "source" ];then + echo "INBOUND SourceTV Port ${sourcetvport}" +fi +echo "OUTBOUND Client Port ${clientport}" +echo "" +echo "You can change ports by editing the" +echo "start parameters in ${selfname}" +echo "" +echo "${servername} Details" +echo "=======================" +echo "Server name: ${servername}" +echo "Rcon Password: ${rcon}" +echo "" +echo "Config file:" +echo "${servercfg}" +echo "" } fn_distro(){ @@ -141,7 +281,13 @@ fn_distro fn_uptime fn_load { -echo -e "=========================================\nServer information\n=========================================\n" +echo -e "========================================\n${servicename} details\n========================================\n" +echo -e "Service: ${servicename}" +echo -e "Game: ${gamename}" +echo -e "Server: ${servername}" +echo -e "Failure reason: ${failurereason}" +echo -e "Action Taken: ${actiontaken}\n" +echo -e "========================================\nServer details\n========================================\n" echo -e "Date: $(date)" echo -e "Distro: ${os}" echo -e "Arch: ${arch}" @@ -149,139 +295,95 @@ echo -e "Kernel: ${kernel}" echo -e "Hostname: $HOSTNAME" echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" echo -e "Avg Load${load}\n" -echo -e "=========================================\n${servicename} statistics\n=========================================\n" -echo -e "Service: ${servicename}" -echo -e "Server: ${servername}" -echo -e "Failure reason: ${failurereason}" -echo -e "Action Taken: ${actiontaken}\n" -echo -e "=========================================\n${servicename} log summary\n=========================================\n" -}|tee ${logdir}/${servicename}-email.log > /dev/null 2>&1 -tail -50 ${logfile} >> /${logdir}/${servicename}-email.log -mail -s "${subject}" ${email} < /${logdir}/${servicename}-email.log -echo -e "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: sent email notification to ${email}" >> ${logfile} +echo -e "========================================\nLogs\n========================================\n" +echo -e "Script log\n===================\n" +}|tee ${scriptlogdir}/${servicename}-email.log > /dev/null 2>&1 +tail -25 ${scriptlog} >> ${emaillog} +if [ ! -z ${consolelog} ];then + echo -e "\n\nConsole log\n====================\n" >> ${emaillog} + tail -25 ${consolelog} >> ${emaillog} +fi +if [ ! -z ${gamelogdir} ];then + echo -e "\n\nServer log\n====================\n" >> ${emaillog} + tail ${gamelogdir}/*|grep -v "==>"|sed '/^$/d'|tail -25 >> ${emaillog} +fi +mail -s "${subject}" ${email} < ${emaillog} +echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" +echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Sent email notification to ${email}" >> ${scriptlog} } fn_emailtest(){ fn_rootcheck fn_syscheck -echo -e "[\e[0;32m OK \e[0;39m] Emailing test notification" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Email Test Notification - Testing ${servername}" failurereason="Testing ${servicename} email notification" actiontaken="Sent test email...hello is this thing on?" fn_emailnotification else - echo -e "[\e[0;31m FAIL \e[0;39m] Email notificaion not enabled" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notificaion not enabled" >> ${logfile} -fi -} - -fn_logmanager(){ -# log manager will active if finds logs older than $logdays -if [ `find ${logdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then - echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${logfile} - echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${logfile} - find ${logdir}/* -mtime +${logdays} |tee >> ${logfile} - count=`find ${logdir}/* -mtime +${logdays}|wc -l` - find ${logdir}/* -mtime +${logdays} -exec rm {} \; - echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${logfile} + echo -e "[\e[0;31m FAIL \e[0;39m] Email notification not enabled" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notification not enabled" >> ${scriptlog} fi +sleep 0.5 +echo -en "\n" } -fn_restartserver(){ - echo -e "[\e[0;32m OK \e[0;39m] Restarting ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${logfile} - fn_stopserver +fn_serverquery(){ +# uses serverquery.py to directly query the server +# detects if the server locks up +if [ -f serverquery.py ];then + echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${scriptlog} + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${scriptlog} + serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` sleep 1 - fn_startserver -} - -fn_startserver(){ -fn_rootcheck -fn_syscheck -fn_runcheck -fn_logmanager -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${logfile} -cp ${logfile} ${logfiledate} -screen -d -m -S ${servicename} ${filesdir}/srcds_run ${parms} -sleep 1 -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 0 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: Failed to start ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${logfile} -fi -} - -fn_stopserver(){ -fn_rootcheck -fn_syscheck -pid=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` -if [ -z ${pid} ];then - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already stopped" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${logfile} -else - echo -e "[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${logfile} - kill `screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` - screen -wipe > /dev/null 2>&1 + if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then + echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${scriptlog} + sleep 1 + fn_restartserver + else + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + fi fi } -fn_debugserver(){ -fn_rootcheck -fn_syscheck -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} in debug mode!" -sleep 0.5 -echo -e "" -echo -e "Use for identifying server issues only!" -while true; do - echo "If server is already running it will be stopped" - read -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; -esac -done -fn_stopserver -sleep 1 -echo -e "[\e[0;36m INFO \e[0;39m] Press CTRL+C to drop out of debug mode" -sleep 3 -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -${filesdir}/srcds_run ${parms} -debug -} - fn_monitorserver(){ fn_rootcheck fn_syscheck fn_logmanager -echo -e "[\e[0;32m OK \e[0;39m] Checking ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Checking ${servername}" >> ${logfile} +echo -en "[ .... ] Monitor is checking ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is checking ${servername}" >> ${scriptlog} +sleep 0.5 updatecheck=`ps -ef|grep "${selfname} update"|grep -v grep|wc -l` if [ "${updatecheck}" = "0" ];then fn_runcheck - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${logfile} + echo -en "\r[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Monitor - Starting ${servername}" - failurereason="${servername} had stopped" - actiontaken="restarted ${servername}" + failurereason="${servicename} process was not running" + actiontaken="restarted ${servicename}" + sleep 0.5 + echo -en "\n" fn_emailnotification fi + sleep 0.5 + echo -en "\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is starting ${servername}" >> ${scriptlog} fn_startserver else echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: Monitor detected ${servername} is currently checking for updates!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${scriptlog} echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} will start when updating is complete" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${scriptlog} fi } @@ -289,80 +391,60 @@ fn_updateserver(){ fn_rootcheck fn_syscheck echo -e "[\e[0;32m OK \e[0;39m] Updating ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${scriptlog} cd ${rootdir} cd steamcmd -./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${logfile} +./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${scriptlog} } -fn_details(){ -echo "" -echo "${gamename} Server Details" -echo "============================" -echo "" -echo "${servername} Ports" -echo "=======================" -if [ "${engine}" = "unreal2" ];then - gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') - queryport=$((${gameport} + 1)) - gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') - webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') - webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') - webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT INI VARIABLE" - echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" - echo "INBOUND Query Port ${queryport} UDP n/a" - if [ "${appid}" != "223250" ];then - echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ];then - echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" - else - echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" - fi - if [ "${appid}" ];then - if [ "${appid}" == "223250" ];then - echo "OUTBOUND Steam Port 20610 UDP n/a" - else - echo "OUTBOUND Steam Port 20660 UDP n/a" - fi - fi - echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" - echo "" - echo "${servername} WebAdmin" - echo "=======================" - echo "WebAdmin URL: http://localhost:${webadminport}" - echo "WebAdmin Username: ${webadminuser}" - echo "WebAdmin Password: ${webadminpass}" - echo "" - echo "Config file" - echo "${systemdir}/${ini}" -elif [ "${engine}" = "source" ]||[ "${engine}" = "goldsource" ];then - servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` - rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT" - echo "INBOUND Game/Rcon Port ${port}" - if [ "${engine}" = "source" ];then - echo "INBOUND SourceTV Port ${sourcetvport}" - fi - echo "OUTBOUND Client Port ${clientport}" - echo "" - echo "You can change ports by editing the" - echo "start parameters in ${selfname}" - echo "" - echo "${servername} Details" - echo "=======================" - echo "Server name: ${servername}" - echo "Rcon Password: ${rcon}" - echo "" - echo "Config file:" - echo "${servercfg}" +fn_restartserver(){ +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${scriptlog} +fn_stopserver +fn_startserver +} + +fn_stopserver(){ +fn_rootcheck +fn_syscheck +pid=$(tmux list-sessions 2>&1|awk '{print $1}') +echo -en "[ .... ] Stopping ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${scriptlog} +sleep 0.5 +if [ "${pid}" == "failed" ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${scriptlog} +else + tmux kill-session -t ${servicename} + echo -en "\r[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopped ${servername}" >> ${scriptlog} fi -echo "" +sleep 0.5 +echo -en "\n" +} + +fn_startserver(){ +fn_rootcheck +fn_syscheck +echo -en "[ .... ] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${scriptlog} +sleep 0.5 +fn_runcheck +fn_logmanager +mv ${scriptlog} ${scriptlogdate} +mv ${consolelog} ${consolelogdate} +cd ${filesdir} +tmux new-session -d -s ${servicename} "./srcds_run ${parms} |tee -a ${consolelog}" +tmuxwc=`tmux list-sessions 2>&1|awk '{print $1}'|wc -l` +sleep 1 +if [ ${tmuxwc} -eq 0 ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${scriptlog} +else + echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername}" >> ${scriptlog} +fi +sleep 0.5 +echo -en "\n" } # @@ -442,8 +524,6 @@ echo "Installing ${gamename} Server" echo "=================================" cd ${rootdir}/steamcmd mkdir -v ${filesdir} - mkdir -v ${rootdir}/log - mkdir -v ${logdir} touch install.txt chmod 0600 install.txt echo "login anonymous" > install.txt @@ -490,7 +570,11 @@ echo "=================================" }|tee ${servercfg} > /dev/null 2>&1 sleep 1 echo "" - echo "Setting up logging" + echo "Creating log directorys" + mkdir -v ${rootdir}/log + mkdir -v ${scriptlogdir} + mkdir -v ${consolelogdir} + touch ${consolelog} if [ ! -h ${rootdir}/log/server ]; then ln -sv ${gamelogdir} ${rootdir}/log/server else @@ -526,16 +610,20 @@ case "$1" in fn_startserver;; monitor) fn_monitorserver;; - install) - fn_install;; - debug) - fn_debugserver;; email-test) fn_emailtest;; details) fn_details;; + backup) + fn_backupserver;; + console) + fn_console;; + debug) + fn_debugserver;; + install) + fn_install;; *) - echo "Usage: $0 {start|stop|restart|update|monitor|install|debug|email-test|details}" - exit 1;; + echo "Usage: $0 {start|stop|restart|update|monitor|email-test|details|backup|console|debug|install}" + exit 1;; esac exit \ No newline at end of file diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index 2edb3f194..4d8ecea64 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -3,7 +3,7 @@ # Server Management Script # Author: Daniel Gibbs # Website: http://danielgibbs.co.uk -# Version: 310813 +# Version: 011013 #### Variables #### @@ -24,6 +24,7 @@ rootdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" selfname="$0" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/System" +backupdir="${rootdir}/backups" compressedmapsdir="${rootdir}/Maps-Compressed" # Server names @@ -34,10 +35,16 @@ ini="${servicename}.ini" servername=`grep -s ServerName= ${systemdir}/${ini} | sed 's/ServerName=//g'` # Logging -logdir="${rootdir}/log" -logfile="${logdir}/${servicename}.log" -logfiledate="${logdir}/${servicename}-$( date '+%d-%m-%Y-%H-%M-%S').log" logdays="7" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" # Start vars defaultmap="KF-BioticsLab.rom" @@ -62,49 +69,277 @@ if [ ! -e ${systemdir} ];then fi } -fn_serverquery(){ -# uses serverquery.py to directly query the server -# detects if the server locks up -if [ -f serverquery.py ];then - echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${logfile} - serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` +fn_runcheck(){ +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + fn_serverquery + echo -en "\r[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${scriptlog} + sleep 0.5 + echo -en "\n" + exit +fi +} +fn_compressmaps(){ +fn_rootcheck +clear +echo "${gamename} Map Compressor" +echo "============================" +echo "Will compress all maps in:" +echo "" +pwd +echo "" +echo "Compressed maps saved to:" +echo "" +echo "${compressedmapsdir}" +echo "" +while true; do + read -p "Start compression [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; + esac +done +mkdir ${compressedmapsdir} +rm -rfv ${filesdir}/Maps/*.uz2 +cd ${systemdir} +./ucc-bin compress ../Maps/* --nohomedir +mv -fv ${filesdir}/Maps/*.uz2 ${compressedmapsdir} +} + +fn_steamguard(){ +fn_rootcheck +fn_syscheck +clear +fn_header +fn_steamdl +clear +fn_header +echo "If you are gettng an error:" +echo "" +echo "Login Failure: Account Logon Denied Failed." +echo "" +echo "You should now get an email from Steam with a Steam Guard code" +echo "" +read -p "Press [Enter] key to when you have the code..." +clear +fn_header +echo "Please enter Steam Guard Code" +echo "==============================" +echo -n "Code: " +read CODE +touch guard.txt +chmod 0600 guard.txt +echo "set_steam_guard_code $CODE" > guard.txt +echo "login ${steamuser} ${steampass}" >> guard.txt +echo "quit" >> guard.txt +STEAMEXE=steamcmd ./steam.sh +runscript guard.txt +rm guard.txt +cd ../ +echo "==============================" +echo "Complete!" +cd ${rootdir} +} + +fn_logmanager(){ +# log manager will active if finds logs older than ${logdays} +if [ `find ${scriptlogdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then + echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${scriptlog} + echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${scriptlog} + find ${scriptlogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + find ${consolelogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + scriptcount=`find ${scriptlogdir}/* -mtime +${logdays}|wc -l` + consolecount=`find ${consolelogdir}/* -mtime +${logdays}|wc -l` + count=$((${scriptcount} + ${consolecount})) + find ${scriptlogdir}/* -mtime +${logdays} -exec rm {} \; + find ${consolelogdir}/* -mtime +${logdays} -exec rm {} \; + echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${scriptlog} +fi +} + +fn_debugserver(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode" +echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +fn_stopserver +echo -en "[ .... ] Starting ${servicename}: ${servername} debug mode" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\n" +cd ${systemdir} + +./ucc-bin ${parms} +} + +fn_console(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console" +echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +echo -en "\r[ .... ] Starting ${servicename} console" +sleep 0.5 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\r[\e[0;32m OK \e[0;39m] Starting ${servicename} console" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} console accessed" >> ${scriptlog} sleep 1 - if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then - echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${logfile} - sleep 1 - fn_restartserver - else - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - fi + tmux attach-session -t $(tmux list-sessions|awk '{print $1}') +else + echo -e "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running" + sleep 0.5 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) fn_startserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi } -fn_runcheck(){ -# already running check -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 1 ];then - fn_serverquery - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${logfile} - exit -# multiple of same instance check -elif [ ${pidwc} -ge 2 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: ${servername} is running ${pidwc} times" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is running ${pidwc} times" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] ${servicename}: Stopping ${pidwc} instances of ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${pidwc} instances of ${servername}" >> ${logfile} - fn_stopserver - exit +fn_backupserver(){ +fn_rootcheck +fn_syscheck +backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" +echo "" +echo "${gamename} Backup" +echo "============================" +echo "" +echo "The following backup will be created." +echo "" +echo "${backupdir}/${backupname}.tar.gz" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running" + while true; do + read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) fn_stopserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done +fi +echo -en "[ .... ] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} backup" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} backup" >> ${scriptlog} +sleep 1 +echo -en "\n" +cd ${rootdir} +mkdir ${backupdir} > /dev/null 2>&1 +tar -cvzf ${backupdir}/${backupname}.tar.gz --exclude '${backupdir}' ${rootdir} +echo -en "\r${servicename} backup complete" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: backup complete" >> ${scriptlog} +} + +fn_details(){ +echo "" +echo "${gamename} Server Details" +echo "============================" +echo "" +echo "${servername} Ports" +echo "=======================" +gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') +queryport=$((${gameport} + 1)) +gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') +udplinkport=$((${gameport} + 2)) +webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') +if [ "${engine}" == "unreal" ];then + webadminuser=$(grep AdminUsername= ${systemdir}/${ini}|sed 's/\AdminUsername=//g') +else + webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') +fi +webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') + + +echo "Ports the server is currently using" +echo "" +echo "DIRECTION DESCRIPTION PORT INI VARIABLE" +echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" +echo "INBOUND Query Port ${queryport} UDP n/a" +if [ "${engine}" == "unreal" ];then + echo "OUTBOUND UdpLink Port (random) ${udplinkport}+ UDP n/a" +fi +if [ "${engine}" != "unreal" ] && [ "${appid}" != "223250" ];then + echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" +fi +if [ "${appid}" == "215360" ];then + echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" +else + echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" +fi +if [ "${appid}" ];then + if [ "${appid}" == "223250" ];then + echo "OUTBOUND Steam Port 20610 UDP n/a" + else + echo "OUTBOUND Steam Port 20660 UDP n/a" + fi + fi +echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" + +echo "" + + + +echo "${servername} WebAdmin" +echo "=======================" +echo "WebAdmin URL: http://localhost:${webadminport}" +echo "WebAdmin Username: ${webadminuser}" + +echo "WebAdmin Password: ${webadminpass}" +echo "" +echo "Config file" +echo "${systemdir}/${ini}" +echo "" } fn_distro(){ @@ -138,7 +373,13 @@ fn_distro fn_uptime fn_load { -echo -e "=========================================\nServer information\n=========================================\n" +echo -e "========================================\n${servicename} details\n========================================\n" +echo -e "Service: ${servicename}" +echo -e "Game: ${gamename}" +echo -e "Server: ${servername}" +echo -e "Failure reason: ${failurereason}" +echo -e "Action Taken: ${actiontaken}\n" +echo -e "========================================\nServer details\n========================================\n" echo -e "Date: $(date)" echo -e "Distro: ${os}" echo -e "Arch: ${arch}" @@ -146,140 +387,95 @@ echo -e "Kernel: ${kernel}" echo -e "Hostname: $HOSTNAME" echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" echo -e "Avg Load${load}\n" -echo -e "=========================================\n${servicename} statistics\n=========================================\n" -echo -e "Service: ${servicename}" -echo -e "Server: ${servername}" -echo -e "Failure reason: ${failurereason}" -echo -e "Action Taken: ${actiontaken}\n" -echo -e "=========================================\n${servicename} log summary\n=========================================\n" -}|tee ${logdir}/${servicename}-email.log > /dev/null 2>&1 -tail -50 ${logfile} >> /${logdir}/${servicename}-email.log -mail -s "${subject}" ${email} < /${logdir}/${servicename}-email.log -echo -e "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: sent email notification to ${email}" >> ${logfile} +echo -e "========================================\nLogs\n========================================\n" +echo -e "Script log\n===================\n" +}|tee ${scriptlogdir}/${servicename}-email.log > /dev/null 2>&1 +tail -25 ${scriptlog} >> ${emaillog} +if [ ! -z ${consolelog} ];then + echo -e "\n\nConsole log\n====================\n" >> ${emaillog} + tail -25 ${consolelog} >> ${emaillog} +fi +if [ ! -z ${gamelogdir} ];then + echo -e "\n\nServer log\n====================\n" >> ${emaillog} + tail ${gamelogdir}/*|grep -v "==>"|sed '/^$/d'|tail -25 >> ${emaillog} +fi +mail -s "${subject}" ${email} < ${emaillog} +echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" +echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Sent email notification to ${email}" >> ${scriptlog} } fn_emailtest(){ fn_rootcheck fn_syscheck -echo -e "[\e[0;32m OK \e[0;39m] Emailing test notification" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Email Test Notification - Testing ${servername}" failurereason="Testing ${servicename} email notification" actiontaken="Sent test email...hello is this thing on?" fn_emailnotification else - echo -e "[\e[0;31m FAIL \e[0;39m] Email notificaion not enabled" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notificaion not enabled" >> ${logfile} -fi -} - -fn_logmanager(){ -# log manager will active if finds logs older than $logdays -if [ `find ${logdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then - echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${logfile} - echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${logfile} - find ${logdir}/* -mtime +${logdays} |tee >> ${logfile} - count=`find ${logdir}/* -mtime +${logdays}|wc -l` - find ${logdir}/* -mtime +${logdays} -exec rm {} \; - echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${logfile} + echo -e "[\e[0;31m FAIL \e[0;39m] Email notification not enabled" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notification not enabled" >> ${scriptlog} fi +sleep 0.5 +echo -en "\n" } -fn_restartserver(){ - echo -e "[\e[0;32m OK \e[0;39m] Restarting ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${logfile} - fn_stopserver +fn_serverquery(){ +# uses serverquery.py to directly query the server +# detects if the server locks up +if [ -f serverquery.py ];then + echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${scriptlog} + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${scriptlog} + serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` sleep 1 - fn_startserver -} - -fn_startserver(){ -fn_rootcheck -fn_syscheck -fn_runcheck -fn_logmanager -cd ${systemdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${logfile} -cp ${logfile} ${logfiledate} -screen -d -m -S ${servicename} ./ucc-bin ${parms} -sleep 1 -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 0 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: Failed to start ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${logfile} -fi -} - -fn_stopserver(){ -fn_rootcheck -fn_syscheck -pid=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` -if [ -z ${pid} ];then - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already stopped" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${logfile} -else - echo -e "[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${logfile} - kill `screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` - screen -wipe > /dev/null 2>&1 + if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then + echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${scriptlog} + sleep 1 + fn_restartserver + else + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + fi fi } -fn_debugserver(){ -fn_rootcheck -fn_syscheck -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} in debug mode!" -sleep 0.5 -echo -e "" -echo -e "Use for identifying server issues only!" -while true; do - echo "If server is already running it will be stopped" - read -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; -esac -done -fn_stopserver -sleep 1 -echo -e "[\e[0;36m INFO \e[0;39m] Press CTRL+C to drop out of debug mode" -sleep 3 -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -cd ${systemdir} -./ucc-bin ${parms} -} - fn_monitorserver(){ fn_rootcheck fn_syscheck fn_logmanager -echo -e "[\e[0;32m OK \e[0;39m] Checking ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Checking ${servername}" >> ${logfile} +echo -en "[ .... ] Monitor is checking ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is checking ${servername}" >> ${scriptlog} +sleep 0.5 updatecheck=`ps -ef|grep "${selfname} update"|grep -v grep|wc -l` if [ "${updatecheck}" = "0" ];then fn_runcheck - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${logfile} + echo -en "\r[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Monitor - Starting ${servername}" - failurereason="${servername} had stopped" - actiontaken="restarted ${servername}" + failurereason="${servicename} process was not running" + actiontaken="restarted ${servicename}" + sleep 0.5 + echo -en "\n" fn_emailnotification fi + sleep 0.5 + echo -en "\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is starting ${servername}" >> ${scriptlog} fn_startserver else echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: Monitor detected ${servername} is currently checking for updates!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${scriptlog} echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} will start when updating is complete" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${scriptlog} fi } @@ -287,7 +483,7 @@ fn_updateserver(){ fn_rootcheck fn_syscheck echo -e "[\e[0;32m OK \e[0;39m] Updating ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${scriptlog} cd ${rootdir} cd steamcmd ./steamcmd.sh +login ${steamuser} ${steampass} +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${logfile} @@ -300,136 +496,55 @@ if [ $(grep Denied ${logfile}|wc -l) -ge 1 ];then fi } -fn_compressmaps(){ -fn_rootcheck -clear -echo "${gamename} Map Compressor" -echo "============================" -echo "Will compress all maps in:" -echo "" -pwd -echo "" -echo "Compressed maps saved to:" -echo "" -echo "$compressedmapsdir" -echo "" -while true; do - read -p "Start compression [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; - esac -done -mkdir $compressedmapsdir -rm -rfv ${filesdir}/Maps/*.uz2 -cd ${systemdir} -./ucc-bin compress ../Maps/* --nohomedir -mv -fv ${filesdir}/Maps/*.uz2 $compressedmapsdir +fn_restartserver(){ +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${scriptlog} +fn_stopserver +fn_startserver } -fn_steamguard(){ +fn_stopserver(){ fn_rootcheck fn_syscheck -clear -fn_header -fn_steamdl -clear -fn_header -echo "If you are gettng an error:" -echo "" -echo "Login Failure: Account Logon Denied Failed." -echo "" -echo "You should now get an email from Steam with a Steam Guard code" -echo "" -read -p "Press [Enter] key to when you have the code..." -clear -fn_header -echo "Please enter Steam Guard Code" -echo "==============================" -echo -n "Code: " -read CODE -touch guard.txt -chmod 0600 guard.txt -echo "set_steam_guard_code $CODE" > guard.txt -echo "login ${steamuser} ${steampass}" >> guard.txt -echo "quit" >> guard.txt -STEAMEXE=steamcmd ./steam.sh +runscript guard.txt -rm guard.txt -cd ../ -echo "==============================" -echo "Complete!" -cd ${rootdir} +pid=$(tmux list-sessions 2>&1|awk '{print $1}') +echo -en "[ .... ] Stopping ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${scriptlog} +sleep 0.5 +if [ "${pid}" == "failed" ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${scriptlog} +else + tmux kill-session -t ${servicename} + echo -en "\r[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopped ${servername}" >> ${scriptlog} +fi +sleep 0.5 +echo -en "\n" } -fn_details(){ -echo "" -echo "${gamename} Server Details" -echo "============================" -echo "" -echo "${servername} Ports" -echo "=======================" -if [ "${engine}" = "unreal2" ];then - gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') - queryport=$((${gameport} + 1)) - gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') - webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') - webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') - webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT INI VARIABLE" - echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" - echo "INBOUND Query Port ${queryport} UDP n/a" - if [ "${appid}" != "223250" ];then - echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ];then - echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" - else - echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" - fi - if [ "${appid}" ];then - if [ "${appid}" == "223250" ];then - echo "OUTBOUND Steam Port 20610 UDP n/a" - else - echo "OUTBOUND Steam Port 20660 UDP n/a" - fi - fi - echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" - echo "" - echo "${servername} WebAdmin" - echo "=======================" - echo "WebAdmin URL: http://localhost:${webadminport}" - echo "WebAdmin Username: ${webadminuser}" - echo "WebAdmin Password: ${webadminpass}" - echo "" - echo "Config file" - echo "${systemdir}/${ini}" -elif [ "${engine}" = "source" ]||[ "${engine}" = "goldsource" ];then - servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` - rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT" - echo "INBOUND Game/Rcon Port ${port}" - if [ "${engine}" = "source" ];then - echo "INBOUND SourceTV Port ${sourcetvport}" - fi - echo "OUTBOUND Client Port ${clientport}" - echo "" - echo "You can change ports by editing the" - echo "start parameters in ${selfname}" - echo "" - echo "${servername} Details" - echo "=======================" - echo "Server name: ${servername}" - echo "Rcon Password: ${rcon}" - echo "" - echo "Config file:" - echo "${servercfg}" +fn_startserver(){ +fn_rootcheck +fn_syscheck +echo -en "[ .... ] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${scriptlog} +sleep 0.5 +fn_runcheck +fn_logmanager +mv ${scriptlog} ${scriptlogdate} +mv ${consolelog} ${consolelogdate} +cd ${systemdir} + +tmux new-session -d -s ${servicename} "./ucc-bin ${parms} |tee -a ${consolelog}" +tmuxwc=`tmux list-sessions 2>&1|awk '{print $1}'|wc -l` +sleep 1 +if [ ${tmuxwc} -eq 0 ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${scriptlog} +else + echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername}" >> ${scriptlog} fi -echo "" +sleep 0.5 +echo -en "\n" } # @@ -534,8 +649,11 @@ echo "=================================" echo "Copying ${systemdir}/default.ini to ${systemdir}/${ini}" cp ${systemdir}/Default.ini ${systemdir}/${ini} sleep 1 - echo "Creating log directory" - mkdir -v ${logdir} + echo "Creating log directorys" + mkdir -v ${rootdir}/log + mkdir -v ${scriptlogdir} + mkdir -v ${consolelogdir} + touch ${consolelog} sleep 1 echo "Applying WebAdmin ROOst.css fix!" echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" @@ -585,21 +703,25 @@ case "$1" in fn_startserver;; monitor) fn_monitorserver;; - install) - fn_install;; + email-test) + fn_emailtest;; + details) + fn_details;; + backup) + fn_backupserver;; + console) + fn_console;; debug) fn_debugserver;; + install) + fn_install;; map-compressor) fn_compressmaps;; steam-auth) fn_updateserver fn_steamguard;; - email-test) - fn_emailtest;; - details) - fn_details;; *) - echo "Usage: $0 {start|stop|restart|update|monitor|install|debug|map-compressor|steam-auth|email-test|details}" - exit 1;; + echo "Usage: $0 {start|stop|restart|update|monitor|email-test|details|backup|console|debug|install|map-compressor|steam-auth}" + exit 1;; esac exit \ No newline at end of file diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index 28bb44f45..fdd843e1b 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -3,7 +3,7 @@ # Server Management Script # Author: Daniel Gibbs # Website: http://danielgibbs.co.uk -# Version: 310813 +# Version: 011013 #### Variables #### @@ -29,6 +29,7 @@ rootdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" selfname="$0" filesdir="${rootdir}/serverfiles" servercfg="${filesdir}/left4dead2/cfg/server.cfg" +backupdir="${rootdir}/backups" # Server Details servicename="l4d2-server" @@ -38,11 +39,17 @@ servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` # Logging -logdir="${rootdir}/log/script" -gamelogdir="${filesdir}/left4dead2/logs" -logfile="${logdir}/${servicename}.log" -logfiledate="${logdir}/${servicename}-$( date '+%d-%m-%Y-%H-%M-%S').log" logdays="7" +gamelogdir="${filesdir}/left4dead2/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" ##### Script ##### # Do not edit @@ -63,49 +70,184 @@ if [ ! -e ${filesdir} ];then fi } -fn_serverquery(){ -# uses serverquery.py to directly query the server -# detects if the server locks up -if [ -f serverquery.py ];then - echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${logfile} - serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` +fn_runcheck(){ +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + fn_serverquery + echo -en "\r[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${scriptlog} + sleep 0.5 + echo -en "\n" + exit +fi +} + +fn_logmanager(){ +# log manager will active if finds logs older than ${logdays} +if [ `find ${scriptlogdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then + echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${scriptlog} + echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${scriptlog} + find ${scriptlogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + find ${consolelogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + scriptcount=`find ${scriptlogdir}/* -mtime +${logdays}|wc -l` + consolecount=`find ${consolelogdir}/* -mtime +${logdays}|wc -l` + count=$((${scriptcount} + ${consolecount})) + find ${scriptlogdir}/* -mtime +${logdays} -exec rm {} \; + find ${consolelogdir}/* -mtime +${logdays} -exec rm {} \; + echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${scriptlog} +fi +} + +fn_debugserver(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode" +echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +fn_stopserver +echo -en "[ .... ] Starting ${servicename}: ${servername} debug mode" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\n" +cd ${filesdir} +./srcds_run ${parms} -debug +} + +fn_console(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console" +echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +echo -en "\r[ .... ] Starting ${servicename} console" +sleep 0.5 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\r[\e[0;32m OK \e[0;39m] Starting ${servicename} console" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} console accessed" >> ${scriptlog} sleep 1 - if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then - echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${logfile} - sleep 1 - fn_restartserver - else - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - fi + tmux attach-session -t $(tmux list-sessions|awk '{print $1}') +else + echo -e "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running" + sleep 0.5 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) fn_startserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi } -fn_runcheck(){ -# already running check -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 1 ];then - fn_serverquery - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${logfile} - exit -# multiple of same instance check -elif [ ${pidwc} -ge 2 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: ${servername} is running ${pidwc} times" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is running ${pidwc} times" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] ${servicename}: Stopping ${pidwc} instances of ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${pidwc} instances of ${servername}" >> ${logfile} - fn_stopserver - exit +fn_backupserver(){ +fn_rootcheck +fn_syscheck +backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" +echo "" +echo "${gamename} Backup" +echo "============================" +echo "" +echo "The following backup will be created." +echo "" +echo "${backupdir}/${backupname}.tar.gz" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running" + while true; do + read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) fn_stopserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi +echo -en "[ .... ] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} backup" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} backup" >> ${scriptlog} +sleep 1 +echo -en "\n" +cd ${rootdir} +mkdir ${backupdir} > /dev/null 2>&1 +tar -cvzf ${backupdir}/${backupname}.tar.gz --exclude '${backupdir}' ${rootdir} +echo -en "\r${servicename} backup complete" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: backup complete" >> ${scriptlog} +} + +fn_details(){ +echo "" +echo "${gamename} Server Details" +echo "============================" +echo "" +echo "${servername} Ports" +echo "=======================" +servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` +rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` +echo "Ports the server is currently using" +echo "" +echo "DIRECTION DESCRIPTION PORT" +echo "INBOUND Game/Rcon Port ${port}" +if [ "${engine}" = "source" ];then + echo "INBOUND SourceTV Port ${sourcetvport}" +fi +echo "OUTBOUND Client Port ${clientport}" +echo "" +echo "You can change ports by editing the" +echo "start parameters in ${selfname}" +echo "" +echo "${servername} Details" +echo "=======================" +echo "Server name: ${servername}" +echo "Rcon Password: ${rcon}" +echo "" +echo "Config file:" +echo "${servercfg}" +echo "" } fn_distro(){ @@ -139,7 +281,13 @@ fn_distro fn_uptime fn_load { -echo -e "=========================================\nServer information\n=========================================\n" +echo -e "========================================\n${servicename} details\n========================================\n" +echo -e "Service: ${servicename}" +echo -e "Game: ${gamename}" +echo -e "Server: ${servername}" +echo -e "Failure reason: ${failurereason}" +echo -e "Action Taken: ${actiontaken}\n" +echo -e "========================================\nServer details\n========================================\n" echo -e "Date: $(date)" echo -e "Distro: ${os}" echo -e "Arch: ${arch}" @@ -147,139 +295,95 @@ echo -e "Kernel: ${kernel}" echo -e "Hostname: $HOSTNAME" echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" echo -e "Avg Load${load}\n" -echo -e "=========================================\n${servicename} statistics\n=========================================\n" -echo -e "Service: ${servicename}" -echo -e "Server: ${servername}" -echo -e "Failure reason: ${failurereason}" -echo -e "Action Taken: ${actiontaken}\n" -echo -e "=========================================\n${servicename} log summary\n=========================================\n" -}|tee ${logdir}/${servicename}-email.log > /dev/null 2>&1 -tail -50 ${logfile} >> /${logdir}/${servicename}-email.log -mail -s "${subject}" ${email} < /${logdir}/${servicename}-email.log -echo -e "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: sent email notification to ${email}" >> ${logfile} +echo -e "========================================\nLogs\n========================================\n" +echo -e "Script log\n===================\n" +}|tee ${scriptlogdir}/${servicename}-email.log > /dev/null 2>&1 +tail -25 ${scriptlog} >> ${emaillog} +if [ ! -z ${consolelog} ];then + echo -e "\n\nConsole log\n====================\n" >> ${emaillog} + tail -25 ${consolelog} >> ${emaillog} +fi +if [ ! -z ${gamelogdir} ];then + echo -e "\n\nServer log\n====================\n" >> ${emaillog} + tail ${gamelogdir}/*|grep -v "==>"|sed '/^$/d'|tail -25 >> ${emaillog} +fi +mail -s "${subject}" ${email} < ${emaillog} +echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" +echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Sent email notification to ${email}" >> ${scriptlog} } fn_emailtest(){ fn_rootcheck fn_syscheck -echo -e "[\e[0;32m OK \e[0;39m] Emailing test notification" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Email Test Notification - Testing ${servername}" failurereason="Testing ${servicename} email notification" actiontaken="Sent test email...hello is this thing on?" fn_emailnotification else - echo -e "[\e[0;31m FAIL \e[0;39m] Email notificaion not enabled" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notificaion not enabled" >> ${logfile} -fi -} - -fn_logmanager(){ -# log manager will active if finds logs older than $logdays -if [ `find ${logdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then - echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${logfile} - echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${logfile} - find ${logdir}/* -mtime +${logdays} |tee >> ${logfile} - count=`find ${logdir}/* -mtime +${logdays}|wc -l` - find ${logdir}/* -mtime +${logdays} -exec rm {} \; - echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${logfile} + echo -e "[\e[0;31m FAIL \e[0;39m] Email notification not enabled" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notification not enabled" >> ${scriptlog} fi +sleep 0.5 +echo -en "\n" } -fn_restartserver(){ - echo -e "[\e[0;32m OK \e[0;39m] Restarting ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${logfile} - fn_stopserver +fn_serverquery(){ +# uses serverquery.py to directly query the server +# detects if the server locks up +if [ -f serverquery.py ];then + echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${scriptlog} + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${scriptlog} + serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` sleep 1 - fn_startserver -} - -fn_startserver(){ -fn_rootcheck -fn_syscheck -fn_runcheck -fn_logmanager -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${logfile} -cp ${logfile} ${logfiledate} -screen -d -m -S ${servicename} ${filesdir}/srcds_run ${parms} -sleep 1 -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 0 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: Failed to start ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${logfile} -fi -} - -fn_stopserver(){ -fn_rootcheck -fn_syscheck -pid=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` -if [ -z ${pid} ];then - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already stopped" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${logfile} -else - echo -e "[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${logfile} - kill `screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` - screen -wipe > /dev/null 2>&1 + if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then + echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${scriptlog} + sleep 1 + fn_restartserver + else + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + fi fi } -fn_debugserver(){ -fn_rootcheck -fn_syscheck -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} in debug mode!" -sleep 0.5 -echo -e "" -echo -e "Use for identifying server issues only!" -while true; do - echo "If server is already running it will be stopped" - read -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; -esac -done -fn_stopserver -sleep 1 -echo -e "[\e[0;36m INFO \e[0;39m] Press CTRL+C to drop out of debug mode" -sleep 3 -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -${filesdir}/srcds_run ${parms} -debug -} - fn_monitorserver(){ fn_rootcheck fn_syscheck fn_logmanager -echo -e "[\e[0;32m OK \e[0;39m] Checking ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Checking ${servername}" >> ${logfile} +echo -en "[ .... ] Monitor is checking ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is checking ${servername}" >> ${scriptlog} +sleep 0.5 updatecheck=`ps -ef|grep "${selfname} update"|grep -v grep|wc -l` if [ "${updatecheck}" = "0" ];then fn_runcheck - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${logfile} + echo -en "\r[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Monitor - Starting ${servername}" - failurereason="${servername} had stopped" - actiontaken="restarted ${servername}" + failurereason="${servicename} process was not running" + actiontaken="restarted ${servicename}" + sleep 0.5 + echo -en "\n" fn_emailnotification fi + sleep 0.5 + echo -en "\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is starting ${servername}" >> ${scriptlog} fn_startserver else echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: Monitor detected ${servername} is currently checking for updates!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${scriptlog} echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} will start when updating is complete" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${scriptlog} fi } @@ -287,80 +391,60 @@ fn_updateserver(){ fn_rootcheck fn_syscheck echo -e "[\e[0;32m OK \e[0;39m] Updating ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${scriptlog} cd ${rootdir} cd steamcmd -./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${logfile} +./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${scriptlog} } -fn_details(){ -echo "" -echo "${gamename} Server Details" -echo "============================" -echo "" -echo "${servername} Ports" -echo "=======================" -if [ "${engine}" = "unreal2" ];then - gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') - queryport=$((${gameport} + 1)) - gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') - webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') - webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') - webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT INI VARIABLE" - echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" - echo "INBOUND Query Port ${queryport} UDP n/a" - if [ "${appid}" != "223250" ];then - echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ];then - echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" - else - echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" - fi - if [ "${appid}" ];then - if [ "${appid}" == "223250" ];then - echo "OUTBOUND Steam Port 20610 UDP n/a" - else - echo "OUTBOUND Steam Port 20660 UDP n/a" - fi - fi - echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" - echo "" - echo "${servername} WebAdmin" - echo "=======================" - echo "WebAdmin URL: http://localhost:${webadminport}" - echo "WebAdmin Username: ${webadminuser}" - echo "WebAdmin Password: ${webadminpass}" - echo "" - echo "Config file" - echo "${systemdir}/${ini}" -elif [ "${engine}" = "source" ]||[ "${engine}" = "goldsource" ];then - servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` - rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT" - echo "INBOUND Game/Rcon Port ${port}" - if [ "${engine}" = "source" ];then - echo "INBOUND SourceTV Port ${sourcetvport}" - fi - echo "OUTBOUND Client Port ${clientport}" - echo "" - echo "You can change ports by editing the" - echo "start parameters in ${selfname}" - echo "" - echo "${servername} Details" - echo "=======================" - echo "Server name: ${servername}" - echo "Rcon Password: ${rcon}" - echo "" - echo "Config file:" - echo "${servercfg}" +fn_restartserver(){ +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${scriptlog} +fn_stopserver +fn_startserver +} + +fn_stopserver(){ +fn_rootcheck +fn_syscheck +pid=$(tmux list-sessions 2>&1|awk '{print $1}') +echo -en "[ .... ] Stopping ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${scriptlog} +sleep 0.5 +if [ "${pid}" == "failed" ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${scriptlog} +else + tmux kill-session -t ${servicename} + echo -en "\r[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopped ${servername}" >> ${scriptlog} fi -echo "" +sleep 0.5 +echo -en "\n" +} + +fn_startserver(){ +fn_rootcheck +fn_syscheck +echo -en "[ .... ] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${scriptlog} +sleep 0.5 +fn_runcheck +fn_logmanager +mv ${scriptlog} ${scriptlogdate} +mv ${consolelog} ${consolelogdate} +cd ${filesdir} +tmux new-session -d -s ${servicename} "./srcds_run ${parms} |tee -a ${consolelog}" +tmuxwc=`tmux list-sessions 2>&1|awk '{print $1}'|wc -l` +sleep 1 +if [ ${tmuxwc} -eq 0 ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${scriptlog} +else + echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername}" >> ${scriptlog} +fi +sleep 0.5 +echo -en "\n" } # @@ -440,8 +524,6 @@ echo "Installing ${gamename} Server" echo "=================================" cd ${rootdir}/steamcmd mkdir -v ${filesdir} - mkdir -v ${rootdir}/log - mkdir -v ${logdir} touch install.txt chmod 0600 install.txt echo "login anonymous" > install.txt @@ -488,7 +570,11 @@ echo "=================================" }|tee ${servercfg} > /dev/null 2>&1 sleep 1 echo "" - echo "Setting up logging" + echo "Creating log directorys" + mkdir -v ${rootdir}/log + mkdir -v ${scriptlogdir} + mkdir -v ${consolelogdir} + touch ${consolelog} if [ ! -h ${rootdir}/log/server ]; then ln -sv ${gamelogdir} ${rootdir}/log/server else @@ -524,16 +610,20 @@ case "$1" in fn_startserver;; monitor) fn_monitorserver;; - install) - fn_install;; - debug) - fn_debugserver;; email-test) fn_emailtest;; details) fn_details;; + backup) + fn_backupserver;; + console) + fn_console;; + debug) + fn_debugserver;; + install) + fn_install;; *) - echo "Usage: $0 {start|stop|restart|update|monitor|install|debug|email-test|details}" - exit 1;; + echo "Usage: $0 {start|stop|restart|update|monitor|email-test|details|backup|console|debug|install}" + exit 1;; esac exit \ No newline at end of file diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index bded18d29..5ccaba458 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -3,7 +3,7 @@ # Server Management Script # Author: Daniel Gibbs # Website: http://danielgibbs.co.uk -# Version: 310813 +# Version: 011013 #### Variables #### @@ -15,6 +15,7 @@ email="email@example.com" # Steam login steamuser="username" steampass="password" + # Steam appid="223250" @@ -23,6 +24,7 @@ rootdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" selfname="$0" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/system" +backupdir="${rootdir}/backups" compressedmapsdir="${rootdir}/Maps-Compressed" # Server names @@ -33,10 +35,16 @@ ini="${servicename}.ini" servername=`grep -s ServerName= ${systemdir}/${ini} | sed 's/ServerName=//g'` # Logging -logdir="${rootdir}/log" -logfile="${logdir}/${servicename}.log" -logfiledate="${logdir}/${servicename}-$( date '+%d-%m-%Y-%H-%M-%S').log" logdays="7" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" # Start vars defaultmap="RO-Arad.rom" @@ -61,49 +69,277 @@ if [ ! -e ${systemdir} ];then fi } -fn_serverquery(){ -# uses serverquery.py to directly query the server -# detects if the server locks up -if [ -f serverquery.py ];then - echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${logfile} - serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` +fn_runcheck(){ +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + fn_serverquery + echo -en "\r[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${scriptlog} + sleep 0.5 + echo -en "\n" + exit +fi +} +fn_compressmaps(){ +fn_rootcheck +clear +echo "${gamename} Map Compressor" +echo "============================" +echo "Will compress all maps in:" +echo "" +pwd +echo "" +echo "Compressed maps saved to:" +echo "" +echo "${compressedmapsdir}" +echo "" +while true; do + read -p "Start compression [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; + esac +done +mkdir ${compressedmapsdir} +rm -rfv ${filesdir}/Maps/*.uz2 +cd ${systemdir} +./ucc-bin compress ../Maps/* --nohomedir +mv -fv ${filesdir}/Maps/*.uz2 ${compressedmapsdir} +} + +fn_steamguard(){ +fn_rootcheck +fn_syscheck +clear +fn_header +fn_steamdl +clear +fn_header +echo "If you are gettng an error:" +echo "" +echo "Login Failure: Account Logon Denied Failed." +echo "" +echo "You should now get an email from Steam with a Steam Guard code" +echo "" +read -p "Press [Enter] key to when you have the code..." +clear +fn_header +echo "Please enter Steam Guard Code" +echo "==============================" +echo -n "Code: " +read CODE +touch guard.txt +chmod 0600 guard.txt +echo "set_steam_guard_code $CODE" > guard.txt +echo "login ${steamuser} ${steampass}" >> guard.txt +echo "quit" >> guard.txt +STEAMEXE=steamcmd ./steam.sh +runscript guard.txt +rm guard.txt +cd ../ +echo "==============================" +echo "Complete!" +cd ${rootdir} +} + +fn_logmanager(){ +# log manager will active if finds logs older than ${logdays} +if [ `find ${scriptlogdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then + echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${scriptlog} + echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${scriptlog} + find ${scriptlogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + find ${consolelogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + scriptcount=`find ${scriptlogdir}/* -mtime +${logdays}|wc -l` + consolecount=`find ${consolelogdir}/* -mtime +${logdays}|wc -l` + count=$((${scriptcount} + ${consolecount})) + find ${scriptlogdir}/* -mtime +${logdays} -exec rm {} \; + find ${consolelogdir}/* -mtime +${logdays} -exec rm {} \; + echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${scriptlog} +fi +} + +fn_debugserver(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode" +echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +fn_stopserver +echo -en "[ .... ] Starting ${servicename}: ${servername} debug mode" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\n" +cd ${systemdir} + +./ucc-bin ${parms} +} + +fn_console(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console" +echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +echo -en "\r[ .... ] Starting ${servicename} console" +sleep 0.5 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\r[\e[0;32m OK \e[0;39m] Starting ${servicename} console" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} console accessed" >> ${scriptlog} sleep 1 - if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then - echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${logfile} - sleep 1 - fn_restartserver - else - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - fi + tmux attach-session -t $(tmux list-sessions|awk '{print $1}') +else + echo -e "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running" + sleep 0.5 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) fn_startserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi } -fn_runcheck(){ -# already running check -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 1 ];then - fn_serverquery - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${logfile} - exit -# multiple of same instance check -elif [ ${pidwc} -ge 2 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: ${servername} is running ${pidwc} times" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is running ${pidwc} times" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] ${servicename}: Stopping ${pidwc} instances of ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${pidwc} instances of ${servername}" >> ${logfile} - fn_stopserver - exit +fn_backupserver(){ +fn_rootcheck +fn_syscheck +backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" +echo "" +echo "${gamename} Backup" +echo "============================" +echo "" +echo "The following backup will be created." +echo "" +echo "${backupdir}/${backupname}.tar.gz" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running" + while true; do + read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) fn_stopserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done +fi +echo -en "[ .... ] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} backup" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} backup" >> ${scriptlog} +sleep 1 +echo -en "\n" +cd ${rootdir} +mkdir ${backupdir} > /dev/null 2>&1 +tar -cvzf ${backupdir}/${backupname}.tar.gz --exclude '${backupdir}' ${rootdir} +echo -en "\r${servicename} backup complete" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: backup complete" >> ${scriptlog} +} + +fn_details(){ +echo "" +echo "${gamename} Server Details" +echo "============================" +echo "" +echo "${servername} Ports" +echo "=======================" +gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') +queryport=$((${gameport} + 1)) +gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') +udplinkport=$((${gameport} + 2)) +webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') +if [ "${engine}" == "unreal" ];then + webadminuser=$(grep AdminUsername= ${systemdir}/${ini}|sed 's/\AdminUsername=//g') +else + webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') +fi +webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') + + +echo "Ports the server is currently using" +echo "" +echo "DIRECTION DESCRIPTION PORT INI VARIABLE" +echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" +echo "INBOUND Query Port ${queryport} UDP n/a" +if [ "${engine}" == "unreal" ];then + echo "OUTBOUND UdpLink Port (random) ${udplinkport}+ UDP n/a" fi +if [ "${engine}" != "unreal" ] && [ "${appid}" != "223250" ];then + echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" +fi +if [ "${appid}" == "215360" ];then + echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" +else + echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" +fi +if [ "${appid}" ];then + if [ "${appid}" == "223250" ];then + echo "OUTBOUND Steam Port 20610 UDP n/a" + else + echo "OUTBOUND Steam Port 20660 UDP n/a" + fi + +fi +echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" + +echo "" + + + +echo "${servername} WebAdmin" +echo "=======================" +echo "WebAdmin URL: http://localhost:${webadminport}" +echo "WebAdmin Username: ${webadminuser}" + +echo "WebAdmin Password: ${webadminpass}" +echo "" +echo "Config file" +echo "${systemdir}/${ini}" +echo "" } fn_distro(){ @@ -137,7 +373,13 @@ fn_distro fn_uptime fn_load { -echo -e "=========================================\nServer information\n=========================================\n" +echo -e "========================================\n${servicename} details\n========================================\n" +echo -e "Service: ${servicename}" +echo -e "Game: ${gamename}" +echo -e "Server: ${servername}" +echo -e "Failure reason: ${failurereason}" +echo -e "Action Taken: ${actiontaken}\n" +echo -e "========================================\nServer details\n========================================\n" echo -e "Date: $(date)" echo -e "Distro: ${os}" echo -e "Arch: ${arch}" @@ -145,140 +387,93 @@ echo -e "Kernel: ${kernel}" echo -e "Hostname: $HOSTNAME" echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" echo -e "Avg Load${load}\n" -echo -e "=========================================\n${servicename} statistics\n=========================================\n" -echo -e "Service: ${servicename}" -echo -e "Server: ${servername}" -echo -e "Failure reason: ${failurereason}" -echo -e "Action Taken: ${actiontaken}\n" -echo -e "=========================================\n${servicename} log summary\n=========================================\n" -}|tee ${logdir}/${servicename}-email.log > /dev/null 2>&1 -tail -50 ${logfile} >> /${logdir}/${servicename}-email.log -mail -s "${subject}" ${email} < /${logdir}/${servicename}-email.log -echo -e "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: sent email notification to ${email}" >> ${logfile} +echo -e "========================================\nLogs\n========================================\n" +echo -e "Script log\n===================\n" +}|tee ${scriptlogdir}/${servicename}-email.log > /dev/null 2>&1 +tail -25 ${scriptlog} >> ${emaillog} +echo -e "\n\nConsole log\n====================\n" >> ${emaillog} +tail -25 ${consolelog} >> ${emaillog} +if [ ! -z ${gamelogdir} ];then + echo -e "\n\nServer log\n====================\n" >> ${emaillog} + tail ${gamelogdir}/*|grep -v "==>"|sed '/^$/d' >> ${emaillog} +fi +mail -s "${subject}" ${email} < ${emaillog} +echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Sent email notification to ${email}" >> ${scriptlog} } fn_emailtest(){ fn_rootcheck fn_syscheck -echo -e "[\e[0;32m OK \e[0;39m] Emailing test notification" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Email Test Notification - Testing ${servername}" failurereason="Testing ${servicename} email notification" actiontaken="Sent test email...hello is this thing on?" fn_emailnotification else - echo -e "[\e[0;31m FAIL \e[0;39m] Email notificaion not enabled" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notificaion not enabled" >> ${logfile} -fi -} - -fn_logmanager(){ -# log manager will active if finds logs older than $logdays -if [ `find ${logdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then - echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${logfile} - echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${logfile} - find ${logdir}/* -mtime +${logdays} |tee >> ${logfile} - count=`find ${logdir}/* -mtime +${logdays}|wc -l` - find ${logdir}/* -mtime +${logdays} -exec rm {} \; - echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${logfile} + echo -e "[\e[0;31m FAIL \e[0;39m] Email notification not enabled" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notification not enabled" >> ${scriptlog} fi +sleep 0.5 +echo -en "\n" } -fn_restartserver(){ - echo -e "[\e[0;32m OK \e[0;39m] Restarting ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${logfile} - fn_stopserver +fn_serverquery(){ +# uses serverquery.py to directly query the server +# detects if the server locks up +if [ -f serverquery.py ];then + echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${scriptlog} + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${scriptlog} + serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` sleep 1 - fn_startserver -} - -fn_startserver(){ -fn_rootcheck -fn_syscheck -fn_runcheck -fn_logmanager -cd ${systemdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${logfile} -cp ${logfile} ${logfiledate} -screen -d -m -S ${servicename} ./ucc-bin ${parms} -sleep 1 -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 0 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: Failed to start ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${logfile} -fi -} - -fn_stopserver(){ -fn_rootcheck -fn_syscheck -pid=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` -if [ -z ${pid} ];then - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already stopped" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${logfile} -else - echo -e "[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${logfile} - kill `screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` - screen -wipe > /dev/null 2>&1 + if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then + echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${scriptlog} + sleep 1 + fn_restartserver + else + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + fi fi } -fn_debugserver(){ -fn_rootcheck -fn_syscheck -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} in debug mode!" -sleep 0.5 -echo -e "" -echo -e "Use for identifying server issues only!" -while true; do - echo "If server is already running it will be stopped" - read -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; -esac -done -fn_stopserver -sleep 1 -echo -e "[\e[0;36m INFO \e[0;39m] Press CTRL+C to drop out of debug mode" -sleep 3 -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -cd ${systemdir} -./ucc-bin ${parms} -} - fn_monitorserver(){ fn_rootcheck fn_syscheck fn_logmanager -echo -e "[\e[0;32m OK \e[0;39m] Checking ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Checking ${servername}" >> ${logfile} +echo -en "[ .... ] Monitor is checking ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is checking ${servername}" >> ${scriptlog} +sleep 0.5 updatecheck=`ps -ef|grep "${selfname} update"|grep -v grep|wc -l` if [ "${updatecheck}" = "0" ];then fn_runcheck - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${logfile} + echo -en "\r[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Monitor - Starting ${servername}" - failurereason="${servername} had stopped" - actiontaken="restarted ${servername}" + failurereason="${servicename} process was not running" + actiontaken="restarted ${servicename}" + sleep 0.5 + echo -en "\n" fn_emailnotification fi + sleep 0.5 + echo -en "\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is starting ${servername}" >> ${scriptlog} fn_startserver else echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: Monitor detected ${servername} is currently checking for updates!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${scriptlog} echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} will start when updating is complete" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${scriptlog} fi } @@ -286,7 +481,7 @@ fn_updateserver(){ fn_rootcheck fn_syscheck echo -e "[\e[0;32m OK \e[0;39m] Updating ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${scriptlog} cd ${rootdir} cd steamcmd ./steamcmd.sh +login ${steamuser} ${steampass} +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${logfile} @@ -299,136 +494,55 @@ if [ $(grep Denied ${logfile}|wc -l) -ge 1 ];then fi } -fn_compressmaps(){ -fn_rootcheck -clear -echo "${gamename} Map Compressor" -echo "============================" -echo "Will compress all maps in:" -echo "" -pwd -echo "" -echo "Compressed maps saved to:" -echo "" -echo "$compressedmapsdir" -echo "" -while true; do - read -p "Start compression [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; - esac -done -mkdir $compressedmapsdir -rm -rfv ${filesdir}/Maps/*.uz2 -cd ${systemdir} -./ucc-bin compress ../Maps/* --nohomedir -mv -fv ${filesdir}/Maps/*.uz2 $compressedmapsdir +fn_restartserver(){ +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${scriptlog} +fn_stopserver +fn_startserver } -fn_steamguard(){ +fn_stopserver(){ fn_rootcheck fn_syscheck -clear -fn_header -fn_steamdl -clear -fn_header -echo "If you are gettng an error:" -echo "" -echo "Login Failure: Account Logon Denied Failed." -echo "" -echo "You should now get an email from Steam with a Steam Guard code" -echo "" -read -p "Press [Enter] key to when you have the code..." -clear -fn_header -echo "Please enter Steam Guard Code" -echo "==============================" -echo -n "Code: " -read CODE -touch guard.txt -chmod 0600 guard.txt -echo "set_steam_guard_code $CODE" > guard.txt -echo "login ${steamuser} ${steampass}" >> guard.txt -echo "quit" >> guard.txt -STEAMEXE=steamcmd ./steam.sh +runscript guard.txt -rm guard.txt -cd ../ -echo "==============================" -echo "Complete!" -cd ${rootdir} +pid=$(tmux list-sessions 2>&1|awk '{print $1}') +echo -en "[ .... ] Stopping ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${scriptlog} +sleep 0.5 +if [ "${pid}" == "failed" ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${scriptlog} +else + tmux kill-session -t ${servicename} + echo -en "\r[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopped ${servername}" >> ${scriptlog} +fi +sleep 0.5 +echo -en "\n" } -fn_details(){ -echo "" -echo "${gamename} Server Details" -echo "============================" -echo "" -echo "${servername} Ports" -echo "=======================" -if [ "${engine}" = "unreal2" ];then - gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') - queryport=$((${gameport} + 1)) - gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') - webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') - webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') - webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT INI VARIABLE" - echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" - echo "INBOUND Query Port ${queryport} UDP n/a" - if [ "${appid}" != "223250" ];then - echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ];then - echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" - else - echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" - fi - if [ "${appid}" ];then - if [ "${appid}" == "223250" ];then - echo "OUTBOUND Steam Port 20610 UDP n/a" - else - echo "OUTBOUND Steam Port 20660 UDP n/a" - fi - fi - echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" - echo "" - echo "${servername} WebAdmin" - echo "=======================" - echo "WebAdmin URL: http://localhost:${webadminport}" - echo "WebAdmin Username: ${webadminuser}" - echo "WebAdmin Password: ${webadminpass}" - echo "" - echo "Config file" - echo "${systemdir}/${ini}" -elif [ "${engine}" = "source" ]||[ "${engine}" = "goldsource" ];then - servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` - rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT" - echo "INBOUND Game/Rcon Port ${port}" - if [ "${engine}" = "source" ];then - echo "INBOUND SourceTV Port ${sourcetvport}" - fi - echo "OUTBOUND Client Port ${clientport}" - echo "" - echo "You can change ports by editing the" - echo "start parameters in ${selfname}" - echo "" - echo "${servername} Details" - echo "=======================" - echo "Server name: ${servername}" - echo "Rcon Password: ${rcon}" - echo "" - echo "Config file:" - echo "${servercfg}" +fn_startserver(){ +fn_rootcheck +fn_syscheck +echo -en "[ .... ] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${scriptlog} +sleep 0.5 +fn_runcheck +fn_logmanager +mv ${scriptlog} ${scriptlogdate} +mv ${consolelog} ${consolelogdate} +cd ${systemdir} + +tmux new-session -d -s ${servicename} "./ucc-bin ${parms} |tee -a ${consolelog}" +tmuxwc=`tmux list-sessions 2>&1|awk '{print $1}'|wc -l` +sleep 1 +if [ ${tmuxwc} -eq 0 ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${scriptlog} +else + echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername}" >> ${scriptlog} fi -echo "" +sleep 0.5 +echo -en "\n" } # @@ -529,12 +643,38 @@ echo "=================================" fn_header echo "Configuring ${gamename} Server" echo "=================================" + + sleep 1 echo "Copying ${systemdir}/default.ini to ${systemdir}/${ini}" cp ${systemdir}/default.ini ${systemdir}/${ini} + + + + + + + + + + + + + + + + + + + + sleep 1 - echo "Creating log directory" - mkdir -v ${logdir} + + echo "Creating log directorys" + mkdir -v ${rootdir}/log + mkdir -v ${scriptlogdir} + mkdir -v ${consolelogdir} + touch ${consolelog} sleep 1 echo "Applying WebAdmin ROOst.css fix!" echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" @@ -543,16 +683,26 @@ echo "=================================" sleep 1 echo "Applying WebAdmin CharSet fix!" echo "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1" - sed -i 's/CharSet="iso-8859-1"/CharSet="utf-8"/g' ${systemdir}/uweb.int + sed -i 's/CharSet="iso-8859-1"/CharSet="utf-8"/g' ${systemdir}/UWeb.int sleep 1 echo "Setting WebAdmin username and password" sed -i 's/AdminName=/AdminName=admin/g' ${systemdir}/${ini} - sed -i 's/AdminPassword=/AdminPassword=ropass/g' ${systemdir}/${ini} + sed -i 's/AdminPassword=/AdminPassword=kfpass/g' ${systemdir}/${ini} sleep 1 echo "Enabling WebAdmin" sed -i 's/bEnabled=False/bEnabled=True/g' ${systemdir}/${ini} + + + + + sleep 1 echo "Forcing server to start to get ports/server name to display correctly" + + + + + sleep 1 cd ${rootdir} ${selfname} start @@ -584,21 +734,25 @@ case "$1" in fn_startserver;; monitor) fn_monitorserver;; - install) - fn_install;; + email-test) + fn_emailtest;; + details) + fn_details;; + backup) + fn_backupserver;; + console) + fn_console;; debug) fn_debugserver;; + install) + fn_install;; map-compressor) fn_compressmaps;; steam-auth) fn_updateserver fn_steamguard;; - email-test) - fn_emailtest;; - details) - fn_details;; *) - echo "Usage: $0 {start|stop|restart|update|monitor|install|debug|map-compressor|steam-auth|email-test|details}" - exit 1;; + echo "Usage: $0 {start|stop|restart|update|monitor|email-test|details|backup|console|debug|install|map-compressor|steam-auth}" + exit 1;; esac exit \ No newline at end of file diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index 5e5a6982b..189c29c84 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -3,7 +3,7 @@ # Server Management Script # Author: Daniel Gibbs # Website: http://danielgibbs.co.uk -# Version: 310813 +# Version: 011013 #### Variables #### @@ -29,21 +29,28 @@ rootdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" selfname="$0" filesdir="${rootdir}/serverfiles" servercfg="${filesdir}/tf/cfg/server.cfg" +backupdir="${rootdir}/backups" # Server Details servicename="tf2-server" -engine="source" gamename="Team Fortress 2" + engine="source" servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` # Logging -logdir="${rootdir}/log/script" -gamelogdir="${filesdir}/tf/logs" -logfile="${logdir}/${servicename}.log" -logfiledate="${logdir}/${servicename}-$( date '+%d-%m-%Y-%H-%M-%S').log" logdays="7" +gamelogdir="${filesdir}/tf/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" ##### Script ##### # Do not edit @@ -64,49 +71,184 @@ if [ ! -e ${filesdir} ];then fi } -fn_serverquery(){ -# uses serverquery.py to directly query the server -# detects if the server locks up -if [ -f serverquery.py ];then - echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${logfile} - serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` +fn_runcheck(){ +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + fn_serverquery + echo -en "\r[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${scriptlog} + sleep 0.5 + echo -en "\n" + exit +fi +} + +fn_logmanager(){ +# log manager will active if finds logs older than ${logdays} +if [ `find ${scriptlogdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then + echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${scriptlog} + echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${scriptlog} + find ${scriptlogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + find ${consolelogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + scriptcount=`find ${scriptlogdir}/* -mtime +${logdays}|wc -l` + consolecount=`find ${consolelogdir}/* -mtime +${logdays}|wc -l` + count=$((${scriptcount} + ${consolecount})) + find ${scriptlogdir}/* -mtime +${logdays} -exec rm {} \; + find ${consolelogdir}/* -mtime +${logdays} -exec rm {} \; + echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${scriptlog} +fi +} + +fn_debugserver(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode" +echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +fn_stopserver +echo -en "[ .... ] Starting ${servicename}: ${servername} debug mode" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\n" +cd ${filesdir} +./srcds_run ${parms} -debug +} + +fn_console(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console" +echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +echo -en "\r[ .... ] Starting ${servicename} console" +sleep 0.5 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\r[\e[0;32m OK \e[0;39m] Starting ${servicename} console" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} console accessed" >> ${scriptlog} sleep 1 - if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then - echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${logfile} - sleep 1 - fn_restartserver - else - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - fi + tmux attach-session -t $(tmux list-sessions|awk '{print $1}') +else + echo -e "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running" + sleep 0.5 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) fn_startserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi } -fn_runcheck(){ -# already running check -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 1 ];then - fn_serverquery - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${logfile} - exit -# multiple of same instance check -elif [ ${pidwc} -ge 2 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: ${servername} is running ${pidwc} times" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is running ${pidwc} times" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] ${servicename}: Stopping ${pidwc} instances of ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${pidwc} instances of ${servername}" >> ${logfile} - fn_stopserver - exit +fn_backupserver(){ +fn_rootcheck +fn_syscheck +backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" +echo "" +echo "${gamename} Backup" +echo "============================" +echo "" +echo "The following backup will be created." +echo "" +echo "${backupdir}/${backupname}.tar.gz" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running" + while true; do + read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) fn_stopserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi +echo -en "[ .... ] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} backup" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} backup" >> ${scriptlog} +sleep 1 +echo -en "\n" +cd ${rootdir} +mkdir ${backupdir} > /dev/null 2>&1 +tar -cvzf ${backupdir}/${backupname}.tar.gz --exclude '${backupdir}' ${rootdir} +echo -en "\r${servicename} backup complete" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: backup complete" >> ${scriptlog} +} + +fn_details(){ +echo "" +echo "${gamename} Server Details" +echo "============================" +echo "" +echo "${servername} Ports" +echo "=======================" +servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` +rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` +echo "Ports the server is currently using" +echo "" +echo "DIRECTION DESCRIPTION PORT" +echo "INBOUND Game/Rcon Port ${port}" +if [ "${engine}" = "source" ];then + echo "INBOUND SourceTV Port ${sourcetvport}" +fi +echo "OUTBOUND Client Port ${clientport}" +echo "" +echo "You can change ports by editing the" +echo "start parameters in ${selfname}" +echo "" +echo "${servername} Details" +echo "=======================" +echo "Server name: ${servername}" +echo "Rcon Password: ${rcon}" +echo "" +echo "Config file:" +echo "${servercfg}" +echo "" } fn_distro(){ @@ -140,7 +282,13 @@ fn_distro fn_uptime fn_load { -echo -e "=========================================\nServer information\n=========================================\n" +echo -e "========================================\n${servicename} details\n========================================\n" +echo -e "Service: ${servicename}" +echo -e "Game: ${gamename}" +echo -e "Server: ${servername}" +echo -e "Failure reason: ${failurereason}" +echo -e "Action Taken: ${actiontaken}\n" +echo -e "========================================\nServer details\n========================================\n" echo -e "Date: $(date)" echo -e "Distro: ${os}" echo -e "Arch: ${arch}" @@ -148,139 +296,95 @@ echo -e "Kernel: ${kernel}" echo -e "Hostname: $HOSTNAME" echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" echo -e "Avg Load${load}\n" -echo -e "=========================================\n${servicename} statistics\n=========================================\n" -echo -e "Service: ${servicename}" -echo -e "Server: ${servername}" -echo -e "Failure reason: ${failurereason}" -echo -e "Action Taken: ${actiontaken}\n" -echo -e "=========================================\n${servicename} log summary\n=========================================\n" -}|tee ${logdir}/${servicename}-email.log > /dev/null 2>&1 -tail -50 ${logfile} >> /${logdir}/${servicename}-email.log -mail -s "${subject}" ${email} < /${logdir}/${servicename}-email.log -echo -e "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: sent email notification to ${email}" >> ${logfile} +echo -e "========================================\nLogs\n========================================\n" +echo -e "Script log\n===================\n" +}|tee ${scriptlogdir}/${servicename}-email.log > /dev/null 2>&1 +tail -25 ${scriptlog} >> ${emaillog} +if [ ! -z ${consolelog} ];then + echo -e "\n\nConsole log\n====================\n" >> ${emaillog} + tail -25 ${consolelog} >> ${emaillog} +fi +if [ ! -z ${gamelogdir} ];then + echo -e "\n\nServer log\n====================\n" >> ${emaillog} + tail ${gamelogdir}/*|grep -v "==>"|sed '/^$/d'|tail -25 >> ${emaillog} +fi +mail -s "${subject}" ${email} < ${emaillog} +echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" +echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Sent email notification to ${email}" >> ${scriptlog} } fn_emailtest(){ fn_rootcheck fn_syscheck -echo -e "[\e[0;32m OK \e[0;39m] Emailing test notification" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Email Test Notification - Testing ${servername}" failurereason="Testing ${servicename} email notification" actiontaken="Sent test email...hello is this thing on?" fn_emailnotification else - echo -e "[\e[0;31m FAIL \e[0;39m] Email notificaion not enabled" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notificaion not enabled" >> ${logfile} -fi -} - -fn_logmanager(){ -# log manager will active if finds logs older than $logdays -if [ `find ${logdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then - echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${logfile} - echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${logfile} - find ${logdir}/* -mtime +${logdays} |tee >> ${logfile} - count=`find ${logdir}/* -mtime +${logdays}|wc -l` - find ${logdir}/* -mtime +${logdays} -exec rm {} \; - echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${logfile} + echo -e "[\e[0;31m FAIL \e[0;39m] Email notification not enabled" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notification not enabled" >> ${scriptlog} fi +sleep 0.5 +echo -en "\n" } -fn_restartserver(){ - echo -e "[\e[0;32m OK \e[0;39m] Restarting ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${logfile} - fn_stopserver +fn_serverquery(){ +# uses serverquery.py to directly query the server +# detects if the server locks up +if [ -f serverquery.py ];then + echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${scriptlog} + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${scriptlog} + serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` sleep 1 - fn_startserver -} - -fn_startserver(){ -fn_rootcheck -fn_syscheck -fn_runcheck -fn_logmanager -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${logfile} -cp ${logfile} ${logfiledate} -screen -d -m -S ${servicename} ${filesdir}/srcds_run ${parms} -sleep 1 -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 0 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: Failed to start ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${logfile} -fi -} - -fn_stopserver(){ -fn_rootcheck -fn_syscheck -pid=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` -if [ -z ${pid} ];then - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already stopped" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${logfile} -else - echo -e "[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${logfile} - kill `screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` - screen -wipe > /dev/null 2>&1 + if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then + echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${scriptlog} + sleep 1 + fn_restartserver + else + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + fi fi } -fn_debugserver(){ -fn_rootcheck -fn_syscheck -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} in debug mode!" -sleep 0.5 -echo -e "" -echo -e "Use for identifying server issues only!" -while true; do - echo "If server is already running it will be stopped" - read -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; -esac -done -fn_stopserver -sleep 1 -echo -e "[\e[0;36m INFO \e[0;39m] Press CTRL+C to drop out of debug mode" -sleep 3 -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -${filesdir}/srcds_run ${parms} -debug -} - fn_monitorserver(){ fn_rootcheck fn_syscheck fn_logmanager -echo -e "[\e[0;32m OK \e[0;39m] Checking ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Checking ${servername}" >> ${logfile} +echo -en "[ .... ] Monitor is checking ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is checking ${servername}" >> ${scriptlog} +sleep 0.5 updatecheck=`ps -ef|grep "${selfname} update"|grep -v grep|wc -l` if [ "${updatecheck}" = "0" ];then fn_runcheck - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${logfile} + echo -en "\r[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Monitor - Starting ${servername}" - failurereason="${servername} had stopped" - actiontaken="restarted ${servername}" + failurereason="${servicename} process was not running" + actiontaken="restarted ${servicename}" + sleep 0.5 + echo -en "\n" fn_emailnotification fi + sleep 0.5 + echo -en "\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is starting ${servername}" >> ${scriptlog} fn_startserver else echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: Monitor detected ${servername} is currently checking for updates!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${scriptlog} echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} will start when updating is complete" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${scriptlog} fi } @@ -288,80 +392,60 @@ fn_updateserver(){ fn_rootcheck fn_syscheck echo -e "[\e[0;32m OK \e[0;39m] Updating ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${scriptlog} cd ${rootdir} cd steamcmd -./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${logfile} +./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${scriptlog} } -fn_details(){ -echo "" -echo "${gamename} Server Details" -echo "============================" -echo "" -echo "${servername} Ports" -echo "=======================" -if [ "${engine}" = "unreal2" ];then - gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') - queryport=$((${gameport} + 1)) - gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') - webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') - webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') - webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT INI VARIABLE" - echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" - echo "INBOUND Query Port ${queryport} UDP n/a" - if [ "${appid}" != "223250" ];then - echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ];then - echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" - else - echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" - fi - if [ "${appid}" ];then - if [ "${appid}" == "223250" ];then - echo "OUTBOUND Steam Port 20610 UDP n/a" - else - echo "OUTBOUND Steam Port 20660 UDP n/a" - fi - fi - echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" - echo "" - echo "${servername} WebAdmin" - echo "=======================" - echo "WebAdmin URL: http://localhost:${webadminport}" - echo "WebAdmin Username: ${webadminuser}" - echo "WebAdmin Password: ${webadminpass}" - echo "" - echo "Config file" - echo "${systemdir}/${ini}" -elif [ "${engine}" = "source" ]||[ "${engine}" = "goldsource" ];then - servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` - rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT" - echo "INBOUND Game/Rcon Port ${port}" - if [ "${engine}" = "source" ];then - echo "INBOUND SourceTV Port ${sourcetvport}" - fi - echo "OUTBOUND Client Port ${clientport}" - echo "" - echo "You can change ports by editing the" - echo "start parameters in ${selfname}" - echo "" - echo "${servername} Details" - echo "=======================" - echo "Server name: ${servername}" - echo "Rcon Password: ${rcon}" - echo "" - echo "Config file:" - echo "${servercfg}" +fn_restartserver(){ +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${scriptlog} +fn_stopserver +fn_startserver +} + +fn_stopserver(){ +fn_rootcheck +fn_syscheck +pid=$(tmux list-sessions 2>&1|awk '{print $1}') +echo -en "[ .... ] Stopping ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${scriptlog} +sleep 0.5 +if [ "${pid}" == "failed" ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${scriptlog} +else + tmux kill-session -t ${servicename} + echo -en "\r[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopped ${servername}" >> ${scriptlog} fi -echo "" +sleep 0.5 +echo -en "\n" +} + +fn_startserver(){ +fn_rootcheck +fn_syscheck +echo -en "[ .... ] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${scriptlog} +sleep 0.5 +fn_runcheck +fn_logmanager +mv ${scriptlog} ${scriptlogdate} +mv ${consolelog} ${consolelogdate} +cd ${filesdir} +tmux new-session -d -s ${servicename} "./srcds_run ${parms} |tee -a ${consolelog}" +tmuxwc=`tmux list-sessions 2>&1|awk '{print $1}'|wc -l` +sleep 1 +if [ ${tmuxwc} -eq 0 ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${scriptlog} +else + echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername}" >> ${scriptlog} +fi +sleep 0.5 +echo -en "\n" } # @@ -441,8 +525,6 @@ echo "Installing ${gamename} Server" echo "=================================" cd ${rootdir}/steamcmd mkdir -v ${filesdir} - mkdir -v ${rootdir}/log - mkdir -v ${logdir} touch install.txt chmod 0600 install.txt echo "login anonymous" > install.txt @@ -489,7 +571,11 @@ echo "=================================" }|tee ${servercfg} > /dev/null 2>&1 sleep 1 echo "" - echo "Setting up logging" + echo "Creating log directorys" + mkdir -v ${rootdir}/log + mkdir -v ${scriptlogdir} + mkdir -v ${consolelogdir} + touch ${consolelog} if [ ! -h ${rootdir}/log/server ]; then ln -sv ${gamelogdir} ${rootdir}/log/server else @@ -525,16 +611,20 @@ case "$1" in fn_startserver;; monitor) fn_monitorserver;; - install) - fn_install;; - debug) - fn_debugserver;; email-test) fn_emailtest;; details) fn_details;; + backup) + fn_backupserver;; + console) + fn_console;; + debug) + fn_debugserver;; + install) + fn_install;; *) - echo "Usage: $0 {start|stop|restart|update|monitor|install|debug|email-test|details}" - exit 1;; + echo "Usage: $0 {start|stop|restart|update|monitor|email-test|details|backup|console|debug|install}" + exit 1;; esac exit \ No newline at end of file diff --git a/TheHiddenSource/thsserver b/TheHiddenSource/thsserver index c63636649..138bab3ba 100644 --- a/TheHiddenSource/thsserver +++ b/TheHiddenSource/thsserver @@ -1,9 +1,9 @@ #!/bin/bash -# The Hidden: Source +# Hidden: Source # Server Management Script # Author: Daniel Gibbs # Website: http://danielgibbs.co.uk -# Version: 070913 +# Version: 011013 #### Variables #### @@ -29,19 +29,22 @@ filesdir="${rootdir}/serverfiles" servercfg="${filesdir}/hidden/cfg/server.cfg" # Server Details -servicename="ths-server" -gamename="The Hidden: Source" +servicename="hs-server" +gamename="Hidden: Source" engine="source" servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` # Logging -logdir="${rootdir}/log/script" -gamelogdir="${filesdir}/hidden/logs" -logfile="${logdir}/${servicename}.log" -logfiledate="${logdir}/${servicename}-$( date '+%d-%m-%Y-%H-%M-%S').log" logdays="7" +gamelogdir="${filesdir}/hidden/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" ##### Script ##### # Do not edit @@ -62,49 +65,184 @@ if [ ! -e ${filesdir} ];then fi } -fn_serverquery(){ -# uses serverquery.py to directly query the server -# detects if the server locks up -if [ -f serverquery.py ];then - echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${logfile} - serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` +fn_runcheck(){ +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + fn_serverquery + echo -en "\r[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${scriptlog} + sleep 0.5 + echo -en "\n" + exit +fi +} + +fn_logmanager(){ +# log manager will active if finds logs older than ${logdays} +if [ `find ${scriptlogdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then + echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${scriptlog} + echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${scriptlog} + find ${scriptlogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + find ${consolelogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + scriptcount=`find ${scriptlogdir}/* -mtime +${logdays}|wc -l` + consolecount=`find ${consolelogdir}/* -mtime +${logdays}|wc -l` + count=$((${scriptcount} + ${consolecount})) + find ${scriptlogdir}/* -mtime +${logdays} -exec rm {} \; + find ${consolelogdir}/* -mtime +${logdays} -exec rm {} \; + echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${scriptlog} +fi +} + +fn_debugserver(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode" +echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +fn_stopserver +echo -en "[ .... ] Starting ${servicename}: ${servername} debug mode" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\n" +cd ${filesdir} +./srcds_run ${parms} -debug +} + +fn_console(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console" +echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +echo -en "\r[ .... ] Starting ${servicename} console" +sleep 0.5 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\r[\e[0;32m OK \e[0;39m] Starting ${servicename} console" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} console accessed" >> ${scriptlog} sleep 1 - if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then - echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${logfile} - sleep 1 - fn_restartserver - else - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - fi + tmux attach-session -t $(tmux list-sessions|awk '{print $1}') +else + echo -e "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running" + sleep 0.5 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) fn_startserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi } -fn_runcheck(){ -# already running check -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 1 ];then - fn_serverquery - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${logfile} - exit -# multiple of same instance check -elif [ ${pidwc} -ge 2 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: ${servername} is running ${pidwc} times" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is running ${pidwc} times" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] ${servicename}: Stopping ${pidwc} instances of ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${pidwc} instances of ${servername}" >> ${logfile} - fn_stopserver - exit +fn_backupserver(){ +fn_rootcheck +fn_syscheck +backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" +echo "" +echo "${gamename} Backup" +echo "============================" +echo "" +echo "The following backup will be created." +echo "" +echo "${backupdir}/${backupname}.tar.gz" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running" + while true; do + read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) fn_stopserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done +fi +echo -en "[ .... ] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} backup" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} backup" >> ${scriptlog} +sleep 1 +echo -en "\n" +cd ${rootdir} +mkdir ${backupdir} > /dev/null 2>&1 +tar -cvzf ${backupdir}/${backupname}.tar.gz --exclude '${backupdir}' ${rootdir} +echo -en "\r${servicename} backup complete" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: backup complete" >> ${scriptlog} +} + +fn_details(){ +echo "" +echo "${gamename} Server Details" +echo "============================" +echo "" +echo "${servername} Ports" +echo "=======================" +servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` +rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` +echo "Ports the server is currently using" +echo "" +echo "DIRECTION DESCRIPTION PORT" +echo "INBOUND Game/Rcon Port ${port}" +if [ "${engine}" = "source" ];then + echo "INBOUND SourceTV Port ${sourcetvport}" fi +echo "OUTBOUND Client Port ${clientport}" +echo "" +echo "You can change ports by editing the" +echo "start parameters in ${selfname}" +echo "" +echo "${servername} Details" +echo "=======================" +echo "Server name: ${servername}" +echo "Rcon Password: ${rcon}" +echo "" +echo "Config file:" +echo "${servercfg}" +echo "" } fn_distro(){ @@ -138,7 +276,13 @@ fn_distro fn_uptime fn_load { -echo -e "=========================================\nServer information\n=========================================\n" +echo -e "========================================\n${servicename} details\n========================================\n" +echo -e "Service: ${servicename}" +echo -e "Game: ${gamename}" +echo -e "Server: ${servername}" +echo -e "Failure reason: ${failurereason}" +echo -e "Action Taken: ${actiontaken}\n" +echo -e "========================================\nServer details\n========================================\n" echo -e "Date: $(date)" echo -e "Distro: ${os}" echo -e "Arch: ${arch}" @@ -146,227 +290,156 @@ echo -e "Kernel: ${kernel}" echo -e "Hostname: $HOSTNAME" echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" echo -e "Avg Load${load}\n" -echo -e "=========================================\n${servicename} statistics\n=========================================\n" -echo -e "Service: ${servicename}" -echo -e "Server: ${servername}" -echo -e "Failure reason: ${failurereason}" -echo -e "Action Taken: ${actiontaken}\n" -echo -e "=========================================\n${servicename} log summary\n=========================================\n" -}|tee ${logdir}/${servicename}-email.log > /dev/null 2>&1 -tail -50 ${logfile} >> /${logdir}/${servicename}-email.log -mail -s "${subject}" ${email} < /${logdir}/${servicename}-email.log -echo -e "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: sent email notification to ${email}" >> ${logfile} +echo -e "========================================\nLogs\n========================================\n" +echo -e "Script log\n===================\n" +}|tee ${scriptlogdir}/${servicename}-email.log > /dev/null 2>&1 +tail -25 ${scriptlog} >> ${emaillog} +if [ ! -z ${consolelog} ];then + echo -e "\n\nConsole log\n====================\n" >> ${emaillog} + tail -25 ${consolelog} >> ${emaillog} +fi +if [ ! -z ${gamelogdir} ];then + echo -e "\n\nServer log\n====================\n" >> ${emaillog} + tail ${gamelogdir}/*|grep -v "==>"|sed '/^$/d'|tail -25 >> ${emaillog} +fi +mail -s "${subject}" ${email} < ${emaillog} +echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" +echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Sent email notification to ${email}" >> ${scriptlog} } fn_emailtest(){ fn_rootcheck fn_syscheck -echo -e "[\e[0;32m OK \e[0;39m] Emailing test notification" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Email Test Notification - Testing ${servername}" failurereason="Testing ${servicename} email notification" actiontaken="Sent test email...hello is this thing on?" fn_emailnotification else - echo -e "[\e[0;31m FAIL \e[0;39m] Email notificaion not enabled" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notificaion not enabled" >> ${logfile} -fi -} - -fn_logmanager(){ -# log manager will active if finds logs older than $logdays -if [ `find ${logdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then - echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${logfile} - echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${logfile} - find ${logdir}/* -mtime +${logdays} |tee >> ${logfile} - count=`find ${logdir}/* -mtime +${logdays}|wc -l` - find ${logdir}/* -mtime +${logdays} -exec rm {} \; - echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${logfile} + echo -e "[\e[0;31m FAIL \e[0;39m] Email notification not enabled" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notification not enabled" >> ${scriptlog} fi +sleep 0.5 +echo -en "\n" } -fn_restartserver(){ - echo -e "[\e[0;32m OK \e[0;39m] Restarting ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${logfile} - fn_stopserver +fn_serverquery(){ +# uses serverquery.py to directly query the server +# detects if the server locks up +if [ -f serverquery.py ];then + echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${scriptlog} + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${scriptlog} + serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` sleep 1 - fn_startserver -} - -fn_startserver(){ -fn_rootcheck -fn_syscheck -fn_runcheck -fn_logmanager -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${logfile} -cp ${logfile} ${logfiledate} -screen -d -m -S ${servicename} ${filesdir}/srcds_run ${parms} -sleep 1 -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 0 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: Failed to start ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${logfile} -fi -} - -fn_stopserver(){ -fn_rootcheck -fn_syscheck -pid=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` -if [ -z ${pid} ];then - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already stopped" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${logfile} -else - echo -e "[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${logfile} - kill `screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` - screen -wipe > /dev/null 2>&1 + if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then + echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${scriptlog} + sleep 1 + fn_restartserver + else + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + fi fi } -fn_debugserver(){ -fn_rootcheck -fn_syscheck -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} in debug mode!" -sleep 0.5 -echo -e "" -echo -e "Use for identifying server issues only!" -while true; do - echo "If server is already running it will be stopped" - read -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; -esac -done -fn_stopserver -sleep 1 -echo -e "[\e[0;36m INFO \e[0;39m] Press CTRL+C to drop out of debug mode" -sleep 3 -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -${filesdir}/srcds_run ${parms} -debug -} - fn_monitorserver(){ fn_rootcheck fn_syscheck fn_logmanager -echo -e "[\e[0;32m OK \e[0;39m] Checking ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Checking ${servername}" >> ${logfile} +echo -en "[ .... ] Monitor is checking ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is checking ${servername}" >> ${scriptlog} +sleep 0.5 updatecheck=`ps -ef|grep "${selfname} update"|grep -v grep|wc -l` if [ "${updatecheck}" = "0" ];then fn_runcheck - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${logfile} + echo -en "\r[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Monitor - Starting ${servername}" - failurereason="${servername} had stopped" - actiontaken="restarted ${servername}" + failurereason="${servicename} process was not running" + actiontaken="restarted ${servicename}" + sleep 0.5 + echo -en "\n" fn_emailnotification fi + sleep 0.5 + echo -en "\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is starting ${servername}" >> ${scriptlog} fn_startserver else echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: Monitor detected ${servername} is currently checking for updates!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${scriptlog} echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} will start when updating is complete" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${scriptlog} fi } -fn_updateserver-hlds(){ +fn_updateserver(){ fn_rootcheck fn_syscheck echo -e "[\e[0;32m OK \e[0;39m] Updating ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${logfile} -cd ${filesdir} -./steam -command update -game episode1 -verify_all -retry -dir ${filesdir} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${scriptlog} +cd ${rootdir} +cd steamcmd +./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${scriptlog} } -fn_details(){ -echo "" -echo "${gamename} Server Details" -echo "============================" -echo "" -echo "${servername} Ports" -echo "=======================" -if [ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ];then - gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') - queryport=$((${gameport} + 1)) - gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') - udplinkport=$((${gameport} + 2)) - webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') - if [ "${engine}" == "unreal" ];then - webadminuser=$(grep AdminUsername= ${systemdir}/${ini}|sed 's/\AdminUsername=//g') - else - webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') - fi - webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT INI VARIABLE" - echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" - echo "INBOUND Query Port ${queryport} UDP n/a" - if [ "${engine}" == "unreal" ];then - echo "OUTBOUND UdpLink Port (random) ${udplinkport}+ UDP n/a" - fi - if [ "${engine}" != "unreal" ] && [ "${appid}" != "223250" ];then - echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ];then - echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" - else - echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" - fi - if [ "${appid}" ];then - if [ "${appid}" == "223250" ];then - echo "OUTBOUND Steam Port 20610 UDP n/a" - else - echo "OUTBOUND Steam Port 20660 UDP n/a" - fi - fi - echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" - echo "" - echo "${servername} WebAdmin" - echo "=======================" - echo "WebAdmin URL: http://localhost:${webadminport}" - echo "WebAdmin Username: ${webadminuser}" - echo "WebAdmin Password: ${webadminpass}" - echo "" - echo "Config file" - echo "${systemdir}/${ini}" -elif [ "${engine}" = "source" ]||[ "${engine}" = "goldsource" ];then - servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` - rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT" - echo "INBOUND Game/Rcon Port ${port}" - if [ "${engine}" = "source" ];then - echo "INBOUND SourceTV Port ${sourcetvport}" - fi - echo "OUTBOUND Client Port ${clientport}" - echo "" - echo "You can change ports by editing the" - echo "start parameters in ${selfname}" - echo "" - echo "${servername} Details" - echo "=======================" - echo "Server name: ${servername}" - echo "Rcon Password: ${rcon}" - echo "" - echo "Config file:" - echo "${servercfg}" +fn_restartserver(){ +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${scriptlog} +fn_stopserver +fn_startserver +} + +fn_stopserver(){ +fn_rootcheck +fn_syscheck +pid=$(tmux list-sessions 2>&1|awk '{print $1}') +echo -en "[ .... ] Stopping ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${scriptlog} +sleep 0.5 +if [ "${pid}" == "failed" ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${scriptlog} +else + tmux kill-session -t ${servicename} + echo -en "\r[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopped ${servername}" >> ${scriptlog} fi -echo "" +sleep 0.5 +echo -en "\n" +} + +fn_startserver(){ +fn_rootcheck +fn_syscheck +echo -en "[ .... ] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${scriptlog} +sleep 0.5 +fn_runcheck +fn_logmanager +mv ${scriptlog} ${scriptlogdate} +mv ${consolelog} ${consolelogdate} +cd ${filesdir} +tmux new-session -d -s ${servicename} "./srcds_run ${parms} |tee -a ${consolelog}" +tmuxwc=`tmux list-sessions 2>&1|awk '{print $1}'|wc -l` +sleep 1 +if [ ${tmuxwc} -eq 0 ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${scriptlog} +else + echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername}" >> ${scriptlog} +fi +sleep 0.5 +echo -en "\n" } # @@ -496,7 +569,9 @@ echo "Installing ${gamename} Server" echo "=================================" mkdir -v ${filesdir} mkdir -v ${rootdir}/log - mkdir -v ${logdir} + mkdir -v ${scriptlogdir} + mkdir -v ${consolelogdir} + touch ${consolelog} fn_hldsdl echo "Downloading episode 1 game assets" echo "=================================" diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index 07b4f4d35..cb87b6265 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -3,7 +3,7 @@ # Server Management Script # Author: Daniel Gibbs # Website: http://danielgibbs.co.uk -# Version: 310813 +# Version: 011013 #### Variables #### @@ -17,6 +17,7 @@ rootdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" selfname="$0" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/System" +backupdir="${rootdir}/backups" compressedmapsdir="${rootdir}/Maps-Compressed" # Server names @@ -27,10 +28,16 @@ ini="${servicename}.ini" servername=`grep -s ServerName= ${systemdir}/${ini} | sed 's/ServerName=//g'` # Logging -logdir="${rootdir}/log" -logfile="${logdir}/${servicename}.log" -logfiledate="${logdir}/${servicename}-$( date '+%d-%m-%Y-%H-%M-%S').log" logdays="7" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" # Start vars defaultmap="DM-Rankin" @@ -55,49 +62,234 @@ if [ ! -e ${systemdir} ];then fi } -fn_serverquery(){ -# uses serverquery.py to directly query the server -# detects if the server locks up -if [ -f serverquery.py ];then - echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${logfile} - serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` +fn_runcheck(){ +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + fn_serverquery + echo -en "\r[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${scriptlog} + sleep 0.5 + echo -en "\n" + exit +fi +} +fn_compressmaps(){ +fn_rootcheck +clear +echo "${gamename} Map Compressor" +echo "============================" +echo "Will compress all maps in:" +echo "" +pwd +echo "" +echo "Compressed maps saved to:" +echo "" +echo "${compressedmapsdir}" +echo "" +while true; do + read -p "Start compression [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; + esac +done +mkdir ${compressedmapsdir} +rm -rfv ${filesdir}/Maps/*.uz2 +cd ${systemdir} +./ucc-bin compress ../Maps/* --nohomedir +mv -fv ${filesdir}/Maps/*.uz2 ${compressedmapsdir} +} + +fn_logmanager(){ +# log manager will active if finds logs older than ${logdays} +if [ `find ${scriptlogdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then + echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${scriptlog} + echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${scriptlog} + find ${scriptlogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + find ${consolelogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + scriptcount=`find ${scriptlogdir}/* -mtime +${logdays}|wc -l` + consolecount=`find ${consolelogdir}/* -mtime +${logdays}|wc -l` + count=$((${scriptcount} + ${consolecount})) + find ${scriptlogdir}/* -mtime +${logdays} -exec rm {} \; + find ${consolelogdir}/* -mtime +${logdays} -exec rm {} \; + echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${scriptlog} +fi +} + +fn_debugserver(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode" +echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +fn_stopserver +echo -en "[ .... ] Starting ${servicename}: ${servername} debug mode" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\n" +cd ${systemdir} +./ucc-bin ${parms} +} + +fn_console(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console" +echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +echo -en "\r[ .... ] Starting ${servicename} console" +sleep 0.5 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\r[\e[0;32m OK \e[0;39m] Starting ${servicename} console" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} console accessed" >> ${scriptlog} sleep 1 - if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then - echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${logfile} - sleep 1 - fn_restartserver - else - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - fi + tmux attach-session -t $(tmux list-sessions|awk '{print $1}') +else + echo -e "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running" + sleep 0.5 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) fn_startserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi } -fn_runcheck(){ -# already running check -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 1 ];then - fn_serverquery - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${logfile} - exit -# multiple of same instance check -elif [ ${pidwc} -ge 2 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: ${servername} is running ${pidwc} times" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is running ${pidwc} times" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] ${servicename}: Stopping ${pidwc} instances of ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${pidwc} instances of ${servername}" >> ${logfile} - fn_stopserver - exit +fn_backupserver(){ +fn_rootcheck +fn_syscheck +backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" +echo "" +echo "${gamename} Backup" +echo "============================" +echo "" +echo "The following backup will be created." +echo "" +echo "${backupdir}/${backupname}.tar.gz" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running" + while true; do + read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) fn_stopserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi +echo -en "[ .... ] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} backup" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} backup" >> ${scriptlog} +sleep 1 +echo -en "\n" +cd ${rootdir} +mkdir ${backupdir} > /dev/null 2>&1 +tar -cvzf ${backupdir}/${backupname}.tar.gz --exclude '${backupdir}' ${rootdir} +echo -en "\r${servicename} backup complete" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: backup complete" >> ${scriptlog} +} + +fn_details(){ +echo "" +echo "${gamename} Server Details" +echo "============================" +echo "" +echo "${servername} Ports" +echo "=======================" +gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') +queryport=$((${gameport} + 1)) +gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') +udplinkport=$((${gameport} + 2)) +webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') +if [ "${engine}" == "unreal" ];then + webadminuser=$(grep AdminUsername= ${systemdir}/${ini}|sed 's/\AdminUsername=//g') +else + webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') +fi +webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') +echo "Ports the server is currently using" +echo "" +echo "DIRECTION DESCRIPTION PORT INI VARIABLE" +echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" +echo "INBOUND Query Port ${queryport} UDP n/a" +if [ "${engine}" == "unreal" ];then + echo "OUTBOUND UdpLink Port (random) ${udplinkport}+ UDP n/a" +fi +if [ "${engine}" != "unreal" ] && [ "${appid}" != "223250" ];then + echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" +fi +if [ "${appid}" == "215360" ];then + echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" +else + echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" +fi +if [ "${appid}" ];then + if [ "${appid}" == "223250" ];then + echo "OUTBOUND Steam Port 20610 UDP n/a" + else + echo "OUTBOUND Steam Port 20660 UDP n/a" + fi +fi +echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" +echo "" +echo "${servername} WebAdmin" +echo "=======================" +echo "WebAdmin URL: http://localhost:${webadminport}" +echo "WebAdmin Username: ${webadminuser}" +echo "WebAdmin Password: ${webadminpass}" +echo "" +echo "Config file" +echo "${systemdir}/${ini}" +echo "" } fn_distro(){ @@ -131,7 +323,13 @@ fn_distro fn_uptime fn_load { -echo -e "=========================================\nServer information\n=========================================\n" +echo -e "========================================\n${servicename} details\n========================================\n" +echo -e "Service: ${servicename}" +echo -e "Game: ${gamename}" +echo -e "Server: ${servername}" +echo -e "Failure reason: ${failurereason}" +echo -e "Action Taken: ${actiontaken}\n" +echo -e "========================================\nServer details\n========================================\n" echo -e "Date: $(date)" echo -e "Distro: ${os}" echo -e "Arch: ${arch}" @@ -139,240 +337,144 @@ echo -e "Kernel: ${kernel}" echo -e "Hostname: $HOSTNAME" echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" echo -e "Avg Load${load}\n" -echo -e "=========================================\n${servicename} statistics\n=========================================\n" -echo -e "Service: ${servicename}" -echo -e "Server: ${servername}" -echo -e "Failure reason: ${failurereason}" -echo -e "Action Taken: ${actiontaken}\n" -echo -e "=========================================\n${servicename} log summary\n=========================================\n" -}|tee ${logdir}/${servicename}-email.log > /dev/null 2>&1 -tail -50 ${logfile} >> /${logdir}/${servicename}-email.log -mail -s "${subject}" ${email} < /${logdir}/${servicename}-email.log -echo -e "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: sent email notification to ${email}" >> ${logfile} +echo -e "========================================\nLogs\n========================================\n" +echo -e "Script log\n===================\n" +}|tee ${scriptlogdir}/${servicename}-email.log > /dev/null 2>&1 +tail -25 ${scriptlog} >> ${emaillog} +if [ ! -z ${consolelog} ];then + echo -e "\n\nConsole log\n====================\n" >> ${emaillog} + tail -25 ${consolelog} >> ${emaillog} +fi +if [ ! -z ${gamelogdir} ];then + echo -e "\n\nServer log\n====================\n" >> ${emaillog} + tail ${gamelogdir}/*|grep -v "==>"|sed '/^$/d'|tail -25 >> ${emaillog} +fi +mail -s "${subject}" ${email} < ${emaillog} +echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" +echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Sent email notification to ${email}" >> ${scriptlog} } fn_emailtest(){ fn_rootcheck fn_syscheck -echo -e "[\e[0;32m OK \e[0;39m] Emailing test notification" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Email Test Notification - Testing ${servername}" failurereason="Testing ${servicename} email notification" actiontaken="Sent test email...hello is this thing on?" fn_emailnotification else - echo -e "[\e[0;31m FAIL \e[0;39m] Email notificaion not enabled" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notificaion not enabled" >> ${logfile} -fi -} - -fn_logmanager(){ -# log manager will active if finds logs older than $logdays -if [ `find ${logdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then - echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${logfile} - echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${logfile} - find ${logdir}/* -mtime +${logdays} |tee >> ${logfile} - count=`find ${logdir}/* -mtime +${logdays}|wc -l` - find ${logdir}/* -mtime +${logdays} -exec rm {} \; - echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${logfile} + echo -e "[\e[0;31m FAIL \e[0;39m] Email notification not enabled" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notification not enabled" >> ${scriptlog} fi +sleep 0.5 +echo -en "\n" } -fn_restartserver(){ - echo -e "[\e[0;32m OK \e[0;39m] Restarting ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${logfile} - fn_stopserver +fn_serverquery(){ +# uses serverquery.py to directly query the server +# detects if the server locks up +if [ -f serverquery.py ];then + echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${scriptlog} + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${scriptlog} + serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` sleep 1 - fn_startserver -} - -fn_startserver(){ -fn_rootcheck -fn_syscheck -fn_runcheck -fn_logmanager -cd ${systemdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${logfile} -cp ${logfile} ${logfiledate} -screen -d -m -S ${servicename} ./ucc-bin ${parms} -sleep 1 -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 0 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: Failed to start ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${logfile} -fi -} - -fn_stopserver(){ -fn_rootcheck -fn_syscheck -pid=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` -if [ -z ${pid} ];then - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already stopped" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${logfile} -else - echo -e "[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${logfile} - kill `screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` - screen -wipe > /dev/null 2>&1 + if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then + echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${scriptlog} + sleep 1 + fn_restartserver + else + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + fi fi } -fn_debugserver(){ -fn_rootcheck -fn_syscheck -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} in debug mode!" -sleep 0.5 -echo -e "" -echo -e "Use for identifying server issues only!" -while true; do - echo "If server is already running it will be stopped" - read -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; -esac -done -fn_stopserver -sleep 1 -echo -e "[\e[0;36m INFO \e[0;39m] Press CTRL+C to drop out of debug mode" -sleep 3 -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -cd ${systemdir} -./ucc-bin ${parms} -} - fn_monitorserver(){ fn_rootcheck fn_syscheck fn_logmanager -echo -e "[\e[0;32m OK \e[0;39m] Checking ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Checking ${servername}" >> ${logfile} +echo -en "[ .... ] Monitor is checking ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is checking ${servername}" >> ${scriptlog} +sleep 0.5 updatecheck=`ps -ef|grep "${selfname} update"|grep -v grep|wc -l` if [ "${updatecheck}" = "0" ];then fn_runcheck - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${logfile} + echo -en "\r[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Monitor - Starting ${servername}" - failurereason="${servername} had stopped" - actiontaken="restarted ${servername}" + failurereason="${servicename} process was not running" + actiontaken="restarted ${servicename}" fn_emailnotification fi + sleep 0.5 + echo -en "\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is starting ${servername}" >> ${scriptlog} fn_startserver else echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: Monitor detected ${servername} is currently checking for updates!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${scriptlog} echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} will start when updating is complete" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${scriptlog} fi } -fn_compressmaps(){ -fn_rootcheck -clear -echo "${gamename} Map Compressor" -echo "============================" -echo "Will compress all maps in:" -echo "" -pwd -echo "" -echo "Compressed maps saved to:" -echo "" -echo "$compressedmapsdir" +fn_restartserver(){ +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${scriptlog} +fn_stopserver +fn_startserver +} -echo "" -while true; do - read -p "Start compression [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; - esac -done -mkdir $compressedmapsdir -rm -rfv ${filesdir}/Maps/*.uz2 -cd ${systemdir} -./ucc-bin compress ../Maps/* --nohomedir -mv -fv ${filesdir}/Maps/*.uz2 $compressedmapsdir +fn_stopserver(){ +fn_rootcheck +fn_syscheck +pid=$(tmux list-sessions 2>&1|awk '{print $1}') +echo -en "[ .... ] Stopping ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${scriptlog} +sleep 0.5 +if [ "${pid}" == "failed" ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${scriptlog} +else + tmux kill-session -t ${servicename} + echo -en "\r[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopped ${servername}" >> ${scriptlog} +fi +sleep 0.5 +echo -en "\n" } -fn_details(){ -echo "" -echo "${gamename} Server Details" -echo "============================" -echo "" -echo "${servername} Ports" -echo "=======================" -if [ "${engine}" = "unreal2" ];then - gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') - queryport=$((${gameport} + 1)) - gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') - webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') - webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') - webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT INI VARIABLE" - echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" - echo "INBOUND Query Port ${queryport} UDP n/a" - if [ "${appid}" != "223250" ];then - echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ];then - echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" - else - echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" - fi - if [ "${appid}" ];then - if [ "${appid}" == "223250" ];then - echo "OUTBOUND Steam Port 20610 UDP n/a" - else - echo "OUTBOUND Steam Port 20660 UDP n/a" - fi - fi - echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" - echo "" - echo "${servername} WebAdmin" - echo "=======================" - echo "WebAdmin URL: http://localhost:${webadminport}" - echo "WebAdmin Username: ${webadminuser}" - echo "WebAdmin Password: ${webadminpass}" - echo "" - echo "Config file" - echo "${systemdir}/${ini}" -elif [ "${engine}" = "source" ]||[ "${engine}" = "goldsource" ];then - servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` - rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT" - echo "INBOUND Game/Rcon Port ${port}" - if [ "${engine}" = "source" ];then - echo "INBOUND SourceTV Port ${sourcetvport}" - fi - echo "OUTBOUND Client Port ${clientport}" - echo "" - echo "You can change ports by editing the" - echo "start parameters in ${selfname}" - echo "" - echo "${servername} Details" - echo "=======================" - echo "Server name: ${servername}" - echo "Rcon Password: ${rcon}" - echo "" - echo "Config file:" - echo "${servercfg}" +fn_startserver(){ +fn_rootcheck +fn_syscheck +echo -en "[ .... ] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${scriptlog} +sleep 0.5 +fn_runcheck +fn_logmanager +mv ${scriptlog} ${scriptlogdate} +mv ${consolelog} ${consolelogdate} +cd ${systemdir} +tmux new-session -d -s ${servicename} "./ucc-bin ${parms} |tee -a ${consolelog}" +tmuxwc=`tmux list-sessions 2>&1|awk '{print $1}'|wc -l` +sleep 1 +if [ ${tmuxwc} -eq 0 ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${scriptlog} +else + echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername}" >> ${scriptlog} fi -echo "" +sleep 0.5 +echo -en "\n" } # @@ -488,6 +590,7 @@ echo "" echo "Installing ${gamename} Server" echo "=================================" sleep 1 + mkdir -v ${filesdir} cd ${filesdir} echo "Extracting dedicatedserver3339-bonuspack.zip" sleep 1 @@ -541,8 +644,11 @@ echo "=================================" echo "Copying ${systemdir}/ut2004.ini to ${systemdir}/${ini}" cp ${systemdir}/UT2004.ini ${systemdir}/${ini} sleep 1 - echo "Creating log directory" - mkdir -v ${logdir} + echo "Creating log directorys" + mkdir -v ${rootdir}/log + mkdir -v ${scriptlogdir} + mkdir -v ${consolelogdir} + touch ${consolelog} sleep 1 echo "Applying WebAdmin ut2003.css fix!" echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" @@ -591,18 +697,22 @@ case "$1" in fn_restartserver;; monitor) fn_monitorserver;; - install) - fn_install;; - debug) - fn_debugserver;; - map-compressor) - fn_compressmaps;; email-test) fn_emailtest;; details) fn_details;; + backup) + fn_backupserver;; + console) + fn_console;; + debug) + fn_debugserver;; + install) + fn_install;; + map-compressor) + fn_compressmaps;; *) - echo "Usage: $0 {start|stop|restart|monitor|install|debug|map-compressor|email-test|details}" - exit 1;; + echo "Usage: $0 {start|stop|restart|monitor|email-test|details|backup|console|debug|install|map-compressor}" + exit 1;; esac exit \ No newline at end of file diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index bcccb79c0..777386d50 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -3,7 +3,7 @@ # Server Management Script # Author: Daniel Gibbs # Website: http://danielgibbs.co.uk -# Version: 310813 +# Version: 011013 #### Variables #### @@ -17,6 +17,7 @@ rootdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" selfname="$0" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/System" +backupdir="${rootdir}/backups" compressedmapsdir="${rootdir}/Maps-Compressed" # Server names @@ -27,10 +28,16 @@ ini="${servicename}.ini" servername=`grep -s ServerName= ${systemdir}/${ini} | sed 's/ServerName=//g'` # Logging -logdir="${rootdir}/log" -logfile="${logdir}/${servicename}.log" -logfiledate="${logdir}/${servicename}-$( date '+%d-%m-%Y-%H-%M-%S').log" logdays="7" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" # Start vars defaultmap="DM-Deck16][" @@ -55,49 +62,234 @@ if [ ! -e ${systemdir} ];then fi } -fn_serverquery(){ -# uses serverquery.py to directly query the server -# detects if the server locks up -if [ -f serverquery.py ];then - echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${logfile} - serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` +fn_runcheck(){ +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + fn_serverquery + echo -en "\r[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${scriptlog} + sleep 0.5 + echo -en "\n" + exit +fi +} +fn_compressmaps(){ +fn_rootcheck +clear +echo "${gamename} Map Compressor" +echo "============================" +echo "Will compress all maps in:" +echo "" +pwd +echo "" +echo "Compressed maps saved to:" +echo "" +echo "${compressedmapsdir}" +echo "" +while true; do + read -p "Start compression [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; + esac +done +mkdir ${compressedmapsdir} +rm -rfv ${filesdir}/Maps/*.uz2 +cd ${systemdir} +./ucc-bin compress ../Maps/* --nohomedir +mv -fv ${filesdir}/Maps/*.uz2 ${compressedmapsdir} +} + +fn_logmanager(){ +# log manager will active if finds logs older than ${logdays} +if [ `find ${scriptlogdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then + echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${scriptlog} + echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${scriptlog} + find ${scriptlogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + find ${consolelogdir}/* -mtime +${logdays} |tee >> ${scriptlog} + scriptcount=`find ${scriptlogdir}/* -mtime +${logdays}|wc -l` + consolecount=`find ${consolelogdir}/* -mtime +${logdays}|wc -l` + count=$((${scriptcount} + ${consolecount})) + find ${scriptlogdir}/* -mtime +${logdays} -exec rm {} \; + find ${consolelogdir}/* -mtime +${logdays} -exec rm {} \; + echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${scriptlog} +fi +} + +fn_debugserver(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode" +echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +fn_stopserver +echo -en "[ .... ] Starting ${servicename}: ${servername} debug mode" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} debug mode" >> ${scriptlog} +sleep 0.5 +echo -en "\n" +cd ${systemdir} +./ucc-bin ${parms} +} + +fn_console(){ +fn_rootcheck +fn_syscheck +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console" +echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +echo -en "\r[ .... ] Starting ${servicename} console" +sleep 0.5 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\r[\e[0;32m OK \e[0;39m] Starting ${servicename} console" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} console accessed" >> ${scriptlog} sleep 1 - if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then - echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${logfile} - sleep 1 - fn_restartserver - else - echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${logfile} - sleep 1 - fi + tmux attach-session -t $(tmux list-sessions|awk '{print $1}') +else + echo -e "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running" + sleep 0.5 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) fn_startserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done fi } -fn_runcheck(){ -# already running check -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 1 ];then - fn_serverquery - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${logfile} - exit -# multiple of same instance check -elif [ ${pidwc} -ge 2 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: ${servername} is running ${pidwc} times" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is running ${pidwc} times" >> ${logfile} - echo -e "[\e[0;32m OK \e[0;39m] ${servicename}: Stopping ${pidwc} instances of ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${pidwc} instances of ${servername}" >> ${logfile} - fn_stopserver - exit +fn_backupserver(){ +fn_rootcheck +fn_syscheck +backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" +echo "" +echo "${gamename} Backup" +echo "============================" +echo "" +echo "The following backup will be created." +echo "" +echo "${backupdir}/${backupname}.tar.gz" +echo "" +while true; do + read -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return 1 ;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|wc -l) +if [ ${tmuxwc} -eq 1 ];then + echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running" + while true; do + read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) fn_stopserver;break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done +fi +echo -en "[ .... ] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} backup" >> ${scriptlog} +sleep 0.5 +echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} backup" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} backup" >> ${scriptlog} +sleep 1 +echo -en "\n" +cd ${rootdir} +mkdir ${backupdir} > /dev/null 2>&1 +tar -cvzf ${backupdir}/${backupname}.tar.gz --exclude '${backupdir}' ${rootdir} +echo -en "\r${servicename} backup complete" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: backup complete" >> ${scriptlog} +} + +fn_details(){ +echo "" +echo "${gamename} Server Details" +echo "============================" +echo "" +echo "${servername} Ports" +echo "=======================" +gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') +queryport=$((${gameport} + 1)) +gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') +udplinkport=$((${gameport} + 2)) +webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') +if [ "${engine}" == "unreal" ];then + webadminuser=$(grep AdminUsername= ${systemdir}/${ini}|sed 's/\AdminUsername=//g') +else + webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') +fi +webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') +echo "Ports the server is currently using" +echo "" +echo "DIRECTION DESCRIPTION PORT INI VARIABLE" +echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" +echo "INBOUND Query Port ${queryport} UDP n/a" +if [ "${engine}" == "unreal" ];then + echo "OUTBOUND UdpLink Port (random) ${udplinkport}+ UDP n/a" fi +if [ "${engine}" != "unreal" ] && [ "${appid}" != "223250" ];then + echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" +fi +if [ "${appid}" == "215360" ];then + echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" +else + echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" +fi +if [ "${appid}" ];then + if [ "${appid}" == "223250" ];then + echo "OUTBOUND Steam Port 20610 UDP n/a" + else + echo "OUTBOUND Steam Port 20660 UDP n/a" + fi +fi +echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" +echo "" +echo "${servername} WebAdmin" +echo "=======================" +echo "WebAdmin URL: http://localhost:${webadminport}" +echo "WebAdmin Username: ${webadminuser}" +echo "WebAdmin Password: ${webadminpass}" +echo "" +echo "Config file" +echo "${systemdir}/${ini}" +echo "" } fn_distro(){ @@ -131,7 +323,13 @@ fn_distro fn_uptime fn_load { -echo -e "=========================================\nServer information\n=========================================\n" +echo -e "========================================\n${servicename} details\n========================================\n" +echo -e "Service: ${servicename}" +echo -e "Game: ${gamename}" +echo -e "Server: ${servername}" +echo -e "Failure reason: ${failurereason}" +echo -e "Action Taken: ${actiontaken}\n" +echo -e "========================================\nServer details\n========================================\n" echo -e "Date: $(date)" echo -e "Distro: ${os}" echo -e "Arch: ${arch}" @@ -139,250 +337,144 @@ echo -e "Kernel: ${kernel}" echo -e "Hostname: $HOSTNAME" echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" echo -e "Avg Load${load}\n" -echo -e "=========================================\n${servicename} statistics\n=========================================\n" -echo -e "Service: ${servicename}" -echo -e "Server: ${servername}" -echo -e "Failure reason: ${failurereason}" -echo -e "Action Taken: ${actiontaken}\n" -echo -e "=========================================\n${servicename} log summary\n=========================================\n" -}|tee ${logdir}/${servicename}-email.log > /dev/null 2>&1 -tail -50 ${logfile} >> /${logdir}/${servicename}-email.log -mail -s "${subject}" ${email} < /${logdir}/${servicename}-email.log -echo -e "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: sent email notification to ${email}" >> ${logfile} +echo -e "========================================\nLogs\n========================================\n" +echo -e "Script log\n===================\n" +}|tee ${scriptlogdir}/${servicename}-email.log > /dev/null 2>&1 +tail -25 ${scriptlog} >> ${emaillog} +if [ ! -z ${consolelog} ];then + echo -e "\n\nConsole log\n====================\n" >> ${emaillog} + tail -25 ${consolelog} >> ${emaillog} +fi +if [ ! -z ${gamelogdir} ];then + echo -e "\n\nServer log\n====================\n" >> ${emaillog} + tail ${gamelogdir}/*|grep -v "==>"|sed '/^$/d'|tail -25 >> ${emaillog} +fi +mail -s "${subject}" ${email} < ${emaillog} +echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}" +echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Sent email notification to ${email}" >> ${scriptlog} } fn_emailtest(){ fn_rootcheck fn_syscheck -echo -e "[\e[0;32m OK \e[0;39m] Emailing test notification" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${logfile} +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Email Test Notification - Testing ${servername}" failurereason="Testing ${servicename} email notification" actiontaken="Sent test email...hello is this thing on?" fn_emailnotification else - echo -e "[\e[0;31m FAIL \e[0;39m] Email notificaion not enabled" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notificaion not enabled" >> ${logfile} -fi -} - -fn_logmanager(){ -# log manager will active if finds logs older than $logdays -if [ `find ${logdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then - echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${logfile} - echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${logfile} - find ${logdir}/* -mtime +${logdays} |tee >> ${logfile} - count=`find ${logdir}/* -mtime +${logdays}|wc -l` - find ${logdir}/* -mtime +${logdays} -exec rm {} \; - echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${logfile} + echo -e "[\e[0;31m FAIL \e[0;39m] Email notification not enabled" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Email notification not enabled" >> ${scriptlog} fi +sleep 0.5 +echo -en "\n" } -fn_restartserver(){ - echo -e "[\e[0;32m OK \e[0;39m] Restarting ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${logfile} - fn_stopserver +fn_serverquery(){ +# uses serverquery.py to directly query the server +# detects if the server locks up +if [ -f serverquery.py ];then + echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${scriptlog} + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${scriptlog} + serverquery=`./serverquery.py 127.0.0.1 ${port} 2>&1` sleep 1 - fn_startserver -} - -fn_startserver(){ -fn_rootcheck -fn_syscheck -fn_runcheck -fn_logmanager -cd ${systemdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${logfile} -cp ${logfile} ${logfiledate} -screen -d -m -S ${servicename} ./ucc-bin ${parms} -sleep 1 -pidwc=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'|wc -l` -if [ ${pidwc} -eq 0 ];then - echo -e "[\e[0;31m FAIL \e[0;39m] ${servicename}: Failed to start ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${logfile} -fi -} - -fn_stopserver(){ -fn_rootcheck -fn_syscheck -pid=`screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` -if [ -z ${pid} ];then - echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already stopped" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${logfile} -else - echo -e "[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${logfile} - kill `screen -ls |grep ${servicename} |awk -F . '{print $1}'|awk '{print $1}'` - screen -wipe > /dev/null 2>&1 + if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then + echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${scriptlog} + sleep 1 + fn_restartserver + else + echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog} + sleep 1 + fi fi } -fn_debugserver(){ -fn_rootcheck -fn_syscheck -cd ${filesdir} -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} in debug mode!" -sleep 0.5 -echo -e "" -echo -e "Use for identifying server issues only!" -while true; do - echo "If server is already running it will be stopped" - read -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; -esac -done -fn_stopserver -sleep 1 -echo -e "[\e[0;36m INFO \e[0;39m] Press CTRL+C to drop out of debug mode" -sleep 3 -echo -e "[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" -cd ${systemdir} -./ucc-bin ${parms} -} - fn_monitorserver(){ fn_rootcheck fn_syscheck fn_logmanager -echo -e "[\e[0;32m OK \e[0;39m] Checking ${servicename}: ${servername}" -echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Checking ${servername}" >> ${logfile} +echo -en "[ .... ] Monitor is checking ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is checking ${servername}" >> ${scriptlog} +sleep 0.5 updatecheck=`ps -ef|grep "${selfname} update"|grep -v grep|wc -l` if [ "${updatecheck}" = "0" ];then fn_runcheck - echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${logfile} + echo -en "\r[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${scriptlog} if [ "${emailnotification}" = "on" ];then subject="${servicename} Monitor - Starting ${servername}" - failurereason="${servername} had stopped" - actiontaken="restarted ${servername}" + failurereason="${servicename} process was not running" + actiontaken="restarted ${servicename}" fn_emailnotification fi + sleep 0.5 + echo -en "\n" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor is starting ${servername}" >> ${scriptlog} fn_startserver else echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: Monitor detected ${servername} is currently checking for updates!" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${scriptlog} echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} will start when updating is complete" - echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${logfile} + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${scriptlog} fi } -fn_compressmaps(){ +fn_restartserver(){ +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${scriptlog} +fn_stopserver +fn_startserver +} + +fn_stopserver(){ fn_rootcheck -clear -echo "${gamename} Map Compressor" -echo "============================" -echo "Will compress all maps in:" -echo "" -pwd -echo "" -echo "Compressed maps saved to:" -echo "" -echo "${compressedmapsdir}" -echo "" -while true; do - read -p "Start compression [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return 1 ;; - * ) echo "Please answer yes or no.";; - esac -done -mkdir ${compressedmapsdir} -rm -rfv ${filesdir}/Maps/*.unr.uz -cd ${systemdir} -for f in ../Maps/* -do - ./ucc-bin compress $f --nohomedir -done -mv -fv ${filesdir}/Maps/*.unr.uz ${compressedmapsdir} +fn_syscheck +pid=$(tmux list-sessions 2>&1|awk '{print $1}') +echo -en "[ .... ] Stopping ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${scriptlog} +sleep 0.5 +if [ "${pid}" == "failed" ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${scriptlog} +else + tmux kill-session -t ${servicename} + echo -en "\r[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Stopped ${servername}" >> ${scriptlog} +fi +sleep 0.5 +echo -en "\n" } -fn_details(){ -echo "" -echo "${gamename} Server Details" -echo "============================" -echo "" -echo "${servername} Ports" -echo "=======================" -if [ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ];then - gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') - queryport=$((${gameport} + 1)) - gsqueryport=$(grep OldQueryPortNumber= ${systemdir}/${ini}|sed 's/\OldQueryPortNumber=//g') - udplinkport=$((${gameport} + 2)) - webadminport=$(grep ListenPort= ${systemdir}/${ini}|sed 's/\ListenPort=//g') - if [ "${engine}" == "unreal" ];then - webadminuser=$(grep AdminUsername= ${systemdir}/${ini}|sed 's/\AdminUsername=//g') - else - webadminuser=$(grep AdminName= ${systemdir}/${ini}|sed 's/\AdminName=//g') - fi - webadminpass=$(grep AdminPassword= ${systemdir}/${ini}|sed 's/\AdminPassword=//g') - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT INI VARIABLE" - echo "INBOUND Game Port ${gameport} UDP Port=${gameport}" - echo "INBOUND Query Port ${queryport} UDP n/a" - if [ "${engine}" == "unreal" ];then - echo "OUTBOUND UdpLink Port (random) ${udplinkport}+ UDP n/a" - fi - if [ "${engine}" != "unreal" ] && [ "${appid}" != "223250" ];then - echo "INBOUND GameSpy Query Port ${gsqueryport} UDP OldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ];then - echo "OUTBOUND Master Server port 28852 TCP/UDP n/a" - else - echo "OUTBOUND Master Server port 28900/28902 TCP/UDP n/a" - fi - if [ "${appid}" ];then - if [ "${appid}" == "223250" ];then - echo "OUTBOUND Steam Port 20610 UDP n/a" - else - echo "OUTBOUND Steam Port 20660 UDP n/a" - fi - fi - echo "INBOUND WebAdmin ${webadminport} TCP ListenPort=${webadminport}" - echo "" - echo "${servername} WebAdmin" - echo "=======================" - echo "WebAdmin URL: http://localhost:${webadminport}" - echo "WebAdmin Username: ${webadminuser}" - echo "WebAdmin Password: ${webadminpass}" - echo "" - echo "Config file" - echo "${systemdir}/${ini}" -elif [ "${engine}" = "source" ]||[ "${engine}" = "goldsource" ];then - servername=`grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g'` - rcon=`grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g'` - echo "Ports the server is currently using" - echo "" - echo "DIRECTION DESCRIPTION PORT" - echo "INBOUND Game/Rcon Port ${port}" - if [ "${engine}" = "source" ];then - echo "INBOUND SourceTV Port ${sourcetvport}" - fi - echo "OUTBOUND Client Port ${clientport}" - echo "" - echo "You can change ports by editing the" - echo "start parameters in ${selfname}" - echo "" - echo "${servername} Details" - echo "=======================" - echo "Server name: ${servername}" - echo "Rcon Password: ${rcon}" - echo "" - echo "Config file:" - echo "${servercfg}" +fn_startserver(){ +fn_rootcheck +fn_syscheck +echo -en "[ .... ] Starting ${servicename}: ${servername}" +echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${scriptlog} +sleep 0.5 +fn_runcheck +fn_logmanager +mv ${scriptlog} ${scriptlogdate} +mv ${consolelog} ${consolelogdate} +cd ${systemdir} +tmux new-session -d -s ${servicename} "./ucc-bin ${parms} |tee -a ${consolelog}" +tmuxwc=`tmux list-sessions 2>&1|awk '{print $1}'|wc -l` +sleep 1 +if [ ${tmuxwc} -eq 0 ];then + echo -en "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${scriptlog} +else + echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}" + echo -e "$( date '+%b %d %H:%M:%S') ${servicename}: Started ${servername}" >> ${scriptlog} fi -echo "" +sleep 0.5 +echo -en "\n" } # @@ -495,6 +587,7 @@ fn_filesdl echo "" echo "Installing ${gamename} Server" echo "=================================" + mkdir -v ${filesdir} cd ${filesdir} tar -zxvf ut-server-436.tar.gz ut-server/ --strip-components=1 tar jxvf UTPGPatch451.tar.bz2 @@ -523,7 +616,7 @@ echo "=================================" [Nn]* ) break ;; * ) echo "Please answer yes or no.";; esac - done + done echo "" echo "Configuring ${gamename} Server" echo "=================================" @@ -538,23 +631,26 @@ echo "=================================" echo "UpdateMinutes=1" echo "MasterServerAddress=unreal.epicgames.com" echo "MasterServerPort=27900" - echo "Region=0" + echo "Region=0" }|tee -a ${systemdir}/${ini} > /dev/null 2>&1 - sleep 1 + sleep 1 echo "Removing dead mplayer.com master server" - sed -i '/master.mplayer.com/d' ${systemdir}/${ini} - sleep 1 + sed -i '/master.mplayer.com/d' ${systemdir}/${ini} + sleep 1 echo "Inserting qtracker.com master server" sed -i '66i\ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.qtracker.com MasterServerPort=27900' ${systemdir}/${ini} - sleep 1 + sleep 1 echo "Enabling WebAdmin" sed -i 's/bEnabled=False/bEnabled=True/g' ${systemdir}/${ini} - sleep 1 + sleep 1 echo "Setting WebAdmin port to 8076" sed -i '467i\ListenPort=8076' ${systemdir}/${ini} - sleep 1 - echo "Creating log directory" - mkdir -v ${logdir} + sleep 1 + echo "Creating log directorys" + mkdir -v ${rootdir}/log + mkdir -v ${scriptlogdir} + mkdir -v ${consolelogdir} + touch ${consolelog} sleep 1 sleep 1 fn_header @@ -574,20 +670,31 @@ case "$1" in fn_stopserver;; restart) fn_restartserver;; + update) + fn_stopserver + fn_updateserver + fn_startserver;; monitor) fn_monitorserver;; - install) - fn_install;; - debug) - fn_debugserver;; - map-compressor) - fn_compressmaps;; email-test) fn_emailtest;; details) fn_details;; + backup) + fn_backupserver;; + console) + fn_console;; + debug) + fn_debugserver;; + install) + fn_install;; + map-compressor) + fn_compressmaps;; + steam-auth) + fn_updateserver + fn_steamguard;; *) - echo "Usage: $0 {start|stop|restart|monitor|install|debug|map-compressor|email-test|details}" - exit 1;; + echo "Usage: $0 {start|stop|restart|update|monitor|email-test|details|backup|console|debug|install|map-compressor|steam-auth}" + exit 1;; esac exit \ No newline at end of file