Browse Source
All servers have now been migrated to the new functions code. All functions are now separated in there own file allowing to make quicker changes to all servers code and simpler management of the code. For the developer the code is now very scalable.pull/254/merge
24 changed files with 2425 additions and 14455 deletions
@ -3,7 +3,7 @@ |
|||||
# Server Management Script |
# Server Management Script |
||||
# Author: Daniel Gibbs |
# Author: Daniel Gibbs |
||||
# Website: http://danielgibbs.co.uk |
# Website: http://danielgibbs.co.uk |
||||
# Version: 231114 |
# Version: 011214 |
||||
|
|
||||
#### Variables #### |
#### Variables #### |
||||
|
|
||||
@ -81,7 +81,7 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- |
|||||
# what you are doing |
# what you are doing |
||||
|
|
||||
fn_scriptlog(){ |
fn_scriptlog(){ |
||||
echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${1}" >> ${scriptlog} |
echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${1}" >> "${scriptlog}" |
||||
} |
} |
||||
|
|
||||
# [ FAIL ] |
# [ FAIL ] |
||||
@ -93,15 +93,16 @@ fn_printfailnl(){ |
|||||
echo -e "\r\033[K[\e[0;31m FAIL \e[0;39m] $@" |
echo -e "\r\033[K[\e[0;31m FAIL \e[0;39m] $@" |
||||
} |
} |
||||
|
|
||||
|
# [ OK ] |
||||
fn_printok(){ |
fn_printok(){ |
||||
echo -en "\r\033[K[\e[0;32m OK \e[0;39m] $@" |
echo -en "\r\033[K[\e[0;32m OK \e[0;39m] $@" |
||||
} |
} |
||||
|
|
||||
# [ OK ] |
|
||||
fn_printoknl(){ |
fn_printoknl(){ |
||||
echo -e "\r\033[K[\e[0;32m OK \e[0;39m] $@" |
echo -e "\r\033[K[\e[0;32m OK \e[0;39m] $@" |
||||
} |
} |
||||
|
|
||||
|
# [ INFO ] |
||||
fn_printinfo(){ |
fn_printinfo(){ |
||||
echo -en "\r\033[K[\e[0;36m INFO \e[0;39m] $@" |
echo -en "\r\033[K[\e[0;36m INFO \e[0;39m] $@" |
||||
} |
} |
||||
@ -110,11 +111,7 @@ fn_printinfonl(){ |
|||||
echo -e "\r\033[K[\e[0;36m INFO \e[0;39m] $@" |
echo -e "\r\033[K[\e[0;36m INFO \e[0;39m] $@" |
||||
} |
} |
||||
|
|
||||
# [ INFO ] |
# [ WARN ] |
||||
fn_printokinfonl(){ |
|
||||
echo -e "\r\033[K[\e[0;36m INFO \e[0;39m] $@" |
|
||||
} |
|
||||
|
|
||||
fn_printwarn(){ |
fn_printwarn(){ |
||||
echo -en "\r\033[K[\e[1;33m WARN \e[0;39m] $@" |
echo -en "\r\033[K[\e[1;33m WARN \e[0;39m] $@" |
||||
} |
} |
||||
@ -129,10 +126,8 @@ fn_printdots(){ |
|||||
} |
} |
||||
|
|
||||
fn_rootcheck(){ |
fn_rootcheck(){ |
||||
if [ `whoami` = "root" ]; then |
functionfile="${FUNCNAME}" |
||||
fn_printfailnl "Script will not run as root!" |
fn_runfunction |
||||
exit |
|
||||
fi |
|
||||
} |
} |
||||
|
|
||||
fn_syscheck(){ |
fn_syscheck(){ |
||||
@ -143,398 +138,73 @@ fi |
|||||
} |
} |
||||
|
|
||||
fn_autoip(){ |
fn_autoip(){ |
||||
# Identifies the server interface IP |
functionfile="${FUNCNAME}" |
||||
# If multiple interfaces this will need to be set manually |
fn_runfunction |
||||
getip=$(ip -o -4 addr|awk '{print $4 }'|grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}'|grep -v 127.0.0) |
|
||||
getipwc=$(ip -o -4 addr|awk '{print $4 }'|grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}'|grep -v 127.0.0|wc -l) |
|
||||
if [ "${ip}" == "0.0.0.0" ]||[ "${ip}" == "" ]; then |
|
||||
if [ "${getipwc}" -ge "2" ]; then |
|
||||
fn_printwarn "Multiple active network interfaces.\n\n" |
|
||||
echo -en "Manually specify the IP you want to use within the ${selfname} script.\n" |
|
||||
echo -en "Set ip=\"0.0.0.0\" to one of the following:\n" |
|
||||
echo -en "${getip}\n" |
|
||||
exit |
|
||||
else |
|
||||
ip=${getip} |
|
||||
fi |
|
||||
fi |
|
||||
} |
} |
||||
|
|
||||
fn_logmanager(){ |
fn_logmanager(){ |
||||
if [ ! -e "${consolelog}" ]; then |
functionfile="${FUNCNAME}" |
||||
touch "${consolelog}" |
fn_runfunction |
||||
fi |
|
||||
# log manager will active if finds logs older than ${logdays} |
|
||||
if [ `find "${scriptlogdir}"/* -mtime +${logdays}|wc -l` -ne "0" ]; then |
|
||||
fn_printdots "Starting log cleaner" |
|
||||
sleep 1 |
|
||||
fn_printok "Starting log cleaner" |
|
||||
fn_scriptlog "Starting log cleaner" |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
fn_printinfo "Removing logs older than ${logdays} days" |
|
||||
fn_scriptlog "Removing logs older than ${logdays} days" |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
if [ "${engine}" == "unreal2" ]; then |
|
||||
find "${gamelogdir}"/* -mtime +${logdays}|tee >> "${scriptlog}" |
|
||||
fi |
|
||||
find "${scriptlogdir}"/* -mtime +${logdays}|tee >> "${scriptlog}" |
|
||||
find "${consolelogdir}"/* -mtime +${logdays}|tee >> "${scriptlog}" |
|
||||
if [ "${engine}" == "unreal2" ]; then |
|
||||
gamecount=$(find "${scriptlogdir}"/* -mtime +${logdays}|wc -l) |
|
||||
fi |
|
||||
scriptcount=$(find "${scriptlogdir}"/* -mtime +${logdays}|wc -l) |
|
||||
consolecount=$(find "${consolelogdir}"/* -mtime +${logdays}|wc -l) |
|
||||
count=$((${scriptcount} + ${consolecount})) |
|
||||
if [ "${engine}" == "unreal2" ]; then |
|
||||
count=$((${scriptcount} + ${consolecount} + ${gamecount})) |
|
||||
else |
|
||||
count=$((${scriptcount} + ${consolecount})) |
|
||||
fi |
|
||||
if [ "${engine}" == "unreal2" ]; then |
|
||||
find "${gamelogdir}"/* -mtime +${logdays} -exec rm {} \; |
|
||||
fi |
|
||||
find "${scriptlogdir}"/* -mtime +${logdays} -exec rm {} \; |
|
||||
find "${consolelogdir}"/* -mtime +${logdays} -exec rm {} \; |
|
||||
fn_printok "Log cleaner removed ${count} log files" |
|
||||
fn_scriptlog "Log cleaner removed ${count} log files" |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
fi |
|
||||
} |
} |
||||
|
|
||||
fn_debugserver(){ |
fn_debugserver(){ |
||||
if [ ! -f ${rootdir}/functions/fn_debugserver ]; then |
functionfile="${FUNCNAME}" |
||||
functionfile="fn_debugserver" |
fn_runfunction |
||||
fn_fninstall |
|
||||
fi |
|
||||
source ${rootdir}/functions/fn_debugserver |
|
||||
} |
} |
||||
|
|
||||
fn_console(){ |
fn_console(){ |
||||
fn_rootcheck |
functionfile="${FUNCNAME}" |
||||
fn_syscheck |
fn_runfunction |
||||
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;; |
|
||||
* ) echo "Please answer yes or no.";; |
|
||||
esac |
|
||||
done |
|
||||
fn_printdots "Starting ${servicename} console" |
|
||||
sleep 1 |
|
||||
tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l) |
|
||||
if [ ${tmuxwc} -eq 1 ]; then |
|
||||
fn_printoknl "Starting ${servicename} console" |
|
||||
fn_scriptlog "Console accessed" |
|
||||
sleep 1 |
|
||||
tmux attach-session -t ${servicename} |
|
||||
else |
|
||||
fn_printfailnl "Starting ${servicename} console: ${servername} not running" |
|
||||
sleep 1 |
|
||||
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_backupserver(){ |
fn_backupserver(){ |
||||
fn_rootcheck |
functionfile="${FUNCNAME}" |
||||
fn_syscheck |
fn_runfunction |
||||
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|grep -E "^${servicename}:"|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 |
|
||||
fn_printdots "Starting backup ${servicename}: ${servername}" |
|
||||
sleep 1 |
|
||||
fn_printok "Starting backup ${servicename}: ${servername}" |
|
||||
fn_scriptlog "Backup started" |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
cd "${rootdir}" |
|
||||
mkdir -pv "${backupdir}" > /dev/null 2>&1 |
|
||||
tar -cvzf "${backupdir}/${backupname}.tar.gz" --exclude "${backupdir}" * |
|
||||
echo -en "\r\033[K${servicename} Backup complete" |
|
||||
fn_scriptlog "Backup complete" |
|
||||
} |
} |
||||
|
|
||||
fn_distro(){ |
fn_distro(){ |
||||
arch=$(uname -m) |
functionfile="${FUNCNAME}" |
||||
kernel=$(uname -r) |
fn_runfunction |
||||
if [ -f /etc/lsb-release ]; then |
|
||||
os=$(lsb_release -s -d) |
|
||||
elif [ -f /etc/debian_version ]; then |
|
||||
os="Debian $(cat /etc/debian_version)" |
|
||||
elif [ -f /etc/redhat-release ]; then |
|
||||
os=$(cat /etc/redhat-release) |
|
||||
else |
|
||||
os="$(uname -s) $(uname -r)" |
|
||||
fi |
|
||||
} |
} |
||||
|
|
||||
fn_uptime(){ |
fn_uptime(){ |
||||
uptime=$(</proc/uptime) |
functionfile="${FUNCNAME}" |
||||
uptime=${uptime%%.*} |
fn_runfunction |
||||
minutes=$(( uptime/60%60 )) |
|
||||
hours=$(( uptime/60/60%24 )) |
|
||||
days=$(( uptime/60/60/24 )) |
|
||||
} |
} |
||||
|
|
||||
fn_load(){ |
fn_load(){ |
||||
load=$(uptime|awk -F 'load average' '{ print $2 }') |
functionfile="${FUNCNAME}" |
||||
|
fn_runfunction |
||||
} |
} |
||||
|
|
||||
fn_emailnotification(){ |
fn_emailnotification(){ |
||||
fn_distro |
functionfile="${FUNCNAME}" |
||||
fn_uptime |
fn_runfunction |
||||
fn_load |
|
||||
{ |
|
||||
echo -e "========================================\n${servicename} details\n========================================\n" |
|
||||
echo -e "Service: ${servicename}" |
|
||||
echo -e "Server: ${servername}" |
|
||||
echo -e "Game: ${gamename}" |
|
||||
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}" |
|
||||
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 "========================================\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}" |
|
||||
fn_printinfo "Sent email notification to ${email}" |
|
||||
fn_scriptlog "Sent email notification to ${email}" |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
} |
} |
||||
|
|
||||
fn_emailtest(){ |
fn_emailtest(){ |
||||
fn_rootcheck |
functionfile="${FUNCNAME}" |
||||
fn_syscheck |
fn_runfunction |
||||
fn_scriptlog "Emailing test notification" |
|
||||
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 |
|
||||
fn_printfailnl "Email notification not enabled" |
|
||||
fn_scriptlog "Email notification not enabled" |
|
||||
fi |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
} |
} |
||||
|
|
||||
fn_serverquery(){ |
fn_serverquery(){ |
||||
# uses gsquery.py to directly query the server |
functionfile="${FUNCNAME}" |
||||
# detects if the server locks up |
fn_runfunction |
||||
if [ -f gsquery.py ]; then |
|
||||
if [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then |
|
||||
gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g') |
|
||||
port=$((${gameport} + 1)) |
|
||||
elif [ "${engine}" == "spark" ]; then |
|
||||
port=$((${port} + 1)) |
|
||||
elif [ "${engine}" == "realvirtuality" ]; then |
|
||||
port=${queryport} |
|
||||
fi |
|
||||
fn_printinfo "Monitoring ${servicename}: Detected gsquery.py" |
|
||||
fn_scriptlog "Detected gsquery.py" |
|
||||
sleep 1 |
|
||||
fn_printdots "Monitoring ${servicename}: Querying port: ${ip}:${port}: QUERYING" |
|
||||
fn_scriptlog "Querying port: ${ip}:${port}: QUERYING" |
|
||||
sleep 1 |
|
||||
serverquery=$(./gsquery.py -a ${ip} -p ${port} -e ${engine} 2>&1) |
|
||||
exitcode=$? |
|
||||
if [ "${exitcode}" == "1" ]||[ "${exitcode}" == "2" ]||[ "${exitcode}" == "3" ]||[ "${exitcode}" == "4" ]; then |
|
||||
fn_printfail "Monitoring ${servicename}: Querying port: ${ip}:${port}: ${serverquery}" |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
fn_scriptlog "Querying port: ${ip}:${port}: ${serverquery}" |
|
||||
if [[ -z "${secondquery}" ]]; then |
|
||||
fn_printinfo "Monitoring ${servicename}: Waiting 30 seconds to re-query" |
|
||||
fn_scriptlog "Waiting 30 seconds to re-query" |
|
||||
sleep 30 |
|
||||
secondquery=1 |
|
||||
fn_serverquery |
|
||||
fi |
|
||||
if [ "${emailnotification}" = "on" ]; then |
|
||||
subject="${servicename} Monitor - Starting ${servername}" |
|
||||
failurereason="Failed to query ${servicename}: ${serverquery}" |
|
||||
actiontaken="restarted ${servicename}" |
|
||||
fn_emailnotification |
|
||||
fi |
|
||||
fn_restartserver |
|
||||
exit |
|
||||
elif [ "${exitcode}" == "0" ]; then |
|
||||
fn_printok "Monitoring ${servicename}: Querying port: ${ip}:${port}: OK" |
|
||||
fn_scriptlog "Querying port: ${ip}:${port}: OK" |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
exit |
|
||||
elif [ "${exitcode}" == "126" ]; then |
|
||||
fn_printfail "Monitoring ${servicename}: Querying port: ${ip}:${port}: ERROR: ./gsquery.py: Permission denied" |
|
||||
fn_scriptlog "Querying port: ${ip}:${port}: ./gsquery.py: Permission denied" |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
echo "Attempting to resolve automatically" |
|
||||
chmod +x -v gsquery.py |
|
||||
exitcode=$? |
|
||||
if [ "${exitcode}" == "0" ]; then |
|
||||
fn_serverquery |
|
||||
else |
|
||||
echo -en "\nUnable to resolve automatically. Please manually fix permissions\n" |
|
||||
owner=$(ls -al gsquery.py|awk '{ print $3 }') |
|
||||
echo "As user ${owner} or root run the following command" |
|
||||
whoami=$(whoami) |
|
||||
echo -en "\nchown ${whoami}:${whoami} gsquery.py\n\n" |
|
||||
exit |
|
||||
fi |
|
||||
else |
|
||||
fn_printfail "Monitoring ${servicename}: Querying port: ${ip}:${port}: UNKNOWN ERROR" |
|
||||
fn_scriptlog "Querying port: ${ip}:${port}: UNKNOWN ERROR" |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
./gsquery.py -a ${ip} -p ${port} -e ${engine} |
|
||||
exit |
|
||||
fi |
|
||||
fi |
|
||||
} |
} |
||||
|
|
||||
fn_monitorserver(){ |
fn_monitorserver(){ |
||||
fn_rootcheck |
functionfile="${FUNCNAME}" |
||||
fn_syscheck |
fn_runfunction |
||||
fn_autoip |
|
||||
fn_printdots "Monitoring ${servicename}: ${servername}" |
|
||||
fn_scriptlog "Monitoring ${servername}" |
|
||||
sleep 1 |
|
||||
if [ ! -f ${lockselfname} ]; then |
|
||||
fn_printinfo "Monitoring ${servicename}: Monitor disabled: No lock file found" |
|
||||
fn_scriptlog "Monitor disabled: No lock file found" |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
echo "To enable monitor run ${selfname} start" |
|
||||
exit |
|
||||
fi |
|
||||
updatecheck=$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l) |
|
||||
if [ "${updatecheck}" = "0" ]; then |
|
||||
fn_printdots "Monitoring ${servicename}: Checking session: CHECKING" |
|
||||
fn_scriptlog "Checking session: CHECKING" |
|
||||
sleep 1 |
|
||||
tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l) |
|
||||
if [ ${tmuxwc} -eq 1 ]; then |
|
||||
fn_printok "Monitoring ${servicename}: Checking session: OK" |
|
||||
fn_scriptlog "Checking session: OK" |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
fn_serverquery |
|
||||
exit |
|
||||
else |
|
||||
fn_printfail "Monitoring ${servicename}: Checking session: FAIL" |
|
||||
fn_scriptlog "Checking session: FAIL" |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
if [ "${emailnotification}" = "on" ]; then |
|
||||
subject="${servicename} Monitor - Starting ${servername}" |
|
||||
failurereason="${servicename} process not running" |
|
||||
actiontaken="${servicename} has been restarted" |
|
||||
fn_emailnotification |
|
||||
fi |
|
||||
fn_scriptlog "Monitor is starting ${servername}" |
|
||||
fn_startserver |
|
||||
fi |
|
||||
else |
|
||||
fn_printinfonl "Monitoring ${servicename}: Detected SteamCMD is checking for updates" |
|
||||
fn_scriptlog "Detected SteamCMD is checking for updates" |
|
||||
sleep 1 |
|
||||
fn_printinfonl "Monitoring ${servicename}: When updates complete ${servicename} will start" |
|
||||
fn_scriptlog "When updates complete ${servicename} will start" |
|
||||
sleep 1 |
|
||||
fi |
|
||||
} |
} |
||||
|
|
||||
fn_updateserver(){ |
fn_updateserver(){ |
||||
fn_rootcheck |
functionfile="${FUNCNAME}" |
||||
fn_syscheck |
fn_runfunction |
||||
fn_printdots "Updating ${servicename}: ${servername}" |
|
||||
sleep 1 |
|
||||
fn_printok "Updating ${servicename}: ${servername}" |
|
||||
sleep 1 |
|
||||
fn_scriptlog "Updating ${servername}" |
|
||||
cd "${rootdir}" |
|
||||
cd "steamcmd" |
|
||||
./steamcmd.sh +login ${steamuser} "${steampass}" +force_install_dir "${filesdir}" +app_update ${appid} +quit|tee -a "${scriptlog}" |
|
||||
} |
} |
||||
|
|
||||
fn_validateserver(){ |
fn_validateserver(){ |
||||
fn_rootcheck |
functionfile="${FUNCNAME}" |
||||
fn_syscheck |
fn_runfunction |
||||
fn_printwarn "Validating may overwrite some customised files." |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
echo -en "https://developer.valvesoftware.com/wiki/SteamCMD#Validate" |
|
||||
sleep 5 |
|
||||
echo -en "\n" |
|
||||
fn_printdots "Validating ${servicename}: ${servername}" |
|
||||
sleep 1 |
|
||||
fn_printok "Validating ${servicename}: ${servername}" |
|
||||
sleep 1 |
|
||||
fn_scriptlog "Validating ${servername}" |
|
||||
cd "${rootdir}" |
|
||||
cd "steamcmd" |
|
||||
./steamcmd.sh +login ${steamuser} "${steampass}" +force_install_dir "${filesdir}" +app_update ${appid} validate +quit|tee -a "${scriptlog}" |
|
||||
} |
} |
||||
|
|
||||
fn_restartserver(){ |
fn_restartserver(){ |
||||
@ -544,96 +214,37 @@ fn_startserver |
|||||
} |
} |
||||
|
|
||||
fn_stopserver(){ |
fn_stopserver(){ |
||||
fn_rootcheck |
functionfile="${FUNCNAME}" |
||||
fn_syscheck |
fn_runfunction |
||||
pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -E "^${servicename}:"|wc -l) |
|
||||
fn_printdots "Stopping ${servicename}: ${servername}" |
|
||||
fn_scriptlog "Stopping ${servername}" |
|
||||
sleep 1 |
|
||||
if [ "${pid}" == "0" ]; then |
|
||||
fn_printfail "Stopping ${servicename}: ${servername} is already stopped" |
|
||||
fn_scriptlog "${servername} is already stopped" |
|
||||
else |
|
||||
tmux kill-session -t ${servicename} |
|
||||
fn_printok "Stopping ${servicename}: ${servername}" |
|
||||
fn_scriptlog "Stopped ${servername}" |
|
||||
fi |
|
||||
# Remove lock file |
|
||||
rm -f ${lockselfname} |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
} |
} |
||||
|
|
||||
fn_startserver(){ |
fn_startserver(){ |
||||
fn_rootcheck |
functionfile="${FUNCNAME}" |
||||
fn_syscheck |
fn_runfunction |
||||
fn_autoip |
|
||||
fn_parms |
|
||||
fn_logmanager |
|
||||
tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l) |
|
||||
if [ ${tmuxwc} -eq 0 ]; then |
|
||||
fn_scriptlog "Rotating log files" |
|
||||
if [ "${engine}" == "unreal2" ]; then |
|
||||
mv "${gamelog}" "${gamelogdate}" |
|
||||
fi |
|
||||
mv "${scriptlog}" "${scriptlogdate}" |
|
||||
mv "${consolelog}" "${consolelogdate}" |
|
||||
fi |
|
||||
fn_printdots "Starting ${servicename}: ${servername}" |
|
||||
fn_scriptlog "Starting ${servername}" |
|
||||
sleep 1 |
|
||||
if [ ${tmuxwc} -eq 1 ]; then |
|
||||
fn_printinfo "Starting ${servicename}: ${servername} is already running" |
|
||||
fn_scriptlog "${servername} is already running" |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
exit |
|
||||
fi |
|
||||
# Create lock file |
|
||||
date > "${rootdir}/${lockselfname}" |
|
||||
cd "${executabledir}" |
|
||||
tmux new-session -d -s ${servicename} "${executable} ${parms}" 2> ${scriptlogdir}/.${servicename}-tmux-error.tmp |
|
||||
tmux pipe-pane -o -t ${servicename} "exec cat >> '${consolelog}'" |
|
||||
sleep 1 |
|
||||
tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -E "^${servicename}:"|wc -l) |
|
||||
if [ ${tmuxwc} -eq 0 ]; then |
|
||||
fn_printfailnl "Starting ${servicename}: Failed to start ${servername}" |
|
||||
echo -en " Check log files: ${rootdir}/log" |
|
||||
fn_scriptlog "failed to start ${servername}" |
|
||||
if [ -a ${scriptlogdir}/.${servicename}-tmux-error.tmp ]; then |
|
||||
fn_scriptlog "tmux returned the following error" |
|
||||
cat ${scriptlogdir}/.${servicename}-tmux-error.tmp >> ${scriptlog} |
|
||||
fi |
|
||||
else |
|
||||
fn_printok "Starting ${servicename}: ${servername}" |
|
||||
fn_scriptlog "Started ${servername}" |
|
||||
fi |
|
||||
rm ${scriptlogdir}/.${servicename}-tmux-error.tmp |
|
||||
sleep 1 |
|
||||
echo -en "\n" |
|
||||
} |
} |
||||
|
|
||||
fn_details(){ |
fn_details(){ |
||||
if [ ! -f ${rootdir}/functions/fn_details ]; then |
functionfile="${FUNCNAME}" |
||||
functionfile="fn_details" |
fn_runfunction |
||||
fn_fninstall |
|
||||
fi |
|
||||
source ${rootdir}/functions/fn_details |
|
||||
} |
} |
||||
|
|
||||
fn_fninstall(){ |
fn_runfunction(){ |
||||
cd ${rootdir} |
# Download function if missing |
||||
if [ ! -d "functions" ]; then |
if [ ! -f "${rootdir}/functions/${functionfile}" ]; then |
||||
mkdir functions |
cd "${rootdir}" |
||||
|
if [ ! -d "functions" ]; then |
||||
|
mkdir functions |
||||
|
fi |
||||
|
echo "loading ${functionfile}..." |
||||
|
cd functions |
||||
|
wget --no-check-certificate -nv -N https://raw.githubusercontent.com/dgibbs64/linuxgameservers/master/functions/${functionfile} |
||||
|
chmod +x "${functionfile}" |
||||
|
cd "${rootdir}" |
||||
|
sleep 1 |
||||
|
echo "" |
||||
fi |
fi |
||||
echo "" |
# Run function |
||||
echo "loading ${functionfile}..." |
source "${rootdir}/functions/${functionfile}" |
||||
cd functions |
|
||||
wget --no-check-certificate -nv -N https://raw.githubusercontent.com/dgibbs64/linuxgameservers/master/functions/${functionfile} |
|
||||
chmod +x ${functionfile} |
|
||||
cd ${rootdir} |
|
||||
sleep 1 |
|
||||
echo "" |
|
||||
} |
} |
||||
|
|
||||
# |
# |
||||
@ -641,253 +252,82 @@ echo "" |
|||||
# |
# |
||||
|
|
||||
fn_glibcfix(){ |
fn_glibcfix(){ |
||||
if [ ! -f ${rootdir}/functions/fn_glibcfix ]; then |
functionfile="${FUNCNAME}" |
||||
functionfile="fn_glibcfix" |
fn_runfunction |
||||
fn_fninstall |
|
||||
fi |
|
||||
source ${rootdir}/functions/fn_glibcfix |
|
||||
} |
} |
||||
|
|
||||
fn_header(){ |
fn_header(){ |
||||
clear |
functionfile="${FUNCNAME}" |
||||
echo "=================================" |
fn_runfunction |
||||
echo "${gamename}" |
|
||||
echo "Linux Game Server Manager" |
|
||||
echo "by Daniel Gibbs" |
|
||||
echo "http://danielgibbs.co.uk" |
|
||||
echo "=================================" |
|
||||
echo "" |
|
||||
} |
} |
||||
|
|
||||
fn_steamdl(){ |
fn_steamdl(){ |
||||
echo "Installing SteamCMD" |
functionfile="${FUNCNAME}" |
||||
echo "=================================" |
fn_runfunction |
||||
cd "${rootdir}" |
|
||||
mkdir -pv "steamcmd" |
|
||||
sleep 1 |
|
||||
cd "steamcmd" |
|
||||
if [ ! -f steamcmd.sh ]; then |
|
||||
wget -nv -N http://media.steampowered.com/client/steamcmd_linux.tar.gz |
|
||||
tar --verbose -zxf steamcmd_linux.tar.gz |
|
||||
rm -v steamcmd_linux.tar.gz |
|
||||
chmod +x steamcmd.sh |
|
||||
sleep 1 |
|
||||
else |
|
||||
echo "" |
|
||||
echo "Steam already installed!" |
|
||||
fi |
|
||||
sleep 1 |
|
||||
echo "" |
|
||||
} |
} |
||||
|
|
||||
fn_steaminstall(){ |
fn_steaminstall(){ |
||||
echo "Installing ${gamename} Server" |
functionfile="${FUNCNAME}" |
||||
echo "=================================" |
fn_runfunction |
||||
sleep 1 |
|
||||
mkdir -pv "${filesdir}" |
|
||||
cd "${rootdir}/steamcmd" |
|
||||
STEAMEXE=steamcmd ./steamcmd.sh +login ${steamuser} "${steampass}" +force_install_dir "${filesdir}" +app_update ${appid} validate +quit |
|
||||
echo "" |
|
||||
echo "=================================" |
|
||||
while true; do |
|
||||
read -p "Was the install successful? [y/N]" yn |
|
||||
case $yn in |
|
||||
[Yy]* ) break;; |
|
||||
[Nn]* ) fn_retryinstall;; |
|
||||
* ) echo "Please answer yes or no.";; |
|
||||
esac |
|
||||
done |
|
||||
echo "" |
|
||||
} |
} |
||||
|
|
||||
fn_steamfix(){ |
fn_steamfix(){ |
||||
if [ ! -f ${rootdir}/functions/fn_steamfix ]; then |
functionfile="${FUNCNAME}" |
||||
functionfile="fn_steamfix" |
fn_runfunction |
||||
fn_fninstall |
|
||||
fi |
|
||||
source ${rootdir}/functions/fn_steamfix |
|
||||
} |
} |
||||
|
|
||||
fn_loginstall(){ |
fn_loginstall(){ |
||||
if [ ! -f ${rootdir}/functions/fn_loginstall ]; then |
functionfile="${FUNCNAME}" |
||||
functionfile="fn_loginstall" |
fn_runfunction |
||||
fn_fninstall |
|
||||
fi |
|
||||
source ${rootdir}/functions/fn_loginstall |
|
||||
} |
} |
||||
|
|
||||
fn_getquery(){ |
fn_getquery(){ |
||||
echo "GameServerQuery" |
functionfile="${FUNCNAME}" |
||||
echo "============================" |
fn_runfunction |
||||
while true; do |
|
||||
read -p "Do you want to install GameServerQuery? [y/N]" yn |
|
||||
case $yn in |
|
||||
[Yy]* ) cd "${rootdir}"; wget -nv -N "http://danielgibbs.co.uk/dl/gsquery.py"; chmod +x gsquery.py; break;; |
|
||||
[Nn]* ) echo -e "Not installing GameServerQuery.";break;; |
|
||||
* ) echo "Please answer yes or no.";; |
|
||||
esac |
|
||||
done |
|
||||
echo "" |
|
||||
} |
} |
||||
|
|
||||
fn_retryinstall(){ |
fn_retryinstall(){ |
||||
while true; do |
functionfile="${FUNCNAME}" |
||||
read -p "Retry install? [y/N]" yn |
fn_runfunction |
||||
case $yn in |
} |
||||
[Yy]* ) fn_install; exit;; |
|
||||
[Nn]* ) echo Exiting; exit;; |
fn_serverdirectory(){ |
||||
* ) echo "Please answer yes or no.";; |
functionfile="${FUNCNAME}" |
||||
esac |
fn_runfunction |
||||
done |
} |
||||
|
|
||||
|
fn_serverconfig(){ |
||||
|
functionfile="${FUNCNAME}" |
||||
|
fn_runfunction |
||||
} |
} |
||||
|
|
||||
fn_install(){ |
fn_install(){ |
||||
fn_rootcheck |
fn_rootcheck |
||||
fn_header |
fn_header |
||||
if [ -d "${filesdir}" ]; then |
if [ -z "${autoinstall}" ]; then |
||||
echo "${gamename} Server is already installed here:" |
fn_serverdirectory |
||||
pwd |
fn_header |
||||
echo "" |
|
||||
while true; do |
|
||||
read -p "Continue [y/N]" yn |
|
||||
case $yn in |
|
||||
[Yy]* ) fn_header; break;; |
|
||||
[Nn]* ) echo Exiting; return 1;; |
|
||||
* ) echo "Please answer yes or no.";; |
|
||||
esac |
|
||||
done |
|
||||
fi |
fi |
||||
echo "Install Directory:" |
|
||||
pwd |
|
||||
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_header |
|
||||
fn_steamdl |
fn_steamdl |
||||
fn_steaminstall |
fn_steaminstall |
||||
fn_steamfix |
fn_steamfix |
||||
|
fn_glibcfix |
||||
fn_loginstall |
fn_loginstall |
||||
fn_getquery |
fn_getquery |
||||
fn_glibcfix |
fn_serverconfig |
||||
echo "Configuring ${gamename} Server" |
fn_header |
||||
|
fn_details |
||||
echo "=================================" |
echo "=================================" |
||||
sleep 1 |
echo "Install Complete!" |
||||
read -p "Enter server name: " servername |
echo "" |
||||
read -p "Enter rcon password: " rconpass |
echo "To start server type:" |
||||
sleep 1 |
echo "${selfname} start" |
||||
echo "Creating server.cfg." |
echo "" |
||||
touch "${defaultcfg}" |
} |
||||
echo "exec ${servicename}.cfg" > "${defaultcfg}" |
|
||||
sleep 1 |
fn_autoinstall(){ |
||||
echo "Creating ${servicename}.cfg config file." |
autoinstall=1 |
||||
touch "${servercfgfullpath}" |
fn_install |
||||
{ |
|
||||
echo -e "// Server Name" |
|
||||
echo -e "hostname \"${servername}\"" |
|
||||
echo -e "" |
|
||||
echo -e "// RCON Password" |
|
||||
echo -e "rcon_password \"${rconpass}\"" |
|
||||
echo -e "" |
|
||||
echo -e "// Server Password" |
|
||||
echo -e "sv_password \"\"" |
|
||||
echo -e "" |
|
||||
echo -e "// Server Logging" |
|
||||
echo -e "log on" |
|
||||
echo -e "sv_logbans 1" |
|
||||
echo -e "sv_logecho 1" |
|
||||
echo -e "sv_logfile 1" |
|
||||
echo -e "sv_log_onefile 0" |
|
||||
echo -e "lua_log_sv 0" |
|
||||
echo -e "sv_rcon_banpenalty 0" |
|
||||
echo -e "sv_rcon_maxfailures 20" |
|
||||
echo -e "sv_rcon_minfailures 20" |
|
||||
echo -e "sv_rcon_minfailuretime 20" |
|
||||
echo -e "" |
|
||||
echo -e "// Network Settings" |
|
||||
echo -e "sv_downloadurl \"\"" |
|
||||
echo -e "sv_loadingurl \"\"" |
|
||||
echo -e "net_maxfilesize 64" |
|
||||
echo -e "sv_maxrate 40000" |
|
||||
echo -e "sv_minrate 40000" |
|
||||
echo -e "sv_maxupdaterate 66" |
|
||||
echo -e "sv_minupdaterate 10" |
|
||||
echo -e "sv_maxcmdrate 60" |
|
||||
echo -e "sv_mincmdrate 10" |
|
||||
echo -e "" |
|
||||
echo -e "// Server Settings" |
|
||||
echo -e "sv_airaccelerate 100" |
|
||||
echo -e "sv_gravity 600" |
|
||||
echo -e "sv_allow_wait_command 0" |
|
||||
echo -e "sv_allow_voice_from_file 0" |
|
||||
echo -e "sv_turbophysics 0" |
|
||||
echo -e "sv_max_usercmd_future_ticks 12" |
|
||||
echo -e "gmod_physiterations 2" |
|
||||
echo -e "sv_client_min_interp_ratio 1" |
|
||||
echo -e "sv_client_max_interp_ratio 2" |
|
||||
echo -e "think_limit 20" |
|
||||
echo -e "sv_region 0" |
|
||||
echo -e "sv_noclipspeed 5" |
|
||||
echo -e "sv_noclipaccelerate 5" |
|
||||
echo -e "sv_lan 0" |
|
||||
echo -e "sv_alltalk 1" |
|
||||
echo -e "sv_contact [email protected]" |
|
||||
echo -e "sv_cheats 0" |
|
||||
echo -e "sv_allowcslua 0" |
|
||||
echo -e "sv_pausable 0" |
|
||||
echo -e "sv_filterban 1" |
|
||||
echo -e "sv_forcepreload 1" |
|
||||
echo -e "sv_footsteps 1" |
|
||||
echo -e "sv_voiceenable 1" |
|
||||
echo -e "sv_voicecodec vaudio_speex" |
|
||||
echo -e "sv_timeout 120" |
|
||||
echo -e "sv_deltaprint 0" |
|
||||
echo -e "sv_allowupload 0" |
|
||||
echo -e "sv_allowdownload 0" |
|
||||
echo -e "" |
|
||||
echo -e "// Sandbox Settings" |
|
||||
echo -e "sbox_noclip 0" |
|
||||
echo -e "sbox_godmode 0" |
|
||||
echo -e "sbox_weapons 0" |
|
||||
echo -e "sbox_plpldamage 0" |
|
||||
echo -e "sbox_maxprops 100" |
|
||||
echo -e "sbox_maxragdolls 50" |
|
||||
echo -e "sbox_maxnpcs 10" |
|
||||
echo -e "sbox_maxballoons 10" |
|
||||
echo -e "sbox_maxeffects 0" |
|
||||
echo -e "sbox_maxdynamite 0" |
|
||||
echo -e "sbox_maxlamps 5" |
|
||||
echo -e "sbox_maxthrusters 20" |
|
||||
echo -e "sbox_maxwheels 20" |
|
||||
echo -e "sbox_maxhoverballs 20" |
|
||||
echo -e "sbox_maxvehicles 1" |
|
||||
echo -e "sbox_maxbuttons 20" |
|
||||
echo -e "sbox_maxemitters 0" |
|
||||
echo -e "sbox_maxspawners 0" |
|
||||
echo -e "sbox_maxturrets 0" |
|
||||
echo -e "" |
|
||||
echo -e "// Misc Config" |
|
||||
echo -e "exec banned_user.cfg" |
|
||||
echo -e "exec banned_ip.cfg" |
|
||||
echo -e "heartbeat" |
|
||||
}|tee "${servercfgfullpath}" > /dev/null 2>&1 |
|
||||
sleep 1 |
|
||||
echo "" |
|
||||
fn_header |
|
||||
sleep 1 |
|
||||
fn_details |
|
||||
sleep 1 |
|
||||
echo "=================================" |
|
||||
echo "Install Complete!" |
|
||||
echo "" |
|
||||
echo "To start server type:" |
|
||||
echo "${selfname} start" |
|
||||
echo "" |
|
||||
} |
} |
||||
|
|
||||
case "$1" in |
case "$1" in |
||||
@ -923,8 +363,10 @@ case "$1" in |
|||||
fn_debugserver;; |
fn_debugserver;; |
||||
install) |
install) |
||||
fn_install;; |
fn_install;; |
||||
|
auto-install) |
||||
|
fn_autoinstall;; |
||||
*) |
*) |
||||
echo "Usage: $0 {start|stop|restart|update|update-restart|validate|validate-restart|monitor|email-test|details|backup|console|debug|install}" |
echo "Usage: $0 {start|stop|restart|update|update-restart|validate|validate-restart|monitor|email-test|details|backup|console|debug|install|auto-install}" |
||||
exit 1;; |
exit 1;; |
||||
esac |
esac |
||||
exit |
exit |
Loading…
Reference in new issue