From 60a70250d61c4dcd431017995349d49d9698d552 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 5 Feb 2016 10:52:23 +0000 Subject: [PATCH 001/434] New download manager core_dl will handle all downloads for LGSM allowing a consistent download experience --- functions/core_dl.sh | 29 +++++++++++++++++++++++++++++ functions/core_functions.sh | 8 ++++++++ 2 files changed, 37 insertions(+) create mode 100644 functions/core_dl.sh diff --git a/functions/core_dl.sh b/functions/core_dl.sh new file mode 100644 index 000000000..1ae0edfbf --- /dev/null +++ b/functions/core_dl.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# LGSM core_dl.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="050216" + +# Description: Deals with all downloads for LGSM. + +fn_curl_dl(){ +curl_filename=$1 +curl_filepath=$2 +curl_url=$3 +echo "curl_filename $curl_filename" +echo "curl_url ${curl_url}" +echo "curl_filepath ${curl_filepath}" + +echo -ne "Downloading ${mm_file_latest}...\c" + +curl_dl=$(curl --fail -o "${curl_filepath}" "${curl_url}" ) +exitcode=$? +if [ $? -ne 0 ]; then + fn_printfaileol + echo "${curl_dl}" + echo -e "${url}\n" + exit ${exitcode} +else + fn_printokeol +fi +} \ No newline at end of file diff --git a/functions/core_functions.sh b/functions/core_functions.sh index 7b0f148cd..f31e447a6 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -32,6 +32,11 @@ functionfile="${FUNCNAME}" fn_runfunction } +core_dl.sh(){ +functionfile="${FUNCNAME}" +fn_runfunction +} + # Command @@ -400,3 +405,6 @@ fn_runfunction # Calls on-screen messages core_messages.sh + +#Calls file downloader +core_dl.sh From 12e8dd1fc2747cef9255de6bfee4ab9a2a77caba Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 5 Feb 2016 10:54:08 +0000 Subject: [PATCH 002/434] date --- functions/core_functions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/core_functions.sh b/functions/core_functions.sh index f31e447a6..a975fd46e 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -2,7 +2,7 @@ # LGSM core_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="170116" +lgsm_version="030216" # Description: Defines all functions to allow download and execution of functions using fn_runfunction. # This function is called first before any other function. Without this file other functions would not load. From cecee81c3007934828f03476860ab523e95debbc Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 5 Feb 2016 11:34:27 +0000 Subject: [PATCH 003/434] added md5 checker --- functions/core_dl.sh | 83 +++++++++++++++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 20 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 1ae0edfbf..88df26654 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -6,24 +6,67 @@ lgsm_version="050216" # Description: Deals with all downloads for LGSM. -fn_curl_dl(){ -curl_filename=$1 -curl_filepath=$2 -curl_url=$3 -echo "curl_filename $curl_filename" -echo "curl_url ${curl_url}" -echo "curl_filepath ${curl_filepath}" - -echo -ne "Downloading ${mm_file_latest}...\c" - -curl_dl=$(curl --fail -o "${curl_filepath}" "${curl_url}" ) -exitcode=$? -if [ $? -ne 0 ]; then - fn_printfaileol - echo "${curl_dl}" - echo -e "${url}\n" - exit ${exitcode} +# Downloads can be defined in code like so +# fn_dl "dl_filename" "dl_filepath" "dl_url" "dl_md5" +# fn_dl "file.tar.bz2" "/home/gameserver" "http://example.com/file.tar/bz2" "10cd7353aa9d758a075c600a6dd193fd" + +fn_dl_md5(){ +# Runs MD5 Check if available +if [ -n "${dl_md5}" ]; then + echo -ne "verifying ${dl_filename} with MD5...\c" + local md5check=$(md5sum "${dl_filepath}/${dl_filename}"|awk '{print $1;}') + if [ "${md5check}" != "${dl_md5}" ]; then + fn_printfaileol + echo "${dl_filename} MD5 checksum: ${md5check}" + echo -e "expected MD5 checksum: ${dl_md5}" + while true; do + read -e -i "y" -p "Retry download? [Y/n]" yn + case $yn in + [Yy]* ) retry_dl=1; fn_dl;; + [Nn]* ) echo Exiting; exit 1;; + * ) echo "Please answer yes or no.";; + esac + done + else + fn_printokeol + fi +fi +} + +fn_dl(){ +# defines variables from other script file +dl_filename=$1 +dl_filepath=$2 +dl_url=$3 +dl_md5=$4 + +if [ ! -f "${dl_filepath}/${dl_filename}" ]||[ -n "${retry_dl}" ]; then + echo -ne "downloading ${dl_filename}...\c" + + local dl=$(curl --fail -o "${dl_filepath}" "${dl_url}") + local exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_printfaileol + echo "${curl_dl}" + echo -e "${url}\n" + exit ${exitcode} + else + fn_printokeol + fi +else + echo -ne "${dl_filename} already exists...\c" + fn_dl_md5 + while true; do + read -e -i "n" -p "Download again? [y/N]" yn + case $yn in + [Yy]* ) fn_dl; retry_dl=1;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done else - fn_printokeol -fi -} \ No newline at end of file + + +fn_dl_md5 +} + From 2162b357233bf51b1c00a03d57dc8e3ec93a084a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 5 Feb 2016 11:34:37 +0000 Subject: [PATCH 004/434] using ut99 as test --- functions/install_dl_ut99.sh | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/functions/install_dl_ut99.sh b/functions/install_dl_ut99.sh index c053ca18e..f2de71fea 100644 --- a/functions/install_dl_ut99.sh +++ b/functions/install_dl_ut99.sh @@ -2,34 +2,17 @@ # LGSM install_dl_ut99.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="050216" echo "" echo "Downloading Server Files" echo "=================================" sleep 1 -cd "${filesdir}" -if [ ! -f ut-server-436.tar.gz ]; then - wget http://gameservermanagers.com/files/ut99/ut-server-436.tar.gz -else - echo "ut-server-436.tar.gz already downloaded!" -fi -echo "Running MD5 checksum to verify the file" -sleep 1 -echo "MD5 checksum: 10cd7353aa9d758a075c600a6dd193fd" -md5check=$(md5sum ut-server-436.tar.gz|awk '{print $1;}') -echo "File returned: ${md5check}" -if [ "${md5check}" != "10cd7353aa9d758a075c600a6dd193fd" ]; then - echo "MD5 checksum: FAILED!" - read -p "Retry download? [y/N]" yn - case $yn in - [Yy]* ) rm -fv ut-server-436.tar.gz; fn_filesdl;; - [Nn]* ) echo Exiting; exit;; - * ) echo "Please answer yes or no.";; - esac -else - echo "MD5 checksum: PASSED" -fi +fn_dl "ut-server-436.tar.gz" "${filesdir}" "http://gameservermanagers.com/files/ut99/ut-server-436.tar.gz" "10cd7353aa9d758a075c600a6dd193fd" + + + + if [ ! -f UTPGPatch451.tar.bz2 ]; then wget http://gameservermanagers.com/files/ut99/UTPGPatch451.tar.bz2 else From efd17f045c7dc9629351265e95f6f6cbfe2bab33 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 5 Feb 2016 11:36:30 +0000 Subject: [PATCH 005/434] else for fi --- functions/core_dl.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 88df26654..3192e45a0 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -63,8 +63,8 @@ else [Nn]* ) break;; * ) echo "Please answer yes or no.";; esac - done -else + done +fi fn_dl_md5 From 3b7afb9fea37fc2d719683af49945892f38fe83b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 5 Feb 2016 11:44:58 +0000 Subject: [PATCH 006/434] Changed to and instead of or --- functions/check.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/check.sh b/functions/check.sh index 0d919b8ab..101544b55 100644 --- a/functions/check.sh +++ b/functions/check.sh @@ -21,7 +21,7 @@ array_contains () { check_root.sh -if [ "${function_selfname}" != "command_install.sh" ]||[ "${function_selfname}" != "update_functions.sh" ]; then +if [ "${function_selfname}" != "command_install.sh" ] && [ "${function_selfname}" != "update_functions.sh" ]; then check_systemdir.sh fi From 63961792fcae6a76829f7b3c4832280e86f2c48a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 5 Feb 2016 11:48:25 +0000 Subject: [PATCH 007/434] filename --- functions/core_dl.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 3192e45a0..d5029fdc9 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -43,7 +43,7 @@ dl_md5=$4 if [ ! -f "${dl_filepath}/${dl_filename}" ]||[ -n "${retry_dl}" ]; then echo -ne "downloading ${dl_filename}...\c" - local dl=$(curl --fail -o "${dl_filepath}" "${dl_url}") + local dl=$(curl --fail -o "${dl_filepath}/${dl_filename}" "${dl_url}") local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_printfaileol From 0d6dbbaccdf830f1efec39fa352e6a6f31608467 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 5 Feb 2016 11:55:43 +0000 Subject: [PATCH 008/434] error is now displayed correctly --- functions/core_dl.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index d5029fdc9..c6a05ecf1 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -43,11 +43,11 @@ dl_md5=$4 if [ ! -f "${dl_filepath}/${dl_filename}" ]||[ -n "${retry_dl}" ]; then echo -ne "downloading ${dl_filename}...\c" - local dl=$(curl --fail -o "${dl_filepath}/${dl_filename}" "${dl_url}") - local exitcode=$? + dl=$(curl --fail -o "${dl_filepath}/${dl_filename}" "${dl_url}" 2>&1) + exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_printfaileol - echo "${curl_dl}" + echo "${dl}" echo -e "${url}\n" exit ${exitcode} else From be5cf54ab91980ac33a41f73f1f24258cf5feb62 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 5 Feb 2016 12:11:59 +0000 Subject: [PATCH 009/434] echo commented old code --- functions/install_dl_ut99.sh | 48 +++++++++++++++++------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/functions/install_dl_ut99.sh b/functions/install_dl_ut99.sh index f2de71fea..820970d03 100644 --- a/functions/install_dl_ut99.sh +++ b/functions/install_dl_ut99.sh @@ -8,30 +8,28 @@ echo "" echo "Downloading Server Files" echo "=================================" sleep 1 +echo "" fn_dl "ut-server-436.tar.gz" "${filesdir}" "http://gameservermanagers.com/files/ut99/ut-server-436.tar.gz" "10cd7353aa9d758a075c600a6dd193fd" - - - -if [ ! -f UTPGPatch451.tar.bz2 ]; then - wget http://gameservermanagers.com/files/ut99/UTPGPatch451.tar.bz2 -else - echo "UTPGPatch451.tar.bz2 already downloaded!" -fi -echo "Running MD5 checksum to verify the file" -sleep 1 -echo "MD5 checksum: 77a735a78b1eb819042338859900b83b" -md5check=$(md5sum UTPGPatch451.tar.bz2|awk '{print $1;}') -echo "File returned: ${md5check}" -if [ "${md5check}" != "77a735a78b1eb819042338859900b83b" ]; then - echo "MD5 checksum: FAILED!" - read -p "Retry download? [y/N]" yn - case $yn in - [Yy]* ) rm -fv UTPGPatch451.tar.bz2; fn_filesdl;; - [Nn]* ) echo Exiting; exit;; - * ) echo "Please answer yes or no.";; - esac -else - echo "MD5 checksum: PASSED" -fi -echo "" \ No newline at end of file +#if [ ! -f UTPGPatch451.tar.bz2 ]; then +# wget http://gameservermanagers.com/files/ut99/UTPGPatch451.tar.bz2 +#else +# echo "UTPGPatch451.tar.bz2 already downloaded!" +#fi +#echo "Running MD5 checksum to verify the file" +#sleep 1 +#echo "MD5 checksum: 77a735a78b1eb819042338859900b83b" +#md5check=$(md5sum UTPGPatch451.tar.bz2|awk '{print $1;}') +#echo "File returned: ${md5check}" +#if [ "${md5check}" != "77a735a78b1eb819042338859900b83b" ]; then +# echo "MD5 checksum: FAILED!" +# read -p "Retry download? [y/N]" yn +# case $yn in +# [Yy]* ) rm -fv UTPGPatch451.tar.bz2; fn_filesdl;; +# [Nn]* ) echo Exiting; exit;; +# * ) echo "Please answer yes or no.";; +# esac +#else +# echo "MD5 checksum: PASSED" +#fi +#echo "" \ No newline at end of file From d5d4bee45ced0809330cd6217c455816d7ee1821 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 5 Feb 2016 12:12:58 +0000 Subject: [PATCH 010/434] adjusting display --- functions/core_dl.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index c6a05ecf1..1d90acab7 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -41,14 +41,13 @@ dl_url=$3 dl_md5=$4 if [ ! -f "${dl_filepath}/${dl_filename}" ]||[ -n "${retry_dl}" ]; then - echo -ne "downloading ${dl_filename}...\c" - - dl=$(curl --fail -o "${dl_filepath}/${dl_filename}" "${dl_url}" 2>&1) + echo -e "downloading ${dl_filename}..." + dl=$(curl --progress-bar --fail -o "${dl_filepath}/${dl_filename}" "${dl_url}") exitcode=$? + echo -ne "downloading ${dl_filename}...\c" if [ ${exitcode} -ne 0 ]; then fn_printfaileol - echo "${dl}" - echo -e "${url}\n" + echo -e "${dl_url}\n" exit ${exitcode} else fn_printokeol From c846baa68e248c2ba9dbc28674740f51ab4e0b1a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 6 Feb 2016 08:22:39 +0000 Subject: [PATCH 011/434] More changes --- functions/core_dl.sh | 4 ++-- functions/install_dl_ut99.sh | 26 +------------------------- 2 files changed, 3 insertions(+), 27 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 1d90acab7..b509d4f82 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -41,7 +41,7 @@ dl_url=$3 dl_md5=$4 if [ ! -f "${dl_filepath}/${dl_filename}" ]||[ -n "${retry_dl}" ]; then - echo -e "downloading ${dl_filename}..." + echo -ne "downloading ${dl_filename}..." dl=$(curl --progress-bar --fail -o "${dl_filepath}/${dl_filename}" "${dl_url}") exitcode=$? echo -ne "downloading ${dl_filename}...\c" @@ -53,7 +53,7 @@ if [ ! -f "${dl_filepath}/${dl_filename}" ]||[ -n "${retry_dl}" ]; then fn_printokeol fi else - echo -ne "${dl_filename} already exists...\c" + echo -e "${dl_filename} already exists...\c" fn_dl_md5 while true; do read -e -i "n" -p "Download again? [y/N]" yn diff --git a/functions/install_dl_ut99.sh b/functions/install_dl_ut99.sh index 820970d03..fa7d64d6d 100644 --- a/functions/install_dl_ut99.sh +++ b/functions/install_dl_ut99.sh @@ -8,28 +8,4 @@ echo "" echo "Downloading Server Files" echo "=================================" sleep 1 -echo "" -fn_dl "ut-server-436.tar.gz" "${filesdir}" "http://gameservermanagers.com/files/ut99/ut-server-436.tar.gz" "10cd7353aa9d758a075c600a6dd193fd" - -#if [ ! -f UTPGPatch451.tar.bz2 ]; then -# wget http://gameservermanagers.com/files/ut99/UTPGPatch451.tar.bz2 -#else -# echo "UTPGPatch451.tar.bz2 already downloaded!" -#fi -#echo "Running MD5 checksum to verify the file" -#sleep 1 -#echo "MD5 checksum: 77a735a78b1eb819042338859900b83b" -#md5check=$(md5sum UTPGPatch451.tar.bz2|awk '{print $1;}') -#echo "File returned: ${md5check}" -#if [ "${md5check}" != "77a735a78b1eb819042338859900b83b" ]; then -# echo "MD5 checksum: FAILED!" -# read -p "Retry download? [y/N]" yn -# case $yn in -# [Yy]* ) rm -fv UTPGPatch451.tar.bz2; fn_filesdl;; -# [Nn]* ) echo Exiting; exit;; -# * ) echo "Please answer yes or no.";; -# esac -#else -# echo "MD5 checksum: PASSED" -#fi -#echo "" \ No newline at end of file +fn_dl "ut-server-451-complete.tar.bz2" "${filesdir}" "http://gameservermanagers.com/files/ut99/ut-server-451-complete.tar.bz2" "42a8c9806e4fce10a56830caca83ce63" From 18df7ec459055e1f0de3976886efe719f628679e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 16 Feb 2016 19:45:53 +0000 Subject: [PATCH 012/434] Upload to test --- JustCause2/jc2server | 75 ++++++++++++++------------- functions/core_dl.sh | 120 +++++++++++++++++++++++++++++++++++++------ 2 files changed, 144 insertions(+), 51 deletions(-) diff --git a/JustCause2/jc2server b/JustCause2/jc2server index 5435a3121..05034cfde 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -4,7 +4,7 @@ # Author: Daniel Gibbs # Website: http://gameservermanagers.com if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log + run 5>dev-debug.log BASH_XTRACEFD="5" set -x fi @@ -36,7 +36,7 @@ parms="" # from a different repo and/or branch. githubuser="dgibbs64" githubrepo="linuxgsm" -githubbranch="master" +githubbranch="dlmanage" # Steam appid="261140" @@ -51,6 +51,8 @@ rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" filesdir="${rootdir}/serverfiles" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" systemdir="${filesdir}" executabledir="${filesdir}" executable="./Jcmp-Server" @@ -76,55 +78,56 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" exit fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" - fi -fi -if [ "${exec}" ]; then - source "${filepath}" + chmod +x "${filedir}/${filename}" fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 -} - -core_functions.sh(){ +core_dl.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 diff --git a/functions/core_dl.sh b/functions/core_dl.sh index b509d4f82..4f786eea3 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -12,28 +12,28 @@ lgsm_version="050216" fn_dl_md5(){ # Runs MD5 Check if available -if [ -n "${dl_md5}" ]; then - echo -ne "verifying ${dl_filename} with MD5...\c" - local md5check=$(md5sum "${dl_filepath}/${dl_filename}"|awk '{print $1;}') +if [ -n "${md5}" ]; then + echo -ne "verifying ${filename} with MD5...\c" + local md5check=$(md5sum "${filedir}/${filename}"|awk '{print $1;}') if [ "${md5check}" != "${dl_md5}" ]; then fn_printfaileol - echo "${dl_filename} MD5 checksum: ${md5check}" - echo -e "expected MD5 checksum: ${dl_md5}" - while true; do - read -e -i "y" -p "Retry download? [Y/n]" yn - case $yn in - [Yy]* ) retry_dl=1; fn_dl;; - [Nn]* ) echo Exiting; exit 1;; - * ) echo "Please answer yes or no.";; - esac - done + echo "${filename} MD5 checksum: ${md5check}" + echo "expected MD5 checksum: ${dl_md5}" + fn_scriptlog "failed to verify ${filename} with MD5" + fn_scriptlog "${filename} MD5 checksum: ${md5check}" + fn_scriptlog "expected MD5 checksum: ${dl_md5}" + exit 1 else fn_printokeol + fn_scriptlog "verifyed ${filename} with MD5" + fn_scriptlog "${filename} MD5 checksum: ${md5check}" + fn_scriptlog "expected MD5 checksum: ${dl_md5}" fi fi } -fn_dl(){ + +fn_dl_file(){ # defines variables from other script file dl_filename=$1 dl_filepath=$2 @@ -65,7 +65,97 @@ else done fi - fn_dl_md5 } + + +# Downloads file using curl and run it if required +fn_dl_file(){ +fileurl="${1}" +filedir="${2}" +filename="${3}" +run=${4:-0} +force=${5:-0} +md5=${6} +# If the file is missing or forced, then download +if [ ! -f "${filedir}" ] || [ "${force}" == "1" ] || [ "${force}" == "yes" ]; then + if [ ! -d "${filedir}" ]; then + mkdir -p "${filedir}" + fi + + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + curlcmd=${curlcmd} + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + # if larger file shows progress bar + if [ "${filename}" == *".tar"* ]; then + curlfetch=$(${curlcmd} --progress-bar -s --fail -o "${filedir}/${filename}" "${fileurl}" 2>&1) + else + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${fileurl}" 2>&1) + fi + if [ $? -ne 0 ]; then + fn_printfaileol + echo "${curlfetch}" + echo -e "${fileurl}\n" + fn_scriptlog "failed to download ${filedir}/${filename}" + fn_scriptlog "${curlfetch}" + fn_scriptlog -e "${fileurl}\n" + sleep 1 + echo "Removing failed ${filename}..." + rm -f "${filedir}/${filename}" + if [ $? -ne 0 ]; then + fn_printfaileol + else + fn_printokeol + fi + exit 1 + else + fn_printokeol + fn_scriptlog "downloaded ${filedir}/${filename}" + fi + else + echo -e "fn_printfaileol" + echo "Curl is not installed!" + echo -e "" + exit 1 + fi + fn_dl_md5 + + # make file executable if run is set + if [ "${run}" == "run" ]; then + chmod +x "${filedir}/${filename}" + fi +fi +# run file if run is set +if [ "${run}" == "run" ]; then + source "${filedir}/${filename}" +fi +} + + +# fn_fetch_file_github +# Parameters: +# github_file_url_dir: The directory the file is located in teh GitHub repo +# github_file_url_name: name of file +# filepath: location file to be saved +# run: Optional, set to 1 to make file executable +# force: force download of file even if exists +fn_fetch_file_github(){ +github_file_url_dir=${1} +github_file_url_name=${2} +filepath=${3} +filename="${github_file_url_name}" +run=${4:-0} +force=${5:-0} +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +echo -e " fetching ${filename}...\c" +fn_fetch_file "${githuburl}" "${filepath}" "${filename}" "${run}" "${force}" +} \ No newline at end of file From eee9851ded3228b7917d8de3d23d4d9e42e59aed Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 16 Feb 2016 20:41:37 +0000 Subject: [PATCH 013/434] Getting functions downloader working --- JustCause2/jc2server | 12 ++- functions/core_dl.sh | 43 ++++++----- functions/core_functions.sh | 149 +++++++++++++++++++----------------- 3 files changed, 108 insertions(+), 96 deletions(-) diff --git a/JustCause2/jc2server b/JustCause2/jc2server index 05034cfde..cedf158b8 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="160316" #### Variables #### @@ -106,7 +106,7 @@ if [ ! -f "${filedir}/${filename}" ]; then echo -e "\e[0;31mFAIL\e[0m\n" echo "${curlfetch}" echo -e "${githuburl}\n" - exit + exit 1 else echo -e "\e[0;32mOK\e[0m" fi @@ -114,7 +114,7 @@ if [ ! -f "${filedir}/${filename}" ]; then echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit + exit 1 fi chmod +x "${filedir}/${filename}" fi @@ -127,6 +127,12 @@ functionfile="${FUNCNAME}" fn_fetch_core_dl } +core_functions.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + core_dl.sh core_functions.sh diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 4f786eea3..04c14cee3 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -71,25 +71,25 @@ fn_dl_md5 # Downloads file using curl and run it if required -fn_dl_file(){ -fileurl="${1}" -filedir="${2}" -filename="${3}" +# fn_fetch_file "fileurl" "filedir" "filename" "run" "force" "md5" +fn_fetch_file(){ +fileurl=${1} +filedir=${2} +filename=${3} run=${4:-0} force=${5:-0} md5=${6} -# If the file is missing or forced, then download -if [ ! -f "${filedir}" ] || [ "${force}" == "1" ] || [ "${force}" == "yes" ]; then +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then mkdir -p "${filedir}" fi - + echo -e " fetching ${filename}...\c" # Check curl exists and use available path curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")" for curlcmd in ${curlpaths} do if [ -x "${curlcmd}" ]; then - curlcmd=${curlcmd} break fi done @@ -105,24 +105,12 @@ if [ ! -f "${filedir}" ] || [ "${force}" == "1" ] || [ "${force}" == "yes" ]; th fn_printfaileol echo "${curlfetch}" echo -e "${fileurl}\n" - fn_scriptlog "failed to download ${filedir}/${filename}" - fn_scriptlog "${curlfetch}" - fn_scriptlog -e "${fileurl}\n" - sleep 1 - echo "Removing failed ${filename}..." - rm -f "${filedir}/${filename}" - if [ $? -ne 0 ]; then - fn_printfaileol - else - fn_printokeol - fi exit 1 else fn_printokeol - fn_scriptlog "downloaded ${filedir}/${filename}" fi else - echo -e "fn_printfaileol" + fn_printfaileol echo "Curl is not installed!" echo -e "" exit 1 @@ -158,4 +146,17 @@ force=${5:-0} githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" echo -e " fetching ${filename}...\c" fn_fetch_file "${githuburl}" "${filepath}" "${filename}" "${run}" "${force}" +} + + + +# Fetches functions +fn_fetch_function(){ +github_file_url_dir="functions" # github dir containing the file +github_file_url_name="${functionfile}" # name of the github file +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +filedir="${functionsdir}" # local dir that will contain the file +filename="${github_file_url_name}" # name of the local file +run="run" +fn_fetch_file "${githuburl}" "${filedir}" "${filename}" "${run}" } \ No newline at end of file diff --git a/functions/core_functions.sh b/functions/core_functions.sh index a975fd46e..c54dd3c19 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -2,97 +2,102 @@ # LGSM core_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="030216" +lgsm_version="160216" -# Description: Defines all functions to allow download and execution of functions using fn_runfunction. +# Description: Defines all functions to allow download and execution of functions using fn_fetch_function. # This function is called first before any other function. Without this file other functions would not load. #Legacy functions fn_functions(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } fn_getopt(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } # Core +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + core_getopt.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } core_messages.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } core_dl.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } - # Command command_console.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } command_debug.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } command_details.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } command_email_test.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } command_backup.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } command_monitor.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } command_start.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } command_stop.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } command_validate.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } command_install.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } command_ts3_server_pass.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } fn_restart(){ @@ -108,52 +113,52 @@ command_start.sh check.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } check_config.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } check_deps.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } check_ip.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } check_logs.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } check_root.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } check_steamcmd.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } check_steamuser.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } check_systemdir.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } check_tmux.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } @@ -161,12 +166,12 @@ fn_runfunction compress_unreal2_maps.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } compress_ut99_maps.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } @@ -174,12 +179,12 @@ fn_runfunction command_dev_debug.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } command_dev_detect_deps.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } @@ -187,52 +192,52 @@ fn_runfunction fix.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } fix_arma3.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } fix_csgo.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } fix_dst.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } fix_ins.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } fix_steamcmd.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } fix_glibc.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } fix_ro.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } fix_kf.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } fix_ut2k4.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } @@ -240,22 +245,22 @@ fn_runfunction info_config.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } info_distro.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } info_glibc.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } info_ts3status.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } @@ -263,14 +268,14 @@ fn_runfunction email.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } # Logs logs.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } @@ -278,7 +283,7 @@ fn_runfunction monitor_gsquery.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } @@ -286,22 +291,22 @@ fn_runfunction update_check.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } update_functions.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } update_dl.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } update_functions.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } @@ -316,91 +321,91 @@ command_install.sh install_complete.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_config.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_gsquery.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_gslt.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_header.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_logs.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_retry.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_serverdir.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_serverfiles.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_steamcmd.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_ts3.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_ts3db.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_ut2k4.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_dl_ut2k4.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_ut2k4_key.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_ut99.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } install_dl_ut99.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } fix_ut99.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_function } # Calls on-screen messages From ea45e1adc0757211bd3f038974669f7f45905f6b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 16 Feb 2016 22:24:49 +0000 Subject: [PATCH 014/434] turned in to functions --- functions/check_steamcmd.sh | 103 ++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 47 deletions(-) diff --git a/functions/check_steamcmd.sh b/functions/check_steamcmd.sh index a47081b8a..5c5c3db83 100644 --- a/functions/check_steamcmd.sh +++ b/functions/check_steamcmd.sh @@ -4,60 +4,69 @@ # Website: http://gameservermanagers.com lgsm_version="281215" -# Description: Downloads SteamCMD on install and checks if missing before running functions that require SteamCMD +# Description: Checks SteamCMD is installed and correct. -if [ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament 2004" ]||[ "${gamename}" == "Mumble" ]||[ "${gamename}" == "Teamspeak 3" ]; then - : # These servers do not require SteamCMD. Check is skipped. -else - # Checks steamuser is setup. - if [ "${steamuser}" == "username" ]; then +fn_install_steamcmd(){ +echo "Installing steamCMD..." +if [ ! -d "${steamcmddir}" ]; then + mkdir -v "${steamcmddir}" +fi +fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "${steamcmddir}" "steamcmd_linux.tar.gz" +tar --verbose -zxf "${steamcmddir}/steamcmd_linux.tar.gz" -C "${steamcmddir}" +rm -v "${steamcmddir}/steamcmd_linux.tar.gz" +chmod +x "${steamcmddir}/steamcmd.sh" +} + + +fn_check_steamcmd_user(){ +# Checks steamuser is setup. +if [ "${steamuser}" == "username" ]; then fn_printfailnl "Steam login not set. Update steamuser." echo " * Change steamuser=\"username\" to a valid steam login." - if [ -d ${scriptlogdir} ]; then + if [ -d "${scriptlogdir}" ]; then fn_scriptlog "edit ${selfname}. change steamuser=\"username\" to a valid steam login." exit 1 fi +fi +# Anonymous user is set if steamuser is missing +if [ -z "${steamuser}" ]; then + fn_printwarnnl "Steam login not set. Using anonymous login." + if [ -d "${scriptlogdir}" ]; then + fn_scriptlog "Steam login not set. Using anonymous login." fi - if [ -z "${steamuser}" ]; then - fn_printwarnnl "Steam login not set. Using anonymous login." - if [ -d "${scriptlogdir}" ]; then - fn_scriptlog "Steam login not set. Using anonymous login." - fi - steamuser="anonymous" - steampass="" - sleep 2 - fi - # Checks if SteamCMD exists when starting or updating a server. - # Re-installs if missing. - steamcmddir="${rootdir}/steamcmd" - if [ ! -f "${steamcmddir}/steamcmd.sh" ]; then - fn_printwarnnl "SteamCMD is missing" - fn_scriptlog "SteamCMD is missing" - sleep 1 - if [ ! -d "${steamcmddir}" ]; then - mkdir -v "${steamcmddir}" - fi - curl=$(curl --fail -o "${steamcmddir}/steamcmd_linux.tar.gz" "http://media.steampowered.com/client/steamcmd_linux.tar.gz" 2>&1) - exitcode=$? - echo -e "downloading steamcmd_linux.tar.gz...\c" - if [ $exitcode -eq 0 ]; then - fn_printokeol - else - fn_printfaileol - echo "${curl}" - echo -e "${githuburl}\n" - exit $exitcode - fi - tar --verbose -zxf "${steamcmddir}/steamcmd_linux.tar.gz" -C "${steamcmddir}" - rm -v "${steamcmddir}/steamcmd_linux.tar.gz" - chmod +x "${steamcmddir}/steamcmd.sh" + steamuser="anonymous" + steampass="" + sleep 2 +fi +} + +fn_check_steamcmd_sh(){ +# Checks if SteamCMD exists when starting or updating a server. +# Re-installs if missing. +steamcmddir="${rootdir}/steamcmd" +if [ ! -f "${steamcmddir}/steamcmd.sh" ]; then + fn_printwarnnl "SteamCMD is missing" + fn_scriptlog "SteamCMD is missing" + sleep 1 + fn_install_steamcmd +fi +} + +fn_check_steamcmd_guard(){ +if [ "${function_selfname}" == "command_update.sh" ]||[ "${function_selfname}" == "command_validate.sh" ]; then + # Checks that steamcmd is working correctly and will prompt Steam Guard if required. + "${steamcmddir}"/steamcmd.sh +login "${steamuser}" "${steampass}" +quit + if [ $? -ne 0 ]; then + fn_printfailurenl "Error running SteamCMD" fi - if [ "${function_selfname}" == "command_update.sh" ]||[ "${function_selfname}" == "command_validate.sh" ]; then - # Checks that steamcmd is working correctly and will prompt Steam Guard if required. - "${steamcmddir}"/steamcmd.sh +login "${steamuser}" "${steampass}" +quit - if [ $? -ne 0 ]; then - fn_printfailurenl "Error running SteamCMD" - fi - fi +fi +} + +if [ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament 2004" ]||[ "${gamename}" == "Mumble" ]||[ "${gamename}" == "Teamspeak 3" ]; then + : # These servers do not require SteamCMD. Check is skipped. +else + fn_check_steamcmd_user + fn_check_steamcmd_sh + fn_check_steamcmd_guard fi From ec05d52a0f92dfe81225f22323f580b8df79e80d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 16 Feb 2016 22:25:13 +0000 Subject: [PATCH 015/434] date --- functions/check_steamcmd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/check_steamcmd.sh b/functions/check_steamcmd.sh index 5c5c3db83..8e5f83544 100644 --- a/functions/check_steamcmd.sh +++ b/functions/check_steamcmd.sh @@ -2,7 +2,7 @@ # LGSM check_steamcmd.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="281215" +lgsm_version="160316" # Description: Checks SteamCMD is installed and correct. From 3d7ac4ed4e9576cbd15ae4fa995c066f00351ab2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 17 Feb 2016 21:50:47 +0000 Subject: [PATCH 016/434] Added steamcmd check to start debug --- functions/check.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions/check.sh b/functions/check.sh index 101544b55..fa6b47306 100644 --- a/functions/check.sh +++ b/functions/check.sh @@ -2,7 +2,7 @@ # LGSM fn_check function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="050216" +lgsm_version="170216" # Description: Overall function for managing checks. # Runs checks that will either halt on or fix an issue. @@ -49,7 +49,7 @@ do fi done -local allowed_commands_array=( update_check.sh command_validate.sh ) +local allowed_commands_array=( update_check.sh command_debug.sh command_start.sh command_validate.sh ) for allowed_command in "${allowed_commands_array[@]}" do if [ "${allowed_command}" == "${function_selfname}" ]; then From 752365a1c62ba2316d47558d62edca47dcbcba90 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 17 Feb 2016 23:02:28 +0000 Subject: [PATCH 017/434] added a trap plus more fine tuning --- functions/core_dl.sh | 61 ++++++++++++++++---------------------------- 1 file changed, 22 insertions(+), 39 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 04c14cee3..d2a0c2372 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -10,6 +10,7 @@ lgsm_version="050216" # fn_dl "dl_filename" "dl_filepath" "dl_url" "dl_md5" # fn_dl "file.tar.bz2" "/home/gameserver" "http://example.com/file.tar/bz2" "10cd7353aa9d758a075c600a6dd193fd" + fn_dl_md5(){ # Runs MD5 Check if available if [ -n "${md5}" ]; then @@ -32,43 +33,19 @@ if [ -n "${md5}" ]; then fi } - -fn_dl_file(){ -# defines variables from other script file -dl_filename=$1 -dl_filepath=$2 -dl_url=$3 -dl_md5=$4 - -if [ ! -f "${dl_filepath}/${dl_filename}" ]||[ -n "${retry_dl}" ]; then - echo -ne "downloading ${dl_filename}..." - dl=$(curl --progress-bar --fail -o "${dl_filepath}/${dl_filename}" "${dl_url}") - exitcode=$? - echo -ne "downloading ${dl_filename}...\c" - if [ ${exitcode} -ne 0 ]; then - fn_printfaileol - echo -e "${dl_url}\n" - exit ${exitcode} - else - fn_printokeol - fi -else - echo -e "${dl_filename} already exists...\c" - fn_dl_md5 - while true; do - read -e -i "n" -p "Download again? [y/N]" yn - case $yn in - [Yy]* ) fn_dl; retry_dl=1;; - [Nn]* ) break;; - * ) echo "Please answer yes or no.";; - esac - done -fi - -fn_dl_md5 +fn_dl_extract(){ +# extracts archives +: } - +# trap to remove file download if canceled before completed +fn_fetch_trap() { + echo "" + fn_printinfomationnl "Cancelling download" + sleep 1 + fn_printinfomation "Removing ${filename}" + rm -f "${filedir}/${filename}" +} # Downloads file using curl and run it if required # fn_fetch_file "fileurl" "filedir" "filename" "run" "force" "md5" @@ -79,12 +56,13 @@ filename=${3} run=${4:-0} force=${5:-0} md5=${6} + # If the file is missing, then download if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then mkdir -p "${filedir}" fi - echo -e " fetching ${filename}...\c" + echo -ne " fetching ${filename}...\c" # Check curl exists and use available path curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")" for curlcmd in ${curlpaths} @@ -95,9 +73,12 @@ if [ ! -f "${filedir}/${filename}" ]; then done # If curl exists download file if [ "$(basename ${curlcmd})" == "curl" ]; then + # trap to remove part downloaded files + trap fn_fetch_trap EXIT + # if larger file shows progress bar - if [ "${filename}" == *".tar"* ]; then - curlfetch=$(${curlcmd} --progress-bar -s --fail -o "${filedir}/${filename}" "${fileurl}" 2>&1) + if [[ $filename == *"tar"* ]]; then + curlfetch=$(${curlcmd} --progress-bar --fail -o "${filedir}/${filename}" "${fileurl}") else curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${fileurl}" 2>&1) fi @@ -108,7 +89,9 @@ if [ ! -f "${filedir}/${filename}" ]; then exit 1 else fn_printokeol - fi + fi + # remove trap + trap - SIGINT SIGQUIT SIGTSTP else fn_printfaileol echo "Curl is not installed!" From 79b0389642a2164876b372a35965a0db10cf4ab8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 17 Feb 2016 23:02:54 +0000 Subject: [PATCH 018/434] looks better during install --- functions/check_steamcmd.sh | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/functions/check_steamcmd.sh b/functions/check_steamcmd.sh index 8e5f83544..4c65ec557 100644 --- a/functions/check_steamcmd.sh +++ b/functions/check_steamcmd.sh @@ -8,14 +8,15 @@ lgsm_version="160316" fn_install_steamcmd(){ -echo "Installing steamCMD..." +echo "Installing steamCMD" if [ ! -d "${steamcmddir}" ]; then mkdir -v "${steamcmddir}" fi fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "${steamcmddir}" "steamcmd_linux.tar.gz" tar --verbose -zxf "${steamcmddir}/steamcmd_linux.tar.gz" -C "${steamcmddir}" rm -v "${steamcmddir}/steamcmd_linux.tar.gz" -chmod +x "${steamcmddir}/steamcmd.sh" +chmod +x "${steamcmddir}/steamcmd.sh" +echo "" } @@ -43,13 +44,20 @@ fi fn_check_steamcmd_sh(){ # Checks if SteamCMD exists when starting or updating a server. -# Re-installs if missing. +# Installs if missing. steamcmddir="${rootdir}/steamcmd" if [ ! -f "${steamcmddir}/steamcmd.sh" ]; then - fn_printwarnnl "SteamCMD is missing" - fn_scriptlog "SteamCMD is missing" - sleep 1 - fn_install_steamcmd + if [ "${function_selfname}" == "command_install.sh" ]; then + fn_install_steamcmd + else + fn_printwarnnl "SteamCMD is missing" + fn_scriptlog "SteamCMD is missing" + sleep 1 + fn_install_steamcmd + fi +elif [ "${function_selfname}" == "command_install.sh" ]; then + fn_printinfomation "SteamCMD is already installed..." + fn_printokeol fi } From a9e3345fe74eb7c1bfc208a84e226704793f962c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 19 Feb 2016 23:19:29 +0000 Subject: [PATCH 019/434] Fixed trap --- functions/core_dl.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index d2a0c2372..1a54b8714 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -38,7 +38,7 @@ fn_dl_extract(){ : } -# trap to remove file download if canceled before completed +# Trap to remove file download if canceled before completed fn_fetch_trap() { echo "" fn_printinfomationnl "Cancelling download" @@ -74,7 +74,7 @@ if [ ! -f "${filedir}/${filename}" ]; then # If curl exists download file if [ "$(basename ${curlcmd})" == "curl" ]; then # trap to remove part downloaded files - trap fn_fetch_trap EXIT + trap fn_fetch_trap INT # if larger file shows progress bar if [[ $filename == *"tar"* ]]; then @@ -91,7 +91,7 @@ if [ ! -f "${filedir}/${filename}" ]; then fn_printokeol fi # remove trap - trap - SIGINT SIGQUIT SIGTSTP + trap - INT else fn_printfaileol echo "Curl is not installed!" From 72bbe93ecfd07427906255ab7646cfa11a825b68 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 19 Feb 2016 23:25:45 +0000 Subject: [PATCH 020/434] Moved logs creation to allow logging on install --- functions/command_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/command_install.sh b/functions/command_install.sh index 791cb160d..7f5753e3b 100644 --- a/functions/command_install.sh +++ b/functions/command_install.sh @@ -9,6 +9,7 @@ function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh install_header.sh install_serverdir.sh +install_logs.sh check_deps.sh # Download and install if [ "${gamename}" == "Unreal Tournament 2004" ]; then @@ -27,7 +28,6 @@ fi # Configuration fix.sh -install_logs.sh install_gsquery.sh install_config.sh if [ "${gamename}" == "Counter Strike: Global Offensive" ]||[ "${gamename}" == "Team Fortress 2" ]||[ "${gamename}" == "BrainBread 2" ]; then From 988b52dbe8d44a2b04afe3d9f137d591a9b7ff0a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 20 Feb 2016 00:46:51 +0000 Subject: [PATCH 021/434] Removed redundant function --- functions/check_steamuser.sh | 23 ----------------------- functions/core_functions.sh | 5 ----- 2 files changed, 28 deletions(-) delete mode 100644 functions/check_steamuser.sh diff --git a/functions/check_steamuser.sh b/functions/check_steamuser.sh deleted file mode 100644 index a807dc70e..000000000 --- a/functions/check_steamuser.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# LGSM check_steamuser.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -if [ "${steamuser}" == "username" ]; then - fn_printfailnl "Steam login not set. Update steamuser." - echo " * Change steamuser=\"username\" to a valid steam login." - if [ -d ${scriptlogdir} ]; then - fn_scriptlog "edit ${selfname}. change steamuser=\"username\" to a valid steam login." - exit 1 - fi -fi -if [ -z "${steamuser}" ]; then - fn_printwarnnl "Steam login not set. Using anonymous login." - if [ -d "${scriptlogdir}" ]; then - fn_scriptlog "Steam login not set. Using anonymous login." - fi - steamuser="anonymous" - steampass="" - sleep 2 -fi diff --git a/functions/core_functions.sh b/functions/core_functions.sh index c54dd3c19..551e543db 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -146,11 +146,6 @@ functionfile="${FUNCNAME}" fn_fetch_function } -check_steamuser.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - check_systemdir.sh(){ functionfile="${FUNCNAME}" fn_fetch_function From 7cf9f88210e5aa063a9472d8365e8c74a0e31efd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 20 Feb 2016 00:49:20 +0000 Subject: [PATCH 022/434] adding extraction feature --- functions/check_steamcmd.sh | 6 ++---- functions/core_dl.sh | 40 ++++++++++++++++++++++++++++--------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/functions/check_steamcmd.sh b/functions/check_steamcmd.sh index 4c65ec557..d62d5e249 100644 --- a/functions/check_steamcmd.sh +++ b/functions/check_steamcmd.sh @@ -12,11 +12,9 @@ echo "Installing steamCMD" if [ ! -d "${steamcmddir}" ]; then mkdir -v "${steamcmddir}" fi -fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "${steamcmddir}" "steamcmd_linux.tar.gz" -tar --verbose -zxf "${steamcmddir}/steamcmd_linux.tar.gz" -C "${steamcmddir}" -rm -v "${steamcmddir}/steamcmd_linux.tar.gz" +fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "${lgsmdir}/tmp" "steamcmd_linux.tar.gz" +fn_dl_extract "${lgsmdir}/tmp" "steamcmd_linux.tar.gz" "${steamcmddir}" chmod +x "${steamcmddir}/steamcmd.sh" -echo "" } diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 1a54b8714..e2b1c61b6 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -34,8 +34,26 @@ fi } fn_dl_extract(){ +filedir=${1} +filename=${2} +extractdir=${3} # extracts archives -: +echo -ne "extracting ${filename}..." +mime=$(file -b --mime-type "${filedir}/${filename}") + +if [ "${mime}" == "application/gzip" ]; then + tarcmd=$(tar -zxf "${filedir}/${filename}" -C "${extractdir}") +elif [ "${mime}" == "application/x-bzip2" ]; then + tarcmd=$(tar -jxf "${filedir}/${filename}" -C "${extractdir}") +fi +local exitcode=$? +if [ ${exitcode} -ne 0 ]; then + fn_printfaileol + echo "${tarcmd}" + exit ${exitcode} +else + fn_printokeol +fi } # Trap to remove file download if canceled before completed @@ -62,7 +80,7 @@ if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then mkdir -p "${filedir}" fi - echo -ne " fetching ${filename}...\c" + # Check curl exists and use available path curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")" for curlcmd in ${curlpaths} @@ -78,15 +96,20 @@ if [ ! -f "${filedir}/${filename}" ]; then # if larger file shows progress bar if [[ $filename == *"tar"* ]]; then - curlfetch=$(${curlcmd} --progress-bar --fail -o "${filedir}/${filename}" "${fileurl}") - else - curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${fileurl}" 2>&1) + echo -ne "downloading ${filename}..." + sleep 1 + curlcmd=$(${curlcmd} --progress-bar --fail -o "${filedir}/${filename}" "${fileurl}") + echo -ne "downloading ${filename}..." + else + echo -ne " fetching ${filename}...\c" + curlcmd=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${fileurl}" 2>&1) fi - if [ $? -ne 0 ]; then + local exitcode=$? + if [ ${exitcode} -ne 0 ]; then fn_printfaileol - echo "${curlfetch}" + echo "${curlcmd}" echo -e "${fileurl}\n" - exit 1 + exit ${exitcode} else fn_printokeol fi @@ -99,7 +122,6 @@ if [ ! -f "${filedir}/${filename}" ]; then exit 1 fi fn_dl_md5 - # make file executable if run is set if [ "${run}" == "run" ]; then chmod +x "${filedir}/${filename}" From 55fff7a689988ebfde137f569397a9cffaf7670c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 20 Feb 2016 00:53:30 +0000 Subject: [PATCH 023/434] removed echo --- functions/check_steamcmd.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/functions/check_steamcmd.sh b/functions/check_steamcmd.sh index d62d5e249..ff713b85f 100644 --- a/functions/check_steamcmd.sh +++ b/functions/check_steamcmd.sh @@ -8,7 +8,6 @@ lgsm_version="160316" fn_install_steamcmd(){ -echo "Installing steamCMD" if [ ! -d "${steamcmddir}" ]; then mkdir -v "${steamcmddir}" fi From 6afee9f422f229e5cc5436dd403db48dfe12e0cf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 20 Feb 2016 16:43:49 +0000 Subject: [PATCH 024/434] Moving install ut99 to new system --- functions/install_dl_ut99.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/functions/install_dl_ut99.sh b/functions/install_dl_ut99.sh index fa7d64d6d..8a9157c55 100644 --- a/functions/install_dl_ut99.sh +++ b/functions/install_dl_ut99.sh @@ -8,4 +8,5 @@ echo "" echo "Downloading Server Files" echo "=================================" sleep 1 -fn_dl "ut-server-451-complete.tar.bz2" "${filesdir}" "http://gameservermanagers.com/files/ut99/ut-server-451-complete.tar.bz2" "42a8c9806e4fce10a56830caca83ce63" +fn_fetch_file "http://gameservermanagers.com/files/ut-server-451-complete.tar.bz2" "${lgsmdir}/tmp" "ut-server-451-complete.tar.bz2" "norun" "noforce" "42a8c9806e4fce10a56830caca83ce63" +fn_dl_extract "${lgsmdir}/tmp" "ut-server-451-complete.tar.bz2" "${filesdir}" \ No newline at end of file From 05dce64eb7bc166ee8f7395de05da8a47759d46b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 20 Feb 2016 17:55:31 +0000 Subject: [PATCH 025/434] Update MD5 Check --- functions/core_dl.sh | 19 ++++++++++--------- functions/install_dl_ut99.sh | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index e2b1c61b6..f1a416638 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -14,21 +14,22 @@ lgsm_version="050216" fn_dl_md5(){ # Runs MD5 Check if available if [ -n "${md5}" ]; then - echo -ne "verifying ${filename} with MD5...\c" - local md5check=$(md5sum "${filedir}/${filename}"|awk '{print $1;}') - if [ "${md5check}" != "${dl_md5}" ]; then + echo -ne "verifying ${filename} with MD5..." + sleep 1 + local md5sumcmd=$(md5sum "${filedir}/${filename}"|awk '{print $1;}') + if [ "${md5sumcmd}" != "${md5}" ]; then fn_printfaileol - echo "${filename} MD5 checksum: ${md5check}" - echo "expected MD5 checksum: ${dl_md5}" + echo "${filename} returned MD5 checksum: ${md5sumcmd}" + echo "expected MD5 checksum: ${md5}" fn_scriptlog "failed to verify ${filename} with MD5" - fn_scriptlog "${filename} MD5 checksum: ${md5check}" - fn_scriptlog "expected MD5 checksum: ${dl_md5}" + fn_scriptlog "${filename} returned MD5 checksum: ${md5sumcmd}" + fn_scriptlog "expected MD5 checksum: ${md5}" exit 1 else fn_printokeol fn_scriptlog "verifyed ${filename} with MD5" - fn_scriptlog "${filename} MD5 checksum: ${md5check}" - fn_scriptlog "expected MD5 checksum: ${dl_md5}" + fn_scriptlog "${filename} returned MD5 checksum: ${md5sumcmd}" + fn_scriptlog "expected MD5 checksum: ${md5}" fi fi } diff --git a/functions/install_dl_ut99.sh b/functions/install_dl_ut99.sh index 8a9157c55..7d8b2fd23 100644 --- a/functions/install_dl_ut99.sh +++ b/functions/install_dl_ut99.sh @@ -8,5 +8,5 @@ echo "" echo "Downloading Server Files" echo "=================================" sleep 1 -fn_fetch_file "http://gameservermanagers.com/files/ut-server-451-complete.tar.bz2" "${lgsmdir}/tmp" "ut-server-451-complete.tar.bz2" "norun" "noforce" "42a8c9806e4fce10a56830caca83ce63" +fn_fetch_file "http://gameservermanagers.com/files/ut-server-451-complete.tar.bz2" "${lgsmdir}/tmp" "ut-server-451-complete.tar.bz2" "norun" "noforce" "e623fdff5ed600a9bfccab852e18d34d" fn_dl_extract "${lgsmdir}/tmp" "ut-server-451-complete.tar.bz2" "${filesdir}" \ No newline at end of file From f732744910401a035a1e7d047a824c45f50f04ed Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 20 Feb 2016 17:56:16 +0000 Subject: [PATCH 026/434] Altered how source is run --- functions/core_dl.sh | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index f1a416638..91c9d02c4 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -122,16 +122,19 @@ if [ ! -f "${filedir}/${filename}" ]; then echo -e "" exit 1 fi - fn_dl_md5 # make file executable if run is set if [ "${run}" == "run" ]; then chmod +x "${filedir}/${filename}" - fi -fi -# run file if run is set -if [ "${run}" == "run" ]; then - source "${filedir}/${filename}" + fi fi + +if [ -f "${filedir}/${filename}" ]; then + fn_dl_md5 + # run file if run is set + if [ "${run}" == "run" ]; then + source "${filedir}/${filename}" + fi +fi } From bc254d39a8c2adb14801c789af9aa543eb908a70 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 20 Feb 2016 18:01:23 +0000 Subject: [PATCH 027/434] Updated ut99 to use new download system --- UnrealTournament99/ut99server | 91 +++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 41 deletions(-) diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index a1dd53887..8fe315593 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="121215" +version="200216" #### Variables #### @@ -28,6 +28,13 @@ parms="server ${defaultmap}.unr ini=${servercfgfullpath}" #### Advanced Variables #### +# Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="dgibbs64" +githubrepo="linuxgsm" +githubbranch="master" + # Server Details servicename="ut99-server" gamename="Unreal Tournament 99" @@ -38,6 +45,8 @@ rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" filesdir="${rootdir}/serverfiles" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" systemdir="${filesdir}/System" executabledir="${systemdir}" executable="./ucc-bin" @@ -60,66 +69,66 @@ 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" -# Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="dgibbs64" -githubrepo="linuxgsm" -githubbranch="master" - ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh +core_getopt.sh \ No newline at end of file From 15f99b7076708c92ad21dc80dcc3aa9dcc173991 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 20 Feb 2016 18:21:15 +0000 Subject: [PATCH 028/434] Merging ut99server files in to install_server_files --- functions/command_install.sh | 5 +- functions/install_dl_ut99.sh | 12 ---- functions/install_server_files.sh | 109 ++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 15 deletions(-) delete mode 100644 functions/install_dl_ut99.sh create mode 100644 functions/install_server_files.sh diff --git a/functions/command_install.sh b/functions/command_install.sh index 7f5753e3b..a68a5cc62 100644 --- a/functions/command_install.sh +++ b/functions/command_install.sh @@ -2,7 +2,7 @@ # LGSM fn_install function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="200216" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" @@ -17,8 +17,7 @@ if [ "${gamename}" == "Unreal Tournament 2004" ]; then install_ut2k4.sh install_ut2k4_key.sh elif [ "${gamename}" == "Unreal Tournament 99" ]; then - install_dl_ut99.sh - install_ut99.sh + install_server_files.sh elif [ "${gamename}" == "Teamspeak 3" ]; then install_ts3.sh elif [ ! -z "${appid}" ]; then diff --git a/functions/install_dl_ut99.sh b/functions/install_dl_ut99.sh deleted file mode 100644 index 7d8b2fd23..000000000 --- a/functions/install_dl_ut99.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# LGSM install_dl_ut99.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="050216" - -echo "" -echo "Downloading Server Files" -echo "=================================" -sleep 1 -fn_fetch_file "http://gameservermanagers.com/files/ut-server-451-complete.tar.bz2" "${lgsmdir}/tmp" "ut-server-451-complete.tar.bz2" "norun" "noforce" "e623fdff5ed600a9bfccab852e18d34d" -fn_dl_extract "${lgsmdir}/tmp" "ut-server-451-complete.tar.bz2" "${filesdir}" \ No newline at end of file diff --git a/functions/install_server_files.sh b/functions/install_server_files.sh new file mode 100644 index 000000000..d0af67112 --- /dev/null +++ b/functions/install_server_files.sh @@ -0,0 +1,109 @@ +#!/bin/bash +# LGSM install_server_files.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="050216" + + +fn_install_server_files(){ +if [ "${gamename}" == "Unreal Tournament 99" ]; then + fileurl="http://gameservermanagers.com/files/ut-server-451-complete.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut-server-451-complete.tar.bz2"; run="norun"; force="noforce"; md5="e623fdff5ed600a9bfccab852e18d34d" +fi +fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${run}" "${force}" "${md5}" +fn_dl_extract "${filedir}" "${filename}" "${filesdir}" +} + +#!/bin/bash +# LGSM install_serverfiles.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +fn_install_server_files_steamcmd(){ +check.sh +mkdir -pv "${filesdir}" +counter="0" +while [ "${counter}" == "0" ]||[ "$(grep -wc 0x402 .install_serverfiles.sh.tmp)" -ge "1" ]||[ "$(grep -wc 0x406 .install_serverfiles.sh.tmp)" -ge "1" ]||[ "$(grep -wc 0x6 .install_serverfiles.sh.tmp)" -ge "1" ]||[ "$(grep -wc 0x106 .install_serverfiles.sh.tmp)" -ge "1" ]; do + counter=$((counter+1)) + cd "${rootdir}/steamcmd" + if [ "${counter}" -le "10" ]; then + # Attempt 1-4: Standard attempt + # Attempt 5-6: Validate attempt + # Attempt 7-8: Validate, delete long name dir + # Attempt 9-10: Validate, delete long name dir, re-download SteamCMD + # Attempt 11: Failure + + if [ "${counter}" -ge "2" ]; then + fn_printwarningnl "SteamCMD did not complete the download, retrying: Attempt ${counter}:" + fi + + if [ "${counter}" -ge "7" ]; then + echo "Removing $(find ${filesdir} -type d -print0 | grep -Ez '[^/]{30}$')" + find ${filesdir} -type d -print0 | grep -Ez '[^/]{30}$' | xargs -0 rm -rf + fi + if [ "${counter}" -ge "9" ]; then + rm -rf "${rootdir}/steamcmd" + check_steamcmd.sh + fi + + # Detects if unbuffer command is available. + if [ $(command -v unbuffer) ]; then + unbuffer=unbuffer + fi + + if [ "${counter}" -le "4" ]; then + if [ "${engine}" == "goldsource" ]; then + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" +quit |tee .install_serverfiles.sh.tmp + else + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" +quit |tee .install_serverfiles.sh.tmp + fi + elif [ "${counter}" -ge "5" ]; then + if [ "${engine}" == "goldsource" ]; then + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" -validate +quit |tee .install_serverfiles.sh.tmp + else + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" -validate +quit |tee .install_serverfiles.sh.tmp + fi + fi + elif [ "${counter}" -ge "11" ]; then + fn_printfailurenl "SteamCMD did not complete the download, too many retrys" + break + fi + +done + +# Goldsource servers commonly fail to download all the server files required. +# Validating a few of times may reduce the chance of this issue. +if [ "${engine}" == "goldsource" ]; then + counter="0" + while [ "${counter}" -le "4" ]; do + counter=$((counter+1)) + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" -validate +quit |tee .install_serverfiles.sh.tmp + done +fi +rm -f .install_serverfiles.sh.tmp +} + +echo "" +echo "Installing ${gamename} Server" +echo "=================================" +sleep 1 +if [ -z "${appid}" ]; then + fn_install_server_files_steamcmd +fi + +if [ ! -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]; then + fn_install_server_files +fi + +if [ -z "${autoinstall}" ]; then + echo "" + echo "=================================" + while true; do + read -e -i "y" -p "Was the install successful? [Y/n]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) install_retry.sh;; + * ) echo "Please answer yes or no.";; + esac + done +fi \ No newline at end of file From 61258600c1fdc296315ade01cce003f9aa393777 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 20 Feb 2016 18:24:12 +0000 Subject: [PATCH 029/434] renamed serverfiles to server_files --- functions/core_functions.sh | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/functions/core_functions.sh b/functions/core_functions.sh index 551e543db..4fbbd25e7 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -353,7 +353,7 @@ install_serverdir.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } -install_serverfiles.sh(){ +install_server_files.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } @@ -388,16 +388,6 @@ functionfile="${FUNCNAME}" fn_fetch_function } -install_ut99.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_dl_ut99.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - fix_ut99.sh(){ functionfile="${FUNCNAME}" fn_fetch_function From a422f3c08208594fc2216dedba97c0e9f6545ab1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 20 Feb 2016 18:29:03 +0000 Subject: [PATCH 030/434] corrected if --- functions/install_server_files.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions/install_server_files.sh b/functions/install_server_files.sh index d0af67112..be0576e3f 100644 --- a/functions/install_server_files.sh +++ b/functions/install_server_files.sh @@ -87,11 +87,11 @@ echo "" echo "Installing ${gamename} Server" echo "=================================" sleep 1 -if [ -z "${appid}" ]; then +if [ -n "${appid}" ]; then fn_install_server_files_steamcmd fi -if [ ! -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]; then +if [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]; then fn_install_server_files fi From ff5be5c68f6016a9ba9442b21f3c4deeaddfd722 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 10:20:46 +0000 Subject: [PATCH 031/434] Added auto install to unreal games --- functions/core_getopt.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/functions/core_getopt.sh b/functions/core_getopt.sh index 95196d0ef..92c8897ab 100644 --- a/functions/core_getopt.sh +++ b/functions/core_getopt.sh @@ -259,6 +259,8 @@ case "$getopt" in command_dev_debug.sh;; i|install) command_install.sh;; + ai|auto-install) + fn_autoinstall;; mc|map-compressor) compress_ut99_maps.sh;; dd|depsdetect) @@ -382,6 +384,8 @@ case "$getopt" in command_dev_debug.sh;; i|install) command_install.sh;; + ai|auto-install) + fn_autoinstall;; mc|map-compressor) compress_unreal2_maps.sh;; dd|depsdetect) From a3a0d78b44d953f2c81af6325ea93ef2ccce49b4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 10:21:40 +0000 Subject: [PATCH 032/434] Auto install descriptions --- functions/core_getopt.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/functions/core_getopt.sh b/functions/core_getopt.sh index 92c8897ab..ed3bd1369 100644 --- a/functions/core_getopt.sh +++ b/functions/core_getopt.sh @@ -283,6 +283,7 @@ case "$getopt" in echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." echo -e "\e[34minstall\t\e[0mInstall the server." + echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." echo -e "\e[34mmap-compressor\t\e[0mCompresses all ${gamename} server maps." } | column -s $'\t' -t esac @@ -408,6 +409,7 @@ case "$getopt" in echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." echo -e "\e[34minstall\t\e[0mInstall the server." + echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." echo -e "\e[34mmap-compressor\t\e[0mCompresses all ${gamename} server maps." } | column -s $'\t' -t esac From b21c1eeac0fadb4620f3e33c84e2d87873d487cd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 10:29:13 +0000 Subject: [PATCH 033/434] Moved gsquery to functions --- {GameServerQuery => functions}/gsquery.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {GameServerQuery => functions}/gsquery.py (100%) diff --git a/GameServerQuery/gsquery.py b/functions/gsquery.py similarity index 100% rename from GameServerQuery/gsquery.py rename to functions/gsquery.py From 85e93ad0736e99d7e0d21885253d9bd611b4cb40 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 10:56:52 +0000 Subject: [PATCH 034/434] Added gsquery.py to functions --- functions/core_functions.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/functions/core_functions.sh b/functions/core_functions.sh index 4fbbd25e7..fdc5f9565 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -281,6 +281,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +gsquery.py(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + # Update From 33ed3562ab0d74ae8ae6d0c06dbbeb0f1b5e4650 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 11:37:10 +0000 Subject: [PATCH 035/434] Code tidy --- functions/info_config.sh | 46 ++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/functions/info_config.sh b/functions/info_config.sh index 60d2d77e0..6e9f1412b 100644 --- a/functions/info_config.sh +++ b/functions/info_config.sh @@ -197,29 +197,29 @@ elif [ "${engine}" == "realvirtuality" ]; then slots="\e[0;31mUNAVAILABLE\e[0m" fi - # port - if [ "${port}" != "" ]; then - port=${port} - fi - if [ ! -n "${port}" ]; then - port="0" - fi - - # query port - if [ "${port}" != "" ]; then - queryport=$((port+1)) - fi - if [ ! -n "${queryport}" ]; then - queryport="0" - fi - - # master port - if [ "${port}" != "" ]; then - masterport=$((port+2)) - fi - if [ ! -n "${masterport}" ]; then - masterport="0" - fi + # port + if [ "${port}" != "" ]; then + port=${port} + fi + if [ ! -n "${port}" ]; then + port="0" + fi + + # query port + if [ "${port}" != "" ]; then + queryport=$((port+1)) + fi + if [ ! -n "${queryport}" ]; then + queryport="0" + fi + + # master port + if [ "${port}" != "" ]; then + masterport=$((port+2)) + fi + if [ ! -n "${masterport}" ]; then + masterport="0" + fi # Serious Sam elif [ "${engine}" == "seriousengine35" ]; then From 911d649f43efab38be1d627664f38d7dc0fbd803 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 13:13:00 +0000 Subject: [PATCH 036/434] Added excecutecmd to allow cmds to not execute --- functions/core_dl.sh | 27 +++++++++++++++------------ functions/core_functions.sh | 6 ------ 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 91c9d02c4..2ad1f3b67 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -67,14 +67,15 @@ fn_fetch_trap() { } # Downloads file using curl and run it if required -# fn_fetch_file "fileurl" "filedir" "filename" "run" "force" "md5" +# fn_fetch_file "fileurl" "filedir" "filename" "executecmd" "run" "force" "md5" fn_fetch_file(){ fileurl=${1} filedir=${2} filename=${3} -run=${4:-0} -force=${5:-0} -md5=${6} +executecmd=${4:-0} +run=${5:-0} +force=${6:-0} +md5=${7} # If the file is missing, then download if [ ! -f "${filedir}/${filename}" ]; then @@ -122,8 +123,8 @@ if [ ! -f "${filedir}/${filename}" ]; then echo -e "" exit 1 fi - # make file executable if run is set - if [ "${run}" == "run" ]; then + # make file executecmd if executecmd is set + if [ "${executecmd}" == "executecmd" ]; then chmod +x "${filedir}/${filename}" fi fi @@ -143,18 +144,19 @@ fi # github_file_url_dir: The directory the file is located in teh GitHub repo # github_file_url_name: name of file # filepath: location file to be saved -# run: Optional, set to 1 to make file executable +# executecmd: set to "executecmd" to make file executecmd +# run: Optional, set to run to execute the file # force: force download of file even if exists fn_fetch_file_github(){ github_file_url_dir=${1} github_file_url_name=${2} filepath=${3} filename="${github_file_url_name}" -run=${4:-0} -force=${5:-0} +executecmd=${4:-0} +run=${5:-0} +force=${6:-0} githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" -echo -e " fetching ${filename}...\c" -fn_fetch_file "${githuburl}" "${filepath}" "${filename}" "${run}" "${force}" +fn_fetch_file "${githuburl}" "${filepath}" "${filename}" "${executecmd}" "${run}" "${force}" } @@ -166,6 +168,7 @@ github_file_url_name="${functionfile}" # name of the github file githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" filedir="${functionsdir}" # local dir that will contain the file filename="${github_file_url_name}" # name of the local file +executecmd="executecmd" run="run" -fn_fetch_file "${githuburl}" "${filedir}" "${filename}" "${run}" +fn_fetch_file "${githuburl}" "${filedir}" "${filename}" "${executecmd}" "${run}" } \ No newline at end of file diff --git a/functions/core_functions.sh b/functions/core_functions.sh index fdc5f9565..0ef2cc095 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -281,12 +281,6 @@ functionfile="${FUNCNAME}" fn_fetch_function } -gsquery.py(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - # Update update_check.sh(){ From 1e2ec54367a5f3fa368ad281e5bf128bc0e7b2e0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 18:49:49 +0000 Subject: [PATCH 037/434] Added fn_printokeolnl and fn_printfaileolnl --- functions/core_messages.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/functions/core_messages.sh b/functions/core_messages.sh index 939e73889..c8b3fb7f0 100644 --- a/functions/core_messages.sh +++ b/functions/core_messages.sh @@ -2,7 +2,7 @@ # LGSM fn_messages function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="380216" # Description: Defines on-screen messages such as [ OK ] and how script logs look. @@ -139,10 +139,18 @@ fn_printinfomationnl(){ # FAIL for end of line fn_printokeol(){ + echo -en "\e[0;32mOK\e[0m" +} + +fn_printokeolnl(){ echo -e "\e[0;32mOK\e[0m" } # FAIL for end of line fn_printfaileol(){ + echo -en "\e[0;31mFAIL\e[0m\n" +} + +fn_printfaileolnl(){ echo -e "\e[0;31mFAIL\e[0m\n" } \ No newline at end of file From 5d687b023dde4653b1f4f564635edef5fff8edfe Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 19:00:47 +0000 Subject: [PATCH 038/434] Major update to monitor_gsquery.sh * Now loops for 60 seconds checking 4 times for if fails * gsquery .py moved to functions dir * uses new core_dl feature so gsquery is auto installed * removed old code * added colors --- functions/monitor_gsquery.sh | 157 +++++++++++++++++------------------ 1 file changed, 77 insertions(+), 80 deletions(-) diff --git a/functions/monitor_gsquery.sh b/functions/monitor_gsquery.sh index 55e2e9fc2..c714d64ee 100644 --- a/functions/monitor_gsquery.sh +++ b/functions/monitor_gsquery.sh @@ -4,94 +4,91 @@ # Website: http://gameservermanagers.com lgsm_version="271215" -# Description: uses gsquery.py to directly query the server. -# Detects if the server has frozen. +# Description: uses gsquery.py to query the server port. +# Detects if the server has frozen with the proccess still running. local modulename="Monitor" -if [ -f "${rootdir}/gsquery.py" ]; then - if [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then - gameport=$(grep Port= "${servercfgfullpath}"|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|tr -d '\r'|tr -cd '[:digit:]') - port=$((${gameport} + 1)) - elif [ "${engine}" == "spark" ]; then - port=$((${port} + 1)) - elif [ "${engine}" == "realvirtuality" ]; then - queryport=$(grep -s steamqueryport= "${servercfgfullpath}"|grep -v //|tr -d '\r'|tr -cd '[:digit:]') - port=${queryport} - elif [ "${gamename}" == "7 Days To Die" ]; then - gameport=$(grep ServerPort "${servercfgfullpath}"|tr -cd '[:digit:]') - port=$((${gameport} + 1)) - elif [ "${gamename}" == "Hurtworld" ]; then - gameport="${port}" - port="${queryport}" - fi - fn_printinfo "Detected gsquery.py" - fn_scriptlog "Detected gsquery.py" - sleep 1 - fn_printdots "Querying port: ${ip}:${port} : QUERYING" - fn_scriptlog "Querying port: ${ip}:${port} : QUERYING" - sleep 1 - serverquery=$("${rootdir}/gsquery.py" -a ${ip} -p ${port} -e ${engine} 2>&1) + +# Downloads gsquery.py if missing +if [ ! -f "${functionsdir}/gsquery.py" ]; then + fn_fetch_file_github "functions" "gsquery.py" "${functionsdir}" "executecmd" "norun" "noforce" +fi + +info_config.sh + +if [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then + port=$((${port} + 1)) +elif [ "${engine}" == "spark" ]; then + port=$((${port} + 1)) +fi + +if [ -z "${queryport}" ]; then + port="${queryport}" +fi + + +fn_printinfo "Querying port: gsquery.py enabled" +fn_scriptlog "gsquery.py enabled" +sleep 1 +fn_printdots "Querying port: ${ip}:${port}: 0/1 : " +fn_printqueryingeol +fn_scriptlog "Querying port: ${ip}:${port}: 1 : QUERYING" +sleep 1 + + +# Will query up to 4 times every 15 seconds. +# Servers changing map can return a failure. +# Will Wait up to 60 seconds to confirm server is down giving server time to change map. +queryattempt=0 +totalseconds=0 +for i in {1..4}; do + gsquerycmd=$("${functionsdir}"/gsquery.py -a ${ip} -p 1 -e ${engine} 2>&1) exitcode=$? - if [ "${exitcode}" == "1" ]||[ "${exitcode}" == "2" ]||[ "${exitcode}" == "3" ]||[ "${exitcode}" == "4" ]; then - fn_printfail "Querying port: ${ip}:${port} : ${serverquery}" - fn_scriptlog "Querying port: ${ip}:${port} : ${serverquery}" + + if [ "${exitcode}" == "0" ]; then + # Server OK + fn_printok "Querying port: ${ip}:${port}: " + fn_printokeol + fn_scriptlog "Querying port: ${ip}:${port}: OK" sleep 1 - echo -en "\n" - if [ -z "${secondquery}" ]; then - if [ "${engine}" == "unreal2" ]; then - # unreal 2: Map change can take around 60 seconds - fn_printinfo "Waiting 60 seconds to re-query" - fn_scriptlog "Waiting 60 seconds to re-query" - sleep 60 - else - fn_printinfo "Waiting 30 seconds to re-query" - fn_scriptlog "Waiting 30 seconds to re-query" - sleep 30 - fi - secondquery=1 - monitor_gsquery.sh - fi + exit + else + # Server failed query + queryattempt=$((queryattempt + 1)) + fn_scriptlog "Querying port: ${ip}:${port}: ${totalseconds}/${queryattempt} : ${gsquerycmd}" + seconds=0 + # Seconds counter + while [ true ]; do + fn_printfail "Querying port: ${ip}:${port}: ${totalseconds}/${queryattempt} : \e[0;31m${gsquerycmd}\e[0m" + seconds=$((seconds + 1)) + totalseconds=$((totalseconds + 1)) + sleep 1 + if [ "${seconds}" == "15" ]; then + fn_printdots "Querying port: ${ip}:${port}: ${totalseconds}/${queryattempt} : " + fn_printqueryingeol + fn_scriptlog "Querying port: ${ip}:${port}: ${queryattempt} : QUERYING" + sleep 1 + break + fi + done + fi + + if [ "${queryattempt}" == "4" ]; then + # Server failed query 4 times confirmed failure + fn_printfail "Querying port: ${ip}:${port}: " + fn_printfaileol + fn_scriptlog "Querying port: ${ip}:${port}: ${gsquerycmd}" + fn_scriptlog "Querying port: ${ip}:${port}: FAIL" + sleep 1 + + # Send email notification if enabled if [ "${emailnotification}" = "on" ]; then info_config.sh subject="${servicename} Monitor - Starting ${servername}" - failurereason="Failed to query ${servicename}: ${serverquery}" + failurereason="Failed to query ${servicename}: ${gsquerycmd}" actiontaken="restarted ${servicename}" email.sh fi fn_restart - exit 1 - elif [ "${exitcode}" == "0" ]; then - fn_printok "Querying port: ${ip}:${port} : OK" - fn_scriptlog "Querying port: ${ip}:${port} : OK" - sleep 1 - echo -en "\n" - exit - elif [ "${exitcode}" == "126" ]; then - fn_printfail "Querying port: ${ip}:${port} : ERROR: ${rootdir}/gsquery.py: Permission denied" - fn_scriptlog "Querying port: ${ip}:${port} : ERROR: ${rootdir}/gsquery.py: Permission denied" - sleep 1 - echo -en "\n" - echo "Attempting to resolve automatically" - chmod +x -v "${rootdir}/gsquery.py" - if [ $? -eq 0 ]; then - monitor_gsquery.sh - else - fn_printfailure "Unable to resolve automatically. Please manually fix permissions.\n" - owner=$(ls -al ${rootdir}/gsquery.py|awk '{ print $3 }') - echo "As user ${owner} or root run the following command." - whoami=$(whoami) - echo -en "\nchown ${whoami}:${whoami} ${rootdir}/gsquery.py\n\n" - exit 1 - fi - else - fn_printfail "Querying port: ${ip}:${port} : UNKNOWN ERROR" - fn_scriptlog "Querying port: ${ip}:${port} : UNKNOWN ERROR" - sleep 1 - echo -en "\n" - ${rootdir}/gsquery.py -a ${ip} -p ${port} -e ${engine} - exit 1 - fi -else - fn_printfailnl "Could not find ${rootdir}/gsquery.py" - fn_scriptlog "Could not find ${rootdir}/gsquery.py" -fi + fi +done \ No newline at end of file From d1491d598489736b2cdf4d33536d8891ea5ceae3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 19:00:58 +0000 Subject: [PATCH 039/434] Added fn_printqueryingeol --- functions/core_messages.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/functions/core_messages.sh b/functions/core_messages.sh index c8b3fb7f0..88a0a8127 100644 --- a/functions/core_messages.sh +++ b/functions/core_messages.sh @@ -153,4 +153,13 @@ fn_printfaileol(){ fn_printfaileolnl(){ echo -e "\e[0;31mFAIL\e[0m\n" +} + +# QUERYING for end of line +fn_printqueryingeol(){ + echo -en "\e[0;31mQUERYING\e[0m\n" +} + +fn_printqueryingeolnl(){ + echo -e "\e[0;31mQUERYING\e[0m\n" } \ No newline at end of file From 20fd5936fb36f9ca2a5c3d5b0fb091a4a21031a9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 19:01:37 +0000 Subject: [PATCH 040/434] Minor tidy --- functions/info_config.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/functions/info_config.sh b/functions/info_config.sh index 6e9f1412b..3fe13fc0e 100644 --- a/functions/info_config.sh +++ b/functions/info_config.sh @@ -207,7 +207,7 @@ elif [ "${engine}" == "realvirtuality" ]; then # query port if [ "${port}" != "" ]; then - queryport=$((port+1)) + queryport=$((port + 1)) fi if [ ! -n "${queryport}" ]; then queryport="0" @@ -215,7 +215,7 @@ elif [ "${engine}" == "realvirtuality" ]; then # master port if [ "${port}" != "" ]; then - masterport=$((port+2)) + masterport=$((port + 2)) fi if [ ! -n "${masterport}" ]; then masterport="0" @@ -274,7 +274,7 @@ elif [ "${engine}" == "seriousengine35" ]; then # query port if [ -f "${servercfgfullpath}" ]; then - queryport=$((${port} + 1)) + queryport=$((port + 1)) fi if [ ! -n "${queryport}" ]; then queryport="0" From 7a13b5f669dad176877ec3aea20824aa766fc8ad Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 19:02:52 +0000 Subject: [PATCH 041/434] Removed gsquery installed --- functions/command_install.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/functions/command_install.sh b/functions/command_install.sh index a68a5cc62..bd61e4930 100644 --- a/functions/command_install.sh +++ b/functions/command_install.sh @@ -2,7 +2,7 @@ # LGSM fn_install function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="200216" +lgsm_version="260216" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" @@ -27,7 +27,6 @@ fi # Configuration fix.sh -install_gsquery.sh install_config.sh if [ "${gamename}" == "Counter Strike: Global Offensive" ]||[ "${gamename}" == "Team Fortress 2" ]||[ "${gamename}" == "BrainBread 2" ]; then install_gslt.sh From cec75582c30c5d10d3a86e1189d49bb86331c784 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 19:06:29 +0000 Subject: [PATCH 042/434] Updated fn_printokeol to fn_printokeolnl --- functions/check_steamcmd.sh | 2 +- functions/core_dl.sh | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/functions/check_steamcmd.sh b/functions/check_steamcmd.sh index ff713b85f..760b0b835 100644 --- a/functions/check_steamcmd.sh +++ b/functions/check_steamcmd.sh @@ -54,7 +54,7 @@ if [ ! -f "${steamcmddir}/steamcmd.sh" ]; then fi elif [ "${function_selfname}" == "command_install.sh" ]; then fn_printinfomation "SteamCMD is already installed..." - fn_printokeol + fn_printokeolnl fi } diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 2ad1f3b67..9d2b95fff 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -18,7 +18,7 @@ if [ -n "${md5}" ]; then sleep 1 local md5sumcmd=$(md5sum "${filedir}/${filename}"|awk '{print $1;}') if [ "${md5sumcmd}" != "${md5}" ]; then - fn_printfaileol + fn_printfaileolnl echo "${filename} returned MD5 checksum: ${md5sumcmd}" echo "expected MD5 checksum: ${md5}" fn_scriptlog "failed to verify ${filename} with MD5" @@ -26,7 +26,7 @@ if [ -n "${md5}" ]; then fn_scriptlog "expected MD5 checksum: ${md5}" exit 1 else - fn_printokeol + fn_printokeolnl fn_scriptlog "verifyed ${filename} with MD5" fn_scriptlog "${filename} returned MD5 checksum: ${md5sumcmd}" fn_scriptlog "expected MD5 checksum: ${md5}" @@ -49,11 +49,11 @@ elif [ "${mime}" == "application/x-bzip2" ]; then fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then - fn_printfaileol + fn_printfaileolnl echo "${tarcmd}" exit ${exitcode} else - fn_printokeol + fn_printokeolnl fi } @@ -108,17 +108,17 @@ if [ ! -f "${filedir}/${filename}" ]; then fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then - fn_printfaileol + fn_printfaileolnl echo "${curlcmd}" echo -e "${fileurl}\n" exit ${exitcode} else - fn_printokeol + fn_printokeolnl fi # remove trap trap - INT else - fn_printfaileol + fn_printfaileolnl echo "Curl is not installed!" echo -e "" exit 1 From 5de4021e75acdb9c36befdf21ef826ba07f290e8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 19:06:44 +0000 Subject: [PATCH 043/434] Removed install_gsquery.sh --- functions/install_gsquery.sh | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 functions/install_gsquery.sh diff --git a/functions/install_gsquery.sh b/functions/install_gsquery.sh deleted file mode 100644 index a113ea829..000000000 --- a/functions/install_gsquery.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -# LGSM install_gsquery.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -fn_dlgsquery(){ -cd "${rootdir}" -echo -e "downloading gsquery.py...\c" -wget -N /dev/null "http://gameservermanagers.com/dl/gsquery.py" 2>&1 | grep -F "HTTP" | grep -v "Moved Permanently" | cut -c45- | uniq -chmod +x gsquery.py -} - -if [ "${engine}" == "avalanche" ]||[ "${engine}" == "goldsource" ]||[ "${engine}" == "realvirtuality" ]||[ "${engine}" == "source" ]||[ "${engine}" == "spark" ]||[ "${engine}" == "unity3d" ]||[ "${gamename}" == "Hurtworld" ]||[ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then - echo "" - echo "GameServerQuery" - echo "============================" - if [ -z ${autoinstall} ]; then - while true; do - read -e -i "y" -p "Do you want to install GameServerQuery? [Y/n]" yn - case $yn in - [Yy]* ) fn_dlgsquery;break;; - [Nn]* ) echo ""; echo "Not installing GameServerQuery.";break;; - * ) echo "Please answer yes or no.";; - esac - done - else - fn_dlgsquery - fi -fi From 59a40f71d16c84edec366e7815920a5aa76ccad3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 20:27:09 +0000 Subject: [PATCH 044/434] Corrected variable --- functions/install_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/install_config.sh b/functions/install_config.sh index 913bf26f0..257e29fd7 100644 --- a/functions/install_config.sh +++ b/functions/install_config.sh @@ -103,7 +103,7 @@ echo "" } fn_ut99config(){ -echo "${defaultcfg} > ${servercfgfullpath}" +echo "${servercfgdefault} > ${servercfgfullpath}" tr -d '\r' < "${servercfgdefault}" > "${servercfgfullpath}" sleep 1 echo "" From 457bc70edb7121f1b562f6ff0691c09801771f40 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 20:27:58 +0000 Subject: [PATCH 045/434] Added gamelogdir --- UnrealTournament99/ut99server | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index 8fe315593..36d31750a 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="200216" +version="260216" #### Variables #### @@ -59,6 +59,7 @@ backupdir="${rootdir}/backups" # Logging logdays="7" +gamelogdir="${systemdir}/Logs/" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" From 5b4e0d77116fb28b256b04e875adeebfc2feb8f7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 22:38:16 +0000 Subject: [PATCH 046/434] Updated glibc requirements --- functions/fix_glibc.sh | 2 +- functions/info_glibc.sh | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/functions/fix_glibc.sh b/functions/fix_glibc.sh index 0270788ab..83422f12b 100644 --- a/functions/fix_glibc.sh +++ b/functions/fix_glibc.sh @@ -93,7 +93,7 @@ elif [ "$(ldd --version | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" -lt 21 wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/Insurgency/dependencies/librt.so.1 wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/Insurgency/dependencies/libpthread.so.0 elif [ "${gamename}" == "Left 4 Dead" ]; then - glibcversion="2.07" + glibcversion="2.3.6" fn_glibcfixmsg cp -v "${rootdir}/steamcmd/linux32/libstdc++.so.6" "${filesdir}/bin/libstdc++.so.6" # Natural Selection 2 diff --git a/functions/info_glibc.sh b/functions/info_glibc.sh index 4181d011d..c1442593e 100644 --- a/functions/info_glibc.sh +++ b/functions/info_glibc.sh @@ -2,7 +2,7 @@ # LGSM info_glibc.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="100116" +lgsm_version="260216" # Description: stores details on servers Glibc requirements. @@ -43,7 +43,7 @@ elif [ "${engine}" == "seriousengine35" ]; then glibcrequired="2.13" glibcfix="yes" elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then - glibcrequired="2.07" + glibcrequired="2.3.6" glibcfix="no" elif [ "${engine}" == "spark" ]; then glibcrequired="2.15" @@ -51,6 +51,12 @@ elif [ "${engine}" == "spark" ]; then elif [ "${engine}" == "starbound" ]; then glibcrequired="2.12" glibcfix="no" +elif [ "${engine}" == "unreal" ]; then + glibcrequired="2.1" + glibcfix="no" +elif [ "${engine}" == "unreal2" ]; then + glibcrequired="2.4" + glibcfix="no" elif [ "${engine}" == "unreal4" ]; then glibcrequired="2.14" glibcfix="no" From 020d8ee689fd3a72b7bd0912e6b286e5e593f7b4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 22:42:23 +0000 Subject: [PATCH 047/434] moved lgsmdir --- JustCause2/jc2server | 2 +- UnrealTournament99/ut99server | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/JustCause2/jc2server b/JustCause2/jc2server index cedf158b8..2d4010e71 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -50,9 +50,9 @@ engine="avalanche" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" -filesdir="${rootdir}/serverfiles" lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" +filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" executable="./Jcmp-Server" diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index 36d31750a..36704e0b2 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -44,9 +44,9 @@ engine="unreal" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" -filesdir="${rootdir}/serverfiles" lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" +filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/System" executabledir="${systemdir}" executable="./ucc-bin" From de4b2914005e27a03d33f03e81ca619186750e01 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 Feb 2016 22:42:37 +0000 Subject: [PATCH 048/434] updated for core_dl --- UnrealTournament2004/ut2k4server | 75 ++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index d74310b30..444e16871 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -35,6 +35,8 @@ engine="unreal2" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/System" executabledir="${systemdir}" @@ -71,56 +73,63 @@ githubbranch="master" ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh +core_getopt.sh \ No newline at end of file From 7809ae0320c8c9244f1409170cc351aae5db0924 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 10:53:55 +0000 Subject: [PATCH 049/434] Updated urls --- functions/install_server_files.sh | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/functions/install_server_files.sh b/functions/install_server_files.sh index be0576e3f..32d6dff7a 100644 --- a/functions/install_server_files.sh +++ b/functions/install_server_files.sh @@ -2,23 +2,20 @@ # LGSM install_server_files.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="050216" +lgsm_version="270216" fn_install_server_files(){ if [ "${gamename}" == "Unreal Tournament 99" ]; then - fileurl="http://gameservermanagers.com/files/ut-server-451-complete.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut-server-451-complete.tar.bz2"; run="norun"; force="noforce"; md5="e623fdff5ed600a9bfccab852e18d34d" + fileurl="http://gameservermanagers.com/files/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut99-server-451-ultimate-linux.tar.bz2"; run="norun"; force="noforce"; md5="e623fdff5ed600a9bfccab852e18d34d" +elif [ "${gamename}" == "Unreal Tournament 2004" ]; then + fileurl="http://gameservermanagers.com/files/UnrealTournament2004/ut2004-server-3339-ultimate-linux.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut2004-server-3339-ultimate-linux.tar.bz2"; run="norun"; force="noforce"; md5="e623fdff5ed600a9bfccab852e18d34d" fi + fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${run}" "${force}" "${md5}" fn_dl_extract "${filedir}" "${filename}" "${filesdir}" } -#!/bin/bash -# LGSM install_serverfiles.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - fn_install_server_files_steamcmd(){ check.sh mkdir -pv "${filesdir}" From d3f7be4919e76e761bf5e72d8e4d5056f0949ed0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 11:05:33 +0000 Subject: [PATCH 050/434] fixed progress bar showing for some .sh files --- functions/core_dl.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 9d2b95fff..d6fc8cd04 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -95,9 +95,8 @@ if [ ! -f "${filedir}/${filename}" ]; then if [ "$(basename ${curlcmd})" == "curl" ]; then # trap to remove part downloaded files trap fn_fetch_trap INT - # if larger file shows progress bar - if [[ $filename == *"tar"* ]]; then + if [ ${filename##*.} == "bz2" ]; then echo -ne "downloading ${filename}..." sleep 1 curlcmd=$(${curlcmd} --progress-bar --fail -o "${filedir}/${filename}" "${fileurl}") From 3c09d25d031afb675833908c235fd7bc71c478ed Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 11:11:56 +0000 Subject: [PATCH 051/434] Renamed files --- functions/command_install.sh | 4 ++-- functions/{install_serverdir.sh => install_server_dir.sh} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename functions/{install_serverdir.sh => install_server_dir.sh} (100%) diff --git a/functions/command_install.sh b/functions/command_install.sh index bd61e4930..7dd44ffa0 100644 --- a/functions/command_install.sh +++ b/functions/command_install.sh @@ -8,7 +8,7 @@ function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh install_header.sh -install_serverdir.sh +install_server_dir.sh install_logs.sh check_deps.sh # Download and install @@ -22,7 +22,7 @@ elif [ "${gamename}" == "Teamspeak 3" ]; then install_ts3.sh elif [ ! -z "${appid}" ]; then install_steamcmd.sh - install_serverfiles.sh + install_server_files.sh fi # Configuration diff --git a/functions/install_serverdir.sh b/functions/install_server_dir.sh similarity index 100% rename from functions/install_serverdir.sh rename to functions/install_server_dir.sh From e90e6bf9d2ad51d64544a20c25ad1adb64bddc27 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 11:12:52 +0000 Subject: [PATCH 052/434] Updated functions function --- functions/update_functions.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions/update_functions.sh b/functions/update_functions.sh index 196b90f75..e205dd901 100644 --- a/functions/update_functions.sh +++ b/functions/update_functions.sh @@ -2,7 +2,7 @@ # LGSM update_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="230116" +lgsm_version="270216" # Description: Deletes the functions dir to allow re-downloading of functions from GitHub. @@ -12,7 +12,7 @@ fn_printdots "Updating functions" fn_scriptlog "Updating functions" sleep 1 echo -ne "\n" -rm -rfv "${rootdir}/functions/"* +rm -rfv "${functionsdir}/"* exitcode=$? if [ "${exitcode}" == "0" ]; then fn_printok "Updating functions" From 3b6431ab6e37a3d898000311a96e24e25795ef38 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 11:14:01 +0000 Subject: [PATCH 053/434] renamed function --- functions/core_functions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/core_functions.sh b/functions/core_functions.sh index 0ef2cc095..5d6464444 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -348,7 +348,7 @@ functionfile="${FUNCNAME}" fn_fetch_function } -install_serverdir.sh(){ +install_server_dir.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } From de924018bcbda2f61e8eab053c8a17f7941c52aa Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 11:36:25 +0000 Subject: [PATCH 054/434] Converted to using exit codes for steamcmd errors --- functions/install_server_files.sh | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/functions/install_server_files.sh b/functions/install_server_files.sh index 32d6dff7a..103fecf3a 100644 --- a/functions/install_server_files.sh +++ b/functions/install_server_files.sh @@ -17,10 +17,8 @@ fn_dl_extract "${filedir}" "${filename}" "${filesdir}" } fn_install_server_files_steamcmd(){ -check.sh -mkdir -pv "${filesdir}" counter="0" -while [ "${counter}" == "0" ]||[ "$(grep -wc 0x402 .install_serverfiles.sh.tmp)" -ge "1" ]||[ "$(grep -wc 0x406 .install_serverfiles.sh.tmp)" -ge "1" ]||[ "$(grep -wc 0x6 .install_serverfiles.sh.tmp)" -ge "1" ]||[ "$(grep -wc 0x106 .install_serverfiles.sh.tmp)" -ge "1" ]; do +while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do counter=$((counter+1)) cd "${rootdir}/steamcmd" if [ "${counter}" -le "10" ]; then @@ -50,15 +48,19 @@ while [ "${counter}" == "0" ]||[ "$(grep -wc 0x402 .install_serverfiles.sh.tmp)" if [ "${counter}" -le "4" ]; then if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" +quit |tee .install_serverfiles.sh.tmp + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" +quit + local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" +quit |tee .install_serverfiles.sh.tmp + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" +quit + local exitcode=$? fi elif [ "${counter}" -ge "5" ]; then if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" -validate +quit |tee .install_serverfiles.sh.tmp + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -validate +quit + local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" -validate +quit |tee .install_serverfiles.sh.tmp + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" -validate +quit + local exitcode=$? fi fi elif [ "${counter}" -ge "11" ]; then @@ -74,10 +76,10 @@ if [ "${engine}" == "goldsource" ]; then counter="0" while [ "${counter}" -le "4" ]; do counter=$((counter+1)) - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" -validate +quit |tee .install_serverfiles.sh.tmp + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" -validate +quit + local exitcode=$? done fi -rm -f .install_serverfiles.sh.tmp } echo "" From 20ea49c65f6554ba12398c6363b8f37126db9cea Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 11:38:08 +0000 Subject: [PATCH 055/434] tidy --- functions/install_server_files.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/functions/install_server_files.sh b/functions/install_server_files.sh index 103fecf3a..112a7fe4b 100644 --- a/functions/install_server_files.sh +++ b/functions/install_server_files.sh @@ -4,7 +4,6 @@ # Website: http://gameservermanagers.com lgsm_version="270216" - fn_install_server_files(){ if [ "${gamename}" == "Unreal Tournament 99" ]; then fileurl="http://gameservermanagers.com/files/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut99-server-451-ultimate-linux.tar.bz2"; run="norun"; force="noforce"; md5="e623fdff5ed600a9bfccab852e18d34d" @@ -67,7 +66,6 @@ while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do fn_printfailurenl "SteamCMD did not complete the download, too many retrys" break fi - done # Goldsource servers commonly fail to download all the server files required. From 2e70c72476ce4af4601890940986213ce84c5c47 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 11:56:25 +0000 Subject: [PATCH 056/434] Renamed function --- functions/{check_systemdir.sh => check_system_dir.sh} | 2 +- functions/core_functions.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename functions/{check_systemdir.sh => check_system_dir.sh} (89%) diff --git a/functions/check_systemdir.sh b/functions/check_system_dir.sh similarity index 89% rename from functions/check_systemdir.sh rename to functions/check_system_dir.sh index c1f65a0d7..ecada4e09 100644 --- a/functions/check_systemdir.sh +++ b/functions/check_system_dir.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_systemdir.sh function +# LGSM check_system_dir.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com lgsm_version="271215" diff --git a/functions/core_functions.sh b/functions/core_functions.sh index 5d6464444..eb1096828 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -146,7 +146,7 @@ functionfile="${FUNCNAME}" fn_fetch_function } -check_systemdir.sh(){ +check_system_dir.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } From 2ed6a60db2bd61acdb28e0851e90052d11e11c11 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 11:56:36 +0000 Subject: [PATCH 057/434] renamed function --- functions/check.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/check.sh b/functions/check.sh index fa6b47306..dd64d9ef1 100644 --- a/functions/check.sh +++ b/functions/check.sh @@ -22,7 +22,7 @@ array_contains () { check_root.sh if [ "${function_selfname}" != "command_install.sh" ] && [ "${function_selfname}" != "update_functions.sh" ]; then - check_systemdir.sh + check_system_dir.sh fi local allowed_commands_array=( command_backup.sh command_console.sh command_debug.sh command_details.sh command_unreal2_maps.sh command_ut99_maps.sh command_monitor.sh command_start.sh command_stop.sh update_check.sh command_validate.sh update_functions.sh command_email_test.sh ) From 8160e36804700f83f0eca4b7ca6ed60d53433d80 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 11:57:21 +0000 Subject: [PATCH 058/434] prevent from deleting everything if no var --- functions/update_functions.sh | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/functions/update_functions.sh b/functions/update_functions.sh index e205dd901..970dc9773 100644 --- a/functions/update_functions.sh +++ b/functions/update_functions.sh @@ -12,8 +12,17 @@ fn_printdots "Updating functions" fn_scriptlog "Updating functions" sleep 1 echo -ne "\n" -rm -rfv "${functionsdir}/"* -exitcode=$? +if [ -d "${rootdir}/functions/" ]; then + rm -rfv "${rootdir}/functions/" + exitcode=$? +elif [ -z "${functionsdir}" ]; then + rm -rfv "${functionsdir}/"* + exitcode=$? +else + fn_printfail "Updating functions" + fn_scriptlog "Failure! Updating functions" +fi + if [ "${exitcode}" == "0" ]; then fn_printok "Updating functions" fn_scriptlog "Success! Updating functions" From 017360f18355e746c8ab82a4d8ea23ce4af4c09c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 15:12:27 +0000 Subject: [PATCH 059/434] No longer required --- functions/install_serverfiles.sh | 87 -------------------------------- 1 file changed, 87 deletions(-) delete mode 100644 functions/install_serverfiles.sh diff --git a/functions/install_serverfiles.sh b/functions/install_serverfiles.sh deleted file mode 100644 index 24677da9c..000000000 --- a/functions/install_serverfiles.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/bash -# LGSM finstall_serverfiles.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -fn_steaminstallcommand(){ -check.sh -counter="0" -while [ "${counter}" == "0" ]||[ "$(grep -wc 0x402 .finstall_serverfiles.sh.tmp)" -ge "1" ]||[ "$(grep -wc 0x406 .finstall_serverfiles.sh.tmp)" -ge "1" ]||[ "$(grep -wc 0x6 .finstall_serverfiles.sh.tmp)" -ge "1" ]||[ "$(grep -wc 0x106 .finstall_serverfiles.sh.tmp)" -ge "1" ]; do - counter=$((counter+1)) - cd "${rootdir}/steamcmd" - if [ "${counter}" -le "10" ]; then - # Attempt 1-4: Standard attempt - # Attempt 5-6: Validate attempt - # Attempt 7-8: Validate, delete long name dir - # Attempt 9-10: Validate, delete long name dir, re-download SteamCMD - # Attempt 11: Failure - - if [ "${counter}" -ge "2" ]; then - fn_printwarningnl "SteamCMD did not complete the download, retrying: Attempt ${counter}:" - fi - - if [ "${counter}" -ge "7" ]; then - echo "Removing $(find ${filesdir} -type d -print0 | grep -Ez '[^/]{30}$')" - find ${filesdir} -type d -print0 | grep -Ez '[^/]{30}$' | xargs -0 rm -rf - fi - if [ "${counter}" -ge "9" ]; then - rm -rf "${rootdir}/steamcmd" - check_steamcmd.sh - fi - - # Detects if unbuffer command is available. - if [ $(command -v unbuffer) ]; then - unbuffer=unbuffer - fi - - if [ "${counter}" -le "4" ]; then - if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" +quit |tee .finstall_serverfiles.sh.tmp - else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" +quit |tee .finstall_serverfiles.sh.tmp - fi - elif [ "${counter}" -ge "5" ]; then - if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" -validate +quit |tee .finstall_serverfiles.sh.tmp - else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" -validate +quit |tee .finstall_serverfiles.sh.tmp - fi - fi - elif [ "${counter}" -ge "11" ]; then - fn_printfailurenl "SteamCMD did not complete the download, too many retrys" - break - fi - -done - -# Goldsource servers commonly fail to download all the server files required. -# Validating a few of times may reduce the chance of this issue. -if [ "${engine}" == "goldsource" ]; then - counter="0" - while [ "${counter}" -le "4" ]; do - counter=$((counter+1)) - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" -validate +quit |tee .finstall_serverfiles.sh.tmp - done -fi -rm -f .finstall_serverfiles.sh.tmp -} - -echo "" -echo "Installing ${gamename} Server" -echo "=================================" -sleep 1 -mkdir -pv "${filesdir}" -fn_steaminstallcommand -if [ -z "${autoinstall}" ]; then - echo "" - echo "=================================" - while true; do - read -e -i "y" -p "Was the install successful? [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) install_retry.sh;; - * ) echo "Please answer yes or no.";; - esac - done -fi From 1502542fc89bab20bd76a40680a94965ab9026ff Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 15:15:10 +0000 Subject: [PATCH 060/434] Changed ut2004 to new system --- functions/command_install.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/functions/command_install.sh b/functions/command_install.sh index 7dd44ffa0..e933b2598 100644 --- a/functions/command_install.sh +++ b/functions/command_install.sh @@ -13,8 +13,7 @@ install_logs.sh check_deps.sh # Download and install if [ "${gamename}" == "Unreal Tournament 2004" ]; then - install_dl_ut2k4.sh - install_ut2k4.sh + install_server_files.sh install_ut2k4_key.sh elif [ "${gamename}" == "Unreal Tournament 99" ]; then install_server_files.sh From 867fb3b911c01fc30c0c9abfd01fc2ba441871ac Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 15:45:59 +0000 Subject: [PATCH 061/434] Altered header to link to github contrib page --- functions/install_header.sh | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/functions/install_header.sh b/functions/install_header.sh index 1ee637c77..ae8ab9240 100644 --- a/functions/install_header.sh +++ b/functions/install_header.sh @@ -9,12 +9,6 @@ echo "=================================" echo "${gamename}" echo "Linux Game Server Manager" echo "by Daniel Gibbs" -if [ "${gamename}" == "ARMA 3" ]; then - echo "contributions by Scarsz" -elif [ "${gamename}" == "Left 4 Dead" ]; then - echo "contributions by Summit Singh Thakur" -elif [ "${gamename}" == "Teeworlds" ]; then - echo "contributions by Bryce Van Dyk (SingingTree)" -fi +echo "Contributors: http://goo.gl/qLmitD" echo "http://gameservermanagers.com" echo "=================================" \ No newline at end of file From 15413e23669bd6abb058d8242e721b747d7e4452 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 15:46:15 +0000 Subject: [PATCH 062/434] added ut2l4 server cd-key option --- functions/core_getopt.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/functions/core_getopt.sh b/functions/core_getopt.sh index ed3bd1369..47cd5f748 100644 --- a/functions/core_getopt.sh +++ b/functions/core_getopt.sh @@ -386,7 +386,9 @@ case "$getopt" in i|install) command_install.sh;; ai|auto-install) - fn_autoinstall;; + fn_autoinstall;; + sck|server-cd-key) + install_ut2k4_key.sh;; mc|map-compressor) compress_unreal2_maps.sh;; dd|depsdetect) @@ -410,6 +412,7 @@ case "$getopt" in echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." echo -e "\e[34minstall\t\e[0mInstall the server." echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." + echo -e "\e[34mserver-cd-key\t\e[0mAdd your server cd key" echo -e "\e[34mmap-compressor\t\e[0mCompresses all ${gamename} server maps." } | column -s $'\t' -t esac From ddb475fa2e75ebe4c1c61094e5066ecbebdbf417 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 15:49:15 +0000 Subject: [PATCH 063/434] Added auto-install mode --- functions/install_ut2k4_key.sh | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/functions/install_ut2k4_key.sh b/functions/install_ut2k4_key.sh index 35a9599f6..34dcab124 100644 --- a/functions/install_ut2k4_key.sh +++ b/functions/install_ut2k4_key.sh @@ -4,6 +4,7 @@ # Website: http://gameservermanagers.com lgsm_version="271215" + echo "" echo "Enter ${gamename} CD Key" echo "=================================" @@ -12,8 +13,14 @@ echo "To get your server listed on the Master Server list" echo "you must get a free CD key. Get a key here:" echo "http://www.unrealtournament.com/ut2004server/cdkey.php" echo "" -echo "Once you have the key enter it below" -echo -n "KEY: " -read CODE -echo ""\""CDKey"\""="\""${CODE}"\""" > "${systemdir}/cdkey" +if [ -z "${autoinstall}" ]; then + echo "Once you have the key enter it below" + echo -n "KEY: " + read CODE + echo ""\""CDKey"\""="\""${CODE}"\""" > "${systemdir}/cdkey" + +else + echo "You can add your key using the following command" + echo "./${selfname} server-cd-key" +fi echo "" \ No newline at end of file From bceae77c2483b0cf5cc81d8d5182044c381939c1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 15:51:38 +0000 Subject: [PATCH 064/434] corrected if and renamed function --- ...te_functions.sh => command_update_functions.sh} | 2 +- functions/core_getopt.sh | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) rename functions/{update_functions.sh => command_update_functions.sh} (94%) diff --git a/functions/update_functions.sh b/functions/command_update_functions.sh similarity index 94% rename from functions/update_functions.sh rename to functions/command_update_functions.sh index 970dc9773..7cc1c4cb2 100644 --- a/functions/update_functions.sh +++ b/functions/command_update_functions.sh @@ -15,7 +15,7 @@ echo -ne "\n" if [ -d "${rootdir}/functions/" ]; then rm -rfv "${rootdir}/functions/" exitcode=$? -elif [ -z "${functionsdir}" ]; then +elif [ -n "${functionsdir}" ]; then rm -rfv "${functionsdir}/"* exitcode=$? else diff --git a/functions/core_getopt.sh b/functions/core_getopt.sh index 47cd5f748..899b6257a 100644 --- a/functions/core_getopt.sh +++ b/functions/core_getopt.sh @@ -20,7 +20,7 @@ case "$getopt" in forceupdate=1; update_check.sh;; uf|update-functions) - update_functions.sh;; + command_update_functions.sh;; v|validate) command_validate.sh;; m|monitor) @@ -81,7 +81,7 @@ case "$getopt" in u|update) update_check.sh;; uf|update-functions) - update_functions.sh;; + command_update_functions.sh;; m|monitor) command_monitor.sh;; et|email-test) @@ -133,7 +133,7 @@ case "$getopt" in r|restart) fn_restart;; uf|update-functions) - update_functions.sh;; + command_update_functions.sh;; m|monitor) command_monitor.sh;; et|email-test) @@ -183,7 +183,7 @@ case "$getopt" in forceupdate=1; update_check.sh;; uf|update-functions) - update_functions.sh;; + command_update_functions.sh;; v|validate) command_validate.sh;; m|monitor) @@ -242,7 +242,7 @@ case "$getopt" in r|restart) fn_restart;; uf|update-functions) - update_functions.sh;; + command_update_functions.sh;; m|monitor) command_monitor.sh;; et|email-test) @@ -305,7 +305,7 @@ case "$getopt" in forceupdate=1; update_check.sh;; uf|update-functions) - update_functions.sh;; + command_update_functions.sh;; v|validate) command_validate.sh;; m|monitor) @@ -368,7 +368,7 @@ case "$getopt" in r|restart) fn_restart;; uf|update-functions) - update_functions.sh;; + command_update_functions.sh;; m|monitor) command_monitor.sh;; et|email-test) From 2037faa487aa6951d710c777758dec49699e8f9b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 19:36:23 +0000 Subject: [PATCH 065/434] tee tidy --- functions/command_validate.sh | 4 ++-- functions/fix_ut99.sh | 2 +- functions/logs.sh | 14 +++++++------- functions/update_dl.sh | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/functions/command_validate.sh b/functions/command_validate.sh index b6dc36819..40e23c01e 100644 --- a/functions/command_validate.sh +++ b/functions/command_validate.sh @@ -29,9 +29,9 @@ if [ $(command -v unbuffer) ]; then fi if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" +app_update "${appid}" validate +quit|tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" +app_update "${appid}" validate +quit| tee -a "${scriptlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" validate +quit|tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" validate +quit| tee -a "${scriptlog}" fi fix.sh diff --git a/functions/fix_ut99.sh b/functions/fix_ut99.sh index d4ceca37f..aceb37128 100644 --- a/functions/fix_ut99.sh +++ b/functions/fix_ut99.sh @@ -12,7 +12,7 @@ echo "UpdateMinutes=1" echo "MasterServerAddress=unreal.epicgames.com" echo "MasterServerPort=27900" echo "Region=0" -}|tee -a "${servercfgfullpath}" > /dev/null 2>&1 +}| tee -a "${servercfgfullpath}" > /dev/null 2>&1 sleep 1 echo "removing dead gamespy.com master server." sed -i '/master0.gamespy.com/d' "${servercfgfullpath}" diff --git a/functions/logs.sh b/functions/logs.sh index a294c4d35..54c9a9836 100644 --- a/functions/logs.sh +++ b/functions/logs.sh @@ -37,18 +37,18 @@ if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; th echo -en "\n" # Logging logfiles to be removed according to "${logdays}", counting and removing them # Script logfiles - find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|tee >> "${scriptlog}" + find "${scriptlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" scriptcount=$(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) find "${scriptlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; # SRCDS and unreal logfiles if [ "${engine}" == "unreal2" ]||[ "${engine}" == "source" ]; then - find "${gamelogdir}"/ -type f -mtime +"${logdays}"|tee >> "${scriptlog}" + find "${gamelogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" gamecount=$(find "${gamelogdir}"/ -type f -mtime +"${logdays}"|wc -l) find "${gamelogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; fi # Console logfiles if [ -n "${consolelog}" ]; then - find "${consolelogdir}"/ -type f -mtime +"${logdays}"|tee >> "${scriptlog}" + find "${consolelogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" consolecount=$(find "${consolelogdir}"/ -type f -mtime +"${logdays}"|wc -l) find "${consolelogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; fi @@ -56,7 +56,7 @@ if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; th if [ "${engine}" == "source" ]; then # SourceMod logfiles if [ -d "${sourcemodlogdir}" ]; then - find "${sourcemodlogdir}"/ -type f -mtime +"${logdays}"|tee >> "${scriptlog}" + find "${sourcemodlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" smcount=$(find "${sourcemodlogdir}"/ -type f -mtime +"${logdays}"|wc -l) find "${sourcemodlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; fi @@ -64,13 +64,13 @@ if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; th if [ "${gamename}" == "Garry's Mod" ]; then # ULX logfiles if [ -d "${ulxlogdir}" ]; then - find "${ulxlogdir}"/ -type f -mtime +"${logdays}"|tee >> "${scriptlog}" + find "${ulxlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" ulxcount=$(find "${ulxlogdir}"/ -type f -mtime +"${logdays}"|wc -l) find "${ulxlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; fi # DarkRP logfiles if [ -d "${darkrplogdir}" ]; then - find "${darkrplogdir}"/ -type f -mtime +"${logdays}"|tee >> "${scriptlog}" + find "${darkrplogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" darkrpcount=$(find "${darkrplogdir}"/ -type f -mtime +"${logdays}"|wc -l) find "${darkrplogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; fi @@ -78,7 +78,7 @@ if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; th fi # Legacy support if [ -d "${legacyserverlogdir}" ]; then - find "${legacyserverlogdir}"/ -type f -mtime +"${logdays}"|tee >> "${scriptlog}" + find "${legacyserverlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" legacycount=$(find "${legacyserverlogdir}"/ -type f -mtime +"${logdays}"|wc -l) find "${legacyserverlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; # Remove folder if empty diff --git a/functions/update_dl.sh b/functions/update_dl.sh index a80caa6d8..0c07fc31a 100644 --- a/functions/update_dl.sh +++ b/functions/update_dl.sh @@ -19,9 +19,9 @@ if [ $(command -v unbuffer) ]; then fi if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" +quit|tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" +quit| tee -a "${scriptlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" +quit|tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" +quit| tee -a "${scriptlog}" fi fix.sh From 0dbeb0789cdac77f1d685630f66b0bc609ee3d0e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 19:36:49 +0000 Subject: [PATCH 066/434] Added script logging and removed unzip dep --- functions/check_deps.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/functions/check_deps.sh b/functions/check_deps.sh index 3f9312024..d562369a8 100644 --- a/functions/check_deps.sh +++ b/functions/check_deps.sh @@ -53,6 +53,7 @@ if [ "${#array_deps_missing[@]}" != "0" ]; then fn_printdots "Checking dependencies" sleep 2 fn_printwarn "Checking dependencies: Dependency missing: \e[0;31m${array_deps_missing[@]}\e[0m" + fn_scriptlog "Checking dependencies: Dependency missing: \e[0;31m${array_deps_missing[@]}\e[0m" sleep 1 echo -e "" sudo -n true > /dev/null 2>&1 @@ -73,6 +74,7 @@ if [ "${#array_deps_missing[@]}" != "0" ]; then else echo "" fn_printinfomationnl "$(whoami) does not have sudo access. manually install dependencies" + fn_scriptlog "$(whoami) does not have sudo access. manually install dependencies" echo "" if [ -n "$(command -v dpkg-query)" ]; then echo "sudo dpkg --add-architecture i386; sudo apt-get install ${array_deps_missing[@]}" @@ -147,7 +149,7 @@ if [ -n "$(command -v dpkg-query)" ]; then elif [ "${executable}" == "./ucc-bin" ]; then #UT2K4 if [ -f "${executabledir}/ut2004-bin" ]; then - array_deps_required+=( libsdl1.2debian libstdc++5:i386 bzip2 unzip ) + array_deps_required+=( libsdl1.2debian libstdc++5:i386 bzip2 ) #UT99 else array_deps_required+=( libsdl1.2debian bzip2 ) @@ -193,7 +195,7 @@ elif [ -n "$(command -v yum)" ]; then elif [ "${executable}" == "./ucc-bin" ]; then #UT2K4 if [ -f "${executabledir}/ut2004-bin" ]; then - array_deps_required+=( compat-libstdc++-33.i686 SDL.i686 bzip2 unzip ) + array_deps_required+=( compat-libstdc++-33.i686 SDL.i686 bzip2 ) #UT99 else array_deps_required+=( SDL.i686 bzip2 ) From 4c0eaa3144e0e37504d644b040250e4c6be67b10 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 19:49:10 +0000 Subject: [PATCH 067/434] No longer required --- functions/install_dl_ut2k4.sh | 54 ----------------------------------- functions/install_ut2k4.sh | 42 --------------------------- functions/install_ut99.sh | 42 --------------------------- 3 files changed, 138 deletions(-) delete mode 100644 functions/install_dl_ut2k4.sh delete mode 100644 functions/install_ut2k4.sh delete mode 100644 functions/install_ut99.sh diff --git a/functions/install_dl_ut2k4.sh b/functions/install_dl_ut2k4.sh deleted file mode 100644 index 687867e74..000000000 --- a/functions/install_dl_ut2k4.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash -# LGSM install_dl_ut2k4.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -echo "" -echo "Downloading Server Files" -echo "=================================" -sleep 1 -cd "${filesdir}" -if [ ! -f dedicatedserver3339-bonuspack.zip ]; then - wget http://gameservermanagers.com/files/ut2004/dedicatedserver3339-bonuspack.zip -else - echo "dedicatedserver3339-bonuspack.zip already downloaded!" -fi -echo "Running MD5 checksum to verify the file" -sleep 1 -echo "MD5 checksum: d3f28c5245c4c02802d48e4f0ffd3e34" -md5check=$(md5sum dedicatedserver3339-bonuspack.zip|awk '{print $1;}') -echo "File returned: ${md5check}" -if [ "${md5check}" != "d3f28c5245c4c02802d48e4f0ffd3e34" ]; then - echo "MD5 checksum: FAILED!" - read -p "Retry download? [y/N]" yn - case $yn in - [Yy]* ) rm -fv dedicatedserver3339-bonuspack.zip; install_dl_ut2k4.sh;; - [Nn]* ) echo Exiting; exit;; - * ) echo "Please answer yes or no.";; - esac -else - echo "MD5 checksum: PASSED" -fi -if [ ! -f ut2004-lnxpatch3369-2.tar.bz2 ]; then - wget http://gameservermanagers.com/files/ut2004/ut2004-lnxpatch3369-2.tar.bz2 -else - echo "ut2004-lnxpatch3369-2.tar.bz2 already downloaded!" -fi -echo "Running MD5 checksum to verify the file" -sleep 1 -echo "MD5 checksum: 0fa447e05fe5a38e0e32adf171be405e" -md5check=$(md5sum ut2004-lnxpatch3369-2.tar.bz2|awk '{print $1;}') -echo "File returned: ${md5check}" -if [ "${md5check}" != "0fa447e05fe5a38e0e32adf171be405e" ]; then - echo "MD5 checksum: FAILED!" - read -p "Retry download? [y/N]" yn - case $yn in - [Yy]* ) rm -fv ut2004-lnxpatch3369-2.tar.bz2; install_dl_ut2k4.sh;; - [Nn]* ) echo Exiting; exit;; - * ) echo "Please answer yes or no.";; - esac -else - echo "MD5 checksum: PASSED" -fi -echo "" \ No newline at end of file diff --git a/functions/install_ut2k4.sh b/functions/install_ut2k4.sh deleted file mode 100644 index 44d78b885..000000000 --- a/functions/install_ut2k4.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -# LGSM install_ut2k4.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -echo "" -echo "Installing ${gamename} Server" -echo "=================================" -sleep 1 -cd "${filesdir}" -echo "Extracting dedicatedserver3339-bonuspack.zip" -sleep 1 -unzip dedicatedserver3339-bonuspack.zip -echo "Extracting ut2004-lnxpatch3369-2.tar.bz2" -sleep 1 -tar -xvjf ut2004-lnxpatch3369-2.tar.bz2 UT2004-Patch/ --strip-components=1 -while true; do - read -p "Was the install successful? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) install_retry.sh;; - * ) echo "Please answer yes or no.";; -esac -done -while true; do - read -p "Remove ut2004-lnxpatch3369-2.tar.bz2? [y/N]" yn - case $yn in - [Yy]* ) rm -fv ut2004-lnxpatch3369-2.tar.bz2; break;; - [Nn]* ) break;; - * ) echo "Please answer yes or no.";; - esac -done -while true; do - read -p "Remove dedicatedserver3339-bonuspack.zip? [y/N]" yn - case $yn in - [Yy]* ) rm -fv dedicatedserver3339-bonuspack.zip; break;; - [Nn]* ) break;; - * ) echo "Please answer yes or no.";; - esac -done -echo "" \ No newline at end of file diff --git a/functions/install_ut99.sh b/functions/install_ut99.sh deleted file mode 100644 index 32b49f7a1..000000000 --- a/functions/install_ut99.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -# LGSM install_ut99.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -echo "" -echo "Installing ${gamename} Server" -echo "=================================" -sleep 1 -cd "${filesdir}" -echo "Extracting ut-server-436.tar.gz" -sleep 1 -tar -zxvf ut-server-436.tar.gz ut-server/ --strip-components=1 -echo "Extracting UTPGPatch451.tar.bz2" -sleep 1 -tar -jxvf UTPGPatch451.tar.bz2 -while true; do - read -p "Was the install successful? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) install_retry.sh;; - * ) echo "Please answer yes or no.";; -esac -done -while true; do - read -p "Remove ut-server-436.tar.gz? [y/N]" yn - case $yn in - [Yy]* ) rm -fv ut-server-436.tar.gz; break;; - [Nn]* ) break;; - * ) echo "Please answer yes or no.";; - esac -done -while true; do - read -p "Remove UTPGPatch451.tar.bz2? [y/N]" yn - case $yn in - [Yy]* ) rm -fv UTPGPatch451.tar.bz2; break;; - [Nn]* ) break;; - * ) echo "Please answer yes or no.";; - esac -done -echo "" \ No newline at end of file From 19b9e779d9e9a22736d556723f1e2b7eece098bd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 19:49:47 +0000 Subject: [PATCH 068/434] Added logging --- functions/install_complete.sh | 1 + functions/install_logs.sh | 5 +++-- functions/install_server_files.sh | 2 ++ functions/install_ut2k4_key.sh | 3 ++- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/functions/install_complete.sh b/functions/install_complete.sh index a782b4f7a..b6fab789d 100644 --- a/functions/install_complete.sh +++ b/functions/install_complete.sh @@ -12,6 +12,7 @@ if [ "${gamename}" == "Don't Starve Together" ]; then fi echo "=================================" echo "Install Complete!" +fn_scriptlog "Install Complete!" echo "" echo "To start server type:" echo "./${selfname} start" diff --git a/functions/install_logs.sh b/functions/install_logs.sh index 6496ad647..c90aadb36 100644 --- a/functions/install_logs.sh +++ b/functions/install_logs.sh @@ -2,7 +2,7 @@ # LGSM install_logs.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="270216" if [ "${checklogs}" != "1" ]; then echo "" @@ -44,4 +44,5 @@ if [ -d "${rootdir}/Steam/logs" ]; then ln -nfsv "${rootdir}/Steam/logs" "${rootdir}/log/steamcmd" fi fi -sleep 1 \ No newline at end of file +sleep 1 +fn_scriptlog "Logs installed" \ No newline at end of file diff --git a/functions/install_server_files.sh b/functions/install_server_files.sh index 112a7fe4b..8f152db84 100644 --- a/functions/install_server_files.sh +++ b/functions/install_server_files.sh @@ -29,6 +29,7 @@ while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do if [ "${counter}" -ge "2" ]; then fn_printwarningnl "SteamCMD did not complete the download, retrying: Attempt ${counter}:" + fn_scriptlog "SteamCMD did not complete the download, retrying: Attempt ${counter}:" fi if [ "${counter}" -ge "7" ]; then @@ -64,6 +65,7 @@ while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do fi elif [ "${counter}" -ge "11" ]; then fn_printfailurenl "SteamCMD did not complete the download, too many retrys" + fn_scriptlog "SteamCMD did not complete the download, too many retrys" break fi done diff --git a/functions/install_ut2k4_key.sh b/functions/install_ut2k4_key.sh index 34dcab124..f582f4c16 100644 --- a/functions/install_ut2k4_key.sh +++ b/functions/install_ut2k4_key.sh @@ -18,7 +18,8 @@ if [ -z "${autoinstall}" ]; then echo -n "KEY: " read CODE echo ""\""CDKey"\""="\""${CODE}"\""" > "${systemdir}/cdkey" - + if [ -f "${systemdir}/cdkey" ]; then + fn_scriptlog "UT2K4 Server CD Key created" else echo "You can add your key using the following command" echo "./${selfname} server-cd-key" From 364856e81916f711b79170a177161de78d1340d0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 19:50:03 +0000 Subject: [PATCH 069/434] Optimised function --- functions/install_gslt.sh | 53 +++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/functions/install_gslt.sh b/functions/install_gslt.sh index 5919fac33..b7649eade 100644 --- a/functions/install_gslt.sh +++ b/functions/install_gslt.sh @@ -2,41 +2,34 @@ # LGSM install_gslt.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="270216" # Description: Configures GSLT. -if [ -z "${autoinstall}" ]; then - echo "" - echo "Game Server Login Token" - echo "============================" - sleep 1 - if [ "${gamename}" == "Counter Strike: Global Offensive" ]; then - echo "GSLT is required to run a public ${gamename} server" - else - echo "GSLT is an optional feature for ${gamename} server" - fi +echo "" +echo "Game Server Login Token" +echo "============================" +sleep 1 +if [ "${gamename}" == "Counter Strike: Global Offensive" ]; then + echo "GSLT is required to run a public ${gamename} server" + fn_scriptlog "GSLT is required to run a public ${gamename} server" +else + echo "GSLT is an optional feature for ${gamename} server" + fn_scriptlog "GSLT is an optional feature for ${gamename} server" +fi - echo "Get more info and a token here:" - echo "http://gameservermanagers.com/gslt" - echo "" +echo "Get more info and a token here:" +echo "http://gameservermanagers.com/gslt" +fn_scriptlog "Get more info and a token here:" +fn_scriptlog "http://gameservermanagers.com/gslt" +echo "" +if [ -z "${autoinstall}" ]; then echo "Enter token below (Can be blank)." echo -n "GSLT TOKEN: " read token sed -i -e "s/gslt=\"\"/gslt=\"${token}\"/g" "${rootdir}/${selfname}" - sleep 1 - echo "The GSLT can be changed by editing ${selfname}." - echo "" -else - if [ "${gamename}" == "Counter Strike: Global Offensive" ]; then - fn_printinfomationnl "GSLT is required to run a public ${gamename} server" - else - fn_printinfomationnl "GSLT is an optional feature for ${gamename} server" - fi - echo "Get more info and a token here:" - echo "http://gameservermanagers.com/gslt" - echo "" - sleep 1 - echo "The GSLT can be changed by editing ${selfname}." - sleep 1 -fi \ No newline at end of file +fi +sleep 1 +echo "The GSLT can be changed by editing ${selfname}." +fn_scriptlog "The GSLT can be changed by editing ${selfname}." +echo "" \ No newline at end of file From f924b10dc3059d5aa0da5aa288f73d03dc7ac420 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 19:51:50 +0000 Subject: [PATCH 070/434] removed legacy functions dir --- functions/command_update_functions.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/functions/command_update_functions.sh b/functions/command_update_functions.sh index 7cc1c4cb2..3c530e4a0 100644 --- a/functions/command_update_functions.sh +++ b/functions/command_update_functions.sh @@ -12,10 +12,14 @@ fn_printdots "Updating functions" fn_scriptlog "Updating functions" sleep 1 echo -ne "\n" + +# Removed legecy functions dir if [ -d "${rootdir}/functions/" ]; then rm -rfv "${rootdir}/functions/" exitcode=$? -elif [ -n "${functionsdir}" ]; then +fi + +if [ -n "${functionsdir}" ]; then rm -rfv "${functionsdir}/"* exitcode=$? else From bc0fc9d1ccdc63cfac00627616dc73f16469d5fb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 19:55:32 +0000 Subject: [PATCH 071/434] Corrected update_functions name --- functions/check.sh | 4 ++-- functions/core_functions.sh | 4 ++-- functions/fn_update_functions | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/functions/check.sh b/functions/check.sh index dd64d9ef1..0c2fbe7bf 100644 --- a/functions/check.sh +++ b/functions/check.sh @@ -21,11 +21,11 @@ array_contains () { check_root.sh -if [ "${function_selfname}" != "command_install.sh" ] && [ "${function_selfname}" != "update_functions.sh" ]; then +if [ "${function_selfname}" != "command_install.sh" ] && [ "${function_selfname}" != "command_update_functions.sh" ]; then check_system_dir.sh fi -local allowed_commands_array=( command_backup.sh command_console.sh command_debug.sh command_details.sh command_unreal2_maps.sh command_ut99_maps.sh command_monitor.sh command_start.sh command_stop.sh update_check.sh command_validate.sh update_functions.sh command_email_test.sh ) +local allowed_commands_array=( command_backup.sh command_console.sh command_debug.sh command_details.sh command_unreal2_maps.sh command_ut99_maps.sh command_monitor.sh command_start.sh command_stop.sh update_check.sh command_validate.sh command_update_functions.sh command_email_test.sh ) for allowed_command in "${allowed_commands_array[@]}" do if [ "${allowed_command}" == "${function_selfname}" ]; then diff --git a/functions/core_functions.sh b/functions/core_functions.sh index eb1096828..5fbcc44d6 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -288,7 +288,7 @@ functionfile="${FUNCNAME}" fn_fetch_function } -update_functions.sh(){ +command_update_functions.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } @@ -298,7 +298,7 @@ functionfile="${FUNCNAME}" fn_fetch_function } -update_functions.sh(){ +fn_update_functions.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } diff --git a/functions/fn_update_functions b/functions/fn_update_functions index 2de9afd6d..bf4e5446d 100644 --- a/functions/fn_update_functions +++ b/functions/fn_update_functions @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM update_functions.sh function +# LGSM command_update_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com lgsm_version="230116" From 91c88c0632bbc95c48e2527d754b2771382591cf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 21:57:53 +0000 Subject: [PATCH 072/434] tidy --- functions/fn_update_functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/fn_update_functions b/functions/fn_update_functions index bf4e5446d..414649f6a 100644 --- a/functions/fn_update_functions +++ b/functions/fn_update_functions @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_update_functions.sh function +# LGSM fn_update_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com lgsm_version="230116" From 78be6b86913c380f6b243ceb8edbc7ef3a2a2650 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 21:58:58 +0000 Subject: [PATCH 073/434] Added code for legacy servers to allow them to work --- functions/core_functions.sh | 52 +++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/functions/core_functions.sh b/functions/core_functions.sh index 5fbcc44d6..b0813243d 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -2,12 +2,12 @@ # LGSM core_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="160216" +lgsm_version="270216" # Description: Defines all functions to allow download and execution of functions using fn_fetch_function. # This function is called first before any other function. Without this file other functions would not load. -#Legacy functions +# Code/functions for legacy lgsm scripts fn_functions(){ functionfile="${FUNCNAME}" @@ -19,6 +19,54 @@ functionfile="${FUNCNAME}" fn_fetch_function } +# fn_fetch_core_dl also placed here to allow legecy scripts to still download core functions +if [ -n "${lgsmdir}" ]; then + lgsmdir="${rootdir}/lgsm" + functionsdir="${lgsmdir}/functions" +fi + +fn_fetch_core_dl(){ +github_file_url_dir="functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then + if [ ! -d "${filedir}" ]; then + mkdir -p "${filedir}" + fi + echo -e " fetching ${filename}...\c" + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else + echo -e "\e[0;31mFAIL\e[0m\n" + echo "Curl is not installed!" + echo -e "" + exit 1 + fi + chmod +x "${filedir}/${filename}" +fi +source "${filedir}/${filename}" +} + # Core From ee76be76cf89891e8506780845c727284714cb88 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 21:59:26 +0000 Subject: [PATCH 074/434] Added message explaining multiple dl attempts --- functions/install_server_files.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/functions/install_server_files.sh b/functions/install_server_files.sh index 8f152db84..b09cc0ba2 100644 --- a/functions/install_server_files.sh +++ b/functions/install_server_files.sh @@ -28,8 +28,8 @@ while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do # Attempt 11: Failure if [ "${counter}" -ge "2" ]; then - fn_printwarningnl "SteamCMD did not complete the download, retrying: Attempt ${counter}:" - fn_scriptlog "SteamCMD did not complete the download, retrying: Attempt ${counter}:" + fn_printwarningnl "SteamCMD did not complete the download, retrying: Attempt ${counter}" + fn_scriptlog "SteamCMD did not complete the download, retrying: Attempt ${counter}" fi if [ "${counter}" -ge "7" ]; then @@ -73,6 +73,7 @@ done # Goldsource servers commonly fail to download all the server files required. # Validating a few of times may reduce the chance of this issue. if [ "${engine}" == "goldsource" ]; then + fn_printinfomationnl "Goldsource servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." counter="0" while [ "${counter}" -le "4" ]; do counter=$((counter+1)) From 3a5086c82146974fe8e6fb9339b7d40a40de490b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 Feb 2016 22:03:21 +0000 Subject: [PATCH 075/434] corrected if --- functions/core_functions.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/functions/core_functions.sh b/functions/core_functions.sh index b0813243d..c0490ffcb 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -7,7 +7,7 @@ lgsm_version="270216" # Description: Defines all functions to allow download and execution of functions using fn_fetch_function. # This function is called first before any other function. Without this file other functions would not load. -# Code/functions for legacy lgsm scripts +# Code/functions for legacy servers fn_functions(){ functionfile="${FUNCNAME}" @@ -19,8 +19,8 @@ functionfile="${FUNCNAME}" fn_fetch_function } -# fn_fetch_core_dl also placed here to allow legecy scripts to still download core functions -if [ -n "${lgsmdir}" ]; then +# fn_fetch_core_dl also placed here to allow legecy servers to still download core functions +if [ -z "${lgsmdir}" ]; then lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" fi From 190fa025323849cab7f7823f5208f7fc0037c285 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 13:10:33 +0000 Subject: [PATCH 076/434] code tidy --- functions/core_dl.sh | 83 ++++++++++++++++++++++++++++---------------- 1 file changed, 54 insertions(+), 29 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index d6fc8cd04..31143eb34 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -6,10 +6,17 @@ lgsm_version="050216" # Description: Deals with all downloads for LGSM. -# Downloads can be defined in code like so -# fn_dl "dl_filename" "dl_filepath" "dl_url" "dl_md5" -# fn_dl "file.tar.bz2" "/home/gameserver" "http://example.com/file.tar/bz2" "10cd7353aa9d758a075c600a6dd193fd" - +# fileurl: The URL of the file: http://example.com/dl/File.tar.bz2 +# filedir: location the file is to be saved: /home/server/lgsm/tmp +# filename: name of file (this can be different from the url name): file.tar.bz2 +# executecmd: Optional, set to "executecmd" to make file executable using chmod +x +# run: Optional, set to run to execute the file +# force: Optional, force re-download of file even if exists +# md5: Optional, Checks file against an md5 sum +# +# Downloads can be defined in code like so: +# fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" +# fn_fetch_file "http://example.com/file.tar.bz2" "/some/dir" "file.tar.bz2" "executecmd" "run" "force" "10cd7353aa9d758a075c600a6dd193fd" fn_dl_md5(){ # Runs MD5 Check if available @@ -34,12 +41,17 @@ if [ -n "${md5}" ]; then fi } +# Extracts bzip2 or gzip files +# Extracts can be defined in code like so: +# fn_dl_extract "${filedir}" "${filename}" "${extractdir}" +# fn_dl_extract "/home/gameserver/lgsm/tmp" "file.tar.bz2" "/home/gamserver/serverfiles" fn_dl_extract(){ filedir=${1} filename=${2} extractdir=${3} # extracts archives echo -ne "extracting ${filename}..." +fn_scriptlog "extracting download" mime=$(file -b --mime-type "${filedir}/${filename}") if [ "${mime}" == "application/gzip" ]; then @@ -50,7 +62,8 @@ fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_printfaileolnl - echo "${tarcmd}" + fn_scriptlog "extracting download: FAIL" + echo "${tarcmd}" | tee -a "${scriptlog}" exit ${exitcode} else fn_printokeolnl @@ -60,14 +73,14 @@ fi # Trap to remove file download if canceled before completed fn_fetch_trap() { echo "" - fn_printinfomationnl "Cancelling download" + fn_printinfomationnl "cancelling download" + fn_scriptlog "canceling download" sleep 1 - fn_printinfomation "Removing ${filename}" - rm -f "${filedir}/${filename}" + fn_printinfomation "removing ${filename}" + fn_scriptlog "removing ${filename}" + rm -f "${filedir}/${filename}" | tee -a "${scriptlog}" } -# Downloads file using curl and run it if required -# fn_fetch_file "fileurl" "filedir" "filename" "executecmd" "run" "force" "md5" fn_fetch_file(){ fileurl=${1} filedir=${2} @@ -98,27 +111,32 @@ if [ ! -f "${filedir}/${filename}" ]; then # if larger file shows progress bar if [ ${filename##*.} == "bz2" ]; then echo -ne "downloading ${filename}..." + fn_scriptlog "downloading ${filename}" sleep 1 curlcmd=$(${curlcmd} --progress-bar --fail -o "${filedir}/${filename}" "${fileurl}") echo -ne "downloading ${filename}..." else echo -ne " fetching ${filename}...\c" + fn_scriptlog "fetching ${filename}" curlcmd=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${fileurl}" 2>&1) fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_printfaileolnl - echo "${curlcmd}" - echo -e "${fileurl}\n" + fn_scriptlog "downloading ${filename}: FAIL" + echo "${curlcmd}" | tee -a "${scriptlog}" + echo -e "${fileurl}\n" | tee -a "${scriptlog}" exit ${exitcode} else fn_printokeolnl + fn_scriptlog "downloading ${filename}: OK" fi # remove trap trap - INT else fn_printfaileolnl echo "Curl is not installed!" + fn_scriptlog "Curl is not installed!" echo -e "" exit 1 fi @@ -138,36 +156,43 @@ fi } -# fn_fetch_file_github -# Parameters: -# github_file_url_dir: The directory the file is located in teh GitHub repo -# github_file_url_name: name of file -# filepath: location file to be saved + +# fileurl: The directory the file is located in teh GitHub repo +# filedir: name of file +# filename: location file to be saved # executecmd: set to "executecmd" to make file executecmd # run: Optional, set to run to execute the file # force: force download of file even if exists +# md5: Checks fail against an md5 sum + + +# Fetches files from the github repo fn_fetch_file_github(){ -github_file_url_dir=${1} -github_file_url_name=${2} -filepath=${3} -filename="${github_file_url_name}" -executecmd=${4:-0} -run=${5:-0} -force=${6:-0} +github_file_url_dir="${1}" +github_file_url_name="${2}" githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" -fn_fetch_file "${githuburl}" "${filepath}" "${filename}" "${executecmd}" "${run}" "${force}" +fileurl="${githuburl}" +filedir="${3}" +filename="${github_file_url_name}" +executecmd="${4:-0}" +run="${5:-0}" +force="${6:-0}" +md5="${7:-0}" +fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" } - # Fetches functions fn_fetch_function(){ github_file_url_dir="functions" # github dir containing the file github_file_url_name="${functionfile}" # name of the github file githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" -filedir="${functionsdir}" # local dir that will contain the file -filename="${github_file_url_name}" # name of the local file +fileurl="${githuburl}" +filedir="${functionsdir}" +filename="${github_file_url_name}" executecmd="executecmd" run="run" -fn_fetch_file "${githuburl}" "${filedir}" "${filename}" "${executecmd}" "${run}" +force="noforce" +md5="" +fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" } \ No newline at end of file From 0a5c682d717c8708c79ca6baaf54e3a7e745e760 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 13:10:47 +0000 Subject: [PATCH 077/434] corrected if best practice --- functions/command_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/command_install.sh b/functions/command_install.sh index e933b2598..fb4682d53 100644 --- a/functions/command_install.sh +++ b/functions/command_install.sh @@ -19,7 +19,7 @@ elif [ "${gamename}" == "Unreal Tournament 99" ]; then install_server_files.sh elif [ "${gamename}" == "Teamspeak 3" ]; then install_ts3.sh -elif [ ! -z "${appid}" ]; then +elif [ -n "${appid}" ]; then install_steamcmd.sh install_server_files.sh fi From 2d31f4795c34d208a83b302cca2c40f1e23a508e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 13:15:22 +0000 Subject: [PATCH 078/434] scriptlog will no longer be used if not installed --- functions/core_dl.sh | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 31143eb34..5ba80c58e 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -111,32 +111,39 @@ if [ ! -f "${filedir}/${filename}" ]; then # if larger file shows progress bar if [ ${filename##*.} == "bz2" ]; then echo -ne "downloading ${filename}..." - fn_scriptlog "downloading ${filename}" + if [ -z "${scriptlog}" ]; then + fn_scriptlog "downloading ${filename}" + fi sleep 1 curlcmd=$(${curlcmd} --progress-bar --fail -o "${filedir}/${filename}" "${fileurl}") echo -ne "downloading ${filename}..." else echo -ne " fetching ${filename}...\c" - fn_scriptlog "fetching ${filename}" + if [ -z "${scriptlog}" ]; then + fn_scriptlog "fetching ${filename}" + fi curlcmd=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${fileurl}" 2>&1) fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_printfaileolnl - fn_scriptlog "downloading ${filename}: FAIL" + if [ -z "${scriptlog}" ]; then + fn_scriptlog "downloading ${filename}: FAIL" + fi echo "${curlcmd}" | tee -a "${scriptlog}" echo -e "${fileurl}\n" | tee -a "${scriptlog}" exit ${exitcode} else fn_printokeolnl - fn_scriptlog "downloading ${filename}: OK" + if [ -z "${scriptlog}" ]; then + fn_scriptlog "downloading ${filename}: OK" + fi fi # remove trap trap - INT else fn_printfaileolnl echo "Curl is not installed!" - fn_scriptlog "Curl is not installed!" echo -e "" exit 1 fi From b038d38589cfdb8f2c2da23bf8b59a56152a50fb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 13:16:50 +0000 Subject: [PATCH 079/434] alterred to use -f --- functions/core_dl.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 5ba80c58e..7b2860f7e 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -111,7 +111,7 @@ if [ ! -f "${filedir}/${filename}" ]; then # if larger file shows progress bar if [ ${filename##*.} == "bz2" ]; then echo -ne "downloading ${filename}..." - if [ -z "${scriptlog}" ]; then + if [ -f "${scriptlog}" ]; then fn_scriptlog "downloading ${filename}" fi sleep 1 @@ -119,7 +119,7 @@ if [ ! -f "${filedir}/${filename}" ]; then echo -ne "downloading ${filename}..." else echo -ne " fetching ${filename}...\c" - if [ -z "${scriptlog}" ]; then + if [ -f "${scriptlog}" ]; then fn_scriptlog "fetching ${filename}" fi curlcmd=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${fileurl}" 2>&1) @@ -127,7 +127,7 @@ if [ ! -f "${filedir}/${filename}" ]; then local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_printfaileolnl - if [ -z "${scriptlog}" ]; then + if [ -f "${scriptlog}" ]; then fn_scriptlog "downloading ${filename}: FAIL" fi echo "${curlcmd}" | tee -a "${scriptlog}" @@ -135,7 +135,7 @@ if [ ! -f "${filedir}/${filename}" ]; then exit ${exitcode} else fn_printokeolnl - if [ -z "${scriptlog}" ]; then + if [ -f "${scriptlog}" ]; then fn_scriptlog "downloading ${filename}: OK" fi fi From 013332bfb1f1cae229218f32d975686efef9516a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 13:26:10 +0000 Subject: [PATCH 080/434] Update trap messages --- functions/core_dl.sh | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 7b2860f7e..856253592 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -73,12 +73,12 @@ fi # Trap to remove file download if canceled before completed fn_fetch_trap() { echo "" - fn_printinfomationnl "cancelling download" - fn_scriptlog "canceling download" + fn_printinfomationnl "downloading ${filename}: CANCELED" + fn_scriptlog "downloading ${filename}: CANCELED" sleep 1 - fn_printinfomation "removing ${filename}" - fn_scriptlog "removing ${filename}" + fn_printinfomation "downloading ${filename}: REMOVED" rm -f "${filedir}/${filename}" | tee -a "${scriptlog}" + fn_scriptlog "downloading ${filename}: REMOVED" } fn_fetch_file(){ @@ -111,17 +111,11 @@ if [ ! -f "${filedir}/${filename}" ]; then # if larger file shows progress bar if [ ${filename##*.} == "bz2" ]; then echo -ne "downloading ${filename}..." - if [ -f "${scriptlog}" ]; then - fn_scriptlog "downloading ${filename}" - fi sleep 1 curlcmd=$(${curlcmd} --progress-bar --fail -o "${filedir}/${filename}" "${fileurl}") echo -ne "downloading ${filename}..." else echo -ne " fetching ${filename}...\c" - if [ -f "${scriptlog}" ]; then - fn_scriptlog "fetching ${filename}" - fi curlcmd=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${fileurl}" 2>&1) fi local exitcode=$? From 9ea653ac84ad9c0191da2e773a9340e131de0d1b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 13:36:01 +0000 Subject: [PATCH 081/434] added exit to trap --- functions/core_dl.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 856253592..9d2a52233 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -79,6 +79,7 @@ fn_fetch_trap() { fn_printinfomation "downloading ${filename}: REMOVED" rm -f "${filedir}/${filename}" | tee -a "${scriptlog}" fn_scriptlog "downloading ${filename}: REMOVED" + exit } fn_fetch_file(){ From 6d1819e05fd0950511a57cb2b7eca990e419bb85 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 13:41:38 +0000 Subject: [PATCH 082/434] Added CANCELED and REMOVED eol --- functions/core_messages.sh | 18 ++++++++++++++++++ functions/install_logs.sh | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/functions/core_messages.sh b/functions/core_messages.sh index 88a0a8127..8d4f87ebe 100644 --- a/functions/core_messages.sh +++ b/functions/core_messages.sh @@ -162,4 +162,22 @@ fn_printqueryingeol(){ fn_printqueryingeolnl(){ echo -e "\e[0;31mQUERYING\e[0m\n" +} + +# CANCELED for end of line +fn_printcanceledeol(){ + echo -en "\e[0;31mQUERYING\e[0m\n" +} + +fn_printcanceledeolnl(){ + echo -e "\e[0;31mQUERYING\e[0m\n" +} + +# REMOVED for end of line +fn_printremovedeol(){ + echo -en "\e[0;31mQUERYING\e[0m\n" +} + +fn_printremovedeolnl(){ + echo -e "\e[0;31mQUERYING\e[0m\n" } \ No newline at end of file diff --git a/functions/install_logs.sh b/functions/install_logs.sh index c90aadb36..2722ef19b 100644 --- a/functions/install_logs.sh +++ b/functions/install_logs.sh @@ -45,4 +45,4 @@ if [ -d "${rootdir}/Steam/logs" ]; then fi fi sleep 1 -fn_scriptlog "Logs installed" \ No newline at end of file +fn_scriptlog "logs installed" \ No newline at end of file From 83a5a22a6e8dc41cd7e1972d3df45544fa318a55 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 13:42:18 +0000 Subject: [PATCH 083/434] added canceled and removed --- functions/core_messages.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/functions/core_messages.sh b/functions/core_messages.sh index 8d4f87ebe..56251e6db 100644 --- a/functions/core_messages.sh +++ b/functions/core_messages.sh @@ -166,18 +166,18 @@ fn_printqueryingeolnl(){ # CANCELED for end of line fn_printcanceledeol(){ - echo -en "\e[0;31mQUERYING\e[0m\n" + echo -en "\e[0;31mCANCELED\e[0m\n" } fn_printcanceledeolnl(){ - echo -e "\e[0;31mQUERYING\e[0m\n" + echo -e "\e[0;31mCANCELED\e[0m\n" } # REMOVED for end of line fn_printremovedeol(){ - echo -en "\e[0;31mQUERYING\e[0m\n" + echo -en "\e[0;31mREMOVED\e[0m\n" } fn_printremovedeolnl(){ - echo -e "\e[0;31mQUERYING\e[0m\n" + echo -e "\e[0;31mREMOVED\e[0m\n" } \ No newline at end of file From fedd6394e60d3d92211ab7d4b336aaf31163ef89 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 13:44:47 +0000 Subject: [PATCH 084/434] Updated trap messages --- functions/core_dl.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 9d2a52233..fae71b735 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -73,11 +73,13 @@ fi # Trap to remove file download if canceled before completed fn_fetch_trap() { echo "" - fn_printinfomationnl "downloading ${filename}: CANCELED" + echo -ne "downloading ${filename}: " + fn_printcanceledeol fn_scriptlog "downloading ${filename}: CANCELED" sleep 1 - fn_printinfomation "downloading ${filename}: REMOVED" rm -f "${filedir}/${filename}" | tee -a "${scriptlog}" + echo -ne "downloading ${filename}: " + fn_printremovedeol fn_scriptlog "downloading ${filename}: REMOVED" exit } From 931cf2855f94783dd30232a6810f662057ae3e89 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 13:51:01 +0000 Subject: [PATCH 085/434] updated md5sums --- functions/install_server_files.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/functions/install_server_files.sh b/functions/install_server_files.sh index b09cc0ba2..b99bb9692 100644 --- a/functions/install_server_files.sh +++ b/functions/install_server_files.sh @@ -6,12 +6,11 @@ lgsm_version="270216" fn_install_server_files(){ if [ "${gamename}" == "Unreal Tournament 99" ]; then - fileurl="http://gameservermanagers.com/files/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut99-server-451-ultimate-linux.tar.bz2"; run="norun"; force="noforce"; md5="e623fdff5ed600a9bfccab852e18d34d" + fileurl="http://gameservermanagers.com/files/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut99-server-451-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" elif [ "${gamename}" == "Unreal Tournament 2004" ]; then - fileurl="http://gameservermanagers.com/files/UnrealTournament2004/ut2004-server-3339-ultimate-linux.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut2004-server-3339-ultimate-linux.tar.bz2"; run="norun"; force="noforce"; md5="e623fdff5ed600a9bfccab852e18d34d" + fileurl="http://gameservermanagers.com/files/UnrealTournament2004/ut2004-server-3339-ultimate-linux.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut2004-server-3339-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" fi - -fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${run}" "${force}" "${md5}" +fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" fn_dl_extract "${filedir}" "${filename}" "${filesdir}" } From d9f9e76ad974b07b30ac5a57467e1c6c08a38075 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 14:47:40 +0000 Subject: [PATCH 086/434] Added module name to all install functions --- functions/command_install.sh | 1 + functions/core_dl.sh | 4 ++-- functions/install_complete.sh | 2 ++ functions/install_config.sh | 2 ++ functions/install_gslt.sh | 2 ++ functions/install_header.sh | 2 ++ functions/install_logs.sh | 2 ++ functions/install_retry.sh | 2 ++ functions/install_server_dir.sh | 2 ++ functions/install_server_files.sh | 2 ++ functions/install_steamcmd.sh | 2 ++ functions/install_ts3.sh | 2 ++ functions/install_ts3db.sh | 2 ++ functions/install_ut2k4_key.sh | 1 + 14 files changed, 26 insertions(+), 2 deletions(-) diff --git a/functions/command_install.sh b/functions/command_install.sh index fb4682d53..9c7eb7180 100644 --- a/functions/command_install.sh +++ b/functions/command_install.sh @@ -4,6 +4,7 @@ # Website: http://gameservermanagers.com lgsm_version="260216" +local modulename="Install" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh diff --git a/functions/core_dl.sh b/functions/core_dl.sh index fae71b735..597a97150 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -28,13 +28,13 @@ if [ -n "${md5}" ]; then fn_printfaileolnl echo "${filename} returned MD5 checksum: ${md5sumcmd}" echo "expected MD5 checksum: ${md5}" - fn_scriptlog "failed to verify ${filename} with MD5" + fn_scriptlog "verifying ${filename} with MD5: FAIL" fn_scriptlog "${filename} returned MD5 checksum: ${md5sumcmd}" fn_scriptlog "expected MD5 checksum: ${md5}" exit 1 else fn_printokeolnl - fn_scriptlog "verifyed ${filename} with MD5" + fn_scriptlog "verifying ${filename} with MD5: OK" fn_scriptlog "${filename} returned MD5 checksum: ${md5sumcmd}" fn_scriptlog "expected MD5 checksum: ${md5}" fi diff --git a/functions/install_complete.sh b/functions/install_complete.sh index b6fab789d..5ea9a127b 100644 --- a/functions/install_complete.sh +++ b/functions/install_complete.sh @@ -4,6 +4,8 @@ # Website: http://gameservermanagers.com lgsm_version="271215" +local modulename="Install" + if [ "${gamename}" == "Don't Starve Together" ]; then echo "" echo "An Authentication Token is required to run this server!" diff --git a/functions/install_config.sh b/functions/install_config.sh index 257e29fd7..a47be1157 100644 --- a/functions/install_config.sh +++ b/functions/install_config.sh @@ -4,6 +4,8 @@ # Website: http://gameservermanagers.com lgsm_version="100116" +local modulename="Install" + fn_defaultconfig(){ echo "creating ${servercfg} config file." cp -v "${servercfgdefault}" "${servercfgfullpath}" diff --git a/functions/install_gslt.sh b/functions/install_gslt.sh index b7649eade..5bd309f28 100644 --- a/functions/install_gslt.sh +++ b/functions/install_gslt.sh @@ -6,6 +6,8 @@ lgsm_version="270216" # Description: Configures GSLT. +local modulename="Install" + echo "" echo "Game Server Login Token" echo "============================" diff --git a/functions/install_header.sh b/functions/install_header.sh index ae8ab9240..2f48fdc9c 100644 --- a/functions/install_header.sh +++ b/functions/install_header.sh @@ -4,6 +4,8 @@ # Website: http://gameservermanagers.com lgsm_version="271215" +local modulename="Install" + clear echo "=================================" echo "${gamename}" diff --git a/functions/install_logs.sh b/functions/install_logs.sh index 2722ef19b..a1687d962 100644 --- a/functions/install_logs.sh +++ b/functions/install_logs.sh @@ -4,6 +4,8 @@ # Website: http://gameservermanagers.com lgsm_version="270216" +local modulename="Install" + if [ "${checklogs}" != "1" ]; then echo "" echo "Creating log directorys" diff --git a/functions/install_retry.sh b/functions/install_retry.sh index 2e7697af5..7f04ac9ed 100644 --- a/functions/install_retry.sh +++ b/functions/install_retry.sh @@ -4,6 +4,8 @@ # Website: http://gameservermanagers.com lgsm_version="271215" +local modulename="Install" + while true; do read -e -i "y" -p "Retry install? [Y/n]" yn case $yn in diff --git a/functions/install_server_dir.sh b/functions/install_server_dir.sh index 2c664e8e3..1a4f54b77 100644 --- a/functions/install_server_dir.sh +++ b/functions/install_server_dir.sh @@ -4,6 +4,8 @@ # Website: http://gameservermanagers.com lgsm_version="271215" +local modulename="Install" + echo "" echo "Server Directory" echo "=================================" diff --git a/functions/install_server_files.sh b/functions/install_server_files.sh index b99bb9692..f345c09f1 100644 --- a/functions/install_server_files.sh +++ b/functions/install_server_files.sh @@ -4,6 +4,8 @@ # Website: http://gameservermanagers.com lgsm_version="270216" +local modulename="Install" + fn_install_server_files(){ if [ "${gamename}" == "Unreal Tournament 99" ]; then fileurl="http://gameservermanagers.com/files/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut99-server-451-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" diff --git a/functions/install_steamcmd.sh b/functions/install_steamcmd.sh index 1f744e7f6..de371bbd8 100644 --- a/functions/install_steamcmd.sh +++ b/functions/install_steamcmd.sh @@ -6,6 +6,8 @@ lgsm_version="271215" # Description: Downloads SteamCMD on install. +local modulename="Install" + echo "" echo "Installing SteamCMD" echo "=================================" diff --git a/functions/install_ts3.sh b/functions/install_ts3.sh index 27598ac56..3a2acc224 100644 --- a/functions/install_ts3.sh +++ b/functions/install_ts3.sh @@ -4,6 +4,8 @@ # Website: http://gameservermanagers.com lgsm_version="271215" +local modulename="Install" + info_distro.sh # Gets the teamspeak server architecture if [ "${arch}" == "x86_64" ]; then diff --git a/functions/install_ts3db.sh b/functions/install_ts3db.sh index 57c87b97d..90f5b0329 100644 --- a/functions/install_ts3db.sh +++ b/functions/install_ts3db.sh @@ -5,6 +5,8 @@ # Website: http://gameservermanagers.com lgsm_version="271215" +local modulename="Install" + fn_install_ts3db_mariadb(){ echo "" echo "checking if libmariadb2 is installed" diff --git a/functions/install_ut2k4_key.sh b/functions/install_ut2k4_key.sh index f582f4c16..53b603de1 100644 --- a/functions/install_ut2k4_key.sh +++ b/functions/install_ut2k4_key.sh @@ -4,6 +4,7 @@ # Website: http://gameservermanagers.com lgsm_version="271215" +local modulename="Install" echo "" echo "Enter ${gamename} CD Key" From 664c35413cd1d346a2fe55c6a22d797b02b62133 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 14:55:53 +0000 Subject: [PATCH 087/434] Fixed gsquery.py download --- functions/core_dl.sh | 4 ++-- functions/monitor_gsquery.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 597a97150..8275d5770 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -20,7 +20,7 @@ lgsm_version="050216" fn_dl_md5(){ # Runs MD5 Check if available -if [ -n "${md5}" ]; then +if [ -n "${md5}" ]||[ "${md5}" == "nomd5" ]; then echo -ne "verifying ${filename} with MD5..." sleep 1 local md5sumcmd=$(md5sum "${filedir}/${filename}"|awk '{print $1;}') @@ -181,7 +181,7 @@ filename="${github_file_url_name}" executecmd="${4:-0}" run="${5:-0}" force="${6:-0}" -md5="${7:-0}" +md5="${7}" fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" } diff --git a/functions/monitor_gsquery.sh b/functions/monitor_gsquery.sh index c714d64ee..5fa63b32e 100644 --- a/functions/monitor_gsquery.sh +++ b/functions/monitor_gsquery.sh @@ -11,7 +11,7 @@ local modulename="Monitor" # Downloads gsquery.py if missing if [ ! -f "${functionsdir}/gsquery.py" ]; then - fn_fetch_file_github "functions" "gsquery.py" "${functionsdir}" "executecmd" "norun" "noforce" + fn_fetch_file_github "functions" "gsquery.py" "${functionsdir}" "executecmd" "norun" "noforce" "nomd5" fi info_config.sh From ece19b33550a2632b43e3a9aee1ed0a3a98eebd4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 16:01:33 +0000 Subject: [PATCH 088/434] Updated messages func names Update al messages function names to make is easier to read --- functions/check_config.sh | 2 +- functions/check_deps.sh | 8 +-- functions/check_ip.sh | 2 +- functions/check_logs.sh | 4 +- functions/check_root.sh | 2 +- functions/check_steamcmd.sh | 12 ++--- functions/check_system_dir.sh | 2 +- functions/check_tmux.sh | 2 +- functions/command_backup.sh | 4 +- functions/command_console.sh | 8 +-- functions/command_debug.sh | 8 +-- functions/command_details.sh | 2 +- functions/command_dev_debug.sh | 4 +- functions/command_email_test.sh | 2 +- functions/command_monitor.sh | 26 +++++----- functions/command_start.sh | 20 ++++---- functions/command_stop.sh | 38 +++++++------- functions/command_ts3_server_pass.sh | 10 ++-- functions/command_update_functions.sh | 8 +-- functions/command_validate.sh | 6 +-- functions/core_dl.sh | 18 +++---- functions/core_messages.sh | 73 ++++++++++++++------------- functions/email.sh | 4 +- functions/fix_arma3.sh | 8 +-- functions/fix_csgo.sh | 8 +-- functions/fix_dst.sh | 8 +-- functions/fix_glibc.sh | 4 +- functions/fix_steamcmd.sh | 8 +-- functions/fn_update_functions | 6 +-- functions/install_server_dir.sh | 2 +- functions/install_server_files.sh | 6 +-- functions/install_ts3.sh | 6 +-- functions/install_ts3db.sh | 2 +- functions/logs.sh | 8 +-- functions/monitor_gsquery.sh | 20 ++++---- functions/update_check.sh | 54 ++++++++++---------- functions/update_dl.sh | 4 +- tests/tests_jc2server.sh | 12 ++--- tests/tests_ts3server.sh | 6 +-- 39 files changed, 215 insertions(+), 212 deletions(-) diff --git a/functions/check_config.sh b/functions/check_config.sh index 24d32318f..c329cca95 100644 --- a/functions/check_config.sh +++ b/functions/check_config.sh @@ -8,7 +8,7 @@ lgsm_version="060116" if [ ! -e "${servercfgfullpath}" ]; then if [ "${gamename}" != "Hurtworld" ]; then - fn_printwarnnl "Config file missing!" + fn_print_warn_nl "Config file missing!" echo "${servercfgfullpath}" fn_scriptlog "Configuration file missing!" fn_scriptlog "${servercfgfullpath}" diff --git a/functions/check_deps.sh b/functions/check_deps.sh index d562369a8..3cd5d32ce 100644 --- a/functions/check_deps.sh +++ b/functions/check_deps.sh @@ -50,15 +50,15 @@ fi fn_found_missing_deps(){ if [ "${#array_deps_missing[@]}" != "0" ]; then - fn_printdots "Checking dependencies" + fn_print_dots "Checking dependencies" sleep 2 - fn_printwarn "Checking dependencies: Dependency missing: \e[0;31m${array_deps_missing[@]}\e[0m" + fn_print_warn "Checking dependencies: Dependency missing: \e[0;31m${array_deps_missing[@]}\e[0m" fn_scriptlog "Checking dependencies: Dependency missing: \e[0;31m${array_deps_missing[@]}\e[0m" sleep 1 echo -e "" sudo -n true > /dev/null 2>&1 if [ $? -eq 0 ]; then - fn_printinfonl "Attempting to install missing dependencies automatically" + fn_print_info_nl "Attempting to install missing dependencies automatically" echo -en ".\r" sleep 1 echo -en "..\r" @@ -73,7 +73,7 @@ if [ "${#array_deps_missing[@]}" != "0" ]; then fi else echo "" - fn_printinfomationnl "$(whoami) does not have sudo access. manually install dependencies" + fn_print_infomation_nl "$(whoami) does not have sudo access. manually install dependencies" fn_scriptlog "$(whoami) does not have sudo access. manually install dependencies" echo "" if [ -n "$(command -v dpkg-query)" ]; then diff --git a/functions/check_ip.sh b/functions/check_ip.sh index 3e7e86cd3..c4b5be149 100644 --- a/functions/check_ip.sh +++ b/functions/check_ip.sh @@ -20,7 +20,7 @@ else if [ "${ip}" == "0.0.0.0" ]||[ "${ip}" == "" ]; then if [ "${getipwc}" -ge "2" ]; then - fn_printwarn "Multiple active network interfaces found.\n\n" + fn_print_warn "Multiple active network interfaces found.\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" diff --git a/functions/check_logs.sh b/functions/check_logs.sh index 92ed2cad1..f390eeab4 100644 --- a/functions/check_logs.sh +++ b/functions/check_logs.sh @@ -8,9 +8,9 @@ lgsm_version="271215" # Create dir's for the script and console logs if [ ! -d "${scriptlogdir}" ]; then - fn_printdots "Checking for log files" + fn_print_dots "Checking for log files" sleep 1 - fn_printinfo "Checking for log files: Creating log files" + fn_print_info "Checking for log files: Creating log files" echo -en "\n" checklogs=1 install_logs.sh diff --git a/functions/check_root.sh b/functions/check_root.sh index 8f2e5ed54..1a37cef57 100644 --- a/functions/check_root.sh +++ b/functions/check_root.sh @@ -5,7 +5,7 @@ lgsm_version="271215" if [ $(whoami) = "root" ]; then - fn_printfailnl "Do NOT run this script as root!" + fn_print_fail_nl "Do NOT run this script as root!" if [ -d "${scriptlogdir}" ]; then fn_scriptlog "${selfname} attempted to run as root." fi diff --git a/functions/check_steamcmd.sh b/functions/check_steamcmd.sh index 760b0b835..4039c4ef8 100644 --- a/functions/check_steamcmd.sh +++ b/functions/check_steamcmd.sh @@ -20,7 +20,7 @@ chmod +x "${steamcmddir}/steamcmd.sh" fn_check_steamcmd_user(){ # Checks steamuser is setup. if [ "${steamuser}" == "username" ]; then - fn_printfailnl "Steam login not set. Update steamuser." + fn_print_fail_nl "Steam login not set. Update steamuser." echo " * Change steamuser=\"username\" to a valid steam login." if [ -d "${scriptlogdir}" ]; then fn_scriptlog "edit ${selfname}. change steamuser=\"username\" to a valid steam login." @@ -29,7 +29,7 @@ if [ "${steamuser}" == "username" ]; then fi # Anonymous user is set if steamuser is missing if [ -z "${steamuser}" ]; then - fn_printwarnnl "Steam login not set. Using anonymous login." + fn_print_warn_nl "Steam login not set. Using anonymous login." if [ -d "${scriptlogdir}" ]; then fn_scriptlog "Steam login not set. Using anonymous login." fi @@ -47,14 +47,14 @@ if [ ! -f "${steamcmddir}/steamcmd.sh" ]; then if [ "${function_selfname}" == "command_install.sh" ]; then fn_install_steamcmd else - fn_printwarnnl "SteamCMD is missing" + fn_print_warn_nl "SteamCMD is missing" fn_scriptlog "SteamCMD is missing" sleep 1 fn_install_steamcmd fi elif [ "${function_selfname}" == "command_install.sh" ]; then - fn_printinfomation "SteamCMD is already installed..." - fn_printokeolnl + fn_print_infomation "SteamCMD is already installed..." + fn_print_ok_eol_nl fi } @@ -63,7 +63,7 @@ if [ "${function_selfname}" == "command_update.sh" ]||[ "${function_selfname}" = # Checks that steamcmd is working correctly and will prompt Steam Guard if required. "${steamcmddir}"/steamcmd.sh +login "${steamuser}" "${steampass}" +quit if [ $? -ne 0 ]; then - fn_printfailurenl "Error running SteamCMD" + fn_print_failure_nl "Error running SteamCMD" fi fi } diff --git a/functions/check_system_dir.sh b/functions/check_system_dir.sh index ecada4e09..d5d57e75b 100644 --- a/functions/check_system_dir.sh +++ b/functions/check_system_dir.sh @@ -5,7 +5,7 @@ lgsm_version="271215" if [ ! -d "${systemdir}" ]; then - fn_printfailnl "Cannot access ${systemdir}: No such directory" + fn_print_fail_nl "Cannot access ${systemdir}: No such directory" if [ -d "${scriptlogdir}" ]; then fn_scriptlog "Cannot access ${systemdir}: No such directory." fi diff --git a/functions/check_tmux.sh b/functions/check_tmux.sh index ac142ebe4..49f43dd21 100644 --- a/functions/check_tmux.sh +++ b/functions/check_tmux.sh @@ -9,7 +9,7 @@ lgsm_version="271215" if [ "$(command -v tmux)" ]||[ "$(which tmux >/dev/null 2>&1)" ]||[ -f "/usr/bin/tmux" ]||[ -f "/bin/tmux" ]; then : else - fn_printfailnl "Tmux not installed" + fn_print_fail_nl "Tmux not installed" sleep 1 fn_scriptlog "Tmux is not installed" echo " * Tmux is required to run this server." diff --git a/functions/command_backup.sh b/functions/command_backup.sh index 5f923ad07..d8d52f4bc 100644 --- a/functions/command_backup.sh +++ b/functions/command_backup.sh @@ -30,7 +30,7 @@ done tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") if [ "${tmuxwc}" -eq 1 ]; then echo "" - fn_printwarningnl "${servicename} is currently running." + fn_print_warning_nl "${servicename} is currently running." sleep 1 while true; do read -p "Stop ${servicename} while running the backup? [y/N]" yn @@ -59,6 +59,6 @@ echo "Backup created: ${backupdir}/${backupname}.tar.gz" fn_scriptlog "Created: ${backupdir}/${backupname}.tar.gz" sleep 1 echo "" -fn_printcompletenl "Complete." +fn_print_complete_nl "Complete." fn_scriptlog "Complete" echo "" diff --git a/functions/command_console.sh b/functions/command_console.sh index 4eab4d6eb..f7f2c1323 100644 --- a/functions/command_console.sh +++ b/functions/command_console.sh @@ -15,7 +15,7 @@ echo "${gamename} Console" echo "============================" echo "" echo "Press \"CTRL+b d\" to exit console." -fn_printwarningnl "Do NOT press CTRL+c to exit." +fn_print_warning_nl "Do NOT press CTRL+c to exit." echo "" while true; do read -e -i "y" -p "Continue? [y/N]" yn @@ -25,16 +25,16 @@ while true; do * ) echo "Please answer yes or no.";; esac done -fn_printdots "Starting" +fn_print_dots "Starting" sleep 1 tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") if [ "${tmuxwc}" -eq 1 ]; then - fn_printoknl "Starting" + fn_print_ok_nl "Starting" fn_scriptlog "accessed" sleep 1 tmux attach-session -t ${servicename} else - fn_printfailnl "Server not running" + fn_print_fail_nl "Server not running" fn_scriptlog "Failed to access: Server not running" sleep 1 while true; do diff --git a/functions/command_debug.sh b/functions/command_debug.sh index 097ddf289..7c9aca38b 100644 --- a/functions/command_debug.sh +++ b/functions/command_debug.sh @@ -31,7 +31,7 @@ fi echo "" echo -e "Use for identifying server issues only!" echo -e "Press CTRL+c to drop out of debug mode." -fn_printwarningnl "If ${servicename} is already running it will be stopped." +fn_print_warning_nl "If ${servicename} is already running it will be stopped." echo "" while true; do read -e -i "y" -p "Continue? [Y/n]" yn @@ -42,13 +42,13 @@ while true; do esac done fn_scriptlog "Starting debug" -fn_printinfonl "Stopping any running servers" +fn_print_info_nl "Stopping any running servers" fn_scriptlog "Stopping any running servers" sleep 1 command_stop.sh -fn_printdots "Starting debug" +fn_print_dots "Starting debug" sleep 1 -fn_printok "Starting debug" +fn_print_ok "Starting debug" fn_scriptlog "Started debug" sleep 1 echo -en "\n" diff --git a/functions/command_details.sh b/functions/command_details.sh index 0084f20e5..177575fe8 100644 --- a/functions/command_details.sh +++ b/functions/command_details.sh @@ -628,5 +628,5 @@ elif [ "${gamename}" == "7 Days To Die" ]; then elif [ "${gamename}" == "Teamspeak 3" ]; then fn_details_teamspeak3 else - fn_printerrornl "Unable to detect server engine." + fn_print_error_nl "Unable to detect server engine." fi diff --git a/functions/command_dev_debug.sh b/functions/command_dev_debug.sh index e2c9d9cc5..1855f5919 100644 --- a/functions/command_dev_debug.sh +++ b/functions/command_dev_debug.sh @@ -8,8 +8,8 @@ function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" if [ -f ".dev-debug" ]; then rm .dev-debug - fn_printoknl "Disabled dev-debug" + fn_print_ok_nl "Disabled dev-debug" else date > .dev-debug - fn_printoknl "Enabled dev-debug" + fn_print_ok_nl "Enabled dev-debug" fi \ No newline at end of file diff --git a/functions/command_email_test.sh b/functions/command_email_test.sh index b24ff3b01..26a0b6a42 100644 --- a/functions/command_email_test.sh +++ b/functions/command_email_test.sh @@ -17,6 +17,6 @@ if [ "${emailnotification}" = "on" ]; then actiontaken="Sent test email...hello is this thing on?" email.sh else - fn_printfailnl "Notifications not enabled" + fn_print_fail_nl "Notifications not enabled" fn_scriptlog "Notifications not enabled" fi \ No newline at end of file diff --git a/functions/command_monitor.sh b/functions/command_monitor.sh index f253abc54..e09b6236c 100644 --- a/functions/command_monitor.sh +++ b/functions/command_monitor.sh @@ -13,33 +13,33 @@ function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_monitor_teamspeak3(){ check.sh logs.sh -fn_printdots "${servername}" +fn_print_dots "${servername}" fn_scriptlog "${servername}" sleep 1 if [ ! -f "${rootdir}/${lockselfname}" ]; then - fn_printinfo "Disabled: No lock file found" + fn_print_info "Disabled: No lock file found" fn_scriptlog "Disabled: No lock file found" sleep 1 echo -en "\n" echo "To enable monitor run ./${selfname} start" exit 1 fi -fn_printdots "Checking session: CHECKING" +fn_print_dots "Checking session: CHECKING" fn_scriptlog "Checking session: CHECKING" sleep 1 info_ts3status.sh if [ "${ts3status}" = "Server is running" ]; then - fn_printok "Checking session: OK" + fn_print_ok "Checking session: OK" fn_scriptlog "Checking session: OK" sleep 1 sleep 0.5 echo -en "\n" exit else - fn_printfail "Checking session: FAIL" + fn_print_fail "Checking session: FAIL" fn_scriptlog "Checking session: FAIL" sleep 1 - fn_printfail "Checking session: FAIL: ${ts3status}" + fn_print_fail "Checking session: FAIL: ${ts3status}" fn_scriptlog "Checking session: FAIL: ${ts3status}" failurereason="${ts3status}" if [ "${emailnotification}" = "on" ]; then @@ -56,11 +56,11 @@ fn_restart fn_monitor_tmux(){ check.sh info_config.sh -fn_printdots "${servername}" +fn_print_dots "${servername}" fn_scriptlog "${servername}" sleep 1 if [ ! -f "${rootdir}/${lockselfname}" ]; then - fn_printinfo "Disabled: No lock file found" + fn_print_info "Disabled: No lock file found" fn_scriptlog "Disabled: No lock file found" sleep 1 echo -en "\n" @@ -70,12 +70,12 @@ fi updatecheck=$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l) if [ "${updatecheck}" = "0" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament 2004" ]; then - fn_printdots "Checking session: CHECKING" + fn_print_dots "Checking session: CHECKING" fn_scriptlog "Checking session: CHECKING" sleep 1 tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") if [ "${tmuxwc}" -eq 1 ]; then - fn_printok "Checking session: OK" + fn_print_ok "Checking session: OK" fn_scriptlog "Checking session: OK" sleep 1 echo -en "\n" @@ -85,7 +85,7 @@ if [ "${updatecheck}" = "0" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "$ fi exit $? else - fn_printfail "Checking session: FAIL" + fn_print_fail "Checking session: FAIL" fn_scriptlog "Checking session: FAIL" sleep 1 echo -en "\n" @@ -99,10 +99,10 @@ if [ "${updatecheck}" = "0" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "$ command_start.sh fi else - fn_printinfonl "SteamCMD is currently checking for updates" + fn_print_info_nl "SteamCMD is currently checking for updates" fn_scriptlog "SteamCMD is currently checking for updates" sleep 1 - fn_printinfonl "When update is complete ${servicename} will start" + fn_print_info_nl "When update is complete ${servicename} will start" fn_scriptlog "When update is complete ${servicename} will start" sleep 1 fi diff --git a/functions/command_start.sh b/functions/command_start.sh index 309a8078f..fd30a17bb 100644 --- a/functions/command_start.sh +++ b/functions/command_start.sh @@ -21,7 +21,7 @@ if [ "${ts3status}" != "Server is running" ]; then fi if [ ! -e "${servercfgfullpath}" ]; then - fn_printwarn "${servercfgfullpath} is missing" + fn_print_warn "${servercfgfullpath} is missing" fn_scriptlog "${servercfgfullpath} is missing" sleep 2 echo -en "\n" @@ -39,12 +39,12 @@ fi logs.sh -fn_printdots "${servername}" +fn_print_dots "${servername}" fn_scriptlog "${servername}" sleep 1 if [ "${ts3status}" == "Server is running" ]; then - fn_printinfo "${servername} is already running" + fn_print_info "${servername} is already running" fn_scriptlog "${servername} is already running" sleep 1 echo -en "\n" @@ -63,12 +63,12 @@ fi sleep 1 info_ts3status.sh if [ "${ts3status}" = "Server seems to have died" ]||[ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then - fn_printfailnl "Unable to start ${servername}" + fn_print_fail_nl "Unable to start ${servername}" fn_scriptlog "Unable to start ${servername}" echo -e " Check log files: ${rootdir}/log" exit 1 else - fn_printok "${servername}" + fn_print_ok "${servername}" fn_scriptlog "Started ${servername}" fi sleep 0.5 @@ -90,7 +90,7 @@ if [ "${tmuxwc}" -eq 0 ]; then fi fi -fn_printdots "${servername}" +fn_print_dots "${servername}" fn_scriptlog "${servername}" sleep 1 @@ -104,7 +104,7 @@ if [ "${tmuxwc}" -eq 0 ]; then fi if [ "${tmuxwc}" -eq 1 ]; then - fn_printinfo "${servername} is already running" + fn_print_info "${servername} is already running" fn_scriptlog "${servername} is already running" sleep 1 echo -en "\n" @@ -132,11 +132,11 @@ sleep 1 tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") # If the server fails to start if [ "${tmuxwc}" -eq 0 ]; then - fn_printfailnl "Unable to start ${servername}" + fn_print_fail_nl "Unable to start ${servername}" fn_scriptlog "Unable to start ${servername}" sleep 1 if [ -s "${scriptlogdir}/.${servicename}-tmux-error.tmp" ]; then - fn_printfailnl "Unable to start ${servername}: Tmux error:" + fn_print_fail_nl "Unable to start ${servername}: Tmux error:" fn_scriptlog "Tmux error" sleep 1 echo -en "\n" @@ -180,7 +180,7 @@ if [ "${tmuxwc}" -eq 0 ]; then fi exit 1 else - fn_printok "${servername}" + fn_print_ok "${servername}" fn_scriptlog "Started ${servername}" fi rm "${scriptlogdir}/.${servicename}-tmux-error.tmp" diff --git a/functions/command_stop.sh b/functions/command_stop.sh index 98d21c9a5..d5d589beb 100644 --- a/functions/command_stop.sh +++ b/functions/command_stop.sh @@ -31,16 +31,16 @@ sdtd_telnet(){ fn_stop_teamspeak3(){ check.sh -fn_printdots "${servername}" +fn_print_dots "${servername}" fn_scriptlog "${servername}" sleep 1 info_ts3status.sh if [ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then - fn_printfail "${servername} is already stopped" + fn_print_fail "${servername} is already stopped" fn_scriptlog "${servername} is already stopped" else ${filesdir}/ts3server_startscript.sh stop > /dev/null 2>&1 - fn_printok "${servername}" + fn_print_ok "${servername}" fn_scriptlog "Stopped ${servername}" fi # Remove lock file @@ -52,14 +52,14 @@ echo -en "\n" fn_stop_tmux(){ check.sh info_config.sh -fn_printdots "${servername}" +fn_print_dots "${servername}" fn_scriptlog "${servername}" sleep 1 if [ "${gamename}" == "7 Days To Die" ] ; then # if game is 7 Days To Die, we need special, graceful shutdown via telnet connection. # Set below variable to be called for expect to operate correctly.. - fn_printdots "Attempting graceful shutdown via telnet" + fn_print_dots "Attempting graceful shutdown via telnet" fn_scriptlog "Attempting graceful shutdown via telnet" sleep 1 telnetip=127.0.0.1 @@ -69,11 +69,11 @@ if [ "${gamename}" == "7 Days To Die" ] ; then refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF") if [ -n "${refused}" ]; then telnetip=${ip} - fn_printwarn "Attempting graceful shutdown via telnet: localhost failed" + fn_print_warn "Attempting graceful shutdown via telnet: localhost failed" fn_scriptlog "Warning! Attempting graceful shutdown failed using localhost" sleep 5 echo -en "\n" - fn_printdots "Attempting graceful shutdown via telnet: using ${telnetip}" + fn_print_dots "Attempting graceful shutdown via telnet: using ${telnetip}" fn_scriptlog "Attempting graceful shutdown via telnet using ${telnetip}" sdtd_telnet sleep 1 @@ -82,14 +82,14 @@ if [ "${gamename}" == "7 Days To Die" ] ; then refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF") completed=$(echo -en "\n ${sdtdshutdown}"| grep "Completed.") if [ -n "${refused}" ]; then - fn_printfail "Attempting graceful shutdown via telnet" + fn_print_fail "Attempting graceful shutdown via telnet" fn_scriptlog "Attempting graceful shutdown failed" fn_scriptlog "${refused}" elif [ -n "${completed}" ]; then - fn_printok "Attempting graceful shutdown via telnet" + fn_print_ok "Attempting graceful shutdown via telnet" fn_scriptlog "Attempting graceful shutdown succeeded" else - fn_printfail "Attempting graceful shutdown via telnet: Unknown error" + fn_print_fail "Attempting graceful shutdown via telnet: Unknown error" fn_scriptlog "Attempting graceful shutdown failed" fn_scriptlog "Unknown error" fi @@ -99,29 +99,29 @@ if [ "${gamename}" == "7 Days To Die" ] ; then echo -en "\n ${sdtdshutdown}" echo -en "\n\n" sleep 1 - fn_printdots "${servername}" + fn_print_dots "${servername}" fn_scriptlog "${servername}" sleep 5 pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") if [ "${pid}" == "0" ]; then - fn_printok "${servername} is already stopped using graceful shutdown" + fn_print_ok "${servername} is already stopped using graceful shutdown" fn_scriptlog "${servername} is already stopped using graceful shutdown" else tmux kill-session -t "${servicename}" - fn_printok "${servername}" + fn_print_ok "${servername}" fn_scriptlog "Stopped ${servername}" fi else pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") if [ "${pid}" == "0" ]; then - fn_printfail "${servername} is already stopped" + fn_print_fail "${servername} is already stopped" fn_scriptlog "${servername} is already stopped" else if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then sleep 1 - fn_printdots "Attempting graceful shutdown" + fn_print_dots "Attempting graceful shutdown" fn_scriptlog "Attempting graceful shutdown" tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 counter=0 @@ -130,19 +130,19 @@ else sleep 1 let counter=counter+1 if [ "${counter}" -gt "1" ]; then - fn_printdots "Attempting graceful shutdown: ${counter}" + fn_print_dots "Attempting graceful shutdown: ${counter}" fi done pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") if [ "${pid}" == "0" ]; then - fn_printok "Attempting graceful shutdown" + fn_print_ok "Attempting graceful shutdown" else - fn_printfail "Attempting graceful shutdown" + fn_print_fail "Attempting graceful shutdown" fi fi tmux kill-session -t "${servicename}" > /dev/null 2>&1 - fn_printok "${servername}" + fn_print_ok "${servername}" fn_scriptlog "Stopped ${servername}" fi fi diff --git a/functions/command_ts3_server_pass.sh b/functions/command_ts3_server_pass.sh index 3cd0f0b1f..eba76523a 100644 --- a/functions/command_ts3_server_pass.sh +++ b/functions/command_ts3_server_pass.sh @@ -17,8 +17,8 @@ echo "${gamename} ServerAdmin Password Change" echo "============================" echo "" echo "Press \"CTRL+b d\" to exit console." -fn_printinfomationnl "You are about to change the ${gamename} ServerAdmin password." -fn_printwarningnl "${gamename} will restart during this process." +fn_print_infomation_nl "You are about to change the ${gamename} ServerAdmin password." +fn_print_warning_nl "${gamename} will restart during this process." echo "" while true; do read -e -i "y" -p "Continue? [y/N]" yn @@ -34,18 +34,18 @@ read -p "Enter new password : " newpassword fn_serveradmin_password_set(){ -fn_printinfonl "Applying new password" +fn_print_info_nl "Applying new password" fn_scriptlog "Applying new password" sleep 1 # Stop any running server command_stop.sh # Start server in "new password mode" ts3serverpass="1" -fn_printinfonl "Starting server with new password" +fn_print_info_nl "Starting server with new password" command_start.sh # Stop server in "new password mode" command_stop.sh -fn_printoknl "Password applied" +fn_print_ok_nl "Password applied" fn_scriptlog "New ServerAdmin password applied" sleep 1 } diff --git a/functions/command_update_functions.sh b/functions/command_update_functions.sh index 3c530e4a0..9c0ac4b90 100644 --- a/functions/command_update_functions.sh +++ b/functions/command_update_functions.sh @@ -8,7 +8,7 @@ lgsm_version="270216" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh -fn_printdots "Updating functions" +fn_print_dots "Updating functions" fn_scriptlog "Updating functions" sleep 1 echo -ne "\n" @@ -23,15 +23,15 @@ if [ -n "${functionsdir}" ]; then rm -rfv "${functionsdir}/"* exitcode=$? else - fn_printfail "Updating functions" + fn_print_fail "Updating functions" fn_scriptlog "Failure! Updating functions" fi if [ "${exitcode}" == "0" ]; then - fn_printok "Updating functions" + fn_print_ok "Updating functions" fn_scriptlog "Success! Updating functions" else - fn_printfail "Updating functions" + fn_print_fail "Updating functions" fn_scriptlog "Failure! Updating functions" fi echo -ne "\n" \ No newline at end of file diff --git a/functions/command_validate.sh b/functions/command_validate.sh index 40e23c01e..59c03b6ff 100644 --- a/functions/command_validate.sh +++ b/functions/command_validate.sh @@ -10,15 +10,15 @@ local modulename="Validate" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_validation(){ -fn_printwarn "Validating may overwrite some customised files." +fn_print_warn "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 "Checking server files" +fn_print_dots "Checking server files" sleep 1 -fn_printok "Checking server files" +fn_print_ok "Checking server files" fn_scriptlog "Checking server files" sleep 1 diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 8275d5770..cf3a2d777 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -25,7 +25,7 @@ if [ -n "${md5}" ]||[ "${md5}" == "nomd5" ]; then sleep 1 local md5sumcmd=$(md5sum "${filedir}/${filename}"|awk '{print $1;}') if [ "${md5sumcmd}" != "${md5}" ]; then - fn_printfaileolnl + fn_print_fail_eol_nl echo "${filename} returned MD5 checksum: ${md5sumcmd}" echo "expected MD5 checksum: ${md5}" fn_scriptlog "verifying ${filename} with MD5: FAIL" @@ -33,7 +33,7 @@ if [ -n "${md5}" ]||[ "${md5}" == "nomd5" ]; then fn_scriptlog "expected MD5 checksum: ${md5}" exit 1 else - fn_printokeolnl + fn_print_ok_eol_nl fn_scriptlog "verifying ${filename} with MD5: OK" fn_scriptlog "${filename} returned MD5 checksum: ${md5sumcmd}" fn_scriptlog "expected MD5 checksum: ${md5}" @@ -61,12 +61,12 @@ elif [ "${mime}" == "application/x-bzip2" ]; then fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then - fn_printfaileolnl + fn_print_fail_eol_nl fn_scriptlog "extracting download: FAIL" echo "${tarcmd}" | tee -a "${scriptlog}" exit ${exitcode} else - fn_printokeolnl + fn_print_ok_eol_nl fi } @@ -74,12 +74,12 @@ fi fn_fetch_trap() { echo "" echo -ne "downloading ${filename}: " - fn_printcanceledeol + fn_print_canceled_eol fn_scriptlog "downloading ${filename}: CANCELED" sleep 1 rm -f "${filedir}/${filename}" | tee -a "${scriptlog}" echo -ne "downloading ${filename}: " - fn_printremovedeol + fn_print_removed_eol fn_scriptlog "downloading ${filename}: REMOVED" exit } @@ -123,7 +123,7 @@ if [ ! -f "${filedir}/${filename}" ]; then fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then - fn_printfaileolnl + fn_print_fail_eol_nl if [ -f "${scriptlog}" ]; then fn_scriptlog "downloading ${filename}: FAIL" fi @@ -131,7 +131,7 @@ if [ ! -f "${filedir}/${filename}" ]; then echo -e "${fileurl}\n" | tee -a "${scriptlog}" exit ${exitcode} else - fn_printokeolnl + fn_print_ok_eol_nl if [ -f "${scriptlog}" ]; then fn_scriptlog "downloading ${filename}: OK" fi @@ -139,7 +139,7 @@ if [ ! -f "${filedir}/${filename}" ]; then # remove trap trap - INT else - fn_printfaileolnl + fn_print_fail_eol_nl echo "Curl is not installed!" echo -e "" exit 1 diff --git a/functions/core_messages.sh b/functions/core_messages.sh index 56251e6db..6581d2f17 100644 --- a/functions/core_messages.sh +++ b/functions/core_messages.sh @@ -6,6 +6,9 @@ lgsm_version="380216" # Description: Defines on-screen messages such as [ OK ] and how script logs look. +# nl: new line: message is following by a new line +# eol: end of line: message is placed at the end of the current line + # Date and servicename for log files. fn_scriptlog(){ if [ -n "${modulename}" ]; then @@ -16,7 +19,7 @@ fn_scriptlog(){ } # [ FAIL ] -fn_printfail(){ +fn_print_fail(){ if [ -n "${modulename}" ]; then echo -en "\r\033[K[\e[0;31m FAIL \e[0m] ${modulename} ${servicename}: $@" else @@ -24,7 +27,7 @@ fn_printfail(){ fi } -fn_printfailnl(){ +fn_print_fail_nl(){ if [ -n "${modulename}" ]; then echo -e "\r\033[K[\e[0;31m FAIL \e[0m] ${modulename} ${servicename}: $@" else @@ -33,7 +36,7 @@ fn_printfailnl(){ } # [ OK ] -fn_printok(){ +fn_print_ok(){ if [ -n "${modulename}" ]; then echo -en "\r\033[K[\e[0;32m OK \e[0m] ${modulename} ${servicename}: $@" else @@ -41,7 +44,7 @@ fn_printok(){ fi } -fn_printoknl(){ +fn_print_ok_nl(){ if [ -n "${modulename}" ]; then echo -e "\r\033[K[\e[0;32m OK \e[0m] ${modulename} ${servicename}: $@" else @@ -50,7 +53,7 @@ fn_printoknl(){ } # [ INFO ] -fn_printinfo(){ +fn_print_info(){ if [ -n "${modulename}" ]; then echo -en "\r\033[K[\e[0;36m INFO \e[0m] ${modulename} ${servicename}: $@" else @@ -58,7 +61,7 @@ fn_printinfo(){ fi } -fn_printinfonl(){ +fn_print_info_nl(){ if [ -n "${modulename}" ]; then echo -e "\r\033[K[\e[0;36m INFO \e[0m] ${modulename} ${servicename}: $@" else @@ -67,7 +70,7 @@ fn_printinfonl(){ } # [ WARN ] -fn_printwarn(){ +fn_print_warn(){ if [ -n "${modulename}" ]; then echo -en "\r\033[K[\e[1;33m WARN \e[0m] ${modulename} ${servicename}: $@" else @@ -75,7 +78,7 @@ fn_printwarn(){ fi } -fn_printwarnnl(){ +fn_print_warn_nl(){ if [ -n "${modulename}" ]; then echo -e "\r\033[K[\e[1;33m WARN \e[0m] ${modulename} ${servicename}: $@" else @@ -84,7 +87,7 @@ fn_printwarnnl(){ } # [ .... ] -fn_printdots(){ +fn_print_dots(){ if [ -n "${modulename}" ]; then echo -en "\r\033[K[ .... ] ${modulename} ${servicename}: $@" else @@ -93,91 +96,91 @@ fn_printdots(){ } # Complete! -fn_printcomplete(){ +fn_print_complete(){ echo -en "\e[0;32mComplete!\e[0m $@" } -fn_printcompletenl(){ +fn_print_complete_nl(){ echo -e "\e[0;32mComplete!\e[0m $@" } # Warning! -fn_printwarning(){ +fn_print_warning(){ echo -en "\e[0;33mWarning!\e[0m $@" } -fn_printwarningnl(){ +fn_print_warning_nl(){ echo -e "\e[0;33mWarning!\e[0m $@" } # Failure! -fn_printfailure(){ +fn_print_failure(){ echo -en "\e[0;31mFailure!\e[0m $@" } -fn_printfailurenl(){ +fn_print_failure_nl(){ echo -e "\e[0;31mFailure!\e[0m $@" } # Error! -fn_printerror(){ +fn_print_error(){ echo -en "\e[0;31mError!\e[0m $@" } -fn_printerrornl(){ +fn_print_error_nl(){ echo -e "\e[0;31mError!\e[0m $@" } # Info! -fn_printinfomation(){ - echo -en "\e[0;36mInfo!\e[0m $@" +fn_print_infomation(){ + echo -en "\e[0;36mInfomation!\e[0m $@" } -fn_printinfomationnl(){ - echo -e "\e[0;36mInfo!\e[0m $@" +fn_print_infomation_nl(){ + echo -e "\e[0;36mInfomation!\e[0m $@" } # FAIL for end of line -fn_printokeol(){ +fn_print_ok_eol(){ echo -en "\e[0;32mOK\e[0m" } -fn_printokeolnl(){ +fn_print_ok_eol_nl(){ echo -e "\e[0;32mOK\e[0m" } # FAIL for end of line -fn_printfaileol(){ +fn_print_fail_eol(){ echo -en "\e[0;31mFAIL\e[0m\n" } -fn_printfaileolnl(){ +fn_print_fail_eol_nl(){ echo -e "\e[0;31mFAIL\e[0m\n" } # QUERYING for end of line -fn_printqueryingeol(){ - echo -en "\e[0;31mQUERYING\e[0m\n" +fn_print_querying_eol(){ + echo -en "\e[0;36mQUERYING\e[0m\n" } -fn_printqueryingeolnl(){ - echo -e "\e[0;31mQUERYING\e[0m\n" +fn_print_querying_eol_nl(){ + echo -e "\e[0;36mQUERYING\e[0m\n" } # CANCELED for end of line -fn_printcanceledeol(){ - echo -en "\e[0;31mCANCELED\e[0m\n" +fn_print_canceled_eol(){ + echo -en "\e[0;33mCANCELED\e[0m\n" } -fn_printcanceledeolnl(){ - echo -e "\e[0;31mCANCELED\e[0m\n" +fn_print_canceled_eol_nl(){ + echo -e "\e[0;33mCANCELED\e[0m\n" } # REMOVED for end of line -fn_printremovedeol(){ +fn_print_removed_eol(){ echo -en "\e[0;31mREMOVED\e[0m\n" } -fn_printremovedeolnl(){ +fn_print_removed_eol_nl(){ echo -e "\e[0;31mREMOVED\e[0m\n" } \ No newline at end of file diff --git a/functions/email.sh b/functions/email.sh index 93d259d80..66d5acba7 100644 --- a/functions/email.sh +++ b/functions/email.sh @@ -7,7 +7,7 @@ lgsm_version="020216" # Description: Sends email notification if monitor picks up a failure. local modulename="Email" -fn_printdots "Sending notification to ${email}" +fn_print_dots "Sending notification to ${email}" info_distro.sh info_config.sh check_ip.sh @@ -64,7 +64,7 @@ if [ ! -z "${gamelogdir}" ]; then tail "${gamelogdir}"/* | grep -v "==>" | sed '/^$/d' | tail -25 >> "${emaillog}" fi mail -s "${subject}" ${email} < "${emaillog}" -fn_printok "Sending notification to ${email}" +fn_print_ok "Sending notification to ${email}" fn_scriptlog "Sent notification to ${email}" sleep 1 echo -en "\n" diff --git a/functions/fix_arma3.sh b/functions/fix_arma3.sh index b0a1317de..b076fe065 100644 --- a/functions/fix_arma3.sh +++ b/functions/fix_arma3.sh @@ -7,19 +7,19 @@ lgsm_version="301215" # Fixes line 63: 20150 Segmentation fault (core dumped) #488 fn_msg_start(){ - fn_printdots "Applying ${fixname} fix: ${gamename}" + fn_print_dots "Applying ${fixname} fix: ${gamename}" sleep 1 - fn_printinfo "Applying ${fixname} fix: ${gamename}" + fn_print_info "Applying ${fixname} fix: ${gamename}" fn_scriptlog "Applying ${fixname} fix: ${gamename}" sleep 1 } fn_msg_end(){ if [ $? -ne 0 ]; then - fn_printfailnl "Applying ${fixname} fix: ${gamename}" + fn_print_fail_nl "Applying ${fixname} fix: ${gamename}" fn_scriptlog "Failure! Applying ${fixname} fix: ${gamename}" else - fn_printoknl "Applying ${fixname} fix: ${gamename}" + fn_print_ok_nl "Applying ${fixname} fix: ${gamename}" fn_scriptlog "Complete! Applying ${fixname} fix: ${gamename}" fi } diff --git a/functions/fix_csgo.sh b/functions/fix_csgo.sh index 4227d36eb..33fd7c169 100644 --- a/functions/fix_csgo.sh +++ b/functions/fix_csgo.sh @@ -7,19 +7,19 @@ lgsm_version="301215" # Description: Resolves various issues with csgo. fn_msg_start(){ - fn_printdots "Applying ${fixname} fix: ${gamename}" + fn_print_dots "Applying ${fixname} fix: ${gamename}" sleep 1 - fn_printinfo "Applying ${fixname} fix: ${gamename}" + fn_print_info "Applying ${fixname} fix: ${gamename}" fn_scriptlog "Applying ${fixname} fix: ${gamename}" sleep 1 } fn_msg_end(){ if [ $? -ne 0 ]; then - fn_printfailnl "Applying ${fixname} fix: ${gamename}" + fn_print_fail_nl "Applying ${fixname} fix: ${gamename}" fn_scriptlog "Failure! Applying ${fixname} fix: ${gamename}" else - fn_printoknl "Applying ${fixname} fix: ${gamename}" + fn_print_ok_nl "Applying ${fixname} fix: ${gamename}" fn_scriptlog "Complete! Applying ${fixname} fix: ${gamename}" fi } diff --git a/functions/fix_dst.sh b/functions/fix_dst.sh index 7a0028504..b860f6d09 100644 --- a/functions/fix_dst.sh +++ b/functions/fix_dst.sh @@ -7,19 +7,19 @@ lgsm_version="020116" # Fixes line 63: 20150 Segmentation fault (core dumped) #488 fn_msg_start(){ - fn_printdots "Applying ${fixname} fix: ${gamename}" + fn_print_dots "Applying ${fixname} fix: ${gamename}" sleep 1 - fn_printinfo "Applying ${fixname} fix: ${gamename}" + fn_print_info "Applying ${fixname} fix: ${gamename}" fn_scriptlog "Applying ${fixname} fix: ${gamename}" sleep 1 } fn_msg_end(){ if [ $? -ne 0 ]; then - fn_printfailnl "Applying ${fixname} fix: ${gamename}" + fn_print_fail_nl "Applying ${fixname} fix: ${gamename}" fn_scriptlog "Failure! Applying ${fixname} fix: ${gamename}" else - fn_printoknl "Applying ${fixname} fix: ${gamename}" + fn_print_ok_nl "Applying ${fixname} fix: ${gamename}" fn_scriptlog "Complete! Applying ${fixname} fix: ${gamename}" fi } diff --git a/functions/fix_glibc.sh b/functions/fix_glibc.sh index 83422f12b..c46a1b5a0 100644 --- a/functions/fix_glibc.sh +++ b/functions/fix_glibc.sh @@ -9,7 +9,7 @@ echo "" echo "GLIBC Fix required" echo "============================" sleep 1 -fn_printwarningnl "${gamename} requires GLIBC_${glibcversion} or above" +fn_print_warning_nl "${gamename} requires GLIBC_${glibcversion} or above" sleep 1 echo "" echo -e "Currently installed:\e[0;31m GLIBC_$(ldd --version |grep ldd|awk '{print $NF}')\e[0;39m" @@ -34,7 +34,7 @@ echo -en "\n" # if ldd command not detected if [ -z $(command -v ldd) ]; then echo "" - fn_printfailurenl "GLIBC is not detected" + fn_print_failure_nl "GLIBC is not detected" sleep 1 echo "Install GLIBC and retry installation." sleep 1 diff --git a/functions/fix_steamcmd.sh b/functions/fix_steamcmd.sh index 862b4736f..a05f783c4 100644 --- a/functions/fix_steamcmd.sh +++ b/functions/fix_steamcmd.sh @@ -7,19 +7,19 @@ lgsm_version="010116" # Description: fixes various issues related to steamCMD. fn_msg_start(){ - fn_printdots "Applying ${fixname} fix: ${gamename}" + fn_print_dots "Applying ${fixname} fix: ${gamename}" sleep 1 - fn_printinfo "Applying ${fixname} fix: ${gamename}" + fn_print_info "Applying ${fixname} fix: ${gamename}" fn_scriptlog "Applying ${fixname} fix: ${gamename}" sleep 1 } fn_msg_end(){ if [ $? -ne 0 ]; then - fn_printfailnl "Applying ${fixname} fix: ${gamename}" + fn_print_fail_nl "Applying ${fixname} fix: ${gamename}" fn_scriptlog "Failure! Applying ${fixname} fix: ${gamename}" else - fn_printoknl "Applying ${fixname} fix: ${gamename}" + fn_print_ok_nl "Applying ${fixname} fix: ${gamename}" fn_scriptlog "Complete! Applying ${fixname} fix: ${gamename}" fi } diff --git a/functions/fn_update_functions b/functions/fn_update_functions index 414649f6a..5fbb28975 100644 --- a/functions/fn_update_functions +++ b/functions/fn_update_functions @@ -6,17 +6,17 @@ lgsm_version="230116" # Description: LEGACY FUNCTION Deletes the functions dir to allow re-downloading of functions from GitHub. -fn_printdots "Updating functions" +fn_print_dots "Updating functions" fn_scriptlog "Updating functions" sleep 1 echo -ne "\n" rm -rfv "${rootdir}/functions/"* exitcode=$? if [ "${exitcode}" == "0" ]; then - fn_printok "Updating functions" + fn_print_ok "Updating functions" fn_scriptlog "Success! Updating functions" else - fn_printfail "Updating functions" + fn_print_fail "Updating functions" fn_scriptlog "Failure! Updating functions" fi echo -ne "\n" \ No newline at end of file diff --git a/functions/install_server_dir.sh b/functions/install_server_dir.sh index 1a4f54b77..ab73ecfd2 100644 --- a/functions/install_server_dir.sh +++ b/functions/install_server_dir.sh @@ -14,7 +14,7 @@ echo "" pwd echo "" if [ -d "${filesdir}" ]; then - fn_printwarningnl "A server is already installed here." + fn_print_warning_nl "A server is already installed here." fi if [ -z "${autoinstall}" ]; then while true; do diff --git a/functions/install_server_files.sh b/functions/install_server_files.sh index f345c09f1..d6655689b 100644 --- a/functions/install_server_files.sh +++ b/functions/install_server_files.sh @@ -29,7 +29,7 @@ while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do # Attempt 11: Failure if [ "${counter}" -ge "2" ]; then - fn_printwarningnl "SteamCMD did not complete the download, retrying: Attempt ${counter}" + fn_print_warning_nl "SteamCMD did not complete the download, retrying: Attempt ${counter}" fn_scriptlog "SteamCMD did not complete the download, retrying: Attempt ${counter}" fi @@ -65,7 +65,7 @@ while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do fi fi elif [ "${counter}" -ge "11" ]; then - fn_printfailurenl "SteamCMD did not complete the download, too many retrys" + fn_print_failure_nl "SteamCMD did not complete the download, too many retrys" fn_scriptlog "SteamCMD did not complete the download, too many retrys" break fi @@ -74,7 +74,7 @@ done # Goldsource servers commonly fail to download all the server files required. # Validating a few of times may reduce the chance of this issue. if [ "${engine}" == "goldsource" ]; then - fn_printinfomationnl "Goldsource servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." + fn_print_infomation_nl "Goldsource servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." counter="0" while [ "${counter}" -le "4" ]; do counter=$((counter+1)) diff --git a/functions/install_ts3.sh b/functions/install_ts3.sh index 3a2acc224..5cf2f0f85 100644 --- a/functions/install_ts3.sh +++ b/functions/install_ts3.sh @@ -13,7 +13,7 @@ if [ "${arch}" == "x86_64" ]; then elif [ "${arch}" == "i386" ]||[ "${arch}" == "i686" ]; then ts3arch="x86" else - fn_printfailure "${arch} is an unsupported architecture" + fn_print_failure "${arch} is an unsupported architecture" exit 1 fi @@ -43,9 +43,9 @@ rm -f ".ts3_version_numbers.tmp" # Checks availablebuild info is available if [ -z "${availablebuild}" ]; then - fn_printfail "Checking for update: teamspeak.com" + fn_print_fail "Checking for update: teamspeak.com" sleep 1 - fn_printfail "Checking for update: teamspeak.com: Not returning version info" + fn_print_fail "Checking for update: teamspeak.com: Not returning version info" sleep 2 exit 1 fi diff --git a/functions/install_ts3db.sh b/functions/install_ts3db.sh index 90f5b0329..61e2db7d4 100644 --- a/functions/install_ts3db.sh +++ b/functions/install_ts3db.sh @@ -55,7 +55,7 @@ if [ -z "${autoinstall}" ]; then esac done else -fn_printwarningnl "./${selfname} auto-install is uses sqlite. For MariaDB/MySQL use ./${selfname} install" +fn_print_warning_nl "./${selfname} auto-install is uses sqlite. For MariaDB/MySQL use ./${selfname} install" fi ## Get privilege key diff --git a/functions/logs.sh b/functions/logs.sh index 54c9a9836..79d4de462 100644 --- a/functions/logs.sh +++ b/functions/logs.sh @@ -18,7 +18,7 @@ fi # Log manager will start the cleanup if it finds logs older than "${logdays}" if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; then - fn_printdots "Starting" + fn_print_dots "Starting" # Set addon logs directories sourcemodlogdir="${systemdir}/addons/sourcemod/logs" ulxlogdir="${systemdir}/data/ulx_logs" @@ -27,11 +27,11 @@ if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; th # Setting up counting variables scriptcount="0" ; consolecount="0" ; gamecount="0" ; srcdscount="0" ; smcount="0" ; ulxcount="0" ; darkrpcount="0" ; legacycount="0" sleep 1 - fn_printok "Starting" + fn_print_ok "Starting" fn_scriptlog "Starting" sleep 1 echo -en "\n" - fn_printinfo "Removing logs older than "${logdays}" days" + fn_print_info "Removing logs older than "${logdays}" days" fn_scriptlog "Removing logs older than "${logdays}" days" sleep 1 echo -en "\n" @@ -90,7 +90,7 @@ if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; th # Count total amount of files removed count=$((${scriptcount} + ${consolecount} + ${gamecount} + ${srcdscount} + ${smcount} + ${ulxcount} + ${darkrpcount} + ${legacycount})) # Job done - fn_printok "Removed ${count} log files" + fn_print_ok "Removed ${count} log files" fn_scriptlog "Removed ${count} log files" sleep 1 echo -en "\n" diff --git a/functions/monitor_gsquery.sh b/functions/monitor_gsquery.sh index 5fa63b32e..7a57aa694 100644 --- a/functions/monitor_gsquery.sh +++ b/functions/monitor_gsquery.sh @@ -27,11 +27,11 @@ if [ -z "${queryport}" ]; then fi -fn_printinfo "Querying port: gsquery.py enabled" +fn_print_info "Querying port: gsquery.py enabled" fn_scriptlog "gsquery.py enabled" sleep 1 -fn_printdots "Querying port: ${ip}:${port}: 0/1 : " -fn_printqueryingeol +fn_print_dots "Querying port: ${ip}:${port}: 0/1 : " +fn_print_querying_eol fn_scriptlog "Querying port: ${ip}:${port}: 1 : QUERYING" sleep 1 @@ -47,8 +47,8 @@ for i in {1..4}; do if [ "${exitcode}" == "0" ]; then # Server OK - fn_printok "Querying port: ${ip}:${port}: " - fn_printokeol + fn_print_ok "Querying port: ${ip}:${port}: " + fn_print_ok_eol fn_scriptlog "Querying port: ${ip}:${port}: OK" sleep 1 exit @@ -59,13 +59,13 @@ for i in {1..4}; do seconds=0 # Seconds counter while [ true ]; do - fn_printfail "Querying port: ${ip}:${port}: ${totalseconds}/${queryattempt} : \e[0;31m${gsquerycmd}\e[0m" + fn_print_fail "Querying port: ${ip}:${port}: ${totalseconds}/${queryattempt} : \e[0;31m${gsquerycmd}\e[0m" seconds=$((seconds + 1)) totalseconds=$((totalseconds + 1)) sleep 1 if [ "${seconds}" == "15" ]; then - fn_printdots "Querying port: ${ip}:${port}: ${totalseconds}/${queryattempt} : " - fn_printqueryingeol + fn_print_dots "Querying port: ${ip}:${port}: ${totalseconds}/${queryattempt} : " + fn_print_querying_eol fn_scriptlog "Querying port: ${ip}:${port}: ${queryattempt} : QUERYING" sleep 1 break @@ -75,8 +75,8 @@ for i in {1..4}; do if [ "${queryattempt}" == "4" ]; then # Server failed query 4 times confirmed failure - fn_printfail "Querying port: ${ip}:${port}: " - fn_printfaileol + fn_print_fail "Querying port: ${ip}:${port}: " + fn_print_fail_eol fn_scriptlog "Querying port: ${ip}:${port}: ${gsquerycmd}" fn_scriptlog "Querying port: ${ip}:${port}: FAIL" sleep 1 diff --git a/functions/update_check.sh b/functions/update_check.sh index 773c88b25..4342e7237 100644 --- a/functions/update_check.sh +++ b/functions/update_check.sh @@ -22,10 +22,10 @@ fn_appmanifestinfo # This is an error is corrected below if required. if [ "${appmanifestfilewc}" -ge "2" ]; then sleep 1 - fn_printwarn "Multiple appmanifest_${appid}.acf files found" + fn_print_warn "Multiple appmanifest_${appid}.acf files found" fn_scriptlog "Warning! Multiple appmanifest_${appid}.acf files found" sleep 2 - fn_printdots "Removing x${appmanifestfilewc} appmanifest_${appid}.acf files" + fn_print_dots "Removing x${appmanifestfilewc} appmanifest_${appid}.acf files" sleep 1 for appfile in ${appmanifestfile}; do rm "${appfile}" @@ -33,7 +33,7 @@ if [ "${appmanifestfilewc}" -ge "2" ]; then appmanifestfilewc1="${appmanifestfilewc}" fn_appmanifestinfo if [ "${appmanifestfilewc}" -ge "2" ]; then - fn_printfail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" + fn_print_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" fn_scriptlog "Failure! Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" sleep 1 echo "" @@ -44,10 +44,10 @@ if [ "${appmanifestfilewc}" -ge "2" ]; then exit 1 else sleep 1 - fn_printok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" + fn_print_ok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" fn_scriptlog "Success! Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" sleep 1 - fn_printinfonl "Forcing update to correct issue" + fn_print_info_nl "Forcing update to correct issue" fn_scriptlog "Forcing update to correct issue" sleep 1 update_dl.sh @@ -55,15 +55,15 @@ if [ "${appmanifestfilewc}" -ge "2" ]; then fi elif [ "${appmanifestfilewc}" -eq "0" ]; then if [ "${forceupdate}" == "1" ]; then - fn_printfail "Still no appmanifest_${appid}.acf found: Unable to update" + fn_print_fail "Still no appmanifest_${appid}.acf found: Unable to update" fn_scriptlog "Warning! Still no appmanifest_${appid}.acf found: Unable to update" exit 1 fi forceupdate=1 - fn_printwarn "No appmanifest_${appid}.acf found" + fn_print_warn "No appmanifest_${appid}.acf found" fn_scriptlog "Warning! No appmanifest_${appid}.acf found" sleep 2 - fn_printinfonl "Forcing update to correct issue" + fn_print_info_nl "Forcing update to correct issue" fn_scriptlog "Forcing update to correct issue" sleep 1 update_dl.sh @@ -73,12 +73,12 @@ fi fn_logupdaterequest(){ # Checks for server update requests from server logs. -fn_printdots "Checking for update: Server logs" +fn_print_dots "Checking for update: Server logs" fn_scriptlog "Checking for update: Server logs" sleep 1 requestrestart=$(grep -Ec "MasterRequestRestart" "${consolelog}") if [ "${requestrestart}" -ge "1" ]; then - fn_printoknl "Checking for update: Server logs: Update requested" + fn_print_ok_nl "Checking for update: Server logs: Update requested" sleep 1 echo "" echo -ne "Applying update.\r" @@ -98,7 +98,7 @@ if [ "${requestrestart}" -ge "1" ]; then update_dl.sh fi else - fn_printok "Checking for update: Server logs: No update requested" + fn_print_ok "Checking for update: Server logs: No update requested" sleep 1 fi } @@ -106,7 +106,7 @@ fi fn_steamcmdcheck(){ fn_appmanifestcheck # Checks for server update from SteamCMD -fn_printdots "Checking for update: SteamCMD" +fn_print_dots "Checking for update: SteamCMD" fn_scriptlog "Checking for update: SteamCMD" sleep 1 @@ -122,14 +122,14 @@ if [ -f "${HOME}/Steam/appcache/appinfo.vdf" ]; then fi availablebuild=$(./steamcmd.sh +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +app_info_print "${appid}" +quit | grep -EA 1000 "^\s+\"branches\"$" | grep -EA 5 "^\s+\"public\"$" | grep -m 1 -EB 10 "^\s+}$" | grep -E "^\s+\"buildid\"\s+" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) if [ -z "${availablebuild}" ]; then - fn_printfail "Checking for update: SteamCMD" + fn_print_fail "Checking for update: SteamCMD" fn_scriptlog "Failure! Checking for update: SteamCMD" sleep 1 - fn_printfailnl "Checking for update: SteamCMD: Not returning version info" + fn_print_fail_nl "Checking for update: SteamCMD: Not returning version info" fn_scriptlog "Failure! Checking for update: SteamCMD: Not returning version info" exit 1 else - fn_printok "Checking for update: SteamCMD" + fn_print_ok "Checking for update: SteamCMD" fn_scriptlog "Success! Checking for update: SteamCMD" sleep 1 fi @@ -172,7 +172,7 @@ else echo -e " Available version: \e[0;32m${availablebuild}\e[0;39m" echo -e " https://steamdb.info/app/${appid}/" echo -e "" - fn_printoknl "No update available" + fn_print_ok_nl "No update available" fn_scriptlog "Current build: ${currentbuild}" fn_scriptlog "Available build: ${availablebuild}" fi @@ -182,19 +182,19 @@ fi fn_teamspeak3_check(){ # Checks for server update from teamspeak.com using a mirror dl.4players.de -fn_printdots "Checking for update: teamspeak.com" +fn_print_dots "Checking for update: teamspeak.com" fn_scriptlog "Checking for update: teamspeak.com" sleep 1 # Gets currentbuild info # Checks currentbuild info is available, if fails a server restart will be forced to generate logs if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then - fn_printfail "Checking for update: teamspeak.com" + fn_print_fail "Checking for update: teamspeak.com" sleep 1 - fn_printfailnl "Checking for update: teamspeak.com: No logs with server version found" + fn_print_fail_nl "Checking for update: teamspeak.com: No logs with server version found" fn_scriptlog "Failure! Checking for update: teamspeak.com: No logs with server version found" sleep 2 - fn_printinfonl "Checking for update: teamspeak.com: Forcing server restart" + fn_print_info_nl "Checking for update: teamspeak.com: Forcing server restart" fn_scriptlog "Checking for update: teamspeak.com: Forcing server restart" sleep 2 command_stop.sh @@ -202,7 +202,7 @@ if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then sleep 2 # If still failing will exit if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then - fn_printfailnl "Checking for update: teamspeak.com: Still No logs with server version found" + fn_print_fail_nl "Checking for update: teamspeak.com: Still No logs with server version found" fn_scriptlog "Failure! Checking for update: teamspeak.com: Still No logs with server version found" exit 1 fi @@ -217,7 +217,7 @@ elif [ "${arch}" == "i386" ]||[ "${arch}" == "i686" ]; then ts3arch="x86" else echo "" - fn_printfailure "${arch} is an unsupported architecture" + fn_print_failure "${arch} is an unsupported architecture" exit 1 fi @@ -249,15 +249,15 @@ rm -f ".ts3_version_numbers.tmp" # Checks availablebuild info is available if [ -z "${availablebuild}" ]; then - fn_printfail "Checking for update: teamspeak.com" + fn_print_fail "Checking for update: teamspeak.com" fn_scriptlog "Checking for update: teamspeak.com" sleep 1 - fn_printfail "Checking for update: teamspeak.com: Not returning version info" + fn_print_fail "Checking for update: teamspeak.com: Not returning version info" fn_scriptlog "Failure! Checking for update: teamspeak.com: Not returning version info" sleep 2 exit 1 else - fn_printok "Checking for update: teamspeak.com" + fn_print_ok "Checking for update: teamspeak.com" fn_scriptlog "Success! Checking for update: teamspeak.com" sleep 1 fi @@ -303,14 +303,14 @@ else echo -e " Current version: \e[0;32m${currentbuild}\e[0;39m" echo -e " Available version: \e[0;32m${availablebuild}\e[0;39m" echo -e "" - fn_printoknl "No update available" + fn_print_ok_nl "No update available" fn_scriptlog "Current build: ${currentbuild}" fn_scriptlog "Available build: ${availablebuild}" fi } check.sh -fn_printdots "Checking for update" +fn_print_dots "Checking for update" if [ "${gamename}" == "Teamspeak 3" ]; then fn_teamspeak3_check elif [ "${engine}" == "goldsource" ]||[ "${forceupdate}" == "1" ]; then diff --git a/functions/update_dl.sh b/functions/update_dl.sh index 0c07fc31a..f23bd2c64 100644 --- a/functions/update_dl.sh +++ b/functions/update_dl.sh @@ -71,9 +71,9 @@ rm -rf "${rootdir}/teamspeak3-server_linux_${ts3arch}" check.sh info_config.sh -fn_printdots "Updating ${servername}" +fn_print_dots "Updating ${servername}" sleep 1 -fn_printoknl "Updating ${servername}" +fn_print_ok_nl "Updating ${servername}" fn_scriptlog "Updating ${servername}" sleep 1 if [ "${gamename}" == "Teamspeak 3" ]; then diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 61b326506..0fce4904c 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -325,7 +325,7 @@ echo "Description:" echo "change the buildid tricking SteamCMD to update." requiredstatus="OFFLINE" fn_setstatus -fn_printinfonl "changed buildid to 0." +fn_print_info_nl "changed buildid to 0." sed -i 's/[0-9]\+/0/' ${filesdir}/steamapps/appmanifest_${appid}.acf update_check.sh echo "" @@ -338,7 +338,7 @@ echo "Description:" echo "change the buildid tricking SteamCMD to update server while already running." requiredstatus="ONLINE" fn_setstatus -fn_printinfonl "changed buildid to 0." +fn_print_info_nl "changed buildid to 0." sed -i 's/[0-9]\+/0/' ${filesdir}/steamapps/appmanifest_${appid}.acf update_check.sh echo "" @@ -351,7 +351,7 @@ echo "Description:" echo "removing appmanifest file will cause script to repair." requiredstatus="OFFLINE" fn_setstatus -fn_printinfonl "removed appmanifest_${appid}.acf." +fn_print_info_nl "removed appmanifest_${appid}.acf." rm --verbose "${filesdir}/steamapps/appmanifest_${appid}.acf" update_check.sh echo "" @@ -433,7 +433,7 @@ echo "Description:" echo "run monitor while server is offline with no lockfile." requiredstatus="OFFLINE" fn_setstatus -fn_printinfonl "creating lockfile." +fn_print_info_nl "creating lockfile." date > "${rootdir}/${lockselfname}" (command_monitor.sh) echo "" @@ -449,7 +449,7 @@ fn_setstatus sed -i 's/[0-9]\+/0/' "${servercfgfullpath}" (command_monitor.sh) echo "" -fn_printinfonl "Reseting ${servercfg}." +fn_print_info_nl "Reseting ${servercfg}." install_config.sh echo "" echo "Test complete!" @@ -478,7 +478,7 @@ echo "" requiredstatus="OFFLINE" fn_setstatus sleep 1 -fn_printinfo "Tidying up directories." +fn_print_info "Tidying up directories." sleep 1 rm -rfv ${serverfiles} echo "END" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index b3207c368..cd7c94f23 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -345,7 +345,7 @@ echo "Description:" echo "run monitor while server is offline with no lockfile." requiredstatus="OFFLINE" fn_setstatus -fn_printinfonl "creating lockfile." +fn_print_info_nl "creating lockfile." date > "${rootdir}/${lockselfname}" (command_monitor.sh) echo "" @@ -361,7 +361,7 @@ fn_setstatus sed -i 's/[0-9]\+/0/' "${servercfgfullpath}" (command_monitor.sh) echo "" -fn_printinfonl "Reseting ${servercfg}." +fn_print_info_nl "Reseting ${servercfg}." install_config.sh echo "" echo "Test complete!" @@ -390,7 +390,7 @@ echo "" requiredstatus="OFFLINE" fn_setstatus sleep 1 -fn_printinfo "Tidying up directories." +fn_print_info "Tidying up directories." sleep 1 rm -rfv ${serverfiles} echo "END" \ No newline at end of file From 661e579dbe2894ce8be8878ee70537274c4ad9a4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 16:05:19 +0000 Subject: [PATCH 089/434] Corrected if --- functions/core_dl.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index cf3a2d777..959161a27 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -20,7 +20,7 @@ lgsm_version="050216" fn_dl_md5(){ # Runs MD5 Check if available -if [ -n "${md5}" ]||[ "${md5}" == "nomd5" ]; then +if [ -n "${md5}" ]||[ "${md5}" != "nomd5" ]; then echo -ne "verifying ${filename} with MD5..." sleep 1 local md5sumcmd=$(md5sum "${filedir}/${filename}"|awk '{print $1;}') From 66f72ebad5348ca9450ef43d4c57baf7ec63ca29 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 16:05:26 +0000 Subject: [PATCH 090/434] Updated notes --- functions/core_messages.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/functions/core_messages.sh b/functions/core_messages.sh index 6581d2f17..acc7ffa5f 100644 --- a/functions/core_messages.sh +++ b/functions/core_messages.sh @@ -9,7 +9,8 @@ lgsm_version="380216" # nl: new line: message is following by a new line # eol: end of line: message is placed at the end of the current line -# Date and servicename for log files. +# Date, servicename & module details displayed in log files. +# e.g Feb 28 14:56:58 ut99-server: Monitor: fn_scriptlog(){ if [ -n "${modulename}" ]; then echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${modulename}: ${1}" >> "${scriptlog}" From a7f6289efa263e9ae013c71630394efc1135abc9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 16:18:05 +0000 Subject: [PATCH 091/434] Fixed md5 checker --- functions/core_dl.sh | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 959161a27..45f46e1c6 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -20,7 +20,7 @@ lgsm_version="050216" fn_dl_md5(){ # Runs MD5 Check if available -if [ -n "${md5}" ]||[ "${md5}" != "nomd5" ]; then +if [ "${md5}" != "0" ]&&[ "${md5}" != "nomd5" ]; then echo -ne "verifying ${filename} with MD5..." sleep 1 local md5sumcmd=$(md5sum "${filedir}/${filename}"|awk '{print $1;}') @@ -46,9 +46,9 @@ fi # fn_dl_extract "${filedir}" "${filename}" "${extractdir}" # fn_dl_extract "/home/gameserver/lgsm/tmp" "file.tar.bz2" "/home/gamserver/serverfiles" fn_dl_extract(){ -filedir=${1} -filename=${2} -extractdir=${3} +filedir="${1}" +filename="${2}" +extractdir="${3}" # extracts archives echo -ne "extracting ${filename}..." fn_scriptlog "extracting download" @@ -85,13 +85,13 @@ fn_fetch_trap() { } fn_fetch_file(){ -fileurl=${1} -filedir=${2} -filename=${3} -executecmd=${4:-0} -run=${5:-0} -force=${6:-0} -md5=${7} +fileurl="${1}" +filedir="${2}" +filename="${3}" +executecmd="${4:-0}" +run="${5:-0}" +force="${6:-0}" +md5="${7:-0}" # If the file is missing, then download if [ ! -f "${filedir}/${filename}" ]; then @@ -181,7 +181,7 @@ filename="${github_file_url_name}" executecmd="${4:-0}" run="${5:-0}" force="${6:-0}" -md5="${7}" +md5="${7:-0}" fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" } @@ -197,6 +197,6 @@ filename="${github_file_url_name}" executecmd="executecmd" run="run" force="noforce" -md5="" +md5="nomd5" fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" } \ No newline at end of file From 2c1627b6cdfd732f65aa9822c596d8fd5a9a1488 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 16:18:14 +0000 Subject: [PATCH 092/434] minor edit --- functions/monitor_gsquery.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/monitor_gsquery.sh b/functions/monitor_gsquery.sh index 7a57aa694..b82496601 100644 --- a/functions/monitor_gsquery.sh +++ b/functions/monitor_gsquery.sh @@ -55,7 +55,7 @@ for i in {1..4}; do else # Server failed query queryattempt=$((queryattempt + 1)) - fn_scriptlog "Querying port: ${ip}:${port}: ${totalseconds}/${queryattempt} : ${gsquerycmd}" + fn_scriptlog "Querying port: ${ip}:${port}: ${queryattempt} : ${gsquerycmd}" seconds=0 # Seconds counter while [ true ]; do From c2382c73a09985d3b2f59beceebec799b33a44d7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 16:40:27 +0000 Subject: [PATCH 093/434] Correcting more messages --- functions/core_messages.sh | 16 ++++++------- functions/monitor_gsquery.sh | 46 ++++++++++++++++++------------------ 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/functions/core_messages.sh b/functions/core_messages.sh index acc7ffa5f..eeaac4170 100644 --- a/functions/core_messages.sh +++ b/functions/core_messages.sh @@ -152,36 +152,36 @@ fn_print_ok_eol_nl(){ # FAIL for end of line fn_print_fail_eol(){ - echo -en "\e[0;31mFAIL\e[0m\n" + echo -en "\e[0;31mFAIL\e[0m" } fn_print_fail_eol_nl(){ - echo -e "\e[0;31mFAIL\e[0m\n" + echo -e "\e[0;31mFAIL\e[0m" } # QUERYING for end of line fn_print_querying_eol(){ - echo -en "\e[0;36mQUERYING\e[0m\n" + echo -en "\e[0;36mQUERYING\e[0m" } fn_print_querying_eol_nl(){ - echo -e "\e[0;36mQUERYING\e[0m\n" + echo -e "\e[0;36mQUERYING\e[0m" } # CANCELED for end of line fn_print_canceled_eol(){ - echo -en "\e[0;33mCANCELED\e[0m\n" + echo -en "\e[0;33mCANCELED\e[0m" } fn_print_canceled_eol_nl(){ - echo -e "\e[0;33mCANCELED\e[0m\n" + echo -e "\e[0;33mCANCELED\e[0m" } # REMOVED for end of line fn_print_removed_eol(){ - echo -en "\e[0;31mREMOVED\e[0m\n" + echo -en "\e[0;31mREMOVED\e[0m" } fn_print_removed_eol_nl(){ - echo -e "\e[0;31mREMOVED\e[0m\n" + echo -e "\e[0;31mREMOVED\e[0m" } \ No newline at end of file diff --git a/functions/monitor_gsquery.sh b/functions/monitor_gsquery.sh index b82496601..95e72a670 100644 --- a/functions/monitor_gsquery.sh +++ b/functions/monitor_gsquery.sh @@ -26,59 +26,59 @@ if [ -z "${queryport}" ]; then port="${queryport}" fi - +queryattempt=1 +totalseconds=0 fn_print_info "Querying port: gsquery.py enabled" fn_scriptlog "gsquery.py enabled" sleep 1 -fn_print_dots "Querying port: ${ip}:${port}: 0/1 : " +fn_print_dots "Querying port: ${ip}:${port} :${totalseconds}/${queryattempt} : " fn_print_querying_eol -fn_scriptlog "Querying port: ${ip}:${port}: 1 : QUERYING" +fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : QUERYING" sleep 1 # Will query up to 4 times every 15 seconds. # Servers changing map can return a failure. # Will Wait up to 60 seconds to confirm server is down giving server time to change map. -queryattempt=0 -totalseconds=0 + for i in {1..4}; do gsquerycmd=$("${functionsdir}"/gsquery.py -a ${ip} -p 1 -e ${engine} 2>&1) exitcode=$? if [ "${exitcode}" == "0" ]; then # Server OK - fn_print_ok "Querying port: ${ip}:${port}: " + fn_print_ok "Querying port: ${ip}:${port} : " fn_print_ok_eol - fn_scriptlog "Querying port: ${ip}:${port}: OK" + fn_scriptlog "Querying port: ${ip}:${port} : OK" sleep 1 exit else # Server failed query - queryattempt=$((queryattempt + 1)) - fn_scriptlog "Querying port: ${ip}:${port}: ${queryattempt} : ${gsquerycmd}" + fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : ${gsquerycmd}" seconds=0 # Seconds counter while [ true ]; do - fn_print_fail "Querying port: ${ip}:${port}: ${totalseconds}/${queryattempt} : \e[0;31m${gsquerycmd}\e[0m" - seconds=$((seconds + 1)) - totalseconds=$((totalseconds + 1)) - sleep 1 - if [ "${seconds}" == "15" ]; then - fn_print_dots "Querying port: ${ip}:${port}: ${totalseconds}/${queryattempt} : " - fn_print_querying_eol - fn_scriptlog "Querying port: ${ip}:${port}: ${queryattempt} : QUERYING" + fn_print_fail "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : \e[0;31m${gsquerycmd}\e[0m" + seconds=$((seconds + 1)) + totalseconds=$((totalseconds + 1)) + sleep 1 + if [ "${seconds}" == "15" ]; then + queryattempt=$((queryattempt + 1)) + fn_print_dots "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : " + fn_print_querying_eol + fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : QUERYING" sleep 1 - break - fi + break + fi done fi if [ "${queryattempt}" == "4" ]; then # Server failed query 4 times confirmed failure - fn_print_fail "Querying port: ${ip}:${port}: " + fn_print_fail "Querying port: ${ip}:${port} : " fn_print_fail_eol - fn_scriptlog "Querying port: ${ip}:${port}: ${gsquerycmd}" - fn_scriptlog "Querying port: ${ip}:${port}: FAIL" + fn_scriptlog "Querying port: ${ip}:${port} : ${gsquerycmd}" + fn_scriptlog "Querying port: ${ip}:${port} : FAIL" sleep 1 # Send email notification if enabled @@ -90,5 +90,5 @@ for i in {1..4}; do email.sh fi fn_restart - fi + fi done \ No newline at end of file From 9f5425bda724e16a7688822c2f7780cb7ff6f15e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 21:51:36 +0000 Subject: [PATCH 094/434] Fixed looping issues --- functions/monitor_gsquery.sh | 137 +++++++++++++++++------------------ 1 file changed, 68 insertions(+), 69 deletions(-) diff --git a/functions/monitor_gsquery.sh b/functions/monitor_gsquery.sh index 95e72a670..058351770 100644 --- a/functions/monitor_gsquery.sh +++ b/functions/monitor_gsquery.sh @@ -2,93 +2,92 @@ # LGSM monitor_gsquery.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="270216" # Description: uses gsquery.py to query the server port. # Detects if the server has frozen with the proccess still running. local modulename="Monitor" -# Downloads gsquery.py if missing -if [ ! -f "${functionsdir}/gsquery.py" ]; then - fn_fetch_file_github "functions" "gsquery.py" "${functionsdir}" "executecmd" "norun" "noforce" "nomd5" -fi +# Forces legecy servers to use gsquery as vat gsquery is not present in legecy +if [ -z "${gsquery}" ]; then + gsquery="yes" +fi -info_config.sh +if [ "${gsquery}" == "yes" ]; then -if [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then - port=$((${port} + 1)) -elif [ "${engine}" == "spark" ]; then - port=$((${port} + 1)) -fi + # Downloads gsquery.py if missing + if [ ! -f "${functionsdir}/gsquery.py" ]; then + fn_fetch_file_github "functions" "gsquery.py" "${functionsdir}" "executecmd" "norun" "noforce" "nomd5" + fi -if [ -z "${queryport}" ]; then - port="${queryport}" -fi + info_config.sh -queryattempt=1 -totalseconds=0 -fn_print_info "Querying port: gsquery.py enabled" -fn_scriptlog "gsquery.py enabled" -sleep 1 -fn_print_dots "Querying port: ${ip}:${port} :${totalseconds}/${queryattempt} : " -fn_print_querying_eol -fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : QUERYING" -sleep 1 + if [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then + port=$((port + 1)) + elif [ "${engine}" == "spark" ]; then + port=$((port + 1)) + fi + if [ -z "${queryport}" ]; then + port="${queryport}" + fi -# Will query up to 4 times every 15 seconds. -# Servers changing map can return a failure. -# Will Wait up to 60 seconds to confirm server is down giving server time to change map. + fn_print_info "Querying port: gsquery.py enabled" + fn_scriptlog "Querying port: gsquery.py enabled" + sleep 1 -for i in {1..4}; do - gsquerycmd=$("${functionsdir}"/gsquery.py -a ${ip} -p 1 -e ${engine} 2>&1) - exitcode=$? + # Will query up to 4 times every 15 seconds. + # Servers changing map can return a failure. + # Will Wait up to 60 seconds to confirm server is down giving server time to change map. + totalseconds=0 + for queryattempt in {1..5}; do + fn_print_dots "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : " + fn_print_querying_eol + fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : QUERYING" + + gsquerycmd=$("${functionsdir}"/gsquery.py -a "${ip}" -p 1 -e "${engine}" 2>&1) + exitcode=$? - if [ "${exitcode}" == "0" ]; then - # Server OK - fn_print_ok "Querying port: ${ip}:${port} : " - fn_print_ok_eol - fn_scriptlog "Querying port: ${ip}:${port} : OK" sleep 1 - exit - else - # Server failed query - fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : ${gsquerycmd}" - seconds=0 - # Seconds counter - while [ true ]; do - fn_print_fail "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : \e[0;31m${gsquerycmd}\e[0m" - seconds=$((seconds + 1)) - totalseconds=$((totalseconds + 1)) + if [ "${exitcode}" == "0" ]; then + # Server OK + fn_print_ok "Querying port: ${ip}:${port} : ${queryattempt} : " + fn_print_ok_eol + fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : OK" sleep 1 - if [ "${seconds}" == "15" ]; then - queryattempt=$((queryattempt + 1)) - fn_print_dots "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : " - fn_print_querying_eol - fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : QUERYING" + exit + else + # Server failed query + fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : ${gsquerycmd}" + + if [ "${queryattempt}" == "5" ]; then + # Server failed query 4 times confirmed failure + fn_print_fail "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : " + fn_print_fail_eol_nl + fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : FAIL" sleep 1 + + # Send email notification if enabled + if [ "${emailnotification}" == "on" ]; then + subject="${servicename} Monitor - Starting ${servername}" + failurereason="Failed to query ${servicename}: ${gsquerycmd}" + actiontaken="restarted ${servicename}" + email.sh + fi + fn_restart break fi - done - fi - if [ "${queryattempt}" == "4" ]; then - # Server failed query 4 times confirmed failure - fn_print_fail "Querying port: ${ip}:${port} : " - fn_print_fail_eol - fn_scriptlog "Querying port: ${ip}:${port} : ${gsquerycmd}" - fn_scriptlog "Querying port: ${ip}:${port} : FAIL" - sleep 1 - - # Send email notification if enabled - if [ "${emailnotification}" = "on" ]; then - info_config.sh - subject="${servicename} Monitor - Starting ${servername}" - failurereason="Failed to query ${servicename}: ${gsquerycmd}" - actiontaken="restarted ${servicename}" - email.sh + # Seconds counter + for seconds in {1..15}; do + fn_print_fail "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : \e[0;31m${gsquerycmd}\e[0m" + totalseconds=$((totalseconds + 1)) + sleep 1 + if [ "${seconds}" == "15" ]; then + break + fi + done fi - fn_restart - fi -done \ No newline at end of file + done +fi \ No newline at end of file From 248518c3c51b6c79e22dd7f5c600bbaae644fe90 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 Feb 2016 22:40:56 +0000 Subject: [PATCH 095/434] repaired ut99 fix --- functions/command_install.sh | 2 +- functions/fix_ut99.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/functions/command_install.sh b/functions/command_install.sh index 9c7eb7180..77cf2d359 100644 --- a/functions/command_install.sh +++ b/functions/command_install.sh @@ -26,11 +26,11 @@ elif [ -n "${appid}" ]; then fi # Configuration -fix.sh install_config.sh if [ "${gamename}" == "Counter Strike: Global Offensive" ]||[ "${gamename}" == "Team Fortress 2" ]||[ "${gamename}" == "BrainBread 2" ]; then install_gslt.sh elif [ "${gamename}" == "Teamspeak 3" ]; then install_ts3db.sh fi +fix.sh install_complete.sh diff --git a/functions/fix_ut99.sh b/functions/fix_ut99.sh index aceb37128..f7792fb44 100644 --- a/functions/fix_ut99.sh +++ b/functions/fix_ut99.sh @@ -3,7 +3,7 @@ # Author: Daniel Gibbs # Website: http://gameservermanagers.com lgsm_version="271215" - +echo "${servercfgfullpath}" echo "enabling UdpServerUplink." { echo "[IpServer.UdpServerUplink]" @@ -21,5 +21,5 @@ echo "removing dead mplayer.com master server." sed -i '/master.mplayer.com/d' "${servercfgfullpath}" sleep 1 echo "inserting qtracker.com master server." -sed -i '66i\ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.qtracker.com MasterServerPort=27900' "${servercfgfullpath}" +sed -i '65i\ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.qtracker.com MasterServerPort=27900' "${servercfgfullpath}" echo "" \ No newline at end of file From 995a4c584d738a414c5ef5f2bec870084fd72126 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 1 Mar 2016 19:23:58 +0000 Subject: [PATCH 096/434] Optimised fixes removed un-needed code --- functions/fix.sh | 23 ++++++++++++++++++-- functions/fix_arma3.sh | 26 +++------------------- functions/fix_csgo.sh | 44 +++++++++++--------------------------- functions/fix_dst.sh | 28 ++++-------------------- functions/fix_ro.sh | 4 ++-- functions/fix_steamcmd.sh | 45 +++++++++++---------------------------- functions/fix_ut2k4.sh | 15 +++++-------- 7 files changed, 61 insertions(+), 124 deletions(-) diff --git a/functions/fix.sh b/functions/fix.sh index 931f4acbe..86e397ee6 100644 --- a/functions/fix.sh +++ b/functions/fix.sh @@ -2,11 +2,31 @@ # LGSM fix.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="020116" +lgsm_version="010316" # Description: Overall function for managing fixes. # Runs functions that will fix an issue. +# Messages that are displayed for some fixes +fn_fix_msg_start(){ + fn_print_dots "Applying ${fixname} fix: ${gamename}" + sleep 1 + fn_print_info "Applying ${fixname} fix: ${gamename}" + fn_scriptlog "Applying ${fixname} fix: ${gamename}" + sleep 1 +} + +fn_fix_msg_end(){ + if [ $? -ne 0 ]; then + fn_print_fail_nl "Applying ${fixname} fix: ${gamename}" + fn_scriptlog "Failure! Applying ${fixname} fix: ${gamename}" + else + fn_print_ok_nl "Applying ${fixname} fix: ${gamename}" + fn_scriptlog "Complete! Applying ${fixname} fix: ${gamename}" + fi +} + + # Fixes that are run on start if [ "${function_selfname}" != "command_install.sh" ]; then if [ ! -z "${appid}" ]; then @@ -14,7 +34,6 @@ if [ "${function_selfname}" != "command_install.sh" ]; then fi if [ "${gamename}" == "Counter Strike: Global Offensive" ]; then - startfix=1 fix_csgo.sh elif [ "${gamename}" == "Don't Starve Together" ]; then fix_dst.sh diff --git a/functions/fix_arma3.sh b/functions/fix_arma3.sh index b076fe065..ffc607ed6 100644 --- a/functions/fix_arma3.sh +++ b/functions/fix_arma3.sh @@ -4,30 +4,10 @@ # Website: http://gameservermanagers.com lgsm_version="301215" -# Fixes line 63: 20150 Segmentation fault (core dumped) #488 - -fn_msg_start(){ - fn_print_dots "Applying ${fixname} fix: ${gamename}" - sleep 1 - fn_print_info "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Applying ${fixname} fix: ${gamename}" - sleep 1 -} - -fn_msg_end(){ - if [ $? -ne 0 ]; then - fn_print_fail_nl "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Failure! Applying ${fixname} fix: ${gamename}" - else - fn_print_ok_nl "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Complete! Applying ${fixname} fix: ${gamename}" - fi -} - # Fixes: server not always creating steam_appid.txt file. if [ ! -d "${rootdir}/.local/share/Arma\ 3" ]; then - local fixname="20150 Segmentation fault (core dumped)" - fn_msg_start + fixname="20150 Segmentation fault (core dumped)" + fn_fix_msg_start mkdir -p "${rootdir}/.local/share/Arma\ 3" - fn_msg_end + fn_fix_msg_end fi \ No newline at end of file diff --git a/functions/fix_csgo.sh b/functions/fix_csgo.sh index 33fd7c169..f968640ce 100644 --- a/functions/fix_csgo.sh +++ b/functions/fix_csgo.sh @@ -2,60 +2,42 @@ # LGSM fix_csgo.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="301215" +lgsm_version="010316" # Description: Resolves various issues with csgo. -fn_msg_start(){ - fn_print_dots "Applying ${fixname} fix: ${gamename}" - sleep 1 - fn_print_info "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Applying ${fixname} fix: ${gamename}" - sleep 1 -} - -fn_msg_end(){ - if [ $? -ne 0 ]; then - fn_print_fail_nl "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Failure! Applying ${fixname} fix: ${gamename}" - else - fn_print_ok_nl "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Complete! Applying ${fixname} fix: ${gamename}" - fi -} - # Fixes: server not always creating steam_appid.txt file. if [ ! -f "${filesdir}/steam_appid.txt" ]; then - local fixname="730 steam_appid.txt" - fn_msg_start + fixname="730 steam_appid.txt" + fn_fix_msg_start echo -n "730" >> "${filesdir}/steam_appid.txt" - fn_msg_end + fn_fix_msg_end fi # Fixes: Error parsing BotProfile.db - unknown attribute 'Rank'". if ! grep -q "//Rank" "${systemdir}/botprofile.db" > /dev/null 2>&1; then - local fixname="botprofile.db" - fn_msg_start + fixname="botprofile.db" + fn_fix_msg_start sed -i 's/\tRank/\t\/\/Rank/g' "${systemdir}/botprofile.db" > /dev/null 2>&1 - fn_msg_end + fn_fix_msg_end fi # Fixes: Unknown command "cl_bobamt_vert". if ! grep -q "//exec default" "${servercfgdir}/valve.rc" > /dev/null 2>&1 || ! grep -q "//exec joystick" "${servercfgdir}/valve.rc" > /dev/null 2>&1; then - local fixname="valve.rc" - fn_msg_start + fixname="valve.rc" + fn_fix_msg_start sed -i 's/exec default.cfg/\/\/exec default.cfg/g' "${servercfgdir}/valve.rc" > /dev/null 2>&1 sed -i 's/exec joystick.cfg/\/\/exec joystick.cfg/g' "${servercfgdir}/valve.rc" > /dev/null 2>&1 - fn_msg_end + fn_fix_msg_end fi # Fixes: workshop map issue. # http://forums.steampowered.com/forums/showthread.php?t=3170366. if [ -f "${systemdir}/subscribed_collection_ids.txt" ]||[ -f "${systemdir}/subscribed_file_ids.txt" ]||[ -f "${systemdir}/ugc_collection_cache.txt" ]; then - local fixname="workshop map" - fn_msg_start + fixname="workshop map" + fn_fix_msg_start rm -f "${systemdir}/subscribed_collection_ids.txt" rm -f "${systemdir}/subscribed_file_ids.txt" rm -f "${systemdir}/ugc_collection_cache.txt" - fn_msg_end + fn_fix_msg_end fi \ No newline at end of file diff --git a/functions/fix_dst.sh b/functions/fix_dst.sh index b860f6d09..feec27b14 100644 --- a/functions/fix_dst.sh +++ b/functions/fix_dst.sh @@ -2,33 +2,13 @@ # LGSM fix_dst.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="020116" - -# Fixes line 63: 20150 Segmentation fault (core dumped) #488 - -fn_msg_start(){ - fn_print_dots "Applying ${fixname} fix: ${gamename}" - sleep 1 - fn_print_info "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Applying ${fixname} fix: ${gamename}" - sleep 1 -} - -fn_msg_end(){ - if [ $? -ne 0 ]; then - fn_print_fail_nl "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Failure! Applying ${fixname} fix: ${gamename}" - else - fn_print_ok_nl "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Complete! Applying ${fixname} fix: ${gamename}" - fi -} +lgsm_version="010316" # Fixes: ./dontstarve_dedicated_server_nullrenderer: ./lib32/libcurl-gnutls.so.4: no version information available (required by ./dontstarve_dedicated_server_nullrenderer) # Issue only occures on CentOS as libcurl-gnutls.so.4 is called libcurl.so.4 on CentOS. if [ -f "/etc/redhat-release" ] && [ ! -f "${filesdir}/bin/lib32/libcurl-gnutls.so.4" ]; then - local fixname="libcurl-gnutls.so.4 missing" - fn_msg_start + fixname="libcurl-gnutls.so.4 missing" + fn_fix_msg_start ln -s "/usr/lib/libcurl.so.4" "${filesdir}/bin/lib32/libcurl-gnutls.so.4" - fn_msg_end + fn_fix_msg_end fi \ No newline at end of file diff --git a/functions/fix_ro.sh b/functions/fix_ro.sh index d3d0ac0e2..a7c703e1a 100644 --- a/functions/fix_ro.sh +++ b/functions/fix_ro.sh @@ -2,14 +2,14 @@ # LGSM fix_ro.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="010316" echo "Applying WebAdmin ROOst.css fix." echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" sed -i 's/none}/none;/g' "${filesdir}/Web/ServerAdmin/ROOst.css" sed -i 's/underline}/underline;/g' "${filesdir}/Web/ServerAdmin/ROOst.css" sleep 1 -echo "Applying WebAdmin CharSet fix." +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" sleep 1 diff --git a/functions/fix_steamcmd.sh b/functions/fix_steamcmd.sh index a05f783c4..46f52e4c8 100644 --- a/functions/fix_steamcmd.sh +++ b/functions/fix_steamcmd.sh @@ -2,60 +2,41 @@ # LGSM fix_steamcmd.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="010116" +lgsm_version="010316" # Description: fixes various issues related to steamCMD. -fn_msg_start(){ - fn_print_dots "Applying ${fixname} fix: ${gamename}" - sleep 1 - fn_print_info "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Applying ${fixname} fix: ${gamename}" - sleep 1 -} - -fn_msg_end(){ - if [ $? -ne 0 ]; then - fn_print_fail_nl "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Failure! Applying ${fixname} fix: ${gamename}" - else - fn_print_ok_nl "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Complete! Applying ${fixname} fix: ${gamename}" - fi -} - - # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so. if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then - local fixname="steamclient.so general" - fn_msg_start + fixname="steamclient.so general" + fn_fix_msg_start mkdir -pv "${HOME}/.steam/sdk32" >> "${scriptlog}" cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${scriptlog}" - fn_msg_end + fn_fix_msg_end fi if [ "${gamename}" == "Serious Sam 3: BFE" ]; then # Fixes: .steam/bin32/libsteam.so: cannot open shared object file: No such file or directory if [ ! -f "${HOME}/.steam/bin32/libsteam.so" ]; then - local fixname="libsteam.so" - fn_msg_start + fixname="libsteam.so" + fn_fix_msg_start mkdir -pv "${HOME}/.steam/bin32" >> "${scriptlog}" cp -v "${filesdir}/Bin/libsteam.so" "${HOME}/.steam/bin32/libsteam.so" >> "${scriptlog}" - fn_msg_end + fn_fix_msg_end fi elif [ "${gamename}" == "Hurtworld" ]; then # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. if [ ! -f "${filesdir}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then - local fixname="steamclient.so x86" - fn_msg_start + fixname="steamclient.so x86" + fn_fix_msg_start cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${filesdir}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${scriptlog}" - fn_msg_end + fn_fix_msg_end fi if [ ! -f "${filesdir}/Hurtworld_Data/Plugins/x86_64/steamclient.so" ]; then - local fixname="steamclient.so x86_64" - fn_msg_start + fixname="steamclient.so x86_64" + fn_fix_msg_start cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${filesdir}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${scriptlog}" - fn_msg_end + fn_fix_msg_end fi fi diff --git a/functions/fix_ut2k4.sh b/functions/fix_ut2k4.sh index b9ec4ad8a..eff67a12c 100644 --- a/functions/fix_ut2k4.sh +++ b/functions/fix_ut2k4.sh @@ -2,7 +2,7 @@ # LGSM fix_ut2k4.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="010316" echo "applying WebAdmin ut2003.css fix." echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" @@ -13,15 +13,10 @@ 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" sleep 1 -echo "" -echo -en "forcing server restart.\r" -sleep 0.5 -echo -en "forcing server restart..\r" -sleep 0.5 -echo -en "forcing server restart...\r" -sleep 0.5 -echo -en "\n" -sleep 0.5 +echo "applying server name fix." +sleep 1 +echo "forcing server restart..." +sleep 1 command_start.sh sleep 5 command_stop.sh From 5d6cf92630dcc8f75865e4b8332ba3092f4a18d3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 1 Mar 2016 19:32:34 +0000 Subject: [PATCH 097/434] Code tidy --- functions/check.sh | 17 +++-------------- functions/command_install.sh | 3 +++ functions/email.sh | 4 ++-- functions/fix.sh | 2 +- functions/fix_dst.sh | 2 ++ functions/fix_ro.sh | 2 ++ functions/fix_steamcmd.sh | 1 - functions/fix_ut2k4.sh | 2 ++ 8 files changed, 15 insertions(+), 18 deletions(-) diff --git a/functions/check.sh b/functions/check.sh index 0c2fbe7bf..3450794b9 100644 --- a/functions/check.sh +++ b/functions/check.sh @@ -7,17 +7,8 @@ lgsm_version="170216" # Description: Overall function for managing checks. # Runs checks that will either halt on or fix an issue. -array_contains () { - local seeking=$1; shift - local in=1 - for element; do - if [ ${element} == ${seeking} ]; then - in=0 - break - fi - done - return $in -} +# Every command that requires checks just references check.sh +# check.sh selects which checks to run by using arrays check_root.sh @@ -53,9 +44,7 @@ local allowed_commands_array=( update_check.sh command_debug.sh command_start.sh for allowed_command in "${allowed_commands_array[@]}" do if [ "${allowed_command}" == "${function_selfname}" ]; then - if [ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament 2004" ]||[ "${gamename}" == "Mumble" ]||[ "${gamename}" == "Teamspeak 3" ]; then - : # These servers do not require SteamCMD. Check is skipped. - else + if [ -n "${appid}" ]; then check_steamcmd.sh fi fi diff --git a/functions/command_install.sh b/functions/command_install.sh index 77cf2d359..e14e4482e 100644 --- a/functions/command_install.sh +++ b/functions/command_install.sh @@ -4,6 +4,9 @@ # Website: http://gameservermanagers.com lgsm_version="260216" +# Description: Overall function for the installer. + + local modulename="Install" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" diff --git a/functions/email.sh b/functions/email.sh index 66d5acba7..51b097dd9 100644 --- a/functions/email.sh +++ b/functions/email.sh @@ -55,11 +55,11 @@ fn_parms }| sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee "${scriptlogdir}/${servicename}-email.log" > /dev/null 2>&1 echo -e "\n\n Script log\n===================" >> "${emaillog}" tail -25 "${scriptlog}" >> "${emaillog}" -if [ ! -z "${consolelog}" ]; then +if [ -n "${consolelog}" ]; then echo -e "\n\n Console log\n====================" >> "${emaillog}" tail -25 "${consolelog}" | awk '{ sub("\r$", ""); print }' >> "${emaillog}" fi -if [ ! -z "${gamelogdir}" ]; then +if [ -n "${gamelogdir}" ]; then echo -e "\n\n Server log\n====================" >> "${emaillog}" tail "${gamelogdir}"/* | grep -v "==>" | sed '/^$/d' | tail -25 >> "${emaillog}" fi diff --git a/functions/fix.sh b/functions/fix.sh index 86e397ee6..e4723e649 100644 --- a/functions/fix.sh +++ b/functions/fix.sh @@ -29,7 +29,7 @@ fn_fix_msg_end(){ # Fixes that are run on start if [ "${function_selfname}" != "command_install.sh" ]; then - if [ ! -z "${appid}" ]; then + if [ -n "${appid}" ]; then fix_steamcmd.sh fi diff --git a/functions/fix_dst.sh b/functions/fix_dst.sh index feec27b14..5dadf4b78 100644 --- a/functions/fix_dst.sh +++ b/functions/fix_dst.sh @@ -4,6 +4,8 @@ # Website: http://gameservermanagers.com lgsm_version="010316" +# Description: Resolves various issues with Dont Starve together. + # Fixes: ./dontstarve_dedicated_server_nullrenderer: ./lib32/libcurl-gnutls.so.4: no version information available (required by ./dontstarve_dedicated_server_nullrenderer) # Issue only occures on CentOS as libcurl-gnutls.so.4 is called libcurl.so.4 on CentOS. if [ -f "/etc/redhat-release" ] && [ ! -f "${filesdir}/bin/lib32/libcurl-gnutls.so.4" ]; then diff --git a/functions/fix_ro.sh b/functions/fix_ro.sh index a7c703e1a..18ceeb433 100644 --- a/functions/fix_ro.sh +++ b/functions/fix_ro.sh @@ -4,6 +4,8 @@ # Website: http://gameservermanagers.com lgsm_version="010316" +# Description: Resolves various issues with red orchestra. + echo "Applying WebAdmin ROOst.css fix." echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" sed -i 's/none}/none;/g' "${filesdir}/Web/ServerAdmin/ROOst.css" diff --git a/functions/fix_steamcmd.sh b/functions/fix_steamcmd.sh index 46f52e4c8..86feb9e2c 100644 --- a/functions/fix_steamcmd.sh +++ b/functions/fix_steamcmd.sh @@ -26,7 +26,6 @@ if [ "${gamename}" == "Serious Sam 3: BFE" ]; then fi elif [ "${gamename}" == "Hurtworld" ]; then # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. - if [ ! -f "${filesdir}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then fixname="steamclient.so x86" fn_fix_msg_start diff --git a/functions/fix_ut2k4.sh b/functions/fix_ut2k4.sh index eff67a12c..363aa5d56 100644 --- a/functions/fix_ut2k4.sh +++ b/functions/fix_ut2k4.sh @@ -4,6 +4,8 @@ # Website: http://gameservermanagers.com lgsm_version="010316" +# Description: Resolves various issues with unreal tournament 2004. + echo "applying WebAdmin ut2003.css fix." echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" sed -i 's/none}/none;/g' "${filesdir}/Web/ServerAdmin/ut2003.css" From 3b6e66a5ae8f7348af3023a63e59f13d4691a978 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 1 Mar 2016 19:37:59 +0000 Subject: [PATCH 098/434] Code tidy --- functions/check_ip.sh | 4 +--- functions/command_dev_debug.sh | 2 ++ functions/command_install.sh | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/functions/check_ip.sh b/functions/check_ip.sh index c4b5be149..2a5ae5794 100644 --- a/functions/check_ip.sh +++ b/functions/check_ip.sh @@ -7,9 +7,7 @@ lgsm_version="271215" # Description: Automatically identifies the server interface IP. # If multiple interfaces are detected the user will need to manualy set using ip="0.0.0.0". -if [ "${gamename}" == "Teamspeak 3" ]; then - : -else +if [ "${gamename}" != "Teamspeak 3" ]; then if [ ! -f "/bin/ip" ]; then ipcommand="/sbin/ip" else diff --git a/functions/command_dev_debug.sh b/functions/command_dev_debug.sh index 1855f5919..46bae900d 100644 --- a/functions/command_dev_debug.sh +++ b/functions/command_dev_debug.sh @@ -4,6 +4,8 @@ # Website: http://gameservermanagers.com lgsm_version="281215" +# Description: Dev only: enables debuging log to be saved to dev-debug.log. + function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" if [ -f ".dev-debug" ]; then diff --git a/functions/command_install.sh b/functions/command_install.sh index e14e4482e..877896380 100644 --- a/functions/command_install.sh +++ b/functions/command_install.sh @@ -6,7 +6,6 @@ lgsm_version="260216" # Description: Overall function for the installer. - local modulename="Install" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" From 9d3bbf3a9a547548d059ae3d4952fd784ef2853d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 1 Mar 2016 19:58:43 +0000 Subject: [PATCH 099/434] Fixed 7 Days to Die deps not working --- functions/check_deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/check_deps.sh b/functions/check_deps.sh index 3cd5d32ce..535a15330 100644 --- a/functions/check_deps.sh +++ b/functions/check_deps.sh @@ -135,7 +135,7 @@ if [ -n "$(command -v dpkg-query)" ]; then if [ "${engine}" == "spark" ]; then array_deps_required+=( speex:i386 libtbb2 ) # 7 Days to Die - elif [ "${executable}" == "./7DaysToDie.sh" ]; then + elif [ "${gamename}" == "7 Days To Die" ]; then array_deps_required+=( telnet expect ) # No More Room in Hell elif [ "${gamename}" == "No More Room in Hell" ]; then From 2fe511007f008025cc1cacd4edd5a21b0c9d625c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 1 Mar 2016 20:14:59 +0000 Subject: [PATCH 100/434] Fixed issue #696 --- functions/info_config.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions/info_config.sh b/functions/info_config.sh index 3fe13fc0e..91b8ab67a 100644 --- a/functions/info_config.sh +++ b/functions/info_config.sh @@ -2,7 +2,7 @@ # LGSM info_config.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="060116" +lgsm_version="010316" # Description: Gets specific details from config files. @@ -513,7 +513,7 @@ elif [ "${gamename}" == "7 Days To Die" ]; then # telnet password if [ -f "${servercfgfullpath}" ]; then - telnetpass=$(grep "TelnetEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + telnetpass=$(grep "TelnetPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") if [ ! -n "${telnetpass}" ]; then telnetpass="NOT SET" fi From 54895153bc296dcf44fa3f2a01bbb8afce300622 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 2 Mar 2016 21:39:53 +0000 Subject: [PATCH 101/434] improvements to stop command improvements to graceful shutdown using functions more for easy reading --- functions/command_stop.sh | 295 ++++++++++++++++++++++---------------- 1 file changed, 169 insertions(+), 126 deletions(-) diff --git a/functions/command_stop.sh b/functions/command_stop.sh index d5d589beb..9d75fbc5a 100644 --- a/functions/command_stop.sh +++ b/functions/command_stop.sh @@ -9,40 +9,146 @@ lgsm_version="271215" local modulename="Stopping" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -sdtd_telnet(){ - sdtdshutdown=$( expect -c ' - proc abort {} { - puts "Timeout or EOF\n" - exit 1 - } - spawn telnet '"${telnetip}"' '"${telnetport}"' - expect { - "password:" { send "'"${telnetpass}"'\r" } - default abort - } - expect { - "session." { send "shutdown\r" } - default abort - } - expect { eof } - puts "Completed.\n" - ') +# Attempts Graceful of source using rcon 'quit' command. +fn_stop_graceful_source(){ +fn_print_dots "Graceful: rcon quit" +fn_scriptlog "Graceful: rcon quit" +# sends quit +tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 +# waits up to 30 seconds giving the server time to shutdown gracefuly +for seconds in {1..30}; do + pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") + if [ "${pid}" == "0" ]; then + fn_print_ok_nl "Graceful: rcon quit: ${seconds}" + fn_scriptlog "Graceful: rcon quit: OK: ${seconds} seconds" + break + fi + sleep 1 + fn_print_dots "Graceful: rcon quit: ${seconds}" +done +if [ "${pid}" != "0" ]; then + fn_print_fail_nl "Graceful: rcon quit" + fn_scriptlog "Graceful: rcon quit: FAIL" +fi +sleep 1 +} + +# Attempts Graceful of goldsource using rcon 'quit' command. +# Goldsource 'quit' command restarts rather than shutsdown +# this function will only wait 3 seconds then force a tmux shutdown. +# preventing the server from coming back online. +fn_stop_graceful_goldsource(){ +fn_print_dots "Graceful: rcon quit" +fn_scriptlog "Graceful: rcon quit" +# sends quit +tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 +# waits 3 seconds as goldsource servers restart with the quit command +for seconds in {1..3}; do + sleep 1 + fn_print_dots "Graceful: rcon quit: ${seconds}" +done +fn_print_ok_nl "Graceful: rcon quit: ${seconds}" +sleep 1 +} + +# Attempts Graceful of 7 Days To Die using telnet. +fn_stop_telnet_sdtd(){ +sdtdshutdown=$( expect -c ' +proc abort {} { + puts "Timeout or EOF\n" + exit 1 +} +spawn telnet '"${telnetip}"' '"${telnetport}"' +expect { + "password:" { send "'"${telnetpass}"'\r" } + default abort +} +expect { + "session." { send "shutdown\r" } + default abort +} +expect { eof } +puts "Completed.\n" +') +} + +fn_stop_graceful_sdtd(){ +# Gets server IP. +info_config.sh + +fn_print_dots "Graceful: telnet" +fn_scriptlog "Graceful: telnet" +sleep 1 + +# uses localhost on first attempt. +telnetip=127.0.0.1 +fn_print_dots "Graceful: telnet: ${telnetip}" +fn_scriptlog "Graceful: telnet: ${telnetip}" +fn_stop_telnet_sdtd +sleep 1 + +# falls back to the server ip if localhost fails. +refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF") +if [ -n "${refused}" ]; then + fn_print_warn_nl "Graceful: telnet: localhost: " + fn_print_fail_eol + fn_scriptlog "Graceful: telnet: localhost: FAIL" + sleep 1 + + telnetip=${ip} + fn_print_dots "Graceful: telnet: ${telnetip}" + fn_scriptlog "Graceful: telnet: ${telnetip}" + fn_stop_telnet_sdtd + refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF") + + fn_print_warnnl "Graceful: telnet: ${telnetip}: " + fn_print_fail_eol + fn_scriptlog "Graceful: telnet: ${telnetip}: FAIL" + sleep 1 +fi + +# Checks if attempts have worked. +completed=$(echo -en "\n ${sdtdshutdown}"| grep "Completed.") +if [ -n "${completed}" ]; then + fn_print_ok_nl "Graceful: telnet: " + fn_print_ok_eol + fn_scriptlog "Graceful: telnet: OK" +elif [ -n "${refused}" ]; then + fn_print_fail_nl "Graceful: telnet: " + fn_print_fail_eol + fn_scriptlog "Graceful: telnet: ${telnetip}: FAIL" + echo -en "\n\n" | tee -a "${scriptlog}" + echo -en "Telnet output:" | tee -a "${scriptlog}" + echo -en "\n ${sdtdshutdown}" | tee -a "${scriptlog}" + echo -en "\n\n" | tee -a "${scriptlog}" +else + fn_print_fail_nl "Graceful: telnet: Unknown error" + fn_scriptlog "Graceful: telnet: Unknown error" + echo -en "\n\n" | tee -a "${scriptlog}" + echo -en "Telnet output:" | tee -a "${scriptlog}" + echo -en "\n ${sdtdshutdown}" | tee -a "${scriptlog}" + echo -en "\n\n" | tee -a "${scriptlog}" +fi +} + +fn_stop_graceful_select(){ +if [ "${gamename}" == "7 Days to Die" ]; then + fn_stop_graceful_sdtd +elif [ "${engine}" == "source" ]; then + fn_stop_graceful_source +elif [ "${engine}" == "goldsource" ]; then + fn_stop_graceful_goldsource +else + fn_stop_tmux } fn_stop_teamspeak3(){ -check.sh fn_print_dots "${servername}" fn_scriptlog "${servername}" sleep 1 -info_ts3status.sh -if [ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then - fn_print_fail "${servername} is already stopped" - fn_scriptlog "${servername} is already stopped" -else - ${filesdir}/ts3server_startscript.sh stop > /dev/null 2>&1 - fn_print_ok "${servername}" - fn_scriptlog "Stopped ${servername}" -fi +${filesdir}/ts3server_startscript.sh stop > /dev/null 2>&1 +fn_print_ok "${servername}" +fn_scriptlog "Stopped ${servername}" # Remove lock file rm -f "${rootdir}/${lockselfname}" sleep 1 @@ -50,110 +156,47 @@ echo -en "\n" } fn_stop_tmux(){ -check.sh -info_config.sh fn_print_dots "${servername}" fn_scriptlog "${servername}" sleep 1 - -if [ "${gamename}" == "7 Days To Die" ] ; then - # if game is 7 Days To Die, we need special, graceful shutdown via telnet connection. - # Set below variable to be called for expect to operate correctly.. - fn_print_dots "Attempting graceful shutdown via telnet" - fn_scriptlog "Attempting graceful shutdown via telnet" - sleep 1 - telnetip=127.0.0.1 - sdtd_telnet - - # If failed using localhost will use servers ip - refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF") - if [ -n "${refused}" ]; then - telnetip=${ip} - fn_print_warn "Attempting graceful shutdown via telnet: localhost failed" - fn_scriptlog "Warning! Attempting graceful shutdown failed using localhost" - sleep 5 - echo -en "\n" - fn_print_dots "Attempting graceful shutdown via telnet: using ${telnetip}" - fn_scriptlog "Attempting graceful shutdown via telnet using ${telnetip}" - sdtd_telnet - sleep 1 - fi - - refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF") - completed=$(echo -en "\n ${sdtdshutdown}"| grep "Completed.") - if [ -n "${refused}" ]; then - fn_print_fail "Attempting graceful shutdown via telnet" - fn_scriptlog "Attempting graceful shutdown failed" - fn_scriptlog "${refused}" - elif [ -n "${completed}" ]; then - fn_print_ok "Attempting graceful shutdown via telnet" - fn_scriptlog "Attempting graceful shutdown succeeded" - else - fn_print_fail "Attempting graceful shutdown via telnet: Unknown error" - fn_scriptlog "Attempting graceful shutdown failed" - fn_scriptlog "Unknown error" - fi - sleep 1 - echo -en "\n\n" - echo -en "Telnet output:" - echo -en "\n ${sdtdshutdown}" - echo -en "\n\n" - sleep 1 - fn_print_dots "${servername}" - fn_scriptlog "${servername}" - sleep 5 - pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") - if [ "${pid}" == "0" ]; then - fn_print_ok "${servername} is already stopped using graceful shutdown" - fn_scriptlog "${servername} is already stopped using graceful shutdown" - else - tmux kill-session -t "${servicename}" - fn_print_ok "${servername}" - fn_scriptlog "Stopped ${servername}" - fi - +# Kill tmux session +tmux kill-session -t "${servicename}" > /dev/null 2>&1 +pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") +if [ "${pid}" == "0" ]; then + fn_print_ok_nl "${servername}" + fn_scriptlog "Stopped ${servername}" + sleep 1 + # Remove lock file + rm -f "${rootdir}/${lockselfname}" else - pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") - if [ "${pid}" == "0" ]; then - fn_print_fail "${servername} is already stopped" - fn_scriptlog "${servername} is already stopped" - else - - if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then - sleep 1 - fn_print_dots "Attempting graceful shutdown" - fn_scriptlog "Attempting graceful shutdown" - tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 - counter=0 - while [ "${pid}" != "0" -a $counter -lt 30 ]; do - pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") - sleep 1 - let counter=counter+1 - if [ "${counter}" -gt "1" ]; then - fn_print_dots "Attempting graceful shutdown: ${counter}" - fi - done - pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") - if [ "${pid}" == "0" ]; then - fn_print_ok "Attempting graceful shutdown" - else - fn_print_fail "Attempting graceful shutdown" - fi - fi - - tmux kill-session -t "${servicename}" > /dev/null 2>&1 - fn_print_ok "${servername}" - fn_scriptlog "Stopped ${servername}" - fi + fn_print_fail_nl "Unable to stop${servername}" + fn_scriptlog "Unable to stop${servername}" fi - # Remove lock file - rm -f "${rootdir}/${lockselfname}" - sleep 1 - echo -en "\n" + } +# checks if the server is already stopped before trying to stop. +fn_stop_pre_check(){ if [ "${gamename}" == "Teamspeak 3" ]; then - fn_stop_teamspeak3 + info_ts3status.sh + if [ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then + fn_print_ok_nl "${servername} is already stopped" + fn_scriptlog "${servername} is already stopped" + else + fn_stop_teamspeak3 + fi else - fn_stop_tmux -fi \ No newline at end of file + pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") + if [ "${pid}" == "0" ]; then + fn_print_ok_nl "${servername} is already stopped" + fn_scriptlog "${servername} is already stopped" + else + fn_stop_graceful_select + fi +fi +} + + + +check.sh +fn_stop_pre_check \ No newline at end of file From 7e732a2f6f5adea61cb4f89938993f1360283d85 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 2 Mar 2016 21:41:28 +0000 Subject: [PATCH 102/434] missing fi --- functions/command_stop.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/functions/command_stop.sh b/functions/command_stop.sh index 9d75fbc5a..a91bed79d 100644 --- a/functions/command_stop.sh +++ b/functions/command_stop.sh @@ -139,7 +139,8 @@ elif [ "${engine}" == "source" ]; then elif [ "${engine}" == "goldsource" ]; then fn_stop_graceful_goldsource else - fn_stop_tmux + fn_stop_tmux +fi } fn_stop_teamspeak3(){ @@ -196,7 +197,5 @@ else fi } - - check.sh fn_stop_pre_check \ No newline at end of file From c2cf00f74679e03ed610006b20ea0cc6a2316dd3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 2 Mar 2016 21:49:20 +0000 Subject: [PATCH 103/434] added tmux_stop --- functions/command_stop.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/functions/command_stop.sh b/functions/command_stop.sh index a91bed79d..a127ebc4b 100644 --- a/functions/command_stop.sh +++ b/functions/command_stop.sh @@ -29,6 +29,7 @@ done if [ "${pid}" != "0" ]; then fn_print_fail_nl "Graceful: rcon quit" fn_scriptlog "Graceful: rcon quit: FAIL" + fn_stop_tmux fi sleep 1 } @@ -49,6 +50,7 @@ for seconds in {1..3}; do done fn_print_ok_nl "Graceful: rcon quit: ${seconds}" sleep 1 +fn_stop_tmux } # Attempts Graceful of 7 Days To Die using telnet. From cbb5bbe170062db001149a8ca1057ca95b33a5e4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 2 Mar 2016 22:12:24 +0000 Subject: [PATCH 104/434] all nl messages will act the same most nl messages already waited 1 second before new line. however all should now do this giving a more consistent feel --- functions/check_logs.sh | 3 +-- functions/command_debug.sh | 4 +--- functions/command_start.sh | 6 +---- functions/command_stop.sh | 11 +++++---- functions/command_validate.sh | 4 +--- functions/core_messages.sh | 44 ++++++++++++++++++++++++----------- functions/email.sh | 6 ++--- functions/logs.sh | 12 +++------- 8 files changed, 46 insertions(+), 44 deletions(-) diff --git a/functions/check_logs.sh b/functions/check_logs.sh index f390eeab4..9b4f41324 100644 --- a/functions/check_logs.sh +++ b/functions/check_logs.sh @@ -10,8 +10,7 @@ lgsm_version="271215" if [ ! -d "${scriptlogdir}" ]; then fn_print_dots "Checking for log files" sleep 1 - fn_print_info "Checking for log files: Creating log files" - echo -en "\n" + fn_print_info_nl "Checking for log files: Creating log files" checklogs=1 install_logs.sh fi diff --git a/functions/command_debug.sh b/functions/command_debug.sh index 7c9aca38b..baa93aec0 100644 --- a/functions/command_debug.sh +++ b/functions/command_debug.sh @@ -48,10 +48,8 @@ sleep 1 command_stop.sh fn_print_dots "Starting debug" sleep 1 -fn_print_ok "Starting debug" +fn_print_ok_nl "Starting debug" fn_scriptlog "Started debug" -sleep 1 -echo -en "\n" cd "${executabledir}" fix.sh if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then diff --git a/functions/command_start.sh b/functions/command_start.sh index fd30a17bb..e1e324caf 100644 --- a/functions/command_start.sh +++ b/functions/command_start.sh @@ -104,10 +104,8 @@ if [ "${tmuxwc}" -eq 0 ]; then fi if [ "${tmuxwc}" -eq 1 ]; then - fn_print_info "${servername} is already running" + fn_print_info_nl "${servername} is already running" fn_scriptlog "${servername} is already running" - sleep 1 - echo -en "\n" exit fi @@ -138,8 +136,6 @@ if [ "${tmuxwc}" -eq 0 ]; then if [ -s "${scriptlogdir}/.${servicename}-tmux-error.tmp" ]; then fn_print_fail_nl "Unable to start ${servername}: Tmux error:" fn_scriptlog "Tmux error" - sleep 1 - echo -en "\n" echo "" echo "Command" echo "=================================" diff --git a/functions/command_stop.sh b/functions/command_stop.sh index a127ebc4b..3e6a7e398 100644 --- a/functions/command_stop.sh +++ b/functions/command_stop.sh @@ -150,17 +150,15 @@ fn_print_dots "${servername}" fn_scriptlog "${servername}" sleep 1 ${filesdir}/ts3server_startscript.sh stop > /dev/null 2>&1 -fn_print_ok "${servername}" -fn_scriptlog "Stopped ${servername}" # Remove lock file rm -f "${rootdir}/${lockselfname}" -sleep 1 -echo -en "\n" +fn_print_ok_nl "${servername}" +fn_scriptlog "Stopped ${servername}" } fn_stop_tmux(){ fn_print_dots "${servername}" -fn_scriptlog "${servername}" +fn_scriptlog "tmux kill-session: ${servername}" sleep 1 # Kill tmux session tmux kill-session -t "${servicename}" > /dev/null 2>&1 @@ -200,4 +198,7 @@ fi } check.sh +fn_print_dots "${servername}" +fn_scriptlog "${servername}" +sleep 1 fn_stop_pre_check \ No newline at end of file diff --git a/functions/command_validate.sh b/functions/command_validate.sh index 59c03b6ff..f4c46c071 100644 --- a/functions/command_validate.sh +++ b/functions/command_validate.sh @@ -10,9 +10,7 @@ local modulename="Validate" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_validation(){ -fn_print_warn "Validating may overwrite some customised files." -sleep 1 -echo -en "\n" +fn_print_warn_nl "Validating may overwrite some customised files." echo -en "https://developer.valvesoftware.com/wiki/SteamCMD#Validate" sleep 5 echo -en "\n" diff --git a/functions/core_messages.sh b/functions/core_messages.sh index eeaac4170..2cbcd08f7 100644 --- a/functions/core_messages.sh +++ b/functions/core_messages.sh @@ -30,10 +30,12 @@ fn_print_fail(){ fn_print_fail_nl(){ if [ -n "${modulename}" ]; then - echo -e "\r\033[K[\e[0;31m FAIL \e[0m] ${modulename} ${servicename}: $@" + echo -en "\r\033[K[\e[0;31m FAIL \e[0m] ${modulename} ${servicename}: $@" else - echo -e "\r\033[K[\e[0;31m FAIL \e[0m] $@" + echo -en "\r\033[K[\e[0;31m FAIL \e[0m] $@" fi + sleep 1 + echo -en "\n" } # [ OK ] @@ -47,10 +49,12 @@ fn_print_ok(){ fn_print_ok_nl(){ if [ -n "${modulename}" ]; then - echo -e "\r\033[K[\e[0;32m OK \e[0m] ${modulename} ${servicename}: $@" + echo -en "\r\033[K[\e[0;32m OK \e[0m] ${modulename} ${servicename}: $@" else - echo -e "\r\033[K[\e[0;32m OK \e[0m] $@" + echo -en "\r\033[K[\e[0;32m OK \e[0m] $@" fi + sleep 1 + echo -en "\n" } # [ INFO ] @@ -64,10 +68,12 @@ fn_print_info(){ fn_print_info_nl(){ if [ -n "${modulename}" ]; then - echo -e "\r\033[K[\e[0;36m INFO \e[0m] ${modulename} ${servicename}: $@" + echo -en "\r\033[K[\e[0;36m INFO \e[0m] ${modulename} ${servicename}: $@" else - echo -e "\r\033[K[\e[0;36m INFO \e[0m] $@" + echo -en "\r\033[K[\e[0;36m INFO \e[0m] $@" fi + sleep 1 + echo -en "\n" } # [ WARN ] @@ -81,10 +87,12 @@ fn_print_warn(){ fn_print_warn_nl(){ if [ -n "${modulename}" ]; then - echo -e "\r\033[K[\e[1;33m WARN \e[0m] ${modulename} ${servicename}: $@" + echo -en "\r\033[K[\e[1;33m WARN \e[0m] ${modulename} ${servicename}: $@" else - echo -e "\r\033[K[\e[1;33m WARN \e[0m] $@" + echo -en "\r\033[K[\e[1;33m WARN \e[0m] $@" fi + sleep 1 + echo -en "\n" } # [ .... ] @@ -120,7 +128,9 @@ fn_print_failure(){ } fn_print_failure_nl(){ - echo -e "\e[0;31mFailure!\e[0m $@" + echo -en "\e[0;31mFailure!\e[0m $@" + sleep 1 + echo -en "\n" } # Error! @@ -129,7 +139,9 @@ fn_print_error(){ } fn_print_error_nl(){ - echo -e "\e[0;31mError!\e[0m $@" + echo -en "\e[0;31mError!\e[0m $@" + sleep 1 + echo -en "\n" } # Info! @@ -138,7 +150,9 @@ fn_print_infomation(){ } fn_print_infomation_nl(){ - echo -e "\e[0;36mInfomation!\e[0m $@" + echo -en "\e[0;36mInfomation!\e[0m $@" + sleep 1 + echo -en "\n" } # FAIL for end of line @@ -147,7 +161,9 @@ fn_print_ok_eol(){ } fn_print_ok_eol_nl(){ - echo -e "\e[0;32mOK\e[0m" + echo -en "\e[0;32mOK\e[0m" + sleep 1 + echo -en "\n" } # FAIL for end of line @@ -156,7 +172,9 @@ fn_print_fail_eol(){ } fn_print_fail_eol_nl(){ - echo -e "\e[0;31mFAIL\e[0m" + echo -en "\e[0;31mFAIL\e[0m" + sleep 1 + echo -en "\n" } # QUERYING for end of line diff --git a/functions/email.sh b/functions/email.sh index 51b097dd9..174ed3ff6 100644 --- a/functions/email.sh +++ b/functions/email.sh @@ -64,7 +64,5 @@ if [ -n "${gamelogdir}" ]; then tail "${gamelogdir}"/* | grep -v "==>" | sed '/^$/d' | tail -25 >> "${emaillog}" fi mail -s "${subject}" ${email} < "${emaillog}" -fn_print_ok "Sending notification to ${email}" -fn_scriptlog "Sent notification to ${email}" -sleep 1 -echo -en "\n" +fn_print_ok_nl "Sending notification to ${email}" +fn_scriptlog "Sent notification to ${email}" \ No newline at end of file diff --git a/functions/logs.sh b/functions/logs.sh index 79d4de462..cb7bd805b 100644 --- a/functions/logs.sh +++ b/functions/logs.sh @@ -27,14 +27,10 @@ if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; th # Setting up counting variables scriptcount="0" ; consolecount="0" ; gamecount="0" ; srcdscount="0" ; smcount="0" ; ulxcount="0" ; darkrpcount="0" ; legacycount="0" sleep 1 - fn_print_ok "Starting" + fn_print_ok_nl "Starting" fn_scriptlog "Starting" - sleep 1 - echo -en "\n" - fn_print_info "Removing logs older than "${logdays}" days" + fn_print_info_nl "Removing logs older than "${logdays}" days" fn_scriptlog "Removing logs older than "${logdays}" days" - sleep 1 - echo -en "\n" # Logging logfiles to be removed according to "${logdays}", counting and removing them # Script logfiles find "${scriptlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" @@ -90,8 +86,6 @@ if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; th # Count total amount of files removed count=$((${scriptcount} + ${consolecount} + ${gamecount} + ${srcdscount} + ${smcount} + ${ulxcount} + ${darkrpcount} + ${legacycount})) # Job done - fn_print_ok "Removed ${count} log files" + fn_print_ok_nl "Removed ${count} log files" fn_scriptlog "Removed ${count} log files" - sleep 1 - echo -en "\n" fi From e8fc3ffcb93162d381c425dc1399ecd0928ff0c4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 2 Mar 2016 22:15:30 +0000 Subject: [PATCH 105/434] removed sleep from eol --- functions/core_messages.sh | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/functions/core_messages.sh b/functions/core_messages.sh index 2cbcd08f7..d8b77305f 100644 --- a/functions/core_messages.sh +++ b/functions/core_messages.sh @@ -129,8 +129,6 @@ fn_print_failure(){ fn_print_failure_nl(){ echo -en "\e[0;31mFailure!\e[0m $@" - sleep 1 - echo -en "\n" } # Error! @@ -140,8 +138,6 @@ fn_print_error(){ fn_print_error_nl(){ echo -en "\e[0;31mError!\e[0m $@" - sleep 1 - echo -en "\n" } # Info! @@ -151,8 +147,6 @@ fn_print_infomation(){ fn_print_infomation_nl(){ echo -en "\e[0;36mInfomation!\e[0m $@" - sleep 1 - echo -en "\n" } # FAIL for end of line @@ -162,8 +156,6 @@ fn_print_ok_eol(){ fn_print_ok_eol_nl(){ echo -en "\e[0;32mOK\e[0m" - sleep 1 - echo -en "\n" } # FAIL for end of line @@ -173,8 +165,6 @@ fn_print_fail_eol(){ fn_print_fail_eol_nl(){ echo -en "\e[0;31mFAIL\e[0m" - sleep 1 - echo -en "\n" } # QUERYING for end of line From 45529e47eed777543217fa1d3616a8cc119d5b4e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 2 Mar 2016 22:16:45 +0000 Subject: [PATCH 106/434] nl in trap --- functions/core_dl.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 45f46e1c6..98e6ebee4 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -74,12 +74,12 @@ fi fn_fetch_trap() { echo "" echo -ne "downloading ${filename}: " - fn_print_canceled_eol + fn_print_canceled_eol_nl fn_scriptlog "downloading ${filename}: CANCELED" sleep 1 rm -f "${filedir}/${filename}" | tee -a "${scriptlog}" echo -ne "downloading ${filename}: " - fn_print_removed_eol + fn_print_removed_eol_nl fn_scriptlog "downloading ${filename}: REMOVED" exit } From 40395338399b1c341e2d10daedb2103fe8d12096 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 2 Mar 2016 22:18:56 +0000 Subject: [PATCH 107/434] returned -n to messages --- functions/core_messages.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/functions/core_messages.sh b/functions/core_messages.sh index d8b77305f..f6977f6e8 100644 --- a/functions/core_messages.sh +++ b/functions/core_messages.sh @@ -128,7 +128,7 @@ fn_print_failure(){ } fn_print_failure_nl(){ - echo -en "\e[0;31mFailure!\e[0m $@" + echo -e "\e[0;31mFailure!\e[0m $@" } # Error! @@ -137,7 +137,7 @@ fn_print_error(){ } fn_print_error_nl(){ - echo -en "\e[0;31mError!\e[0m $@" + echo -e "\e[0;31mError!\e[0m $@" } # Info! @@ -146,7 +146,7 @@ fn_print_infomation(){ } fn_print_infomation_nl(){ - echo -en "\e[0;36mInfomation!\e[0m $@" + echo -e "\e[0;36mInfomation!\e[0m $@" } # FAIL for end of line @@ -155,7 +155,7 @@ fn_print_ok_eol(){ } fn_print_ok_eol_nl(){ - echo -en "\e[0;32mOK\e[0m" + echo -e "\e[0;32mOK\e[0m" } # FAIL for end of line @@ -164,7 +164,7 @@ fn_print_fail_eol(){ } fn_print_fail_eol_nl(){ - echo -en "\e[0;31mFAIL\e[0m" + echo -e "\e[0;31mFAIL\e[0m" } # QUERYING for end of line From 4dc0f80d934067394ab852d2d6ee0cff007c7245 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 3 Mar 2016 23:00:18 +0000 Subject: [PATCH 108/434] Fixed 7 days to die bug --- functions/check_deps.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/functions/check_deps.sh b/functions/check_deps.sh index 535a15330..f433e7298 100644 --- a/functions/check_deps.sh +++ b/functions/check_deps.sh @@ -52,8 +52,8 @@ fn_found_missing_deps(){ if [ "${#array_deps_missing[@]}" != "0" ]; then fn_print_dots "Checking dependencies" sleep 2 - fn_print_warn "Checking dependencies: Dependency missing: \e[0;31m${array_deps_missing[@]}\e[0m" - fn_scriptlog "Checking dependencies: Dependency missing: \e[0;31m${array_deps_missing[@]}\e[0m" + fn_print_warn "Checking dependencies: missing: \e[0;31m${array_deps_missing[@]}\e[0m" + fn_scriptlog "Checking dependencies: missing: \e[0;31m${array_deps_missing[@]}\e[0m" sleep 1 echo -e "" sudo -n true > /dev/null 2>&1 @@ -181,7 +181,7 @@ elif [ -n "$(command -v yum)" ]; then if [ "${engine}" == "spark" ]; then array_deps_required+=( speex.i686 tbb.i686 ) # 7 Days to Die - elif [ "${executable}" == "./7DaysToDie.sh" ]; then + elif [ "${gamename}" == "7 Days To Die" ]; then array_deps_required+=( telnet expect ) # No More Room in Hell elif [ "${gamename}" == "No More Room in Hell" ]; then From 77c5692bd85d4dcee4864cf945d44b2cf720b0e3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 4 Mar 2016 00:34:34 +0000 Subject: [PATCH 109/434] Getting sdtd graceful working better --- functions/command_stop.sh | 313 ++++++++++++++++++++------------------ 1 file changed, 164 insertions(+), 149 deletions(-) diff --git a/functions/command_stop.sh b/functions/command_stop.sh index 3e6a7e398..69b799839 100644 --- a/functions/command_stop.sh +++ b/functions/command_stop.sh @@ -11,27 +11,29 @@ function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" # Attempts Graceful of source using rcon 'quit' command. fn_stop_graceful_source(){ -fn_print_dots "Graceful: rcon quit" -fn_scriptlog "Graceful: rcon quit" -# sends quit -tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 -# waits up to 30 seconds giving the server time to shutdown gracefuly -for seconds in {1..30}; do - pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") - if [ "${pid}" == "0" ]; then - fn_print_ok_nl "Graceful: rcon quit: ${seconds}" - fn_scriptlog "Graceful: rcon quit: OK: ${seconds} seconds" - break + fn_print_dots "Graceful: rcon quit" + fn_scriptlog "Graceful: rcon quit" + # sends quit + tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 + # waits up to 30 seconds giving the server time to shutdown gracefuly + for seconds in {1..30}; do + pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") + if [ "${pid}" == "0" ]; then + fn_print_ok "Graceful: rcon quit: ${seconds}: " + fn_print_ok_eol_nl + fn_scriptlog "Graceful: rcon quit: OK: ${seconds} seconds" + break + fi + sleep 1 + fn_print_dots "Graceful: rcon quit: ${seconds}" + done + if [ "${pid}" != "0" ]; then + fn_print_fail "Graceful: rcon quit" + fn_print_fail_eol_nl + fn_scriptlog "Graceful: rcon quit: FAIL" + fn_stop_tmux fi sleep 1 - fn_print_dots "Graceful: rcon quit: ${seconds}" -done -if [ "${pid}" != "0" ]; then - fn_print_fail_nl "Graceful: rcon quit" - fn_scriptlog "Graceful: rcon quit: FAIL" - fn_stop_tmux -fi -sleep 1 } # Attempts Graceful of goldsource using rcon 'quit' command. @@ -39,162 +41,175 @@ sleep 1 # this function will only wait 3 seconds then force a tmux shutdown. # preventing the server from coming back online. fn_stop_graceful_goldsource(){ -fn_print_dots "Graceful: rcon quit" -fn_scriptlog "Graceful: rcon quit" -# sends quit -tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 -# waits 3 seconds as goldsource servers restart with the quit command -for seconds in {1..3}; do + fn_print_dots "Graceful: rcon quit" + fn_scriptlog "Graceful: rcon quit" + # sends quit + tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 + # waits 3 seconds as goldsource servers restart with the quit command + for seconds in {1..3}; do + sleep 1 + fn_print_dots "Graceful: rcon quit: ${seconds}" + done + fn_print_ok "Graceful: rcon quit: ${seconds}: " + fn_print_ok_eol_nl + fn_scriptlog "Graceful: rcon quit: OK: ${seconds} seconds" sleep 1 - fn_print_dots "Graceful: rcon quit: ${seconds}" -done -fn_print_ok_nl "Graceful: rcon quit: ${seconds}" -sleep 1 -fn_stop_tmux + fn_stop_tmux } # Attempts Graceful of 7 Days To Die using telnet. fn_stop_telnet_sdtd(){ -sdtdshutdown=$( expect -c ' -proc abort {} { - puts "Timeout or EOF\n" - exit 1 -} -spawn telnet '"${telnetip}"' '"${telnetport}"' -expect { - "password:" { send "'"${telnetpass}"'\r" } - default abort -} -expect { - "session." { send "shutdown\r" } - default abort -} -expect { eof } -puts "Completed.\n" -') + sdtd_telnet_shutdown=$( expect -c ' + proc abort {} { + puts "Timeout or EOF\n" + exit 1 + } + spawn telnet '"${telnetip}"' '"${telnetport}"' + expect { + "password:" { send "'"${telnetpass}"'\r" } + default abort + } + expect { + "session." { send "shutdown\r" } + default abort + } + expect { eof } + puts "Completed.\n" + ') + } fn_stop_graceful_sdtd(){ -# Gets server IP. -info_config.sh - -fn_print_dots "Graceful: telnet" -fn_scriptlog "Graceful: telnet" -sleep 1 + # Gets server IP. + info_config.sh -# uses localhost on first attempt. -telnetip=127.0.0.1 -fn_print_dots "Graceful: telnet: ${telnetip}" -fn_scriptlog "Graceful: telnet: ${telnetip}" -fn_stop_telnet_sdtd -sleep 1 - -# falls back to the server ip if localhost fails. -refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF") -if [ -n "${refused}" ]; then - fn_print_warn_nl "Graceful: telnet: localhost: " - fn_print_fail_eol - fn_scriptlog "Graceful: telnet: localhost: FAIL" + fn_print_dots "Graceful: telnet" + fn_scriptlog "Graceful: telnet" sleep 1 - - telnetip=${ip} - fn_print_dots "Graceful: telnet: ${telnetip}" - fn_scriptlog "Graceful: telnet: ${telnetip}" - fn_stop_telnet_sdtd - refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF") - - fn_print_warnnl "Graceful: telnet: ${telnetip}: " - fn_print_fail_eol - fn_scriptlog "Graceful: telnet: ${telnetip}: FAIL" - sleep 1 -fi - -# Checks if attempts have worked. -completed=$(echo -en "\n ${sdtdshutdown}"| grep "Completed.") -if [ -n "${completed}" ]; then - fn_print_ok_nl "Graceful: telnet: " - fn_print_ok_eol - fn_scriptlog "Graceful: telnet: OK" -elif [ -n "${refused}" ]; then - fn_print_fail_nl "Graceful: telnet: " - fn_print_fail_eol - fn_scriptlog "Graceful: telnet: ${telnetip}: FAIL" - echo -en "\n\n" | tee -a "${scriptlog}" - echo -en "Telnet output:" | tee -a "${scriptlog}" - echo -en "\n ${sdtdshutdown}" | tee -a "${scriptlog}" - echo -en "\n\n" | tee -a "${scriptlog}" -else - fn_print_fail_nl "Graceful: telnet: Unknown error" - fn_scriptlog "Graceful: telnet: Unknown error" - echo -en "\n\n" | tee -a "${scriptlog}" - echo -en "Telnet output:" | tee -a "${scriptlog}" - echo -en "\n ${sdtdshutdown}" | tee -a "${scriptlog}" - echo -en "\n\n" | tee -a "${scriptlog}" -fi + if [ "${telnetenabled}" == "false" ]; then + fn_print_info_nl "Graceful: telnet: DISABLED: Enable in ${servercfg}" + elif [ "$(command -v expect)" ]||[ "$(which expect >/dev/null 2>&1)" ]; then + # Tries to shutdown with both localhost and server IP. + for telnetip in 127.0.0.1 ${ip}; do + fn_print_dots "Graceful: telnet: ${telnetip}" + fn_scriptlog "Graceful: telnet: ${telnetip}" + sleep 1 + fn_stop_telnet_sdtd + completed=$(echo -en "\n ${sdtd_telnet_shutdown}"|grep "Completed.") + refused=$(echo -en "\n ${sdtd_telnet_shutdown}"|grep "Timeout or EOF") + if [ -n "${refused}" ]; then + fn_print_warn "Graceful: telnet: ${telnetip}: " + fn_print_fail_eol_nl + fn_scriptlog "Graceful: telnet: ${telnetip}: FAIL" + sleep 1 + elif [ -n "${completed}" ]; then + break + fi + done + + # If telnet was successful will use telnet again to check the connection has closed + # This confirms that the tmux session can now be killed. + if [ -n "${completed}" ]; then + for seconds in {1..30}; do + fn_stop_telnet_sdtd + refused=$(echo -en "\n ${sdtd_telnet_shutdown}"|grep "Timeout or EOF") + if [ -n "${refused}" ]; then + fn_print_ok "Graceful: telnet: ${telnetip}: " + fn_print_ok_eol_nl + fn_scriptlog "Graceful: telnet: ${telnetip}: ${seconds} seconds" + break + fi + sleep 1 + fn_print_dots "Graceful: rcon quit: ${seconds}" + done + # If telnet failed will go straight to tmux shutdown. + # If cannot shutdown correctly world save may be lost + else + if [ -n "${refused}" ]; then + fn_print_fail "Graceful: telnet: " + fn_print_fail_eol_nl + fn_scriptlog "Graceful: telnet: ${telnetip}: FAIL" + else + fn_print_fail_nl "Graceful: telnet: Unknown error" + fn_scriptlog "Graceful: telnet: Unknown error" + fi + echo -en "\n\n" | tee -a "${scriptlog}" + echo -en "Telnet output:" | tee -a "${scriptlog}" + echo -en "\n ${sdtd_telnet_shutdown}" | tee -a "${scriptlog}" + echo -en "\n\n" | tee -a "${scriptlog}" + fi + else + fn_print_dots "Graceful: telnet: " + fn_scriptlog "Graceful: telnet: " + fn_print_fail "Graceful: telnet: expect not installed: " + fn_print_fail_eol_nl + fn_scriptlog "Graceful: telnet: expect not installed: FAIL" + fi + sleep 1 + fn_stop_tmux } fn_stop_graceful_select(){ -if [ "${gamename}" == "7 Days to Die" ]; then - fn_stop_graceful_sdtd -elif [ "${engine}" == "source" ]; then - fn_stop_graceful_source -elif [ "${engine}" == "goldsource" ]; then - fn_stop_graceful_goldsource -else - fn_stop_tmux -fi + if [ "${gamename}" == "7 Days To Die" ]; then + fn_stop_graceful_sdtd + elif [ "${engine}" == "source" ]; then + fn_stop_graceful_source + elif [ "${engine}" == "goldsource" ]; then + fn_stop_graceful_goldsource + else + fn_stop_tmux + fi } fn_stop_teamspeak3(){ -fn_print_dots "${servername}" -fn_scriptlog "${servername}" -sleep 1 -${filesdir}/ts3server_startscript.sh stop > /dev/null 2>&1 -# Remove lock file -rm -f "${rootdir}/${lockselfname}" -fn_print_ok_nl "${servername}" -fn_scriptlog "Stopped ${servername}" -} - -fn_stop_tmux(){ -fn_print_dots "${servername}" -fn_scriptlog "tmux kill-session: ${servername}" -sleep 1 -# Kill tmux session -tmux kill-session -t "${servicename}" > /dev/null 2>&1 -pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") -if [ "${pid}" == "0" ]; then - fn_print_ok_nl "${servername}" - fn_scriptlog "Stopped ${servername}" + fn_print_dots "${servername}" + fn_scriptlog "${servername}" sleep 1 + ${filesdir}/ts3server_startscript.sh stop > /dev/null 2>&1 # Remove lock file rm -f "${rootdir}/${lockselfname}" -else - fn_print_fail_nl "Unable to stop${servername}" - fn_scriptlog "Unable to stop${servername}" -fi + fn_print_ok_nl "${servername}" + fn_scriptlog "Stopped ${servername}" + } + fn_stop_tmux(){ + fn_print_dots "${servername}" + fn_scriptlog "tmux kill-session: ${servername}" + sleep 1 + # Kill tmux session + tmux kill-session -t "${servicename}" > /dev/null 2>&1 + sleep 0.5 + pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") + if [ "${pid}" == "0" ]; then + # Remove lock file + rm -f "${rootdir}/${lockselfname}" + fn_print_ok_nl "${servername}" + fn_scriptlog "Stopped ${servername}" + else + fn_print_fail_nl "Unable to stop${servername}" + fn_scriptlog "Unable to stop${servername}" + fi } # checks if the server is already stopped before trying to stop. fn_stop_pre_check(){ -if [ "${gamename}" == "Teamspeak 3" ]; then - info_ts3status.sh - if [ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then - fn_print_ok_nl "${servername} is already stopped" - fn_scriptlog "${servername} is already stopped" - else - fn_stop_teamspeak3 - fi -else - pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") - if [ "${pid}" == "0" ]; then - fn_print_ok_nl "${servername} is already stopped" - fn_scriptlog "${servername} is already stopped" + if [ "${gamename}" == "Teamspeak 3" ]; then + info_ts3status.sh + if [ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then + fn_print_ok_nl "${servername} is already stopped" + fn_scriptlog "${servername} is already stopped" + else + fn_stop_teamspeak3 + fi else - fn_stop_graceful_select + pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") + if [ "${pid}" == "0" ]; then + fn_print_ok_nl "${servername} is already stopped" + fn_scriptlog "${servername} is already stopped" + else + fn_stop_graceful_select + fi fi -fi } check.sh From b82d0082f6f623a02d5fa0a0ca29645f63becd43 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 5 Mar 2016 12:51:27 +0000 Subject: [PATCH 110/434] Moved info_config.sh to the correct place --- functions/command_stop.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/functions/command_stop.sh b/functions/command_stop.sh index 69b799839..ba8400879 100644 --- a/functions/command_stop.sh +++ b/functions/command_stop.sh @@ -80,9 +80,6 @@ fn_stop_telnet_sdtd(){ } fn_stop_graceful_sdtd(){ - # Gets server IP. - info_config.sh - fn_print_dots "Graceful: telnet" fn_scriptlog "Graceful: telnet" sleep 1 @@ -133,7 +130,7 @@ fn_stop_graceful_sdtd(){ fn_print_fail_nl "Graceful: telnet: Unknown error" fn_scriptlog "Graceful: telnet: Unknown error" fi - echo -en "\n\n" | tee -a "${scriptlog}" + echo -en "\n" | tee -a "${scriptlog}" echo -en "Telnet output:" | tee -a "${scriptlog}" echo -en "\n ${sdtd_telnet_shutdown}" | tee -a "${scriptlog}" echo -en "\n\n" | tee -a "${scriptlog}" @@ -213,6 +210,7 @@ fn_stop_pre_check(){ } check.sh +info_config.sh fn_print_dots "${servername}" fn_scriptlog "${servername}" sleep 1 From 4e8920e421ae9394cf56aad61fc7f28be8442e90 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 5 Mar 2016 12:51:43 +0000 Subject: [PATCH 111/434] updated monitor function --- functions/command_monitor.sh | 156 +++++++++++++++++------------------ 1 file changed, 75 insertions(+), 81 deletions(-) diff --git a/functions/command_monitor.sh b/functions/command_monitor.sh index e09b6236c..900945603 100644 --- a/functions/command_monitor.sh +++ b/functions/command_monitor.sh @@ -10,104 +10,98 @@ lgsm_version="271215" local modulename="Monitor" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -fn_monitor_teamspeak3(){ -check.sh -logs.sh -fn_print_dots "${servername}" -fn_scriptlog "${servername}" -sleep 1 -if [ ! -f "${rootdir}/${lockselfname}" ]; then - fn_print_info "Disabled: No lock file found" - fn_scriptlog "Disabled: No lock file found" - sleep 1 - echo -en "\n" - echo "To enable monitor run ./${selfname} start" - exit 1 -fi -fn_print_dots "Checking session: CHECKING" -fn_scriptlog "Checking session: CHECKING" -sleep 1 -info_ts3status.sh -if [ "${ts3status}" = "Server is running" ]; then - fn_print_ok "Checking session: OK" - fn_scriptlog "Checking session: OK" - sleep 1 - sleep 0.5 - echo -en "\n" - exit -else - fn_print_fail "Checking session: FAIL" - fn_scriptlog "Checking session: FAIL" - sleep 1 - fn_print_fail "Checking session: FAIL: ${ts3status}" - fn_scriptlog "Checking session: FAIL: ${ts3status}" - failurereason="${ts3status}" - if [ "${emailnotification}" = "on" ]; then - subject="${servicename} Monitor - Restarting ${servername}" - actiontaken="restarted ${servername}" - email.sh +fn_monitor_check_lockfile(){ + # Monitor does not run it lockfile is not found + if [ ! -f "${rootdir}/${lockselfname}" ]; then + fn_print_info_nl "Disabled: No lock file found" + fn_scriptlog "Disabled: No lock file found" + echo "To enable monitor run ./${selfname} start" + exit 1 fi -fi -sleep 0.5 -echo -en "\n" -fn_restart } -fn_monitor_tmux(){ -check.sh -info_config.sh -fn_print_dots "${servername}" -fn_scriptlog "${servername}" -sleep 1 -if [ ! -f "${rootdir}/${lockselfname}" ]; then - fn_print_info "Disabled: No lock file found" - fn_scriptlog "Disabled: No lock file found" - sleep 1 - echo -en "\n" - echo "To enable monitor run ./${selfname} start" - exit 1 -fi +fn_monitor_check_update(){ + # Monitor will not check if update is running. + updatecheck=$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l) + if [ "${updatecheck}" >= "0" ]; then + fn_print_info_nl "SteamCMD is currently checking for updates" + fn_scriptlog "SteamCMD is currently checking for updates" + sleep 1 + exit + fi +} -updatecheck=$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l) -if [ "${updatecheck}" = "0" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament 2004" ]; then +fn_monitor_msg_checking(){ fn_print_dots "Checking session: CHECKING" fn_scriptlog "Checking session: CHECKING" + sleep 1 +} + +fn_monitor_email_notification(){ + # Email will be sent if enabled + if [ "${emailnotification}" = "on" ]; then + subject="${servicename} Monitor - Starting ${servername}" + failurereason="${servicename} process not running" + actiontaken="${servicename} has been restarted" + email.sh + fi +} + +fn_monitor_teamspeak3(){ + info_ts3status.sh + if [ "${ts3status}" = "Server is running" ]; then + fn_print_ok "Checking session: " + fn_print_ok_eol_nl + fn_scriptlog "Checking session: OK" + exit + else + fn_print_fail "Checking session: ${ts3status}: " + fn_print_fail_eol_nl + fn_scriptlog "Checking session: ${ts3status}: FAIL" + failurereason="${ts3status}" + fn_monitor_email_notification + fi + fn_scriptlog "Monitor is starting ${servername}" sleep 1 - tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") - if [ "${tmuxwc}" -eq 1 ]; then + fn_restart +} + +fn_monitor_tmux(){ + # checks that tmux session is running + tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") + if [ "${tmuxwc}" == "1" ]; then fn_print_ok "Checking session: OK" + fn_print_ok_eol_nl fn_scriptlog "Checking session: OK" - sleep 1 - echo -en "\n" - - if [ "${engine}" == "avalanche" ]||[ "${engine}" == "goldsource" ]||[ "${engine}" == "realvirtuality" ]||[ "${engine}" == "source" ]||[ "${engine}" == "spark" ]||[ "${engine}" == "unity3d" ]||[ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then - monitor_gsquery.sh - fi - exit $? + # runs gsquery check on game with specific engines. + local allowed_engines_array=( avalanche goldsource realvirtuality source spark unity3d unreal unreal2 ) + for allowed_engine in "${allowed_engines_array[@]}" + do + if [ "${allowed_engine}" == "${function_selfname}" ]; then + monitor_gsquery.sh + fi + done + exit else fn_print_fail "Checking session: FAIL" + fn_print_fail_eol_nl 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" - email.sh - fi + fn_monitor_email_notification fn_scriptlog "Monitor is starting ${servername}" + sleep 1 command_start.sh fi -else - fn_print_info_nl "SteamCMD is currently checking for updates" - fn_scriptlog "SteamCMD is currently checking for updates" - sleep 1 - fn_print_info_nl "When update is complete ${servicename} will start" - fn_scriptlog "When update is complete ${servicename} will start" - sleep 1 -fi } +check.sh +logs.sh +info_config.sh +fn_print_dots "${servername}" +fn_scriptlog "${servername}" +sleep 1 +fn_monitor_check_lockfile +fn_monitor_check_update +fn_monitor_msg_checking if [ "${gamename}" == "Teamspeak 3" ]; then fn_monitor_teamspeak3 else From 43043ab1c3143d82a05e13e71ae52084b5ae1b20 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 5 Mar 2016 12:51:53 +0000 Subject: [PATCH 112/434] Fixed minor issue --- functions/core_functions.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/functions/core_functions.sh b/functions/core_functions.sh index c0490ffcb..6c867b7e6 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -151,7 +151,9 @@ fn_fetch_function fn_restart(){ local modulename="Restarting" info_config.sh -fn_scriptlog "${servername}" +if [ -d "${scriptlogdir}" ]; then + fn_scriptlog "${servername}" +fi command_stop.sh command_start.sh } From fb97f609ee5f134a37613bcdf86ba01d67ad6fcd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 5 Mar 2016 12:52:34 +0000 Subject: [PATCH 113/434] sd2dserver now bypasses sd2d start script --- 7DaysToDie/sdtdserver | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index b3112820c..6a4bd3d39 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -28,7 +28,7 @@ updateonstart="off" # http://7daystodie.gamepedia.com/Server fn_parms(){ -parms="-configfile=${servercfgfullpath} -dedicated" +parms="-logfile ${gamelogdir}/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated -configfile=${servercfgfullpath}" } #### Advanced Variables #### @@ -52,10 +52,12 @@ engine="unity3d" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" -executable="./startserver.sh" +executable="./7DaysToDieServer.x86" servercfg="${servicename}.xml" servercfgdir="${filesdir}" servercfgfullpath="${servercfgdir}/${servercfg}" From 7bd6fb9af1f19de52c3f048a6fe816bb4373ffe9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 5 Mar 2016 12:53:46 +0000 Subject: [PATCH 114/434] no longer a requirement for symbolic link the game log dir is set in parms --- functions/install_logs.sh | 7 ------- 1 file changed, 7 deletions(-) diff --git a/functions/install_logs.sh b/functions/install_logs.sh index a1687d962..9f86f7129 100644 --- a/functions/install_logs.sh +++ b/functions/install_logs.sh @@ -33,13 +33,6 @@ if [ "${engine}" == "unreal2" ]||[ "${engine}" == "unity3d" ]||[ "${gamename}" = mkdir -pv "${gamelogdir}" fi -# If a server is 7 Days to Die. -if [ "${gamename}" == "7 Days To Die" ]; then - if [ ! -h "${gamelogdir}/output_log.txt" ]; then - ln -nfsv "${filesdir}/7DaysToDie_Data/output_log.txt" "${gamelogdir}/output_log.txt" - fi -fi - # If server uses SteamCMD create a symbolic link to the Steam logs. if [ -d "${rootdir}/Steam/logs" ]; then if [ ! -h "${rootdir}/log/steamcmd" ]; then From d78ba978a3fab450219f7c706ed4c1b1883ae36c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 5 Mar 2016 15:50:56 +0000 Subject: [PATCH 115/434] tab --- functions/check_steamcmd.sh | 100 +++++++++++++++++------------------ functions/command_monitor.sh | 2 +- 2 files changed, 49 insertions(+), 53 deletions(-) diff --git a/functions/check_steamcmd.sh b/functions/check_steamcmd.sh index 4039c4ef8..db1c7969a 100644 --- a/functions/check_steamcmd.sh +++ b/functions/check_steamcmd.sh @@ -8,70 +8,66 @@ lgsm_version="160316" fn_install_steamcmd(){ -if [ ! -d "${steamcmddir}" ]; then - mkdir -v "${steamcmddir}" -fi -fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "${lgsmdir}/tmp" "steamcmd_linux.tar.gz" -fn_dl_extract "${lgsmdir}/tmp" "steamcmd_linux.tar.gz" "${steamcmddir}" -chmod +x "${steamcmddir}/steamcmd.sh" + if [ ! -d "${steamcmddir}" ]; then + mkdir -v "${steamcmddir}" + fi + fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "${lgsmdir}/tmp" "steamcmd_linux.tar.gz" + fn_dl_extract "${lgsmdir}/tmp" "steamcmd_linux.tar.gz" "${steamcmddir}" + chmod +x "${steamcmddir}/steamcmd.sh" } fn_check_steamcmd_user(){ -# Checks steamuser is setup. -if [ "${steamuser}" == "username" ]; then - fn_print_fail_nl "Steam login not set. Update steamuser." - echo " * Change steamuser=\"username\" to a valid steam login." - if [ -d "${scriptlogdir}" ]; then - fn_scriptlog "edit ${selfname}. change steamuser=\"username\" to a valid steam login." - exit 1 - fi -fi -# Anonymous user is set if steamuser is missing -if [ -z "${steamuser}" ]; then - fn_print_warn_nl "Steam login not set. Using anonymous login." - if [ -d "${scriptlogdir}" ]; then - fn_scriptlog "Steam login not set. Using anonymous login." + # Checks steamuser is setup. + if [ "${steamuser}" == "username" ]; then + fn_print_fail_nl "Steam login not set. Update steamuser." + echo " * Change steamuser=\"username\" to a valid steam login." + if [ -d "${scriptlogdir}" ]; then + fn_scriptlog "edit ${selfname}. change steamuser=\"username\" to a valid steam login." + exit 1 + fi fi - steamuser="anonymous" - steampass="" - sleep 2 -fi + # Anonymous user is set if steamuser is missing + if [ -z "${steamuser}" ]; then + fn_print_warn_nl "Steam login not set. Using anonymous login." + if [ -d "${scriptlogdir}" ]; then + fn_scriptlog "Steam login not set. Using anonymous login." + fi + steamuser="anonymous" + steampass="" + sleep 2 + fi } fn_check_steamcmd_sh(){ -# Checks if SteamCMD exists when starting or updating a server. -# Installs if missing. -steamcmddir="${rootdir}/steamcmd" -if [ ! -f "${steamcmddir}/steamcmd.sh" ]; then - if [ "${function_selfname}" == "command_install.sh" ]; then - fn_install_steamcmd - else - fn_print_warn_nl "SteamCMD is missing" - fn_scriptlog "SteamCMD is missing" - sleep 1 - fn_install_steamcmd + # Checks if SteamCMD exists when starting or updating a server. + # Installs if missing. + steamcmddir="${rootdir}/steamcmd" + if [ ! -f "${steamcmddir}/steamcmd.sh" ]; then + if [ "${function_selfname}" == "command_install.sh" ]; then + fn_install_steamcmd + else + fn_print_warn_nl "SteamCMD is missing" + fn_scriptlog "SteamCMD is missing" + sleep 1 + fn_install_steamcmd + fi + elif [ "${function_selfname}" == "command_install.sh" ]; then + fn_print_infomation "SteamCMD is already installed..." + fn_print_ok_eol_nl fi -elif [ "${function_selfname}" == "command_install.sh" ]; then - fn_print_infomation "SteamCMD is already installed..." - fn_print_ok_eol_nl -fi } fn_check_steamcmd_guard(){ -if [ "${function_selfname}" == "command_update.sh" ]||[ "${function_selfname}" == "command_validate.sh" ]; then - # Checks that steamcmd is working correctly and will prompt Steam Guard if required. - "${steamcmddir}"/steamcmd.sh +login "${steamuser}" "${steampass}" +quit - if [ $? -ne 0 ]; then - fn_print_failure_nl "Error running SteamCMD" + if [ "${function_selfname}" == "command_update.sh" ]||[ "${function_selfname}" == "command_validate.sh" ]; then + # Checks that steamcmd is working correctly and will prompt Steam Guard if required. + "${steamcmddir}"/steamcmd.sh +login "${steamuser}" "${steampass}" +quit + if [ $? -ne 0 ]; then + fn_print_failure_nl "Error running SteamCMD" + fi fi -fi } -if [ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament 2004" ]||[ "${gamename}" == "Mumble" ]||[ "${gamename}" == "Teamspeak 3" ]; then - : # These servers do not require SteamCMD. Check is skipped. -else - fn_check_steamcmd_user - fn_check_steamcmd_sh - fn_check_steamcmd_guard -fi +fn_check_steamcmd_user +fn_check_steamcmd_sh +fn_check_steamcmd_guard diff --git a/functions/command_monitor.sh b/functions/command_monitor.sh index 900945603..93c78dcdc 100644 --- a/functions/command_monitor.sh +++ b/functions/command_monitor.sh @@ -15,7 +15,7 @@ fn_monitor_check_lockfile(){ if [ ! -f "${rootdir}/${lockselfname}" ]; then fn_print_info_nl "Disabled: No lock file found" fn_scriptlog "Disabled: No lock file found" - echo "To enable monitor run ./${selfname} start" + echo " * To enable monitor run ./${selfname} start" exit 1 fi } From bad55355a2cf82de0ab8a208355863b58934e3c9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 5 Mar 2016 15:58:58 +0000 Subject: [PATCH 116/434] tab funtions --- functions/check_deps.sh | 140 ++++++++++++++++++++-------------------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/functions/check_deps.sh b/functions/check_deps.sh index f433e7298..71e5236e2 100644 --- a/functions/check_deps.sh +++ b/functions/check_deps.sh @@ -8,85 +8,85 @@ lgsm_version="060216" fn_deps_detector(){ -# Checks if dependency is missing -if [ -n "$(command -v dpkg-query)" ]; then - dpkg-query -W -f='${Status}' ${deptocheck} 2>/dev/null| grep -q -P '^install ok installed$' - depstatus=$? -elif [ -n "$(command -v yum)" ]; then - yum -q list installed ${deptocheck} > /dev/null 2>&1 - depstatus=$? -fi -if [ "${depstatus}" == "0" ]; then - missingdep=0 - if [ "${function_selfname}" == "command_install.sh" ]; then - echo -e "\e[0;32m${deptocheck}\e[0m" - sleep 0.5 - fi -else - # if missing dependency is found - missingdep=1 - if [ "${function_selfname}" == "command_install.sh" ]; then - echo -e "\e[0;31m${deptocheck}\e[0m" - sleep 0.5 - fi -fi - -# Missing dependencies are added to array_deps_missing -if [ "${missingdep}" == "1" ]; then - array_deps_missing+=("${deptocheck}") -fi -} - -fn_deps_email(){ -# Adds postfix to required dependencies if email notification is enabled -if [ "${emailnotification}" == "on" ]; then + # Checks if dependency is missing if [ -n "$(command -v dpkg-query)" ]; then - array_deps_required+=( mailutils postfix ) + dpkg-query -W -f='${Status}' ${deptocheck} 2>/dev/null| grep -q -P '^install ok installed$' + depstatus=$? elif [ -n "$(command -v yum)" ]; then - array_deps_required+=( mailx postfix ) + yum -q list installed ${deptocheck} > /dev/null 2>&1 + depstatus=$? fi -fi + if [ "${depstatus}" == "0" ]; then + missingdep=0 + if [ "${function_selfname}" == "command_install.sh" ]; then + echo -e "\e[0;32m${deptocheck}\e[0m" + sleep 0.5 + fi + else + # if missing dependency is found + missingdep=1 + if [ "${function_selfname}" == "command_install.sh" ]; then + echo -e "\e[0;31m${deptocheck}\e[0m" + sleep 0.5 + fi + fi + + # Missing dependencies are added to array_deps_missing + if [ "${missingdep}" == "1" ]; then + array_deps_missing+=("${deptocheck}") + fi } -fn_found_missing_deps(){ -if [ "${#array_deps_missing[@]}" != "0" ]; then - fn_print_dots "Checking dependencies" - sleep 2 - fn_print_warn "Checking dependencies: missing: \e[0;31m${array_deps_missing[@]}\e[0m" - fn_scriptlog "Checking dependencies: missing: \e[0;31m${array_deps_missing[@]}\e[0m" - sleep 1 - echo -e "" - sudo -n true > /dev/null 2>&1 - if [ $? -eq 0 ]; then - fn_print_info_nl "Attempting to install missing dependencies automatically" - echo -en ".\r" - sleep 1 - echo -en "..\r" - sleep 1 - echo -en "...\r" - sleep 1 - echo -en " \r" - if [ -n "$(command -v dpkg-query)" ]; then - echo "sudo dpkg --add-architecture i386; sudo apt-get install ${array_deps_missing[@]}" - elif [ -n "$(command -v yum)" ]; then - echo "yum install ${array_deps_missing[@]}" - fi - else - echo "" - fn_print_infomation_nl "$(whoami) does not have sudo access. manually install dependencies" - fn_scriptlog "$(whoami) does not have sudo access. manually install dependencies" - echo "" +fn_deps_email(){ + # Adds postfix to required dependencies if email notification is enabled + if [ "${emailnotification}" == "on" ]; then if [ -n "$(command -v dpkg-query)" ]; then - echo "sudo dpkg --add-architecture i386; sudo apt-get install ${array_deps_missing[@]}" + array_deps_required+=( mailutils postfix ) elif [ -n "$(command -v yum)" ]; then - echo "yum install ${array_deps_missing[@]}" + array_deps_required+=( mailx postfix ) fi - echo "" - fi - if [ "${function_selfname}" == "command_install.sh" ]; then - sleep 5 fi -fi +} + +fn_found_missing_deps(){ + if [ "${#array_deps_missing[@]}" != "0" ]; then + fn_print_dots "Checking dependencies" + sleep 2 + fn_print_warn "Checking dependencies: missing: \e[0;31m${array_deps_missing[@]}\e[0m" + fn_scriptlog "Checking dependencies: missing: \e[0;31m${array_deps_missing[@]}\e[0m" + sleep 1 + echo -e "" + sudo -n true > /dev/null 2>&1 + if [ $? -eq 0 ]; then + fn_print_info_nl "Attempting to install missing dependencies automatically" + echo -en ".\r" + sleep 1 + echo -en "..\r" + sleep 1 + echo -en "...\r" + sleep 1 + echo -en " \r" + if [ -n "$(command -v dpkg-query)" ]; then + echo "sudo dpkg --add-architecture i386; sudo apt-get install ${array_deps_missing[@]}" + elif [ -n "$(command -v yum)" ]; then + echo "yum install ${array_deps_missing[@]}" + fi + else + echo "" + fn_print_infomation_nl "$(whoami) does not have sudo access. manually install dependencies" + fn_scriptlog "$(whoami) does not have sudo access. manually install dependencies" + echo "" + if [ -n "$(command -v dpkg-query)" ]; then + echo "sudo dpkg --add-architecture i386; sudo apt-get install ${array_deps_missing[@]}" + elif [ -n "$(command -v yum)" ]; then + echo "yum install ${array_deps_missing[@]}" + fi + echo "" + fi + if [ "${function_selfname}" == "command_install.sh" ]; then + sleep 5 + fi + fi } fn_check_loop(){ From d99a7e2b43153bcd12913aa93f1c8809eb1e62a0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 6 Mar 2016 16:54:51 +0000 Subject: [PATCH 117/434] Updated function --- functions/command_monitor.sh | 2 +- functions/command_start.sh | 114 ++++++++++++++++------------------- functions/core_messages.sh | 2 +- 3 files changed, 55 insertions(+), 63 deletions(-) diff --git a/functions/command_monitor.sh b/functions/command_monitor.sh index 93c78dcdc..3dfea8adf 100644 --- a/functions/command_monitor.sh +++ b/functions/command_monitor.sh @@ -83,7 +83,7 @@ fn_monitor_tmux(){ done exit else - fn_print_fail "Checking session: FAIL" + fn_print_fail "Checking session: " fn_print_fail_eol_nl fn_scriptlog "Checking session: FAIL" fn_monitor_email_notification diff --git a/functions/command_start.sh b/functions/command_start.sh index e1e324caf..e9fa5d0d0 100644 --- a/functions/command_start.sh +++ b/functions/command_start.sh @@ -10,69 +10,63 @@ local modulename="Starting" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_start_teamspeak3(){ -check.sh -info_ts3status.sh + check.sh + info_ts3status.sh + + if [ "${ts3status}" != "Server is running" ]; then + # Will check for updates is updateonstart is yes + if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateonstart}" == "on" ]; then + update_check.sh + fi + fi -if [ "${ts3status}" != "Server is running" ]; then - # Will check for updates is updateonstart is yes - if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateonstart}" == "on" ]; then - update_check.sh - fi -fi + if [ ! -e "${servercfgfullpath}" ]; then + fn_print_warn_nl "${servercfgfullpath} is missing" + fn_scriptlog "${servercfgfullpath} is missing" + echo " * Creating blank ${servercfg}" + fn_scriptlog "Creating blank ${servercfg}" + sleep 2 + echo " * ${servercfg} can remain blank by default." + fn_scriptlog "${servercfgfullpath} can remain blank by default." + sleep 2 + echo " * ${servercfg} is located in ${servercfgfullpath}." + fn_scriptlog "${servercfg} is located in ${servercfgfullpath}." + sleep 5 + touch "${servercfgfullpath}" + fi -if [ ! -e "${servercfgfullpath}" ]; then - fn_print_warn "${servercfgfullpath} is missing" - fn_scriptlog "${servercfgfullpath} is missing" - sleep 2 - echo -en "\n" - echo " * Creating blank ${servercfg}" - fn_scriptlog "Creating blank ${servercfg}" - sleep 2 - echo " * ${servercfg} can remain blank by default." - fn_scriptlog "${servercfgfullpath} can remain blank by default." - sleep 2 - echo " * ${servercfg} is located in ${servercfgfullpath}." - fn_scriptlog "${servercfg} is located in ${servercfgfullpath}." - sleep 5 - touch "${servercfgfullpath}" -fi + logs.sh -logs.sh + fn_print_dots "${servername}" + fn_scriptlog "${servername}" + sleep 1 -fn_print_dots "${servername}" -fn_scriptlog "${servername}" -sleep 1 + if [ "${ts3status}" == "Server is running" ]; then + fn_print_info_nl "${servername} is already running" + fn_scriptlog "${servername} is already running" + exit + fi -if [ "${ts3status}" == "Server is running" ]; then - fn_print_info "${servername} is already running" - fn_scriptlog "${servername} is already running" + mv "${scriptlog}" "${scriptlogdate}" + # Create lock file + date > "${rootdir}/${lockselfname}" + cd "${executabledir}" + if [ "${ts3serverpass}" == "1" ];then + ./ts3server_startscript.sh start serveradmin_password="${newpassword}" + else + ./ts3server_startscript.sh start inifile="${servercfgfullpath}" > /dev/null 2>&1 + fi sleep 1 - echo -en "\n" - exit -fi - -mv "${scriptlog}" "${scriptlogdate}" -# Create lock file -date > "${rootdir}/${lockselfname}" -cd "${executabledir}" -if [ "${ts3serverpass}" == "1" ];then - ./ts3server_startscript.sh start serveradmin_password="${newpassword}" -else - ./ts3server_startscript.sh start inifile="${servercfgfullpath}" > /dev/null 2>&1 -fi -sleep 1 -info_ts3status.sh -if [ "${ts3status}" = "Server seems to have died" ]||[ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then - fn_print_fail_nl "Unable to start ${servername}" - fn_scriptlog "Unable to start ${servername}" - echo -e " Check log files: ${rootdir}/log" - exit 1 -else - fn_print_ok "${servername}" - fn_scriptlog "Started ${servername}" -fi -sleep 0.5 -echo -en "\n" + info_ts3status.sh + if [ "${ts3status}" = "Server seems to have died" ]||[ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then + fn_print_fail_nl "Unable to start ${servername}" + fn_scriptlog "Unable to start ${servername}" + echo -e " Check log files: ${rootdir}/log" + exit 1 + else + fn_print_ok_nl "${servername}" + fn_scriptlog "Started ${servername}" + fi } fn_start_tmux(){ @@ -139,13 +133,11 @@ if [ "${tmuxwc}" -eq 0 ]; then echo "" echo "Command" echo "=================================" - echo "tmux new-session -d -s \"${servicename}\" \"${executable} ${parms}\"" - echo "tmux new-session -d -s \"${servicename}\" \"${executable} ${parms}\"" >> "${scriptlog}" + echo "tmux new-session -d -s \"${servicename}\" \"${executable} ${parms}\"" | tee -a "${scriptlog}" echo "" echo "Error" echo "=================================" - cat "${scriptlogdir}/.${servicename}-tmux-error.tmp" - cat "${scriptlogdir}/.${servicename}-tmux-error.tmp" >> "${scriptlog}" + cat "${scriptlogdir}/.${servicename}-tmux-error.tmp" | tee -a "${scriptlog}" # Detected error http://gameservermanagers.com/issues if [ $(grep -c "Operation not permitted" "${scriptlogdir}/.${servicename}-tmux-error.tmp") ]; then diff --git a/functions/core_messages.sh b/functions/core_messages.sh index f6977f6e8..5e2b269f3 100644 --- a/functions/core_messages.sh +++ b/functions/core_messages.sh @@ -140,7 +140,7 @@ fn_print_error_nl(){ echo -e "\e[0;31mError!\e[0m $@" } -# Info! +# Infomation! fn_print_infomation(){ echo -en "\e[0;36mInfomation!\e[0m $@" } From 8153665d0fb4772e21ed295c64206df3206b28d9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 6 Mar 2016 17:27:50 +0000 Subject: [PATCH 118/434] run to exec --- JustCause2/jc2server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JustCause2/jc2server b/JustCause2/jc2server index 2d4010e71..f92e74ebc 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -4,7 +4,7 @@ # Author: Daniel Gibbs # Website: http://gameservermanagers.com if [ -f ".dev-debug" ]; then - run 5>dev-debug.log + exec 5>dev-debug.log BASH_XTRACEFD="5" set -x fi From a4ff32b29fab9e687f93e0778ad0092cbbc55ba4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 6 Mar 2016 17:39:06 +0000 Subject: [PATCH 119/434] Removed merge conflict --- functions/core_functions.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/functions/core_functions.sh b/functions/core_functions.sh index 878763b65..8e7b530c4 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -2,11 +2,7 @@ # LGSM core_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -<<<<<<< HEAD -lgsm_version="190216" -======= lgsm_version="270216" ->>>>>>> dlmanage # Description: Defines all functions to allow download and execution of functions using fn_fetch_function. # This function is called first before any other function. Without this file other functions would not load. From 231febbebd5b8b3112a1246fd720adde41c89107 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 6 Mar 2016 17:52:44 +0000 Subject: [PATCH 120/434] removed path from curl check --- JustCause2/jc2server | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament99/ut99server | 2 +- functions/core_dl.sh | 2 +- functions/core_functions.sh | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/JustCause2/jc2server b/JustCause2/jc2server index f92e74ebc..29666b60d 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -92,7 +92,7 @@ if [ ! -f "${filedir}/${filename}" ]; then fi echo -e " fetching ${filename}...\c" # Check curl exists and use available path - curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")" + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" for curlcmd in ${curlpaths} do if [ -x "${curlcmd}" ]; then diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index 444e16871..5888477b3 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -87,7 +87,7 @@ if [ ! -f "${filedir}/${filename}" ]; then fi echo -e " fetching ${filename}...\c" # Check curl exists and use available path - curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")" + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" for curlcmd in ${curlpaths} do if [ -x "${curlcmd}" ]; then diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index 36704e0b2..edd64523e 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -87,7 +87,7 @@ if [ ! -f "${filedir}/${filename}" ]; then fi echo -e " fetching ${filename}...\c" # Check curl exists and use available path - curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")" + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" for curlcmd in ${curlpaths} do if [ -x "${curlcmd}" ]; then diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 98e6ebee4..579fb2788 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -100,7 +100,7 @@ if [ ! -f "${filedir}/${filename}" ]; then fi # Check curl exists and use available path - curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")" + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" for curlcmd in ${curlpaths} do if [ -x "${curlcmd}" ]; then diff --git a/functions/core_functions.sh b/functions/core_functions.sh index 8e7b530c4..ccea1f07d 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -38,7 +38,7 @@ if [ ! -f "${filedir}/${filename}" ]; then fi echo -e " fetching ${filename}...\c" # Check curl exists and use available path - curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")" + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" for curlcmd in ${curlpaths} do if [ -x "${curlcmd}" ]; then From 86ac8014b3995e7b0f0a87dd248b64e1052fdbed Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 6 Mar 2016 18:00:33 +0000 Subject: [PATCH 121/434] Fixed update check bug --- functions/command_monitor.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions/command_monitor.sh b/functions/command_monitor.sh index 14e4c3c35..abe42cf38 100644 --- a/functions/command_monitor.sh +++ b/functions/command_monitor.sh @@ -23,7 +23,7 @@ fn_monitor_check_lockfile(){ fn_monitor_check_update(){ # Monitor will not check if update is running. updatecheck=$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l) - if [ "${updatecheck}" >= "0" ]; then + if [ "${updatecheck}" != "0" ]; then fn_print_info_nl "SteamCMD is currently checking for updates" fn_scriptlog "SteamCMD is currently checking for updates" sleep 1 @@ -70,7 +70,7 @@ fn_monitor_tmux(){ # checks that tmux session is running tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") if [ "${tmuxwc}" == "1" ]; then - fn_print_ok "Checking session: OK" + fn_print_ok "Checking session" fn_print_ok_eol_nl fn_scriptlog "Checking session: OK" # runs gsquery check on game with specific engines. From 3b63636dee52d01b087ee2ba38897cb6224ffd12 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 6 Mar 2016 18:03:10 +0000 Subject: [PATCH 122/434] Added coloured checking message --- functions/command_monitor.sh | 7 ++++--- functions/core_messages.sh | 9 +++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/functions/command_monitor.sh b/functions/command_monitor.sh index abe42cf38..066d0dbdf 100644 --- a/functions/command_monitor.sh +++ b/functions/command_monitor.sh @@ -23,7 +23,7 @@ fn_monitor_check_lockfile(){ fn_monitor_check_update(){ # Monitor will not check if update is running. updatecheck=$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l) - if [ "${updatecheck}" != "0" ]; then + if [ "${updatecheck}" >= "1" ]; then fn_print_info_nl "SteamCMD is currently checking for updates" fn_scriptlog "SteamCMD is currently checking for updates" sleep 1 @@ -32,7 +32,8 @@ fn_monitor_check_update(){ } fn_monitor_msg_checking(){ - fn_print_dots "Checking session: CHECKING" + fn_print_dots "Checking session: " + fn_print_checking_eol fn_scriptlog "Checking session: CHECKING" sleep 1 } @@ -70,7 +71,7 @@ fn_monitor_tmux(){ # checks that tmux session is running tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") if [ "${tmuxwc}" == "1" ]; then - fn_print_ok "Checking session" + fn_print_ok "Checking session: OK" fn_print_ok_eol_nl fn_scriptlog "Checking session: OK" # runs gsquery check on game with specific engines. diff --git a/functions/core_messages.sh b/functions/core_messages.sh index 5e2b269f3..54b245193 100644 --- a/functions/core_messages.sh +++ b/functions/core_messages.sh @@ -176,6 +176,15 @@ fn_print_querying_eol_nl(){ echo -e "\e[0;36mQUERYING\e[0m" } +# CHECKING for end of line +fn_print_checking_eol(){ + echo -en "\e[0;36mCHECKING\e[0m" +} + +fn_print_checking_eol_nl(){ + echo -e "\e[0;36mCHECKING\e[0m" +} + # CANCELED for end of line fn_print_canceled_eol(){ echo -en "\e[0;33mCANCELED\e[0m" From ff8efabf528c8f24af5a5fa61beb33b579a7db75 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 6 Mar 2016 23:34:53 +0100 Subject: [PATCH 123/434] corrected check for fn_parms --- functions/command_details.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/command_details.sh b/functions/command_details.sh index 5fb446ddb..6ec515d00 100644 --- a/functions/command_details.sh +++ b/functions/command_details.sh @@ -636,7 +636,7 @@ fn_details_disk fn_details_gameserver fn_details_backup # Some game servers do not have parms. -if [ "${gamename}" != "Teamspeak 3" ]||[ "${engine}" != "avalanche" ]||[ "${engine}" != "dontstarve" ]||[ "${engine}" != "projectzomboid" ]; then +if [ "${gamename}" != "Teamspeak 3" ]&&[ "${engine}" != "avalanche" ]&&[ "${engine}" != "dontstarve" ]&&[ "${engine}" != "projectzomboid" ]; then fn_parms fn_details_commandlineparms fi From 841a65b2f7105bc174674703101cb4a24d2d9a64 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 12 Mar 2016 23:46:45 +0000 Subject: [PATCH 124/434] moved functions to lgsm dir --- JustCause2/jc2server | 1 + {functions => lgsm/functions}/README.md | 0 lgsm/functions/check.sh | 67 ++ lgsm/functions/check_config.sh | 17 + lgsm/functions/check_deps.sh | 218 +++++ lgsm/functions/check_ip.sh | 33 + lgsm/functions/check_logs.sh | 16 + lgsm/functions/check_root.sh | 13 + lgsm/functions/check_steamcmd.sh | 73 ++ lgsm/functions/check_system_dir.sh | 13 + lgsm/functions/check_tmux.sh | 20 + lgsm/functions/command_backup.sh | 64 ++ lgsm/functions/command_console.sh | 48 + lgsm/functions/command_debug.sh | 59 ++ lgsm/functions/command_details.sh | 682 ++++++++++++++ lgsm/functions/command_dev_debug.sh | 17 + .../functions}/command_dev_detect_deps.sh | 0 lgsm/functions/command_email_test.sh | 22 + .../functions}/command_fastdl.sh | 0 lgsm/functions/command_install.sh | 38 + lgsm/functions/command_monitor.sh | 110 +++ lgsm/functions/command_start.sh | 182 ++++ lgsm/functions/command_stop.sh | 217 +++++ lgsm/functions/command_ts3_server_pass.sh | 62 ++ .../functions}/command_update.sh | 0 lgsm/functions/command_update_functions.sh | 37 + lgsm/functions/command_validate.sh | 47 + .../functions}/compress_unreal2_maps.sh | 0 .../functions}/compress_ut99_maps.sh | 0 lgsm/functions/core_dl.sh | 202 ++++ lgsm/functions/core_functions.sh | 454 +++++++++ lgsm/functions/core_getopt.sh | 441 +++++++++ lgsm/functions/core_messages.sh | 204 ++++ lgsm/functions/email.sh | 68 ++ lgsm/functions/fix.sh | 75 ++ lgsm/functions/fix_arma3.sh | 13 + lgsm/functions/fix_csgo.sh | 43 + lgsm/functions/fix_dst.sh | 16 + {functions => lgsm/functions}/fix_ins.sh | 0 {functions => lgsm/functions}/fix_kf.sh | 0 lgsm/functions/fix_ro.sh | 27 + lgsm/functions/fix_steamcmd.sh | 41 + lgsm/functions/fix_ut2k4.sh | 27 + lgsm/functions/fix_ut99.sh | 25 + {functions => lgsm/functions}/fn_functions | 0 {functions => lgsm/functions}/fn_getopt | 0 lgsm/functions/fn_update_functions | 22 + lgsm/functions/gsquery.py | 125 +++ lgsm/functions/info_config.sh | 868 ++++++++++++++++++ {functions => lgsm/functions}/info_distro.sh | 0 lgsm/functions/info_glibc.sh | 71 ++ .../functions}/info_ts3status.sh | 0 lgsm/functions/install_complete.sh | 21 + lgsm/functions/install_config.sh | 349 +++++++ lgsm/functions/install_gslt.sh | 37 + .../functions}/install_gsquery.sh | 0 lgsm/functions/install_header.sh | 16 + lgsm/functions/install_logs.sh | 43 + lgsm/functions/install_retry.sh | 16 + lgsm/functions/install_server_dir.sh | 32 + lgsm/functions/install_server_files.sh | 110 +++ lgsm/functions/install_steamcmd.sh | 15 + lgsm/functions/install_ts3.sh | 82 ++ lgsm/functions/install_ts3db.sh | 71 ++ lgsm/functions/install_ut2k4_key.sh | 28 + lgsm/functions/logs.sh | 102 ++ lgsm/functions/monitor_gsquery.sh | 93 ++ lgsm/functions/update_check.sh | 326 +++++++ lgsm/functions/update_dl.sh | 83 ++ 69 files changed, 6202 insertions(+) rename {functions => lgsm/functions}/README.md (100%) create mode 100644 lgsm/functions/check.sh create mode 100644 lgsm/functions/check_config.sh create mode 100644 lgsm/functions/check_deps.sh create mode 100644 lgsm/functions/check_ip.sh create mode 100644 lgsm/functions/check_logs.sh create mode 100644 lgsm/functions/check_root.sh create mode 100644 lgsm/functions/check_steamcmd.sh create mode 100644 lgsm/functions/check_system_dir.sh create mode 100644 lgsm/functions/check_tmux.sh create mode 100644 lgsm/functions/command_backup.sh create mode 100644 lgsm/functions/command_console.sh create mode 100644 lgsm/functions/command_debug.sh create mode 100644 lgsm/functions/command_details.sh create mode 100644 lgsm/functions/command_dev_debug.sh rename {functions => lgsm/functions}/command_dev_detect_deps.sh (100%) create mode 100644 lgsm/functions/command_email_test.sh rename {functions => lgsm/functions}/command_fastdl.sh (100%) create mode 100644 lgsm/functions/command_install.sh create mode 100644 lgsm/functions/command_monitor.sh create mode 100644 lgsm/functions/command_start.sh create mode 100644 lgsm/functions/command_stop.sh create mode 100644 lgsm/functions/command_ts3_server_pass.sh rename {functions => lgsm/functions}/command_update.sh (100%) create mode 100644 lgsm/functions/command_update_functions.sh create mode 100644 lgsm/functions/command_validate.sh rename {functions => lgsm/functions}/compress_unreal2_maps.sh (100%) rename {functions => lgsm/functions}/compress_ut99_maps.sh (100%) create mode 100644 lgsm/functions/core_dl.sh create mode 100644 lgsm/functions/core_functions.sh create mode 100644 lgsm/functions/core_getopt.sh create mode 100644 lgsm/functions/core_messages.sh create mode 100644 lgsm/functions/email.sh create mode 100644 lgsm/functions/fix.sh create mode 100644 lgsm/functions/fix_arma3.sh create mode 100644 lgsm/functions/fix_csgo.sh create mode 100644 lgsm/functions/fix_dst.sh rename {functions => lgsm/functions}/fix_ins.sh (100%) rename {functions => lgsm/functions}/fix_kf.sh (100%) create mode 100644 lgsm/functions/fix_ro.sh create mode 100644 lgsm/functions/fix_steamcmd.sh create mode 100644 lgsm/functions/fix_ut2k4.sh create mode 100644 lgsm/functions/fix_ut99.sh rename {functions => lgsm/functions}/fn_functions (100%) rename {functions => lgsm/functions}/fn_getopt (100%) create mode 100644 lgsm/functions/fn_update_functions create mode 100644 lgsm/functions/gsquery.py create mode 100644 lgsm/functions/info_config.sh rename {functions => lgsm/functions}/info_distro.sh (100%) create mode 100644 lgsm/functions/info_glibc.sh rename {functions => lgsm/functions}/info_ts3status.sh (100%) create mode 100644 lgsm/functions/install_complete.sh create mode 100644 lgsm/functions/install_config.sh create mode 100644 lgsm/functions/install_gslt.sh rename {functions => lgsm/functions}/install_gsquery.sh (100%) create mode 100644 lgsm/functions/install_header.sh create mode 100644 lgsm/functions/install_logs.sh create mode 100644 lgsm/functions/install_retry.sh create mode 100644 lgsm/functions/install_server_dir.sh create mode 100644 lgsm/functions/install_server_files.sh create mode 100644 lgsm/functions/install_steamcmd.sh create mode 100644 lgsm/functions/install_ts3.sh create mode 100644 lgsm/functions/install_ts3db.sh create mode 100644 lgsm/functions/install_ut2k4_key.sh create mode 100644 lgsm/functions/logs.sh create mode 100644 lgsm/functions/monitor_gsquery.sh create mode 100644 lgsm/functions/update_check.sh create mode 100644 lgsm/functions/update_dl.sh diff --git a/JustCause2/jc2server b/JustCause2/jc2server index 29666b60d..ccf5e3c31 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -52,6 +52,7 @@ selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" diff --git a/functions/README.md b/lgsm/functions/README.md similarity index 100% rename from functions/README.md rename to lgsm/functions/README.md diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh new file mode 100644 index 000000000..69f62f0ad --- /dev/null +++ b/lgsm/functions/check.sh @@ -0,0 +1,67 @@ +#!/bin/bash +# LGSM fn_check function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="060316" + +# Description: Overall function for managing checks. +# Runs checks that will either halt on or fix an issue. + +# Every command that requires checks just references check.sh +# check.sh selects which checks to run by using arrays + +check_root.sh + +if [ "${function_selfname}" != "command_install.sh" ] && [ "${function_selfname}" != "command_update_functions.sh" ]; then + check_system_dir.sh +fi + +local allowed_commands_array=( command_backup.sh command_console.sh command_debug.sh command_details.sh command_unreal2_maps.sh command_ut99_maps.sh command_monitor.sh command_start.sh command_stop.sh update_check.sh command_validate.sh command_update_functions.sh command_email_test.sh ) +for allowed_command in "${allowed_commands_array[@]}" +do + if [ "${allowed_command}" == "${function_selfname}" ]; then + check_logs.sh + fi +done + +local allowed_commands_array=( command_debug.sh command_start.sh command_stop.sh ) +for allowed_command in "${allowed_commands_array[@]}" +do + if [ "${allowed_command}" == "${function_selfname}" ]; then + check_deps.sh + fi +done + +local allowed_commands_array=( command_debug.sh command_details.sh command_monitor.sh command_start.sh command_stop.sh ) +for allowed_command in "${allowed_commands_array[@]}" +do + if [ "${allowed_command}" == "${function_selfname}" ]; then + check_ip.sh + fi +done + +local allowed_commands_array=( update_check.sh command_debug.sh command_start.sh command_validate.sh ) +for allowed_command in "${allowed_commands_array[@]}" +do + if [ "${allowed_command}" == "${function_selfname}" ]; then + if [ -n "${appid}" ]; then + check_steamcmd.sh + fi + fi +done + +local allowed_commands_array=( command_console.sh command_start.sh ) +for allowed_command in "${allowed_commands_array[@]}" +do + if [ "${allowed_command}" == "${function_selfname}" ]; then + check_tmux.sh + fi +done + +local allowed_commands_array=( command_console.sh command_debug.sh command_details.sh command_monitor.sh command_start.sh command_stop.sh ) +for allowed_command in "${allowed_commands_array[@]}" +do + if [ "${allowed_command}" == "${function_selfname}" ]; then + check_config.sh + fi +done \ No newline at end of file diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh new file mode 100644 index 000000000..c329cca95 --- /dev/null +++ b/lgsm/functions/check_config.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# LGSM check_config.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="060116" + +# Description: If server config missing warn user. + +if [ ! -e "${servercfgfullpath}" ]; then + if [ "${gamename}" != "Hurtworld" ]; then + fn_print_warn_nl "Config file missing!" + echo "${servercfgfullpath}" + fn_scriptlog "Configuration file missing!" + fn_scriptlog "${servercfgfullpath}" + sleep 2 + fi +fi \ No newline at end of file diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh new file mode 100644 index 000000000..56c8c711c --- /dev/null +++ b/lgsm/functions/check_deps.sh @@ -0,0 +1,218 @@ +#!/bin/bash +# LGSM check_deps.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="060316" + +# Description: Checks that the requires dependencies are installed for LGSM. + + +fn_deps_detector(){ + # Checks if dependency is missing + if [ -n "$(command -v dpkg-query)" ]; then + dpkg-query -W -f='${Status}' ${deptocheck} 2>/dev/null| grep -q -P '^install ok installed$' + depstatus=$? + elif [ -n "$(command -v yum)" ]; then + yum -q list installed ${deptocheck} > /dev/null 2>&1 + depstatus=$? + fi + if [ "${depstatus}" == "0" ]; then + missingdep=0 + if [ "${function_selfname}" == "command_install.sh" ]; then + echo -e "\e[0;32m${deptocheck}\e[0m" + sleep 0.5 + fi + else + # if missing dependency is found + missingdep=1 + if [ "${function_selfname}" == "command_install.sh" ]; then + echo -e "\e[0;31m${deptocheck}\e[0m" + sleep 0.5 + fi + fi + + # Missing dependencies are added to array_deps_missing + if [ "${missingdep}" == "1" ]; then + array_deps_missing+=("${deptocheck}") + fi +} + +fn_deps_email(){ + # Adds postfix to required dependencies if email notification is enabled + if [ "${emailnotification}" == "on" ]; then + if [ -f /usr/bin/mailx ]; then + if [ -d /etc/exim4 ]; then + array_deps_required+=( exim4 ) + elif [ -d /etc/sendmail ]; then + array_deps_required+=( sendmail ) + elif [ -n "$(command -v dpkg-query)" ]; then + array_deps_required+=( mailutils postfix ) + elif [ -n "$(command -v yum)" ]; then + array_deps_required+=( mailx postfix ) + fi + else + if [ -n "$(command -v dpkg-query)" ]; then + array_deps_required+=( mailutils postfix ) + elif [ -n "$(command -v yum)" ]; then + array_deps_required+=( mailx postfix ) + fi + fi + fi +} + +fn_found_missing_deps(){ + if [ "${#array_deps_missing[@]}" != "0" ]; then + fn_print_dots "Checking dependencies" + sleep 2 + fn_print_warn "Checking dependencies: missing: \e[0;31m${array_deps_missing[@]}\e[0m" + fn_scriptlog "Checking dependencies: missing: \e[0;31m${array_deps_missing[@]}\e[0m" + sleep 1 + echo -e "" + sudo -n true > /dev/null 2>&1 + if [ $? -eq 0 ]; then + fn_print_info_nl "Attempting to install missing dependencies automatically" + echo -en ".\r" + sleep 1 + echo -en "..\r" + sleep 1 + echo -en "...\r" + sleep 1 + echo -en " \r" + if [ -n "$(command -v dpkg-query)" ]; then + echo "sudo dpkg --add-architecture i386; sudo apt-get install ${array_deps_missing[@]}" + elif [ -n "$(command -v yum)" ]; then + echo "yum install ${array_deps_missing[@]}" + fi + else + echo "" + fn_print_infomation_nl "$(whoami) does not have sudo access. Please manually install dependencies" + fn_scriptlog "$(whoami) does not have sudo access. Please manually install dependencies" + echo "" + if [ -n "$(command -v dpkg-query)" ]; then + echo "sudo dpkg --add-architecture i386; sudo apt-get install ${array_deps_missing[@]}" + elif [ -n "$(command -v yum)" ]; then + echo "yum install ${array_deps_missing[@]}" + fi + echo "" + fi + if [ "${function_selfname}" == "command_install.sh" ]; then + sleep 5 + fi + fi +} + +fn_check_loop(){ + # Loop though required depenencies + for deptocheck in "${array_deps_required[@]}" + do + fn_deps_detector + done + + # user to be informaed of any missing dependecies + fn_found_missing_deps +} + +if [ "${function_selfname}" == "command_install.sh" ]; then + echo "" + echo "Checking Dependecies" + echo "=================================" +fi + + +# Check will only run if using apt-get or yum +if [ -n "$(command -v dpkg-query)" ]; then + # Generate array of missing deps + array_deps_missing=() + + # LGSM requirement for curl + array_deps_required=( curl ca-certificates ) + + # All servers except ts3 require tmux + if [ "${executable}" != "./ts3server_startscript.sh" ]; then + array_deps_required+=( tmux ) + fi + + # All servers except ts3 & mumble require libstdc++6, lib32gcc1 + if [ "${executable}" != "./ts3server_startscript.sh" ]||[ "${executable}" != "./murmur.x86" ]; then + if [ "${arch}" == "x86_64" ]; then + array_deps_required+=( lib32gcc1 libstdc++6:i386 ) + else + array_deps_required+=( libstdc++6:i386 ) + fi + fi + + # Game Specific requirements + + # Spark + if [ "${engine}" == "spark" ]; then + array_deps_required+=( speex:i386 libtbb2 ) + # 7 Days to Die + elif [ "${gamename}" == "7 Days To Die" ]; then + array_deps_required+=( telnet expect ) + # No More Room in Hell + elif [ "${gamename}" == "No More Room in Hell" ]; then + array_deps_required+=( lib32tinfo5 ) + # Brainbread 2 and Don't Starve Together + elif [ "${gamename}" == "Brainbread 2" ]||[ "${gamename}" == "Don't Starve Together" ]; then + array_deps_required+=( libcurl4-gnutls-dev:i386 ) + elif [ "${engine}" == "projectzomboid" ]; then + array_deps_required+=( openjdk-7-jre ) + # Unreal engine + elif [ "${executable}" == "./ucc-bin" ]; then + #UT2K4 + if [ -f "${executabledir}/ut2004-bin" ]; then + array_deps_required+=( libsdl1.2debian libstdc++5:i386 bzip2 ) + #UT99 + else + array_deps_required+=( libsdl1.2debian bzip2 ) + fi + fi + fn_deps_email + fn_check_loop + +elif [ -n "$(command -v yum)" ]; then + # Generate array of missing deps + array_deps_missing=() + + # LGSM requirement for curl + array_deps_required=( curl ) + + # All servers except ts3 require tmux + if [ "${executable}" != "./ts3server_startscript.sh" ]; then + array_deps_required+=( tmux ) + fi + + # All servers excelts ts3 & mumble require glibc.i686 libstdc++.i686 + if [ "${executable}" != "./ts3server_startscript.sh" ]||[ "${executable}" != "./murmur.x86" ]; then + array_deps_required+=( glibc.i686 libstdc++.i686 ) + fi + + # Game Specific requirements + + # Spark + if [ "${engine}" == "spark" ]; then + array_deps_required+=( speex.i686 tbb.i686 ) + # 7 Days to Die + elif [ "${gamename}" == "7 Days To Die" ]; then + array_deps_required+=( telnet expect ) + # No More Room in Hell + elif [ "${gamename}" == "No More Room in Hell" ]; then + array_deps_required+=( ncurses-libs.i686 ) + # Brainbread 2 and Don't Starve Together + elif [ "${gamename}" == "Brainbread 2" ]||[ "${gamename}" == "Don't Starve Together" ]; then + array_deps_required+=( libcurl.i686 ) + elif [ "${engine}" == "projectzomboid" ]; then + array_deps_required+=( java-1.7.0-openjdk ) + # Unreal engine + elif [ "${executable}" == "./ucc-bin" ]; then + #UT2K4 + if [ -f "${executabledir}/ut2004-bin" ]; then + array_deps_required+=( compat-libstdc++-33.i686 SDL.i686 bzip2 ) + #UT99 + else + array_deps_required+=( SDL.i686 bzip2 ) + fi + fi + fn_deps_email + fn_check_loop +fi \ No newline at end of file diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh new file mode 100644 index 000000000..2a5ae5794 --- /dev/null +++ b/lgsm/functions/check_ip.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# LGSM check_ip.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +# Description: Automatically identifies the server interface IP. +# If multiple interfaces are detected the user will need to manualy set using ip="0.0.0.0". + +if [ "${gamename}" != "Teamspeak 3" ]; then + if [ ! -f "/bin/ip" ]; then + ipcommand="/sbin/ip" + else + ipcommand="ip" + fi + getip=$(${ipcommand} -o -4 addr|awk '{print $4}'|grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}'|grep -v 127.0.0) + getipwc=$(${ipcommand} -o -4 addr|awk '{print $4}'|grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}'|grep -vc 127.0.0) + + if [ "${ip}" == "0.0.0.0" ]||[ "${ip}" == "" ]; then + if [ "${getipwc}" -ge "2" ]; then + fn_print_warn "Multiple active network interfaces found.\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" + echo -en "" + echo -en "http://gameservermanagers.com/network-interfaces\n" + echo -en "" + exit 1 + else + ip=${getip} + fi + fi +fi diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh new file mode 100644 index 000000000..9b4f41324 --- /dev/null +++ b/lgsm/functions/check_logs.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# LGSM check_logs.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +# Description: Checks that log files exist on server start + +# Create dir's for the script and console logs +if [ ! -d "${scriptlogdir}" ]; then + fn_print_dots "Checking for log files" + sleep 1 + fn_print_info_nl "Checking for log files: Creating log files" + checklogs=1 + install_logs.sh +fi diff --git a/lgsm/functions/check_root.sh b/lgsm/functions/check_root.sh new file mode 100644 index 000000000..01c89b629 --- /dev/null +++ b/lgsm/functions/check_root.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# LGSM check_root.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="060316" + +if [ $(whoami) = "root" ]; then + fn_print_fail_nl "Do NOT run this script as root!" + if [ -d "${scriptlogdir}" ]; then + fn_scriptlog "${selfname} attempted to run as root." + fi + exit 1 +fi diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh new file mode 100644 index 000000000..81e0f31c4 --- /dev/null +++ b/lgsm/functions/check_steamcmd.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# LGSM check_steamcmd.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="160316" + +# Description: Checks SteamCMD is installed and correct. + + +fn_install_steamcmd(){ + if [ ! -d "${steamcmddir}" ]; then + mkdir -v "${steamcmddir}" + fi + fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "${lgsmdir}/tmp" "steamcmd_linux.tar.gz" + fn_dl_extract "${lgsmdir}/tmp" "steamcmd_linux.tar.gz" "${steamcmddir}" + chmod +x "${steamcmddir}/steamcmd.sh" +} + + +fn_check_steamcmd_user(){ + # Checks steamuser is setup. + if [ "${steamuser}" == "username" ]; then + fn_print_fail_nl "Steam login not set. Update steamuser." + echo " * Change steamuser=\"username\" to a valid steam login." + if [ -d "${scriptlogdir}" ]; then + fn_scriptlog "edit ${selfname}. change steamuser=\"username\" to a valid steam login." + exit 1 + fi + fi + # Anonymous user is set if steamuser is missing + if [ -z "${steamuser}" ]; then + fn_print_warn_nl "Steam login not set. Using anonymous login." + if [ -d "${scriptlogdir}" ]; then + fn_scriptlog "Steam login not set. Using anonymous login." + fi + steamuser="anonymous" + steampass="" + sleep 2 + fi +} + +fn_check_steamcmd_sh(){ + # Checks if SteamCMD exists when starting or updating a server. + # Installs if missing. + steamcmddir="${rootdir}/steamcmd" + if [ ! -f "${steamcmddir}/steamcmd.sh" ]; then + if [ "${function_selfname}" == "command_install.sh" ]; then + fn_install_steamcmd + else + fn_print_warn_nl "SteamCMD is missing" + fn_scriptlog "SteamCMD is missing" + sleep 1 + fn_install_steamcmd + fi + elif [ "${function_selfname}" == "command_install.sh" ]; then + fn_print_infomation "SteamCMD is already installed..." + fn_print_ok_eol_nl + fi +} + +fn_check_steamcmd_guard(){ + if [ "${function_selfname}" == "command_update.sh" ]||[ "${function_selfname}" == "command_validate.sh" ]; then + # Checks that steamcmd is working correctly and will prompt Steam Guard if required. + "${steamcmddir}"/steamcmd.sh +login "${steamuser}" "${steampass}" +quit + if [ $? -ne 0 ]; then + fn_print_failure_nl "Error running SteamCMD" + fi + fi +} + +fn_check_steamcmd_user +fn_check_steamcmd_sh +fn_check_steamcmd_guard \ No newline at end of file diff --git a/lgsm/functions/check_system_dir.sh b/lgsm/functions/check_system_dir.sh new file mode 100644 index 000000000..d5d57e75b --- /dev/null +++ b/lgsm/functions/check_system_dir.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# LGSM check_system_dir.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +if [ ! -d "${systemdir}" ]; then + fn_print_fail_nl "Cannot access ${systemdir}: No such directory" + if [ -d "${scriptlogdir}" ]; then + fn_scriptlog "Cannot access ${systemdir}: No such directory." + fi + exit 1 +fi diff --git a/lgsm/functions/check_tmux.sh b/lgsm/functions/check_tmux.sh new file mode 100644 index 000000000..49f43dd21 --- /dev/null +++ b/lgsm/functions/check_tmux.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# LGSM check_tmux.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +# Checks if tmux is installed as too many users do not RTFM or know how to use Google. + +if [ "$(command -v tmux)" ]||[ "$(which tmux >/dev/null 2>&1)" ]||[ -f "/usr/bin/tmux" ]||[ -f "/bin/tmux" ]; then + : +else + fn_print_fail_nl "Tmux not installed" + sleep 1 + fn_scriptlog "Tmux is not installed" + echo " * Tmux is required to run this server." + # Suitable passive agressive message + echo " * Please see the the following link." + echo " * http://gameservermanagers.com/tmux-not-found" + exit 127 +fi diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh new file mode 100644 index 000000000..d8d52f4bc --- /dev/null +++ b/lgsm/functions/command_backup.sh @@ -0,0 +1,64 @@ +#!/bin/bash +# LGSM command_backup.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +# Description: Creates a .tar.gz file in the backup directory. + +local modulename="Backup" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +check.sh +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;; + * ) echo "Please answer yes or no.";; +esac +done +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") +if [ "${tmuxwc}" -eq 1 ]; then + echo "" + fn_print_warning_nl "${servicename} is currently running." + sleep 1 + while true; do + read -p "Stop ${servicename} while running the backup? [y/N]" yn + case $yn in + [Yy]* ) command_stop.sh; break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done +fi +fn_scriptlog "Started" +echo -en "starting backup.\r" +sleep 1 +echo -en "starting backup..\r" +sleep 1 +echo -en "starting backup...\r" +sleep 1 +echo -en "\n" +cd "${rootdir}" +if [ ! -d "${backupdir}" ]; then + mkdir -v "${backupdir}" +fi +tar -cvzf "${backupdir}/${backupname}.tar.gz" --exclude "${backupdir}" ./* +echo "" +echo "Backup created: ${backupdir}/${backupname}.tar.gz" +fn_scriptlog "Created: ${backupdir}/${backupname}.tar.gz" +sleep 1 +echo "" +fn_print_complete_nl "Complete." +fn_scriptlog "Complete" +echo "" diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh new file mode 100644 index 000000000..f7f2c1323 --- /dev/null +++ b/lgsm/functions/command_console.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# LGSM command_console.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +# Description: Gives access to the server tmux console. + +local modulename="Console" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +check.sh +echo "" +echo "${gamename} Console" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console." +fn_print_warning_nl "Do NOT press CTRL+c to exit." +echo "" +while true; do + read -e -i "y" -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return;; + * ) echo "Please answer yes or no.";; +esac +done +fn_print_dots "Starting" +sleep 1 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") +if [ "${tmuxwc}" -eq 1 ]; then + fn_print_ok_nl "Starting" + fn_scriptlog "accessed" + sleep 1 + tmux attach-session -t ${servicename} +else + fn_print_fail_nl "Server not running" + fn_scriptlog "Failed to access: Server not running" + sleep 1 + while true; do + read -p "Do you want to start the server? [y/N]" yn + case $yn in + [Yy]* ) command_start.sh; break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done +fi diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh new file mode 100644 index 000000000..baa93aec0 --- /dev/null +++ b/lgsm/functions/command_debug.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# LGSM command_debug.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +# Description: Runs the server without tmux. Runs direct from the terminal. + +local modulename="Debug" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +check.sh +fix.sh +info_distro.sh +fn_parms +echo "" +echo "${gamename} Debug" +echo "============================" +echo "" +echo -e "Distro: ${os}" +echo -e "Arch: ${arch}" +echo -e "Kernel: ${kernel}" +echo -e "Hostname: $HOSTNAME" +echo "" +echo "Start parameters:" +if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then + echo "${executable} ${parms} -debug" +else + echo "${executable} ${parms}" +fi +echo "" +echo -e "Use for identifying server issues only!" +echo -e "Press CTRL+c to drop out of debug mode." +fn_print_warning_nl "If ${servicename} is already running it will be stopped." +echo "" +while true; do + read -e -i "y" -p "Continue? [Y/n]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return;; + * ) echo "Please answer yes or no.";; +esac +done +fn_scriptlog "Starting debug" +fn_print_info_nl "Stopping any running servers" +fn_scriptlog "Stopping any running servers" +sleep 1 +command_stop.sh +fn_print_dots "Starting debug" +sleep 1 +fn_print_ok_nl "Starting debug" +fn_scriptlog "Started debug" +cd "${executabledir}" +fix.sh +if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then + ${executable} ${parms} -debug +else + ${executable} ${parms} +fi \ No newline at end of file diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh new file mode 100644 index 000000000..5fb446ddb --- /dev/null +++ b/lgsm/functions/command_details.sh @@ -0,0 +1,682 @@ +#!/bin/bash +# LGSM command_details.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="230216" + +# Description: Displays server infomation. + +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +# Standard Details +# This applies to all engines + +fn_details_os(){ +echo -e "" +echo -e "\e[93mDistro Details\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +{ + echo -e "\e[34mDistro:\t\e[0m${os}" + echo -e "\e[34mArch:\t\e[0m${arch}" + echo -e "\e[34mKernel:\t\e[0m${kernel}" + echo -e "\e[34mHostname:\t\e[0m$HOSTNAME" + echo -e "\e[34mtmux:\t\e[0m${tmuxv}" + echo -e "\e[34mGLIBC:\t\e[0m${glibcv}" +} | column -s $'\t' -t +} + +fn_details_performance(){ +echo -e "" +echo -e "\e[93mPerformance\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +{ + echo -e "\e[34mUptime:\t\e[0m${days}d, ${hours}h, ${minutes}m" + echo -e "\e[34mAvg Load:\t\e[0m${load}" +} | column -s $'\t' -t +echo -e "" +{ + echo -e "\e[34mMem:\t\e[34mtotal\t used\t free\e[0m" + echo -e "\e[34mPhysical:\t\e[0m${physmemtotal}\t${physmemused}\t${physmemfree}\e[0m" + echo -e "\e[34mSwap:\t\e[0m${swaptotal}\t${swapused}\t${swapfree}\e[0m" +} | column -s $'\t' -t +} + +fn_details_disk(){ +echo -e "" +echo -e "\e[93mStorage\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +{ + echo -e "\e[34mFilesystem:\t\e[0m${filesystem}" + echo -e "\e[34mTotal:\t\e[0m${totalspace}" + echo -e "\e[34mUsed:\t\e[0m${usedspace}" + echo -e "\e[34mAvailable:\t\e[0m${availspace}" + echo -e "\e[34mServerfiles:\t\e[0m${filesdirdu}" + if [ -d "${backupdir}" ]; then + echo -e "\e[34mBackups:\t\e[0m${backupdirdu}" + fi +} | column -s $'\t' -t +} + +fn_details_gameserver(){ +echo -e "" + +## server details +echo -e "\e[92m${gamename} Server Details\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +{ + # server name + echo -e "\e[34mServer name:\t\e[0m${servername}" + + # server ip + echo -e "\e[34mServer IP:\t\e[0m${ip}:${port}" + + # rcon password + if [ -n "${rconpassword}" ]; then + echo -e "\e[34mRCON password:\t\e[0m${rconpassword}" + fi + + # server password + if [ -n "${serverpassword}" ]; then + echo -e "\e[34mServer password:\t\e[0m${serverpassword}" + fi + + # admin password + if [ -n "${adminpassword}" ]; then + echo -e "\e[34mAdmin password:\t\e[0m${adminpassword}" + fi + + # slots + if [ -n "${slots}" ]; then + echo -e "\e[34mSlots:\t\e[0m${slots}" + fi + + # game mode + if [ -n "${gamemode}" ]; then + echo -e "\e[34mGame mode:\t\e[0m${gamemode}" + fi + + # game world + if [ -n "${gameworld}" ]; then + echo -e "\e[34mGame world:\t\e[0m${gameworld}" + fi + + # tick rate + if [ -n "${tickrate}" ]; then + echo -e "\e[34mTick rate:\t\e[0m${tickrate}" + fi + + # online status + if [ "${gamename}" == "Teamspeak 3" ]; then + info_ts3status.sh + if [ "${ts3status}" = "Server seems to have died" ]||[ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then + echo -e "\e[34mStatus:\t\e[0;31mOFFLINE\e[0m" + else + echo -e "\e[34mStatus:\t\e[0;32mONLINE\e[0m" + fi + else + pid=$(tmux list-sessions 2>&1 | awk '{print $1}' | grep -Ec "^${servicename}:") + if [ "${pid}" == "0" ]; then + echo -e "\e[34mStatus:\t\e[0;31mOFFLINE\e[0m" + else + echo -e "\e[34mStatus:\t\e[0;32mONLINE\e[0m" + fi + fi + + # teamspeak dbplugin + if [ -n "${dbplugin}" ]; then + echo -e "\e[34mdbplugin:\t\e[0m${dbplugin}" + fi +} | column -s $'\t' -t +echo -e "" + +## script details +echo -e "\e[92m${selfname} Script Details\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +{ + # service name + echo -e "\e[34mService name:\t\e[0m${servicename}" + + # script version + if [ -n "${version}" ]; then + echo -e "\e[34m${selfname} version:\t\e[0m${version}" + fi + + # script user + echo -e "\e[34mUser:\t\e[0m$(whoami)" + + # GLIBC required + if [ -n "${glibcrequired}" ]; then + if [ "$(ldd --version | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" -lt "$(echo "${glibcrequired}" | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" ]; then + if [ "${glibcfix}" == "yes" ]; then + echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired} \e[0m(\e[0;32mUsing GLIBC fix\e[0m)" + else + echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired}\e[0m(\e[0;32mGLIBC version too old\e[0m)" + fi + else + echo -e "\e[34mGLIBC required:\t\e[0;32m${glibcrequired}\e[0m" + fi + fi + + # email notification + if [ -n "${emailnotification}" ]; then + echo -e "\e[34mEmail notification:\t\e[0m${emailnotification}" + fi + + # update on start + if [ -n "${updateonstart}" ]; then + echo -e "\e[34mUpdate on start:\t\e[0m${updateonstart}" + fi + + # script location + echo -e "\e[34mLocation:\t\e[0m${rootdir}" + + # config file location + if [ -n "${servercfgfullpath}" ]; then + echo -e "\e[34mConfig file:\t\e[0m${servercfgfullpath}" + fi + + # network config file location (ARMA 3) + if [ -n "${networkcfgfullpath}" ]; then + echo -e "\e[34mNetwork config file:\t\e[0m${networkcfgfullpath}" + fi +} | column -s $'\t' -t +} + +fn_details_backup(){ +echo -e "" +echo -e "\e[92mBackups\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +if [ ! -d "${backupdir}" ]||[ "${backupcount}" == "0" ]; then + echo -e "No Backups created" +else + { + echo -e "\e[34mNo. of backups:\t\e[0m${backupcount}" + echo -e "\e[34mLatest backup:\e[0m" + echo -e "\e[34m date:\t\e[0m${lastbackupdate}" + echo -e "\e[34m file:\t\e[0m${lastbackup}" + echo -e "\e[34m size:\t\e[0m${lastbackupsize}" + } | column -s $'\t' -t +fi +} + +fn_details_commandlineparms(){ +echo -e "" +echo -e "\e[92mCommand-line Parameters\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "${executable} ${parms}" +} + +fn_details_statusbottom(){ +echo -e "" +if [ "${gamename}" == "Teamspeak 3" ]; then + if [ "${ts3status}" = "Server seems to have died" ]||[ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then + echo -e "\e[34mStatus: \e[0;31mOFFLINE\e[0m" + else + echo -e "\e[34mStatus: \e[0;32mONLINE\e[0m" + fi +else + pid=$(tmux list-sessions 2>&1 | awk '{print $1}' | grep -Ec "^${servicename}:") + if [ "${pid}" == "0" ]; then + echo -e "\e[34mStatus: \e[0;31mOFFLINE\e[0m" + else + echo -e "\e[34mStatus: \e[0;32mONLINE\e[0m" + fi +fi +echo -e "" +} + +# Engine Specific details + +fn_details_avalanche(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the parameters in" +echo -e "${servercfgfullpath}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep Jcmp-Server" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" +} | column -s $'\t' -t + +fn_details_statusbottom +} + +fn_details_dontstarve(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the parameters in" +echo -e "${servercfgfullpath}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep dontstarve" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" +} | column -s $'\t' -t + +fn_details_statusbottom +} + +fn_details_projectzomboid(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the parameters in" +echo -e "${servercfgfullpath}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep java" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" +} | column -s $'\t' -t + +fn_details_statusbottom +} + + +fn_details_realvirtuality(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the parameters in" +echo -e "${servercfgfullpath}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep arma3server" +echo -e "" +if [ -z "${port}" ]||[ -z "${queryport}" ]||[ -z "${masterport}" ]; then + echo -e "\e[0;31mERROR!\e[0m Missing/commented ports in ${servercfg}." + echo -e "" +fi +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Steam: Query\tINBOUND\t${queryport}\tudp" + echo -e "> Steam: Master traffic\tINBOUND\t${masterport}\tudp" +} | column -s $'\t' -t + +fn_details_statusbottom +} + +fn_details_idtech3(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the parameters in" +echo -e "${servercfgfullpath}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep qzeroded" +echo -e "" +if [ -z "${port}" ]||[ -z "${rconport}" ]||[ -z "${statsport}" ]; then + echo -e "\e[0;31mERROR!\e[0m Missing/commented ports in ${servercfg}." + echo -e "" +fi +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Rcon\tINBOUND\t${rconport}\tudp" + echo -e "> Stats\tINBOUND\t${statsport}\tudp" +} | column -s $'\t' -t + +fn_details_statusbottom +} + + +fn_details_seriousengine35(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the parameters in" +echo -e "${servercfgfullpath}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep Sam3_Dedicate" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/RCON\tINBOUND\t${port}\ttcp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" +} | column -s $'\t' -t + +fn_details_statusbottom +} + +fn_details_source(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the command-line" +echo -e "parameters in ${selfname}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep srcds_linux" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/RCON\tINBOUND\t${port}\ttcp/udp" + if [ -n "${sourcetvport}" ]; then + echo -e "> SourceTV\tINBOUND\t${sourcetvport}\tudp" + fi + echo -e "< Client\tOUTBOUND\t${clientport}\tudp" +} | column -s $'\t' -t + +fn_details_statusbottom +} + +fn_details_spark(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the command-line" +echo -e "parameters in ${selfname}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep server_linux3" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/RCON\tINBOUND\t${port}\tudp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" +} | column -s $'\t' -t +echo -e "" +echo -e "\e[92m${servername} WebAdmin\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +{ + echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}/index.html" + echo -e "\e[34mWebAdmin username:\t\e[0m${webadminuser}" + echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}" +} | column -s $'\t' -t + +fn_details_statusbottom +} + +fn_details_starbound(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the command-line" +echo -e "parameters in ${selfname}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep starbound" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\ttcp" + echo -e "> Query\tINBOUND\t${queryport}\ttcp" + echo -e "> Rcon\tINBOUND\t${rconport}\ttcp" +} | column -s $'\t' -t + +fn_details_statusbottom + +} + +fn_details_teamspeak3(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the parameters in" +echo -e "${servercfgfullpath}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep ts3server" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Voice\tINBOUND\t${port}\tudp" + echo -e "> ServerQuery\tINBOUND\t${queryport}\ttcp" + echo -e "> File transfer\tINBOUND\t${fileport}\ttcp" +} | column -s $'\t' -t + +fn_details_statusbottom +} + +fn_details_teeworlds(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the command-line" +echo -e "parameters in ${servercfgfullpath}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep teeworlds_srv" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\ttcp" +} | column -s $'\t' -t + +fn_details_statusbottom +} + +fn_details_terraria(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the command-line" +echo -e "parameters in ${servercfgfullpath}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep terraia" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\ttcp" + echo -e "> Query\tINBOUND\t${queryport}\ttcp" + echo -e "> Rcon\tINBOUND\t${rconport}\ttcp" +} | column -s $'\t' -t + +fn_details_statusbottom +} + +fn_details_sdtd(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the parameters in" +echo -e "${servercfgfullpath}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep 7DaysToDie" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/RCON\tINBOUND\t${port}\tudp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" + echo -e "> Telnet\tINBOUND\t${telnetport}\ttcp" +} | column -s $'\t' -t +echo -e "" +echo -e "\e[92m${servername} WebAdmin\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +{ + echo -e "\e[34mWebAdmin enabled:\t\e[0m${webadminenabled}" + echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}" + echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}" +} | column -s $'\t' -t +echo -e "" +echo -e "\e[92m${servername} Telnet\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +{ + echo -e "\e[34mTelnet enabled:\t\e[0m${telnetenabled}" + echo -e "\e[34mTelnet address:\t\e[0m${ip} ${telnetport}" + echo -e "\e[34mTelnet password:\t\e[0m${telnetpass}" +} | column -s $'\t' -t + +fn_details_statusbottom +} + +fn_details_hurtworld(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the parameters in" +echo -e "hwserver script" +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep Hurtworld" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/RCON\tINBOUND\t${port}\tudp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + +} | column -s $'\t' -t +echo -e "" + +fn_details_statusbottom +} + +fn_details_rust(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the parameters in" +echo -e "rustserver script" +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep Rust" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/Query\tINBOUND\t${port}\tudp" + echo -e "> RCON\tINBOUND\t${rconport}\ttcp" + +} | column -s $'\t' -t +echo -e "" + +fn_details_statusbottom +} + +fn_details_unreal(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the parameters in" +echo -e "${servercfgfullpath}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep ucc-bin" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL\tINI VARIABLE" + echo -e "> Game\tINBOUND\t${port}\tudp\tPort=${port}" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + if [ "${engine}" == "unreal" ]; then + echo -e "< UdpLink Port (random)\tOUTBOUND\t${udplinkport}+\tudp" + fi + if [ "${engine}" != "unreal" ] && [ "${appid}" != "223250" ]; then + echo -e "> GameSpy query\tINBOUND\t${gsqueryport}\tudp\tOldQueryPortNumber=${gsqueryport}" + fi + if [ "${appid}" == "215360" ]; then + echo -e "< Master server\tOUTBOUND\t28852\ttcp/udp" + else + echo -e "< Master server\tOUTBOUND\t28900/28902\ttcp/udp" + fi + if [ "${appid}" ]; then + if [ "${appid}" == "223250" ]; then + echo -e "< Steam\tOUTBOUND\t20610\tudp" + else + echo -e "< Steam\tOUTBOUND\t20660\tudp" + fi + fi + echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" +} | column -s $'\t' -t +echo -e "" +echo -e "\e[92m${servername} WebAdmin\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +{ + echo -e "\e[34mWebAdmin enabled:\t\e[0m${webadminenabled}" + echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}" + echo -e "\e[34mWebAdmin username:\t\e[0m${webadminuser}" + echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}" +} | column -s $'\t' -t + +fn_details_statusbottom +} + +fn_details_ark(){ +echo -e "" +echo -e "\e[92mPorts\e[0m" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +echo -e "Change ports by editing the parameters in" +echo -e "${servercfgfullpath}." +echo -e "" +echo -e "Useful port diagnostic command:" +echo -e "netstat -atunp | grep ShooterGame" +echo -e "" +{ + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL\tINI VARIABLE" + echo -e "> Game\tINBOUND\t${port}\tudp\tPort=${port}" + echo -e "> Query\tINBOUND\t${queryport}\tudp" +} | column -s $'\t' -t + +fn_details_statusbottom +} + + +# Run checks and gathers details to display. +check.sh +info_config.sh +info_distro.sh +info_glibc.sh +fn_details_os +fn_details_performance +fn_details_disk +fn_details_gameserver +fn_details_backup +# Some game servers do not have parms. +if [ "${gamename}" != "Teamspeak 3" ]||[ "${engine}" != "avalanche" ]||[ "${engine}" != "dontstarve" ]||[ "${engine}" != "projectzomboid" ]; then + fn_parms + fn_details_commandlineparms +fi + + +# Display details depending on game or engine. +if [ "${engine}" == "avalanche" ]; then + fn_details_avalanche +elif [ "${engine}" == "dontstarve" ]; then + fn_details_dontstarve +elif [ "${engine}" == "projectzomboid" ]; then + fn_details_projectzomboid +elif [ "${engine}" == "idtech3" ]; then + fn_details_idtech3 +elif [ "${engine}" == "realvirtuality" ]; then + fn_details_realvirtuality +elif [ "${engine}" == "seriousengine35" ]; then + fn_details_seriousengine35 +elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then + fn_details_source +elif [ "${engine}" == "spark" ]; then + fn_details_spark +elif [ "${engine}" == "starbound" ]; then + fn_details_starbound +elif [ "${engine}" == "teeworlds" ]; then + fn_details_teeworlds +elif [ "${engine}" == "terraria" ]; then + fn_details_terraria +elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then + fn_details_unreal +elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then + fn_details_ark +elif [ "${gamename}" == "Hurtworld" ]; then + fn_details_hurtworld +elif [ "${gamename}" == "7 Days To Die" ]; then + fn_details_sdtd +elif [ "${gamename}" == "Teamspeak 3" ]; then + fn_details_teamspeak3 +elif [ "${gamename}" == "Rust" ]; then + fn_details_rust +else + fn_print_error_nl "Unable to detect server engine." +fi diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh new file mode 100644 index 000000000..46bae900d --- /dev/null +++ b/lgsm/functions/command_dev_debug.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# LGSM dev_debug.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="281215" + +# Description: Dev only: enables debuging log to be saved to dev-debug.log. + +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +if [ -f ".dev-debug" ]; then + rm .dev-debug + fn_print_ok_nl "Disabled dev-debug" +else + date > .dev-debug + fn_print_ok_nl "Enabled dev-debug" +fi \ No newline at end of file diff --git a/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh similarity index 100% rename from functions/command_dev_detect_deps.sh rename to lgsm/functions/command_dev_detect_deps.sh diff --git a/lgsm/functions/command_email_test.sh b/lgsm/functions/command_email_test.sh new file mode 100644 index 000000000..26a0b6a42 --- /dev/null +++ b/lgsm/functions/command_email_test.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# LGSM command_email_test.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +# Description: Sends a test email notification. + +local modulename="Email" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +check.sh +info_config.sh +if [ "${emailnotification}" = "on" ]; then + fn_scriptlog "Sending test notification" + subject="${servicename} Email Test Notification - Testing ${servername}" + failurereason="Testing ${servicename} email notification" + actiontaken="Sent test email...hello is this thing on?" + email.sh +else + fn_print_fail_nl "Notifications not enabled" + fn_scriptlog "Notifications not enabled" +fi \ No newline at end of file diff --git a/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh similarity index 100% rename from functions/command_fastdl.sh rename to lgsm/functions/command_fastdl.sh diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh new file mode 100644 index 000000000..877896380 --- /dev/null +++ b/lgsm/functions/command_install.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# LGSM fn_install function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="260216" + +# Description: Overall function for the installer. + +local modulename="Install" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +check.sh +install_header.sh +install_server_dir.sh +install_logs.sh +check_deps.sh +# Download and install +if [ "${gamename}" == "Unreal Tournament 2004" ]; then + install_server_files.sh + install_ut2k4_key.sh +elif [ "${gamename}" == "Unreal Tournament 99" ]; then + install_server_files.sh +elif [ "${gamename}" == "Teamspeak 3" ]; then + install_ts3.sh +elif [ -n "${appid}" ]; then + install_steamcmd.sh + install_server_files.sh +fi + +# Configuration +install_config.sh +if [ "${gamename}" == "Counter Strike: Global Offensive" ]||[ "${gamename}" == "Team Fortress 2" ]||[ "${gamename}" == "BrainBread 2" ]; then + install_gslt.sh +elif [ "${gamename}" == "Teamspeak 3" ]; then + install_ts3db.sh +fi +fix.sh +install_complete.sh diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh new file mode 100644 index 000000000..066d0dbdf --- /dev/null +++ b/lgsm/functions/command_monitor.sh @@ -0,0 +1,110 @@ +#!/bin/bash +# LGSM command_monitor.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +# Description: Monitors server by checking for running proccesses +# then passes to monitor_gsquery.sh. + +local modulename="Monitor" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +fn_monitor_check_lockfile(){ + # Monitor does not run it lockfile is not found + if [ ! -f "${rootdir}/${lockselfname}" ]; then + fn_print_info_nl "Disabled: No lock file found" + fn_scriptlog "Disabled: No lock file found" + echo " * To enable monitor run ./${selfname} start" + exit 1 + fi +} + +fn_monitor_check_update(){ + # Monitor will not check if update is running. + updatecheck=$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l) + if [ "${updatecheck}" >= "1" ]; then + fn_print_info_nl "SteamCMD is currently checking for updates" + fn_scriptlog "SteamCMD is currently checking for updates" + sleep 1 + exit + fi +} + +fn_monitor_msg_checking(){ + fn_print_dots "Checking session: " + fn_print_checking_eol + fn_scriptlog "Checking session: CHECKING" + sleep 1 +} + +fn_monitor_email_notification(){ + # Email will be sent if enabled + if [ "${emailnotification}" = "on" ]; then + subject="${servicename} Monitor - Starting ${servername}" + failurereason="${servicename} process not running" + actiontaken="${servicename} has been restarted" + email.sh + fi +} + +fn_monitor_teamspeak3(){ + info_ts3status.sh + if [ "${ts3status}" = "Server is running" ]; then + fn_print_ok "Checking session: " + fn_print_ok_eol_nl + fn_scriptlog "Checking session: OK" + exit + else + fn_print_fail "Checking session: ${ts3status}: " + fn_print_fail_eol_nl + fn_scriptlog "Checking session: ${ts3status}: FAIL" + failurereason="${ts3status}" + fn_monitor_email_notification + fi + fn_scriptlog "Monitor is starting ${servername}" + sleep 1 + fn_restart +} + +fn_monitor_tmux(){ + # checks that tmux session is running + tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") + if [ "${tmuxwc}" == "1" ]; then + fn_print_ok "Checking session: OK" + fn_print_ok_eol_nl + fn_scriptlog "Checking session: OK" + # runs gsquery check on game with specific engines. + local allowed_engines_array=( avalanche goldsource realvirtuality source spark unity3d unreal unreal2 ) + for allowed_engine in "${allowed_engines_array[@]}" + do + if [ "${allowed_engine}" == "${function_selfname}" ]; then + monitor_gsquery.sh + fi + done + exit + else + fn_print_fail "Checking session: " + fn_print_fail_eol_nl + fn_scriptlog "Checking session: FAIL" + fn_monitor_email_notification + fn_scriptlog "Monitor is starting ${servername}" + sleep 1 + command_start.sh + fi +} + +check.sh +logs.sh +info_config.sh +fn_print_dots "${servername}" +fn_scriptlog "${servername}" +sleep 1 +fn_monitor_check_lockfile +fn_monitor_check_update +fn_monitor_msg_checking +if [ "${gamename}" == "Teamspeak 3" ]; then + fn_monitor_teamspeak3 +else + fn_monitor_tmux +fi \ No newline at end of file diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh new file mode 100644 index 000000000..e9fa5d0d0 --- /dev/null +++ b/lgsm/functions/command_start.sh @@ -0,0 +1,182 @@ +#!/bin/bash +# LGSM command_start.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="070116" + +# Description: Starts the server. + +local modulename="Starting" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +fn_start_teamspeak3(){ + check.sh + info_ts3status.sh + + if [ "${ts3status}" != "Server is running" ]; then + # Will check for updates is updateonstart is yes + if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateonstart}" == "on" ]; then + update_check.sh + fi + fi + + if [ ! -e "${servercfgfullpath}" ]; then + fn_print_warn_nl "${servercfgfullpath} is missing" + fn_scriptlog "${servercfgfullpath} is missing" + echo " * Creating blank ${servercfg}" + fn_scriptlog "Creating blank ${servercfg}" + sleep 2 + echo " * ${servercfg} can remain blank by default." + fn_scriptlog "${servercfgfullpath} can remain blank by default." + sleep 2 + echo " * ${servercfg} is located in ${servercfgfullpath}." + fn_scriptlog "${servercfg} is located in ${servercfgfullpath}." + sleep 5 + touch "${servercfgfullpath}" + fi + + logs.sh + + fn_print_dots "${servername}" + fn_scriptlog "${servername}" + sleep 1 + + if [ "${ts3status}" == "Server is running" ]; then + fn_print_info_nl "${servername} is already running" + fn_scriptlog "${servername} is already running" + exit + fi + + mv "${scriptlog}" "${scriptlogdate}" + # Create lock file + date > "${rootdir}/${lockselfname}" + cd "${executabledir}" + if [ "${ts3serverpass}" == "1" ];then + ./ts3server_startscript.sh start serveradmin_password="${newpassword}" + else + ./ts3server_startscript.sh start inifile="${servercfgfullpath}" > /dev/null 2>&1 + fi + sleep 1 + info_ts3status.sh + if [ "${ts3status}" = "Server seems to have died" ]||[ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then + fn_print_fail_nl "Unable to start ${servername}" + fn_scriptlog "Unable to start ${servername}" + echo -e " Check log files: ${rootdir}/log" + exit 1 + else + fn_print_ok_nl "${servername}" + fn_scriptlog "Started ${servername}" + fi +} + +fn_start_tmux(){ +check.sh +fix.sh +info_config.sh +fn_parms +logs.sh + +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") +# Will check for updates if updateonstart is yes +if [ "${tmuxwc}" -eq 0 ]; then + if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateonstart}" == "on" ]; then + update_check.sh + fi +fi + +fn_print_dots "${servername}" +fn_scriptlog "${servername}" +sleep 1 + +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 + +if [ "${tmuxwc}" -eq 1 ]; then + fn_print_info_nl "${servername} is already running" + fn_scriptlog "${servername} is already running" + 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 not supported in tmux versions < 1.6 +if [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -lt "16" ]; then + echo "Console logging disabled: Tmux => 1.6 required" >> "${consolelog}" + echo "http://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" + echo "Currently installed: $(tmux -V)" >> "${consolelog}" +elif [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -eq "18" ]; then + echo "Console logging disabled: Bug in tmux 1.8 breaks logging" >> "${consolelog}" + echo "http://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" + echo "Currently installed: $(tmux -V)" >> "${consolelog}" +else + touch "${consolelog}" + tmux pipe-pane -o -t "${servicename}" "exec cat >> '${consolelog}'" +fi +sleep 1 +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") +# If the server fails to start +if [ "${tmuxwc}" -eq 0 ]; then + fn_print_fail_nl "Unable to start ${servername}" + fn_scriptlog "Unable to start ${servername}" + sleep 1 + if [ -s "${scriptlogdir}/.${servicename}-tmux-error.tmp" ]; then + fn_print_fail_nl "Unable to start ${servername}: Tmux error:" + fn_scriptlog "Tmux error" + echo "" + echo "Command" + echo "=================================" + echo "tmux new-session -d -s \"${servicename}\" \"${executable} ${parms}\"" | tee -a "${scriptlog}" + echo "" + echo "Error" + echo "=================================" + cat "${scriptlogdir}/.${servicename}-tmux-error.tmp" | tee -a "${scriptlog}" + + # Detected error http://gameservermanagers.com/issues + if [ $(grep -c "Operation not permitted" "${scriptlogdir}/.${servicename}-tmux-error.tmp") ]; then + echo "" + echo "Fix" + echo "=================================" + if [ ! $(grep "tty:" /etc/group|grep "$(whoami)") ]; then + echo "$(whoami) is not part of the tty group." + fn_scriptlog "$(whoami) is not part of the tty group." + group=$(grep tty /etc/group) + echo "" + echo " ${group}" + fn_scriptlog "${group}" + echo "" + echo "Run the following command with root privileges." + echo "" + echo " usermod -G tty $(whoami)" + echo "" + echo "http://gameservermanagers.com/tmux-op-perm" + fn_scriptlog "http://gameservermanagers.com/tmux-op-perm" + else + echo "No known fix currently. Please log an issue." + fn_scriptlog "No known fix currently. Please log an issue." + echo "http://gameservermanagers.com/issues" + fn_scriptlog "http://gameservermanagers.com/issues" + fi + fi + fi +exit 1 +else + fn_print_ok "${servername}" + fn_scriptlog "Started ${servername}" +fi +rm "${scriptlogdir}/.${servicename}-tmux-error.tmp" +echo -en "\n" +} + +if [ "${gamename}" == "Teamspeak 3" ]; then + fn_start_teamspeak3 +else + fn_start_tmux +fi diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh new file mode 100644 index 000000000..ba8400879 --- /dev/null +++ b/lgsm/functions/command_stop.sh @@ -0,0 +1,217 @@ +#!/bin/bash +# LGSM command_stop.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +# Description: Stops the server. + +local modulename="Stopping" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +# Attempts Graceful of source using rcon 'quit' command. +fn_stop_graceful_source(){ + fn_print_dots "Graceful: rcon quit" + fn_scriptlog "Graceful: rcon quit" + # sends quit + tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 + # waits up to 30 seconds giving the server time to shutdown gracefuly + for seconds in {1..30}; do + pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") + if [ "${pid}" == "0" ]; then + fn_print_ok "Graceful: rcon quit: ${seconds}: " + fn_print_ok_eol_nl + fn_scriptlog "Graceful: rcon quit: OK: ${seconds} seconds" + break + fi + sleep 1 + fn_print_dots "Graceful: rcon quit: ${seconds}" + done + if [ "${pid}" != "0" ]; then + fn_print_fail "Graceful: rcon quit" + fn_print_fail_eol_nl + fn_scriptlog "Graceful: rcon quit: FAIL" + fn_stop_tmux + fi + sleep 1 +} + +# Attempts Graceful of goldsource using rcon 'quit' command. +# Goldsource 'quit' command restarts rather than shutsdown +# this function will only wait 3 seconds then force a tmux shutdown. +# preventing the server from coming back online. +fn_stop_graceful_goldsource(){ + fn_print_dots "Graceful: rcon quit" + fn_scriptlog "Graceful: rcon quit" + # sends quit + tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 + # waits 3 seconds as goldsource servers restart with the quit command + for seconds in {1..3}; do + sleep 1 + fn_print_dots "Graceful: rcon quit: ${seconds}" + done + fn_print_ok "Graceful: rcon quit: ${seconds}: " + fn_print_ok_eol_nl + fn_scriptlog "Graceful: rcon quit: OK: ${seconds} seconds" + sleep 1 + fn_stop_tmux +} + +# Attempts Graceful of 7 Days To Die using telnet. +fn_stop_telnet_sdtd(){ + sdtd_telnet_shutdown=$( expect -c ' + proc abort {} { + puts "Timeout or EOF\n" + exit 1 + } + spawn telnet '"${telnetip}"' '"${telnetport}"' + expect { + "password:" { send "'"${telnetpass}"'\r" } + default abort + } + expect { + "session." { send "shutdown\r" } + default abort + } + expect { eof } + puts "Completed.\n" + ') + +} + +fn_stop_graceful_sdtd(){ + fn_print_dots "Graceful: telnet" + fn_scriptlog "Graceful: telnet" + sleep 1 + if [ "${telnetenabled}" == "false" ]; then + fn_print_info_nl "Graceful: telnet: DISABLED: Enable in ${servercfg}" + elif [ "$(command -v expect)" ]||[ "$(which expect >/dev/null 2>&1)" ]; then + # Tries to shutdown with both localhost and server IP. + for telnetip in 127.0.0.1 ${ip}; do + fn_print_dots "Graceful: telnet: ${telnetip}" + fn_scriptlog "Graceful: telnet: ${telnetip}" + sleep 1 + fn_stop_telnet_sdtd + completed=$(echo -en "\n ${sdtd_telnet_shutdown}"|grep "Completed.") + refused=$(echo -en "\n ${sdtd_telnet_shutdown}"|grep "Timeout or EOF") + if [ -n "${refused}" ]; then + fn_print_warn "Graceful: telnet: ${telnetip}: " + fn_print_fail_eol_nl + fn_scriptlog "Graceful: telnet: ${telnetip}: FAIL" + sleep 1 + elif [ -n "${completed}" ]; then + break + fi + done + + # If telnet was successful will use telnet again to check the connection has closed + # This confirms that the tmux session can now be killed. + if [ -n "${completed}" ]; then + for seconds in {1..30}; do + fn_stop_telnet_sdtd + refused=$(echo -en "\n ${sdtd_telnet_shutdown}"|grep "Timeout or EOF") + if [ -n "${refused}" ]; then + fn_print_ok "Graceful: telnet: ${telnetip}: " + fn_print_ok_eol_nl + fn_scriptlog "Graceful: telnet: ${telnetip}: ${seconds} seconds" + break + fi + sleep 1 + fn_print_dots "Graceful: rcon quit: ${seconds}" + done + # If telnet failed will go straight to tmux shutdown. + # If cannot shutdown correctly world save may be lost + else + if [ -n "${refused}" ]; then + fn_print_fail "Graceful: telnet: " + fn_print_fail_eol_nl + fn_scriptlog "Graceful: telnet: ${telnetip}: FAIL" + else + fn_print_fail_nl "Graceful: telnet: Unknown error" + fn_scriptlog "Graceful: telnet: Unknown error" + fi + echo -en "\n" | tee -a "${scriptlog}" + echo -en "Telnet output:" | tee -a "${scriptlog}" + echo -en "\n ${sdtd_telnet_shutdown}" | tee -a "${scriptlog}" + echo -en "\n\n" | tee -a "${scriptlog}" + fi + else + fn_print_dots "Graceful: telnet: " + fn_scriptlog "Graceful: telnet: " + fn_print_fail "Graceful: telnet: expect not installed: " + fn_print_fail_eol_nl + fn_scriptlog "Graceful: telnet: expect not installed: FAIL" + fi + sleep 1 + fn_stop_tmux +} + +fn_stop_graceful_select(){ + if [ "${gamename}" == "7 Days To Die" ]; then + fn_stop_graceful_sdtd + elif [ "${engine}" == "source" ]; then + fn_stop_graceful_source + elif [ "${engine}" == "goldsource" ]; then + fn_stop_graceful_goldsource + else + fn_stop_tmux + fi +} + +fn_stop_teamspeak3(){ + fn_print_dots "${servername}" + fn_scriptlog "${servername}" + sleep 1 + ${filesdir}/ts3server_startscript.sh stop > /dev/null 2>&1 + # Remove lock file + rm -f "${rootdir}/${lockselfname}" + fn_print_ok_nl "${servername}" + fn_scriptlog "Stopped ${servername}" + } + + fn_stop_tmux(){ + fn_print_dots "${servername}" + fn_scriptlog "tmux kill-session: ${servername}" + sleep 1 + # Kill tmux session + tmux kill-session -t "${servicename}" > /dev/null 2>&1 + sleep 0.5 + pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") + if [ "${pid}" == "0" ]; then + # Remove lock file + rm -f "${rootdir}/${lockselfname}" + fn_print_ok_nl "${servername}" + fn_scriptlog "Stopped ${servername}" + else + fn_print_fail_nl "Unable to stop${servername}" + fn_scriptlog "Unable to stop${servername}" + fi +} + +# checks if the server is already stopped before trying to stop. +fn_stop_pre_check(){ + if [ "${gamename}" == "Teamspeak 3" ]; then + info_ts3status.sh + if [ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then + fn_print_ok_nl "${servername} is already stopped" + fn_scriptlog "${servername} is already stopped" + else + fn_stop_teamspeak3 + fi + else + pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") + if [ "${pid}" == "0" ]; then + fn_print_ok_nl "${servername} is already stopped" + fn_scriptlog "${servername} is already stopped" + else + fn_stop_graceful_select + fi + fi +} + +check.sh +info_config.sh +fn_print_dots "${servername}" +fn_scriptlog "${servername}" +sleep 1 +fn_stop_pre_check \ No newline at end of file diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh new file mode 100644 index 000000000..eba76523a --- /dev/null +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# LGSM command_serveradmin_password.sh function +# Author: Daniel Gibbs +# Contributor : UltimateByte +# Website: http://gameservermanagers.com +lgsm_version="080116" + +# Description: Changes TS3 serveradmin password + +local modulename="Change password" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + + +fn_serveradmin_password_prompt(){ +echo "" +echo "${gamename} ServerAdmin Password Change" +echo "============================" +echo "" +echo "Press \"CTRL+b d\" to exit console." +fn_print_infomation_nl "You are about to change the ${gamename} ServerAdmin password." +fn_print_warning_nl "${gamename} will restart during this process." +echo "" +while true; do + read -e -i "y" -p "Continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; return;; + * ) echo "Please answer yes or no.";; +esac +done +fn_scriptlog "Initiating ${gamename} ServerAdmin password change" +read -p "Enter new password : " newpassword +} + + +fn_serveradmin_password_set(){ +fn_print_info_nl "Applying new password" +fn_scriptlog "Applying new password" +sleep 1 +# Stop any running server +command_stop.sh +# Start server in "new password mode" +ts3serverpass="1" +fn_print_info_nl "Starting server with new password" +command_start.sh +# Stop server in "new password mode" +command_stop.sh +fn_print_ok_nl "Password applied" +fn_scriptlog "New ServerAdmin password applied" +sleep 1 +} + +# Running functions +check.sh +fn_serveradmin_password_prompt +info_ts3status.sh +if [ "${ts3status}" == "Server is running" ]; then + fn_serveradmin_password_set + command_start.sh +else + fn_serveradmin_password_set +fi \ No newline at end of file diff --git a/functions/command_update.sh b/lgsm/functions/command_update.sh similarity index 100% rename from functions/command_update.sh rename to lgsm/functions/command_update.sh diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh new file mode 100644 index 000000000..9c0ac4b90 --- /dev/null +++ b/lgsm/functions/command_update_functions.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# LGSM update_functions.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="270216" + +# Description: Deletes the functions dir to allow re-downloading of functions from GitHub. + +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +check.sh +fn_print_dots "Updating functions" +fn_scriptlog "Updating functions" +sleep 1 +echo -ne "\n" + +# Removed legecy functions dir +if [ -d "${rootdir}/functions/" ]; then + rm -rfv "${rootdir}/functions/" + exitcode=$? +fi + +if [ -n "${functionsdir}" ]; then + rm -rfv "${functionsdir}/"* + exitcode=$? +else + fn_print_fail "Updating functions" + fn_scriptlog "Failure! Updating functions" +fi + +if [ "${exitcode}" == "0" ]; then + fn_print_ok "Updating functions" + fn_scriptlog "Success! Updating functions" +else + fn_print_fail "Updating functions" + fn_scriptlog "Failure! Updating functions" +fi +echo -ne "\n" \ No newline at end of file diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh new file mode 100644 index 000000000..f4c46c071 --- /dev/null +++ b/lgsm/functions/command_validate.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# LGSM command_validate.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +# Description: Runs a server validation. + +local modulename="Validate" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +fn_validation(){ +fn_print_warn_nl "Validating may overwrite some customised files." +echo -en "https://developer.valvesoftware.com/wiki/SteamCMD#Validate" +sleep 5 +echo -en "\n" +fn_print_dots "Checking server files" +sleep 1 +fn_print_ok "Checking server files" +fn_scriptlog "Checking server files" +sleep 1 + +cd "${rootdir}/steamcmd" + +if [ $(command -v unbuffer) ]; then + unbuffer=unbuffer +fi + +if [ "${engine}" == "goldsource" ]; then + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" +app_update "${appid}" validate +quit| tee -a "${scriptlog}" +else + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" validate +quit| tee -a "${scriptlog}" +fi + +fix.sh +fn_scriptlog "Checking complete" +} + +check.sh +tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") +if [ "${tmuxwc}" -eq 1 ]; then + command_stop.sh + fn_validation + command_start.sh +else + fn_validation +fi diff --git a/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh similarity index 100% rename from functions/compress_unreal2_maps.sh rename to lgsm/functions/compress_unreal2_maps.sh diff --git a/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh similarity index 100% rename from functions/compress_ut99_maps.sh rename to lgsm/functions/compress_ut99_maps.sh diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh new file mode 100644 index 000000000..579fb2788 --- /dev/null +++ b/lgsm/functions/core_dl.sh @@ -0,0 +1,202 @@ +#!/bin/bash +# LGSM core_dl.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="050216" + +# Description: Deals with all downloads for LGSM. + +# fileurl: The URL of the file: http://example.com/dl/File.tar.bz2 +# filedir: location the file is to be saved: /home/server/lgsm/tmp +# filename: name of file (this can be different from the url name): file.tar.bz2 +# executecmd: Optional, set to "executecmd" to make file executable using chmod +x +# run: Optional, set to run to execute the file +# force: Optional, force re-download of file even if exists +# md5: Optional, Checks file against an md5 sum +# +# Downloads can be defined in code like so: +# fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" +# fn_fetch_file "http://example.com/file.tar.bz2" "/some/dir" "file.tar.bz2" "executecmd" "run" "force" "10cd7353aa9d758a075c600a6dd193fd" + +fn_dl_md5(){ +# Runs MD5 Check if available +if [ "${md5}" != "0" ]&&[ "${md5}" != "nomd5" ]; then + echo -ne "verifying ${filename} with MD5..." + sleep 1 + local md5sumcmd=$(md5sum "${filedir}/${filename}"|awk '{print $1;}') + if [ "${md5sumcmd}" != "${md5}" ]; then + fn_print_fail_eol_nl + echo "${filename} returned MD5 checksum: ${md5sumcmd}" + echo "expected MD5 checksum: ${md5}" + fn_scriptlog "verifying ${filename} with MD5: FAIL" + fn_scriptlog "${filename} returned MD5 checksum: ${md5sumcmd}" + fn_scriptlog "expected MD5 checksum: ${md5}" + exit 1 + else + fn_print_ok_eol_nl + fn_scriptlog "verifying ${filename} with MD5: OK" + fn_scriptlog "${filename} returned MD5 checksum: ${md5sumcmd}" + fn_scriptlog "expected MD5 checksum: ${md5}" + fi +fi +} + +# Extracts bzip2 or gzip files +# Extracts can be defined in code like so: +# fn_dl_extract "${filedir}" "${filename}" "${extractdir}" +# fn_dl_extract "/home/gameserver/lgsm/tmp" "file.tar.bz2" "/home/gamserver/serverfiles" +fn_dl_extract(){ +filedir="${1}" +filename="${2}" +extractdir="${3}" +# extracts archives +echo -ne "extracting ${filename}..." +fn_scriptlog "extracting download" +mime=$(file -b --mime-type "${filedir}/${filename}") + +if [ "${mime}" == "application/gzip" ]; then + tarcmd=$(tar -zxf "${filedir}/${filename}" -C "${extractdir}") +elif [ "${mime}" == "application/x-bzip2" ]; then + tarcmd=$(tar -jxf "${filedir}/${filename}" -C "${extractdir}") +fi +local exitcode=$? +if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_scriptlog "extracting download: FAIL" + echo "${tarcmd}" | tee -a "${scriptlog}" + exit ${exitcode} +else + fn_print_ok_eol_nl +fi +} + +# Trap to remove file download if canceled before completed +fn_fetch_trap() { + echo "" + echo -ne "downloading ${filename}: " + fn_print_canceled_eol_nl + fn_scriptlog "downloading ${filename}: CANCELED" + sleep 1 + rm -f "${filedir}/${filename}" | tee -a "${scriptlog}" + echo -ne "downloading ${filename}: " + fn_print_removed_eol_nl + fn_scriptlog "downloading ${filename}: REMOVED" + exit +} + +fn_fetch_file(){ +fileurl="${1}" +filedir="${2}" +filename="${3}" +executecmd="${4:-0}" +run="${5:-0}" +force="${6:-0}" +md5="${7:-0}" + +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then + if [ ! -d "${filedir}" ]; then + mkdir -p "${filedir}" + fi + + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + # trap to remove part downloaded files + trap fn_fetch_trap INT + # if larger file shows progress bar + if [ ${filename##*.} == "bz2" ]; then + echo -ne "downloading ${filename}..." + sleep 1 + curlcmd=$(${curlcmd} --progress-bar --fail -o "${filedir}/${filename}" "${fileurl}") + echo -ne "downloading ${filename}..." + else + echo -ne " fetching ${filename}...\c" + curlcmd=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${fileurl}" 2>&1) + fi + local exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + if [ -f "${scriptlog}" ]; then + fn_scriptlog "downloading ${filename}: FAIL" + fi + echo "${curlcmd}" | tee -a "${scriptlog}" + echo -e "${fileurl}\n" | tee -a "${scriptlog}" + exit ${exitcode} + else + fn_print_ok_eol_nl + if [ -f "${scriptlog}" ]; then + fn_scriptlog "downloading ${filename}: OK" + fi + fi + # remove trap + trap - INT + else + fn_print_fail_eol_nl + echo "Curl is not installed!" + echo -e "" + exit 1 + fi + # make file executecmd if executecmd is set + if [ "${executecmd}" == "executecmd" ]; then + chmod +x "${filedir}/${filename}" + fi +fi + +if [ -f "${filedir}/${filename}" ]; then + fn_dl_md5 + # run file if run is set + if [ "${run}" == "run" ]; then + source "${filedir}/${filename}" + fi +fi +} + + + +# fileurl: The directory the file is located in teh GitHub repo +# filedir: name of file +# filename: location file to be saved +# executecmd: set to "executecmd" to make file executecmd +# run: Optional, set to run to execute the file +# force: force download of file even if exists +# md5: Checks fail against an md5 sum + + +# Fetches files from the github repo +fn_fetch_file_github(){ +github_file_url_dir="${1}" +github_file_url_name="${2}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +fileurl="${githuburl}" +filedir="${3}" +filename="${github_file_url_name}" +executecmd="${4:-0}" +run="${5:-0}" +force="${6:-0}" +md5="${7:-0}" +fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" +} + + +# Fetches functions +fn_fetch_function(){ +github_file_url_dir="functions" # github dir containing the file +github_file_url_name="${functionfile}" # name of the github file +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +fileurl="${githuburl}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +executecmd="executecmd" +run="run" +force="noforce" +md5="nomd5" +fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" +} \ No newline at end of file diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh new file mode 100644 index 000000000..ccea1f07d --- /dev/null +++ b/lgsm/functions/core_functions.sh @@ -0,0 +1,454 @@ +#!/bin/bash +# LGSM core_functions.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="270216" + +# Description: Defines all functions to allow download and execution of functions using fn_fetch_function. +# This function is called first before any other function. Without this file other functions would not load. + +# Code/functions for legacy servers + +fn_functions(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fn_getopt(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +# fn_fetch_core_dl also placed here to allow legecy servers to still download core functions +if [ -z "${lgsmdir}" ]; then + lgsmdir="${rootdir}/lgsm" + functionsdir="${lgsmdir}/functions" +fi + +fn_fetch_core_dl(){ +github_file_url_dir="functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then + if [ ! -d "${filedir}" ]; then + mkdir -p "${filedir}" + fi + echo -e " fetching ${filename}...\c" + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else + echo -e "\e[0;31mFAIL\e[0m\n" + echo "Curl is not installed!" + echo -e "" + exit 1 + fi + chmod +x "${filedir}/${filename}" +fi +source "${filedir}/${filename}" +} + + +# Core + +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +core_getopt.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +core_messages.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +core_dl.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +# Command + +command_console.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_debug.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_details.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_email_test.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_backup.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_monitor.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_start.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_stop.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_validate.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_install.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_fastdl.sh(){ +functionfile="${FUNCNAME}" +fn_runfunction +} + +command_ts3_server_pass.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fn_restart(){ +local modulename="Restarting" +info_config.sh +if [ -d "${scriptlogdir}" ]; then + fn_scriptlog "${servername}" +fi +command_stop.sh +command_start.sh +} + + +# Checks + +check.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_config.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_deps.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_ip.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_logs.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_root.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_steamcmd.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_system_dir.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_tmux.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# Compress + +compress_unreal2_maps.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +compress_ut99_maps.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# Dev + +command_dev_debug.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_dev_detect_deps.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# Fix + +fix.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_arma3.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_csgo.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_dst.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_ins.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_steamcmd.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_glibc.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_ro.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_kf.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_ut2k4.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# Info + +info_config.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +info_distro.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +info_glibc.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +info_ts3status.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# Email + +email.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +# Logs + +logs.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# Monitor + +monitor_gsquery.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +# Update + +update_check.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_update_functions.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +update_dl.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fn_update_functions.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# +## Installer functions +# + +fn_autoinstall(){ +autoinstall=1 +command_install.sh +} + +install_complete.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_config.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_gsquery.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_gslt.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_header.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_logs.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_retry.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_server_dir.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} +install_server_files.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_steamcmd.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_ts3.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_ts3db.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_ut2k4.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_dl_ut2k4.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_ut2k4_key.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_ut99.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +# Calls on-screen messages +core_messages.sh + +#Calls file downloader +core_dl.sh diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh new file mode 100644 index 000000000..e035f0c3c --- /dev/null +++ b/lgsm/functions/core_getopt.sh @@ -0,0 +1,441 @@ +#!/bin/bash +# LGSM core_getopt.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="070116" + +# Description: getopt arguments. + +fn_getopt_generic(){ +case "$getopt" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + fn_restart;; + u|update) + update_check.sh;; + fu|force-update|update-restart) + forceupdate=1; + update_check.sh;; + uf|update-functions) + command_update_functions.sh;; + v|validate) + command_validate.sh;; + m|monitor) + command_monitor.sh;; + et|email-test) + command_email_test.sh;; + d|details) + command_details.sh;; + b|backup) + command_backup.sh;; + c|console) + command_console.sh;; + d|debug) + command_debug.sh;; + dev|dev-debug) + command_dev_debug.sh;; + i|install) + command_install.sh;; + ai|auto-install) + fn_autoinstall;; + dd|depsdetect) + command_dev_detect_deps.sh;; + *) + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "http://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "\e[93mCommands\e[0m" + { + echo -e "\e[34mstart\t\e[0mStart the server." + echo -e "\e[34mstop\t\e[0mStop the server." + echo -e "\e[34mrestart\t\e[0mRestart the server." + echo -e "\e[34mupdate\t\e[0mChecks and applies updates from SteamCMD." + echo -e "\e[34mforce-update\t\e[0mBypasses the check and applies updates from SteamCMD." + echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." + echo -e "\e[34mvalidate\t\e[0mValidate server files with SteamCMD." + echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." + echo -e "\e[34memail-test\t\e[0mSends test monitor email." + echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server." + echo -e "\e[34mbackup\t\e[0mCreate archive of the server." + echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." + echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." + echo -e "\e[34minstall\t\e[0mInstall the server." + echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." + } | column -s $'\t' -t + esac +exit +} + +fn_getopt_teamspeak3(){ +case "$getopt" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + fn_restart;; + u|update) + update_check.sh;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + et|email-test) + command_email_test.sh;; + d|details) + command_details.sh;; + b|backup) + command_backup.sh;; + pw|change-password) + command_ts3_server_pass.sh;; + dev|dev-debug) + command_dev_debug.sh;; + i|install) + command_install.sh;; + ai|auto-install) + fn_autoinstall;; + dd|depsdetect) + command_dev_detect_deps.sh;; + *) + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "http://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "\e[93mCommands\e[0m" + { + echo -e "\e[34mstart\t\e[0mStart the server." + echo -e "\e[34mstop\t\e[0mStop the server." + echo -e "\e[34mrestart\t\e[0mRestart the server." + echo -e "\e[34mupdate\t\e[0mChecks and applies updates from teamspeak.com." + echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." + echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." + echo -e "\e[34memail-test\t\e[0mSends test monitor email." + echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server." + echo -e "\e[34mchange-password\t\e[0mChanges TS3 serveradmin password." + echo -e "\e[34mbackup\t\e[0mCreate archive of the server." + echo -e "\e[34minstall\t\e[0mInstall the server." + echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." + } | column -s $'\t' -t + esac +exit +} + +fn_getopt_mumble(){ +case "$getopt" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + fn_restart;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + et|email-test) + command_email_test.sh;; + b|backup) + command_backup.sh;; + dev|dev-debug) + command_dev_debug.sh;; + console) + command_console.sh;; + d|debug) + command_debug.sh;; + dd|depsdetect) + command_dev_detect_deps.sh;; + *) + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "http://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "\e[93mCommands\e[0m" + { + echo -e "\e[34mstart\t\e[0mStart the server." + echo -e "\e[34mstop\t\e[0mStop the server." + echo -e "\e[34mrestart\t\e[0mRestart the server." + echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." + echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." + echo -e "\e[34memail-test\t\e[0mSends test monitor email." + echo -e "\e[34mbackup\t\e[0mCreate archive of the server." + echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." + echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." + } | column -s $'\t' -t + esac +exit +} + +fn_getopt_gmodserver(){ +case "$getopt" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + fn_restart;; + u|update) + update_check.sh;; + fu|force-update|update-restart) + forceupdate=1; + update_check.sh;; + uf|update-functions) + command_update_functions.sh;; + v|validate) + command_validate.sh;; + m|monitor) + command_monitor.sh;; + et|email-test) + command_email_test.sh;; + d|details) + command_details.sh;; + b|backup) + command_backup.sh;; + c|console) + command_console.sh;; + d|debug) + command_debug.sh;; + dev|dev-debug) + command_dev_debug.sh;; + i|install) + command_install.sh;; + ai|auto-install) + fn_autoinstall;; + dd|depsdetect) + command_dev_detect_deps.sh;; + fd|fastdl) + command_fastdl.sh;; + *) + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "http://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "\e[93mCommands\e[0m" + { + echo -e "\e[34mstart\t\e[0mStart the server." + echo -e "\e[34mstop\t\e[0mStop the server." + echo -e "\e[34mrestart\t\e[0mRestart the server." + echo -e "\e[34mupdate\t\e[0mChecks and applies updates from SteamCMD." + echo -e "\e[34mforce-update\t\e[0mBypasses the check and applies updates from SteamCMD." + echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." + echo -e "\e[34mvalidate\t\e[0mValidate server files with SteamCMD." + echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." + echo -e "\e[34memail-test\t\e[0mSends test monitor email." + echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server." + echo -e "\e[34mbackup\t\e[0mCreate archive of the server." + echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." + echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." + echo -e "\e[34minstall\t\e[0mInstall the server." + echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." + echo -e "\e[34mfastdl\t\e[0mGenerates or update a FastDL folder for your server." + } | column -s $'\t' -t + esac +exit +} + +fn_getopt_unreal(){ +case "$getopt" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + fn_restart;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + et|email-test) + command_email_test.sh;; + d|details) + command_details.sh;; + b|backup) + command_backup.sh;; + c|console) + command_console.sh;; + d|debug) + command_debug.sh;; + dev|dev-debug) + command_dev_debug.sh;; + i|install) + command_install.sh;; + ai|auto-install) + fn_autoinstall;; + mc|map-compressor) + compress_ut99_maps.sh;; + dd|depsdetect) + command_dev_detect_deps.sh;; + *) + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "http://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "\e[93mCommands\e[0m" + { + echo -e "\e[34mstart\t\e[0mStart the server." + echo -e "\e[34mstop\t\e[0mStop the server." + echo -e "\e[34mrestart\t\e[0mRestart the server." + echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." + echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." + echo -e "\e[34memail-test\t\e[0mSends test monitor email." + echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server." + echo -e "\e[34mbackup\t\e[0mCreate archive of the server." + echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." + echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." + echo -e "\e[34minstall\t\e[0mInstall the server." + echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." + echo -e "\e[34mmap-compressor\t\e[0mCompresses all ${gamename} server maps." + } | column -s $'\t' -t + esac +exit +} + + +fn_getopt_unreal2(){ +case "$getopt" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + fn_restart;; + u|update) + update_check.sh;; + fu|force-update|update-restart) + forceupdate=1; + update_check.sh;; + uf|update-functions) + command_update_functions.sh;; + v|validate) + command_validate.sh;; + m|monitor) + command_monitor.sh;; + et|email-test) + command_email_test.sh;; + d|details) + command_details.sh;; + b|backup) + command_backup.sh;; + c|console) + command_console.sh;; + d|debug) + command_debug.sh;; + dev|dev-debug) + command_dev_debug.sh;; + i|install) + command_install.sh;; + ai|auto-install) + fn_autoinstall;; + dd|depsdetect) + command_dev_detect_deps.sh;; + mc|map-compressor) + compress_unreal2_maps.sh;; + *) + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "http://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "\e[93mCommands\e[0m" + { + echo -e "\e[34mstart\t\e[0mStart the server." + echo -e "\e[34mstop\t\e[0mStop the server." + echo -e "\e[34mrestart\t\e[0mRestart the server." + echo -e "\e[34mupdate\t\e[0mChecks and applies updates from SteamCMD." + echo -e "\e[34mforce-update\t\e[0mBypasses the check and applies updates from SteamCMD." + echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." + echo -e "\e[34mvalidate\t\e[0mValidate server files with SteamCMD." + echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." + echo -e "\e[34memail-test\t\e[0mSends test monitor email." + echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server." + echo -e "\e[34mbackup\t\e[0mCreate archive of the server." + echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." + echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." + echo -e "\e[34minstall\t\e[0mInstall the server." + echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." + echo -e "\e[34mmap-compressor\t\e[0mCompresses all ${gamename} server maps." + } | column -s $'\t' -t + esac +exit +} + + +fn_getopt_ut2k4(){ +case "$getopt" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + fn_restart;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + et|email-test) + command_email_test.sh;; + d|details) + command_details.sh;; + b|backup) + command_backup.sh;; + c|console) + command_console.sh;; + d|debug) + command_debug.sh;; + dev|dev-debug) + command_dev_debug.sh;; + i|install) + command_install.sh;; + ai|auto-install) + fn_autoinstall;; + sck|server-cd-key) + install_ut2k4_key.sh;; + mc|map-compressor) + compress_unreal2_maps.sh;; + dd|depsdetect) + command_dev_detect_deps.sh;; + *) + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "http://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "\e[93mCommands\e[0m" + { + echo -e "\e[34mstart\t\e[0mStart the server." + echo -e "\e[34mstop\t\e[0mStop the server." + echo -e "\e[34mrestart\t\e[0mRestart the server." + echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." + echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." + echo -e "\e[34memail-test\t\e[0mSends test monitor email." + echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server." + echo -e "\e[34mbackup\t\e[0mCreate archive of the server." + echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." + echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." + echo -e "\e[34minstall\t\e[0mInstall the server." + echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." + echo -e "\e[34mserver-cd-key\t\e[0mAdd your server cd key" + echo -e "\e[34mmap-compressor\t\e[0mCompresses all ${gamename} server maps." + } | column -s $'\t' -t + esac +exit +} + +if [ "${gamename}" == "Mumble" ]; then + fn_getopt_mumble +elif [ "${gamename}" == "Teamspeak 3" ]; then + fn_getopt_teamspeak3 +elif [ "${gamename}" == "Garry's Mod" ]; then + fn_getopt_gmodserver +elif [ "${engine}" == "unreal2" ]; then + if [ "${gamename}" == "Unreal Tournament 2004" ]; then + fn_getopt_ut2k4 + else + fn_getopt_unreal2 + fi +elif [ "${engine}" == "unreal" ]; then + fn_getopt_unreal +else + fn_getopt_generic +fi diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh new file mode 100644 index 000000000..54b245193 --- /dev/null +++ b/lgsm/functions/core_messages.sh @@ -0,0 +1,204 @@ +#!/bin/bash +# LGSM fn_messages function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="380216" + +# Description: Defines on-screen messages such as [ OK ] and how script logs look. + +# nl: new line: message is following by a new line +# eol: end of line: message is placed at the end of the current line + +# Date, servicename & module details displayed in log files. +# e.g Feb 28 14:56:58 ut99-server: Monitor: +fn_scriptlog(){ + if [ -n "${modulename}" ]; then + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${modulename}: ${1}" >> "${scriptlog}" + else + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${1}" >> "${scriptlog}" + fi +} + +# [ FAIL ] +fn_print_fail(){ + if [ -n "${modulename}" ]; then + echo -en "\r\033[K[\e[0;31m FAIL \e[0m] ${modulename} ${servicename}: $@" + else + echo -en "\r\033[K[\e[0;31m FAIL \e[0m] $@" + fi +} + +fn_print_fail_nl(){ + if [ -n "${modulename}" ]; then + echo -en "\r\033[K[\e[0;31m FAIL \e[0m] ${modulename} ${servicename}: $@" + else + echo -en "\r\033[K[\e[0;31m FAIL \e[0m] $@" + fi + sleep 1 + echo -en "\n" +} + +# [ OK ] +fn_print_ok(){ + if [ -n "${modulename}" ]; then + echo -en "\r\033[K[\e[0;32m OK \e[0m] ${modulename} ${servicename}: $@" + else + echo -en "\r\033[K[\e[0;32m OK \e[0m] $@" + fi +} + +fn_print_ok_nl(){ + if [ -n "${modulename}" ]; then + echo -en "\r\033[K[\e[0;32m OK \e[0m] ${modulename} ${servicename}: $@" + else + echo -en "\r\033[K[\e[0;32m OK \e[0m] $@" + fi + sleep 1 + echo -en "\n" +} + +# [ INFO ] +fn_print_info(){ + if [ -n "${modulename}" ]; then + echo -en "\r\033[K[\e[0;36m INFO \e[0m] ${modulename} ${servicename}: $@" + else + echo -en "\r\033[K[\e[0;36m INFO \e[0m] $@" + fi +} + +fn_print_info_nl(){ + if [ -n "${modulename}" ]; then + echo -en "\r\033[K[\e[0;36m INFO \e[0m] ${modulename} ${servicename}: $@" + else + echo -en "\r\033[K[\e[0;36m INFO \e[0m] $@" + fi + sleep 1 + echo -en "\n" +} + +# [ WARN ] +fn_print_warn(){ + if [ -n "${modulename}" ]; then + echo -en "\r\033[K[\e[1;33m WARN \e[0m] ${modulename} ${servicename}: $@" + else + echo -en "\r\033[K[\e[1;33m WARN \e[0m] $@" + fi +} + +fn_print_warn_nl(){ + if [ -n "${modulename}" ]; then + echo -en "\r\033[K[\e[1;33m WARN \e[0m] ${modulename} ${servicename}: $@" + else + echo -en "\r\033[K[\e[1;33m WARN \e[0m] $@" + fi + sleep 1 + echo -en "\n" +} + +# [ .... ] +fn_print_dots(){ + if [ -n "${modulename}" ]; then + echo -en "\r\033[K[ .... ] ${modulename} ${servicename}: $@" + else + echo -en "\r\033[K[ .... ] $@" + fi +} + +# Complete! +fn_print_complete(){ + echo -en "\e[0;32mComplete!\e[0m $@" +} + +fn_print_complete_nl(){ + echo -e "\e[0;32mComplete!\e[0m $@" +} + +# Warning! +fn_print_warning(){ + echo -en "\e[0;33mWarning!\e[0m $@" +} + +fn_print_warning_nl(){ + echo -e "\e[0;33mWarning!\e[0m $@" +} + +# Failure! +fn_print_failure(){ + echo -en "\e[0;31mFailure!\e[0m $@" +} + +fn_print_failure_nl(){ + echo -e "\e[0;31mFailure!\e[0m $@" +} + +# Error! +fn_print_error(){ + echo -en "\e[0;31mError!\e[0m $@" +} + +fn_print_error_nl(){ + echo -e "\e[0;31mError!\e[0m $@" +} + +# Infomation! +fn_print_infomation(){ + echo -en "\e[0;36mInfomation!\e[0m $@" +} + +fn_print_infomation_nl(){ + echo -e "\e[0;36mInfomation!\e[0m $@" +} + +# FAIL for end of line +fn_print_ok_eol(){ + echo -en "\e[0;32mOK\e[0m" +} + +fn_print_ok_eol_nl(){ + echo -e "\e[0;32mOK\e[0m" +} + +# FAIL for end of line +fn_print_fail_eol(){ + echo -en "\e[0;31mFAIL\e[0m" +} + +fn_print_fail_eol_nl(){ + echo -e "\e[0;31mFAIL\e[0m" +} + +# QUERYING for end of line +fn_print_querying_eol(){ + echo -en "\e[0;36mQUERYING\e[0m" +} + +fn_print_querying_eol_nl(){ + echo -e "\e[0;36mQUERYING\e[0m" +} + +# CHECKING for end of line +fn_print_checking_eol(){ + echo -en "\e[0;36mCHECKING\e[0m" +} + +fn_print_checking_eol_nl(){ + echo -e "\e[0;36mCHECKING\e[0m" +} + +# CANCELED for end of line +fn_print_canceled_eol(){ + echo -en "\e[0;33mCANCELED\e[0m" +} + +fn_print_canceled_eol_nl(){ + echo -e "\e[0;33mCANCELED\e[0m" +} + +# REMOVED for end of line +fn_print_removed_eol(){ + echo -en "\e[0;31mREMOVED\e[0m" +} + +fn_print_removed_eol_nl(){ + echo -e "\e[0;31mREMOVED\e[0m" +} \ No newline at end of file diff --git a/lgsm/functions/email.sh b/lgsm/functions/email.sh new file mode 100644 index 000000000..174ed3ff6 --- /dev/null +++ b/lgsm/functions/email.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# LGSM email.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="020216" + +# Description: Sends email notification if monitor picks up a failure. + +local modulename="Email" +fn_print_dots "Sending notification to ${email}" +info_distro.sh +info_config.sh +check_ip.sh +fn_parms +{ + echo -e "========================================\n${servicename} details\n========================================" + echo -e "Service name: ${servicename}" + echo -e "Server name: ${servername}" + echo -e "Game name: ${gamename}" + echo -e "Server IP: ${ip}:${port}" + echo -e "Failure reason: ${failurereason}" + echo -e "Action Taken: ${actiontaken}\n" + echo -e "" + echo -e "========================================\nDistro Details\n========================================" + echo -e "Date: $(date)" + echo -e "Distro: ${os}" + echo -e "Arch: ${arch}" + echo -e "Kernel: ${kernel}" + echo -e "Hostname: $HOSTNAME" + echo -e "tmux: ${tmuxv}" + echo -e "GLIBC: ${glibcv}" + echo -e "" + echo -e "========================================\nPerformance\n========================================" + echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" + echo -e "Avg Load: ${load}" + echo -e "" + echo -e "Mem: total used free" + echo -e "Physical: ${physmemtotal} ${physmemused} ${physmemfree}" + echo -e "Swap: ${swaptotal}${swapused} ${swapfree}" + echo -e "" + echo -e "========================================\nStorage\n========================================" + echo -e "\e[34mFilesystem:\t\e[0m${filesystem}" + echo -e "\e[34mTotal:\t\e[0m${totalspace}" + echo -e "\e[34mUsed:\t\e[0m${usedspace}" + echo -e "\e[34mAvailable:\t\e[0m${availspace}" + echo -e "\e[34mServerfiles:\t\e[0m${filesdirdu}" + if [ -d "${backupdir}" ]; then + echo -e "\e[34mBackups:\t\e[0m${backupdirdu}" + fi + echo -e "" + echo -e "========================================\nCommand-line Parameters\n========================================" + echo -e "${executable} ${parms}" + echo -e "" + echo -e "========================================\nLogs\n========================================" +}| sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee "${scriptlogdir}/${servicename}-email.log" > /dev/null 2>&1 +echo -e "\n\n Script log\n===================" >> "${emaillog}" +tail -25 "${scriptlog}" >> "${emaillog}" +if [ -n "${consolelog}" ]; then + echo -e "\n\n Console log\n====================" >> "${emaillog}" + tail -25 "${consolelog}" | awk '{ sub("\r$", ""); print }' >> "${emaillog}" +fi +if [ -n "${gamelogdir}" ]; then + echo -e "\n\n Server log\n====================" >> "${emaillog}" + tail "${gamelogdir}"/* | grep -v "==>" | sed '/^$/d' | tail -25 >> "${emaillog}" +fi +mail -s "${subject}" ${email} < "${emaillog}" +fn_print_ok_nl "Sending notification to ${email}" +fn_scriptlog "Sent notification to ${email}" \ No newline at end of file diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh new file mode 100644 index 000000000..e4723e649 --- /dev/null +++ b/lgsm/functions/fix.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# LGSM fix.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="010316" + +# Description: Overall function for managing fixes. +# Runs functions that will fix an issue. + +# Messages that are displayed for some fixes +fn_fix_msg_start(){ + fn_print_dots "Applying ${fixname} fix: ${gamename}" + sleep 1 + fn_print_info "Applying ${fixname} fix: ${gamename}" + fn_scriptlog "Applying ${fixname} fix: ${gamename}" + sleep 1 +} + +fn_fix_msg_end(){ + if [ $? -ne 0 ]; then + fn_print_fail_nl "Applying ${fixname} fix: ${gamename}" + fn_scriptlog "Failure! Applying ${fixname} fix: ${gamename}" + else + fn_print_ok_nl "Applying ${fixname} fix: ${gamename}" + fn_scriptlog "Complete! Applying ${fixname} fix: ${gamename}" + fi +} + + +# Fixes that are run on start +if [ "${function_selfname}" != "command_install.sh" ]; then + if [ -n "${appid}" ]; then + fix_steamcmd.sh + fi + + if [ "${gamename}" == "Counter Strike: Global Offensive" ]; then + fix_csgo.sh + elif [ "${gamename}" == "Don't Starve Together" ]; then + fix_dst.sh + elif [ "${gamename}" == "Insurgency" ]; then + fix_ins.sh + elif [ "${gamename}" == "ARMA 3" ]; then + fix_arma3.sh + fi +fi + +# Fixes that are run on install only. +if [ "${function_selfname}" == "command_install.sh" ]; then + fix_glibc.sh + if [ "${gamename}" == "Killing Floor" ]; then + echo "" + echo "Applying ${gamename} Server Fixes" + echo "=================================" + sleep 1 + fix_kf.sh + elif [ "${gamename}" == "Red Orchestra: Ostfront 41-45" ]; then + echo "" + echo "Applying ${gamename} Server Fixes" + echo "=================================" + sleep 1 + fix_ro.sh + elif [ "${gamename}" == "Unreal Tournament 2004" ]; then + echo "" + echo "Applying ${gamename} Server Fixes" + echo "=================================" + sleep 1 + fix_ut2k4.sh + elif [ "${gamename}" == "Unreal Tournament 99" ]; then + echo "" + echo "Applying ${gamename} Server Fixes" + echo "=================================" + sleep 1 + fix_ut99.sh + fi +fi diff --git a/lgsm/functions/fix_arma3.sh b/lgsm/functions/fix_arma3.sh new file mode 100644 index 000000000..ffc607ed6 --- /dev/null +++ b/lgsm/functions/fix_arma3.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# LGSM fix_arma3.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="301215" + +# Fixes: server not always creating steam_appid.txt file. +if [ ! -d "${rootdir}/.local/share/Arma\ 3" ]; then + fixname="20150 Segmentation fault (core dumped)" + fn_fix_msg_start + mkdir -p "${rootdir}/.local/share/Arma\ 3" + fn_fix_msg_end +fi \ No newline at end of file diff --git a/lgsm/functions/fix_csgo.sh b/lgsm/functions/fix_csgo.sh new file mode 100644 index 000000000..f968640ce --- /dev/null +++ b/lgsm/functions/fix_csgo.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# LGSM fix_csgo.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="010316" + +# Description: Resolves various issues with csgo. + +# Fixes: server not always creating steam_appid.txt file. +if [ ! -f "${filesdir}/steam_appid.txt" ]; then + fixname="730 steam_appid.txt" + fn_fix_msg_start + echo -n "730" >> "${filesdir}/steam_appid.txt" + fn_fix_msg_end +fi + +# Fixes: Error parsing BotProfile.db - unknown attribute 'Rank'". +if ! grep -q "//Rank" "${systemdir}/botprofile.db" > /dev/null 2>&1; then + fixname="botprofile.db" + fn_fix_msg_start + sed -i 's/\tRank/\t\/\/Rank/g' "${systemdir}/botprofile.db" > /dev/null 2>&1 + fn_fix_msg_end +fi + +# Fixes: Unknown command "cl_bobamt_vert". +if ! grep -q "//exec default" "${servercfgdir}/valve.rc" > /dev/null 2>&1 || ! grep -q "//exec joystick" "${servercfgdir}/valve.rc" > /dev/null 2>&1; then + fixname="valve.rc" + fn_fix_msg_start + sed -i 's/exec default.cfg/\/\/exec default.cfg/g' "${servercfgdir}/valve.rc" > /dev/null 2>&1 + sed -i 's/exec joystick.cfg/\/\/exec joystick.cfg/g' "${servercfgdir}/valve.rc" > /dev/null 2>&1 + fn_fix_msg_end +fi + +# Fixes: workshop map issue. +# http://forums.steampowered.com/forums/showthread.php?t=3170366. +if [ -f "${systemdir}/subscribed_collection_ids.txt" ]||[ -f "${systemdir}/subscribed_file_ids.txt" ]||[ -f "${systemdir}/ugc_collection_cache.txt" ]; then + fixname="workshop map" + fn_fix_msg_start + rm -f "${systemdir}/subscribed_collection_ids.txt" + rm -f "${systemdir}/subscribed_file_ids.txt" + rm -f "${systemdir}/ugc_collection_cache.txt" + fn_fix_msg_end +fi \ No newline at end of file diff --git a/lgsm/functions/fix_dst.sh b/lgsm/functions/fix_dst.sh new file mode 100644 index 000000000..5dadf4b78 --- /dev/null +++ b/lgsm/functions/fix_dst.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# LGSM fix_dst.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="010316" + +# Description: Resolves various issues with Dont Starve together. + +# Fixes: ./dontstarve_dedicated_server_nullrenderer: ./lib32/libcurl-gnutls.so.4: no version information available (required by ./dontstarve_dedicated_server_nullrenderer) +# Issue only occures on CentOS as libcurl-gnutls.so.4 is called libcurl.so.4 on CentOS. +if [ -f "/etc/redhat-release" ] && [ ! -f "${filesdir}/bin/lib32/libcurl-gnutls.so.4" ]; then + fixname="libcurl-gnutls.so.4 missing" + fn_fix_msg_start + ln -s "/usr/lib/libcurl.so.4" "${filesdir}/bin/lib32/libcurl-gnutls.so.4" + fn_fix_msg_end +fi \ No newline at end of file diff --git a/functions/fix_ins.sh b/lgsm/functions/fix_ins.sh similarity index 100% rename from functions/fix_ins.sh rename to lgsm/functions/fix_ins.sh diff --git a/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh similarity index 100% rename from functions/fix_kf.sh rename to lgsm/functions/fix_kf.sh diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh new file mode 100644 index 000000000..9364d3e01 --- /dev/null +++ b/lgsm/functions/fix_ro.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# LGSM fix_ro.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="010316" + +# Description: Resolves various issues with red orchestra. + +echo "Applying WebAdmin ROOst.css fix." +echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" +sed -i 's/none}/none;/g' "${filesdir}/Web/ServerAdmin/ROOst.css" +sed -i 's/underline}/underline;/g' "${filesdir}/Web/ServerAdmin/ROOst.css" +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" +sleep 1 +echo "applying server name fix." +sleep 1 +echo "forcing server restart..." +sleep 1 +command_start.sh +sleep 5 +command_stop.sh +command_start.sh +sleep 5 +command_stop.sh \ No newline at end of file diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh new file mode 100644 index 000000000..86feb9e2c --- /dev/null +++ b/lgsm/functions/fix_steamcmd.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# LGSM fix_steamcmd.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="010316" + +# Description: fixes various issues related to steamCMD. + +# Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so. +if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then + fixname="steamclient.so general" + fn_fix_msg_start + mkdir -pv "${HOME}/.steam/sdk32" >> "${scriptlog}" + cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${scriptlog}" + fn_fix_msg_end +fi + +if [ "${gamename}" == "Serious Sam 3: BFE" ]; then + # Fixes: .steam/bin32/libsteam.so: cannot open shared object file: No such file or directory + if [ ! -f "${HOME}/.steam/bin32/libsteam.so" ]; then + fixname="libsteam.so" + fn_fix_msg_start + mkdir -pv "${HOME}/.steam/bin32" >> "${scriptlog}" + cp -v "${filesdir}/Bin/libsteam.so" "${HOME}/.steam/bin32/libsteam.so" >> "${scriptlog}" + fn_fix_msg_end + fi +elif [ "${gamename}" == "Hurtworld" ]; then + # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. + if [ ! -f "${filesdir}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then + fixname="steamclient.so x86" + fn_fix_msg_start + cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${filesdir}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${scriptlog}" + fn_fix_msg_end + fi + if [ ! -f "${filesdir}/Hurtworld_Data/Plugins/x86_64/steamclient.so" ]; then + fixname="steamclient.so x86_64" + fn_fix_msg_start + cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${filesdir}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${scriptlog}" + fn_fix_msg_end + fi +fi diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh new file mode 100644 index 000000000..363aa5d56 --- /dev/null +++ b/lgsm/functions/fix_ut2k4.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# LGSM fix_ut2k4.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="010316" + +# Description: Resolves various issues with unreal tournament 2004. + +echo "applying WebAdmin ut2003.css fix." +echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" +sed -i 's/none}/none;/g' "${filesdir}/Web/ServerAdmin/ut2003.css" +sed -i 's/underline}/underline;/g' "${filesdir}/Web/ServerAdmin/ut2003.css" +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" +sleep 1 +echo "applying server name fix." +sleep 1 +echo "forcing server restart..." +sleep 1 +command_start.sh +sleep 5 +command_stop.sh +command_start.sh +sleep 5 +command_stop.sh \ No newline at end of file diff --git a/lgsm/functions/fix_ut99.sh b/lgsm/functions/fix_ut99.sh new file mode 100644 index 000000000..f7792fb44 --- /dev/null +++ b/lgsm/functions/fix_ut99.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# LGSM fix_ut99.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" +echo "${servercfgfullpath}" +echo "enabling UdpServerUplink." +{ +echo "[IpServer.UdpServerUplink]" +echo "DoUplink=True" +echo "UpdateMinutes=1" +echo "MasterServerAddress=unreal.epicgames.com" +echo "MasterServerPort=27900" +echo "Region=0" +}| tee -a "${servercfgfullpath}" > /dev/null 2>&1 +sleep 1 +echo "removing dead gamespy.com master server." +sed -i '/master0.gamespy.com/d' "${servercfgfullpath}" +sleep 1 +echo "removing dead mplayer.com master server." +sed -i '/master.mplayer.com/d' "${servercfgfullpath}" +sleep 1 +echo "inserting qtracker.com master server." +sed -i '65i\ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.qtracker.com MasterServerPort=27900' "${servercfgfullpath}" +echo "" \ No newline at end of file diff --git a/functions/fn_functions b/lgsm/functions/fn_functions similarity index 100% rename from functions/fn_functions rename to lgsm/functions/fn_functions diff --git a/functions/fn_getopt b/lgsm/functions/fn_getopt similarity index 100% rename from functions/fn_getopt rename to lgsm/functions/fn_getopt diff --git a/lgsm/functions/fn_update_functions b/lgsm/functions/fn_update_functions new file mode 100644 index 000000000..5fbb28975 --- /dev/null +++ b/lgsm/functions/fn_update_functions @@ -0,0 +1,22 @@ +#!/bin/bash +# LGSM fn_update_functions.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="230116" + +# Description: LEGACY FUNCTION Deletes the functions dir to allow re-downloading of functions from GitHub. + +fn_print_dots "Updating functions" +fn_scriptlog "Updating functions" +sleep 1 +echo -ne "\n" +rm -rfv "${rootdir}/functions/"* +exitcode=$? +if [ "${exitcode}" == "0" ]; then + fn_print_ok "Updating functions" + fn_scriptlog "Success! Updating functions" +else + fn_print_fail "Updating functions" + fn_scriptlog "Failure! Updating functions" +fi +echo -ne "\n" \ No newline at end of file diff --git a/lgsm/functions/gsquery.py b/lgsm/functions/gsquery.py new file mode 100644 index 000000000..b132038e3 --- /dev/null +++ b/lgsm/functions/gsquery.py @@ -0,0 +1,125 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- +# Game Server Query +# Author: Anonymous & Daniel Gibbs +# # Website: http://gameservermanagers.com +# Version: 190216 + +import optparse +import socket +import sys + +class GameServer: + def __init__( self, options, arguments ): + self.option = options + self.argument = arguments + # + self.server_response_timeout = 5 + self.default_buffer_length = 1024 + # + if self.option.engine == 'source': + self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0' + elif self.option.engine == 'goldsource': + self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0' + elif self.option.engine == 'spark': + self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0' + elif self.option.engine == 'realvirtuality': + self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0' + elif self.option.engine == 'unity3d': + self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0' + elif self.option.engine == 'idtech3': + self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0' + elif self.option.engine == 'unreal': + self.query_prompt_string = '\x5C\x69\x6E\x66\x6F\x5C' + elif self.option.engine == 'unreal2': + self.query_prompt_string = '\x79\x00\x00\x00\x00' + elif self.option.engine == 'avalanche': + self.query_prompt_string = '\xFE\xFD\x09\x10\x20\x30\x40' + self.connected = False + self.response = None + self.sanity_checks() + + def fatal_error( self, error_message, error_code=1 ): + sys.stderr.write( 'ERROR: ' + str(error_message) + '\n' ) + sys.exit( error_code ) + + def exit_success( self, success_message='' ): + sys.stdout.write( 'OK: ' + str(success_message) + '\n' ) + sys.exit( 0 ) + + def responding( self ): + # Connect. + connection = socket.socket( socket.AF_INET, socket.SOCK_DGRAM ) + connection.settimeout( self.server_response_timeout ) + try: + self.connected = connection.connect( ( self.option.address, int(self.option.port) ) ) + except socket.timeout: + self.fatal_error( 'Request timed out', 1 ) + except: + self.fatal_error( 'Unable to connect', 1 ) + # Send. + connection.send( self.query_prompt_string ) + # Receive. + try: + self.response = connection.recv( self.default_buffer_length ) + except socket.error: + self.fatal_error( 'Unable to receive', 2 ) + connection.close() + # Response. + if self.response == None: + self.fatal_error( 'No response', 3 ) + if len( self.response ) < 10 : + sys.exit( 'Short response.', 3 ) + else: + self.exit_success( str( self.response ) ) + + def sanity_checks( self ): + if not self.option.address: + self.fatal_error( 'No IPv4 address supplied.', 4 ) + if not self.option.port: + self.fatal_error( 'No port supplied.', 4 ) + +if __name__ == '__main__': + parser = optparse.OptionParser( + usage = 'usage: python %prog [options]', + version = '%prog 0.0.1' + ) + parser.add_option( + '-a', '--address', + action = 'store', + dest = 'address', + default = False, + help = 'The IPv4 address of the server.' + ) + parser.add_option( + '-p', '--port', + action = 'store', + dest = 'port', + default = False, + help = 'The IPv4 port of the server.' + ) + parser.add_option( + '-e', '--engine', + action = 'store', + dest = 'engine', + default = False, + help = 'Engine type: avalanche, goldsource, idtech3, realvirtuality, spark, source, unity3d, unreal, unreal2.' + ) + parser.add_option( + '-v', '--verbose', + action = 'store_true', + dest = 'verbose', + default = False, + help = 'Display verbose output.' + ) + parser.add_option( + '-d', '--debug', + action = 'store_true', + dest = 'debug', + default = False, + help = 'Display debugging output.' + ) + options, arguments = parser.parse_args() + # + server = GameServer( options, arguments ) + server.responding() diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh new file mode 100644 index 000000000..d9d5d4dfb --- /dev/null +++ b/lgsm/functions/info_config.sh @@ -0,0 +1,868 @@ +#!/bin/bash +# LGSM info_config.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="010316" + +# Description: Gets specific details from config files. + +## Examples of filtering to get info from config files +# sed 's/foo//g' - remove foo +# tr -cd '[:digit:]' leave only digits +# tr -d '=\"; ' remove selected charectors =\"; +# grep -v "foo" filter out lines that contain foo + +## Just Cause 2 +if [ "${engine}" == "avalanche" ]; then + + # server name + if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "Name" "${servercfgfullpath}" | sed 's/Name//g' | tr -d '=", \n') + if [ ! -n "${servername}" ]; then + servername="NOT SET" + fi + else + servername="\e[0;31mUNAVAILABLE\e[0m" + fi + + # ip + if [ -f "${servercfgfullpath}" ]; then + # check if the ip exists in the config file. Failing this will fall back to the default. + configipcheck=$(grep "BindIP" "${servercfgfullpath}" | sed 's/BindIP//g' | tr -d '=", \n') + fi + if [ -n "${configipcheck}" ]; then + ip=$(grep "BindIP" "${servercfgfullpath}" | sed 's/BindIP//g' | tr -d '=", \n') + fi + + # server password + if [ -f "${servercfgfullpath}" ]; then + serverpassword=$(grep "Password" "${servercfgfullpath}" | sed 's/Password//g' | tr -d '=", \n') + if [ ! -n "${serverpassword}" ]; then + serverpassword="NOT SET" + fi + else + serverpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # slots + if [ -f "${servercfgfullpath}" ]; then + slots=$(grep "MaxPlayers" "${servercfgfullpath}" | tr -cd '[:digit:]') + if [ ! -n "${slots}" ]; then + slots="NOT SET" + fi + else + slots="\e[0;31mUNAVAILABLE\e[0m" + fi + + # port + if [ -f "${servercfgfullpath}" ]; then + port=$(grep "BindPort" "${servercfgfullpath}" | tr -cd '[:digit:]') + fi + if [ ! -n "${port}" ]; then + port="0" + fi + +## Dont Starve Together +elif [ "${engine}" == "dontstarve" ]; then + + # server name + if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "default_server_name = " "${servercfgfullpath}" | sed 's/default_server_name = //g') + if [ ! -n "${servername}" ]; then + servername="NOT SET" + fi + else + servername="\e[0;31mUNAVAILABLE\e[0m" + fi + + # server password + if [ -f "${servercfgfullpath}" ]; then + serverpassword=$(grep "server_password = " "${servercfgfullpath}" | grep -v "#" | sed 's/server_password = //g') + if [ ! -n "${serverpassword}" ]; then + serverpassword="NOT SET" + fi + else + serverpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # slots + if [ -f "${servercfgfullpath}" ]; then + slots=$(grep "max_players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + if [ ! -n "${slots}" ]; then + slots="NOT SET" + fi + else + slots="\e[0;31mUNAVAILABLE\e[0m" + fi + + # game mode + if [ -f "${servercfgfullpath}" ]; then + gamemode=$(grep "game_mode = " "${servercfgfullpath}" | grep -v "#" | sed 's/game_mode = //g') + if [ ! -n "${gamemode}" ]; then + gamemode="NOT SET" + fi + else + gamemode="\e[0;31mUNAVAILABLE\e[0m" + fi + + # tickrate + if [ -f "${servercfgfullpath}" ]; then + tickrate=$(grep "tick_rate" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + if [ ! -n "${tickrate}" ]; then + tickrate="NOT SET" + fi + else + tickrate="\e[0;31mUNAVAILABLE\e[0m" + fi + + # port + if [ -f "${servercfgfullpath}" ]; then + port=$(grep "server_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + fi + if [ ! -n "${port}" ]; then + port="0" + fi + +## Project Zomboid +elif [ "${engine}" == "projectzomboid" ]; then + + # server name + if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "PublicName=" "${servercfgfullpath}" | sed 's/PublicName=//g' | tr -d '=", \n') + if [ ! -n "${servername}" ]; then + servername="NOT SET" + fi + else + servername="\e[0;31mUNAVAILABLE\e[0m" + fi + + # slots + if [ -f "${servercfgfullpath}" ]; then + slots=$(grep "MaxPlayers=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + if [ ! -n "${slots}" ]; then + slots="NOT SET" + fi + else + slots="\e[0;31mUNAVAILABLE\e[0m" + fi + + # port + if [ -f "${servercfgfullpath}" ]; then + port=$(grep "DefaultPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') + fi + if [ ! -n "${port}" ]; then + port="0" + fi + + +# Quake Live +elif [ "${engine}" == "idtech3" ]; then + + # server name + if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "set sv_hostname " "${servercfgfullpath}" | sed 's/set sv_hostname //g' | tr -d '=\"; ') + if [ ! -n "${servername}" ]; then + servername="NOT SET" + fi + else + servername="\e[0;31mUNAVAILABLE\e[0m" + fi + + # server password + if [ -f "${servercfgfullpath}" ]; then + + serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/set g_password//g' | tr -d '=\"; '| cut -f1 -d "/") + if [ ! -n "${serverpassword}" ]; then + serverpassword="NOT SET" + fi + else + serverpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # rcon password + rconpassword="${rconpassword}" + if [ -f "${servercfgfullpath}" ]; then + if [ ! -n "${rconpassword}" ]; then + rconpassword="NOT SET" + fi + else + rconpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # slots + if [ -f "${servercfgfullpath}" ]; then + slots=$(grep "set sv_maxClients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + if [ ! -n "${slots}" ]; then + slots="NOT SET" + fi + else + slots="\e[0;31mUNAVAILABLE\e[0m" + fi + + # port + port="${gameport}" + if [ ! -n "${port}" ]; then + port="0" + fi + + # rcon port + if [ ! -n "${rconport}" ]; then + rconport="0" + fi + + # Stats port + if [ ! -n "${statsport}" ]; then + statsport="0" + fi + +# ARMA 3 +elif [ "${engine}" == "realvirtuality" ]; then + + # server name + if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "hostname" "${servercfgfullpath}" | grep -v "//" | sed -e 's/\//g' | tr -d '=\"; ') + if [ ! -n "${servername}" ]; then + servername="NOT SET" + fi + else + servername="\e[0;31mUNAVAILABLE\e[0m" + fi + + # admin password + if [ -f "${servercfgfullpath}" ]; then + adminpassword=$(grep "passwordAdmin" "${servercfgfullpath}" | grep -v "//" | sed -e 's/\passwordAdmin//g' | tr -d '=\"; ') + if [ ! -n "${adminpassword}" ]; then + adminpassword="NOT SET" + fi + else + adminpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # server password + if [ -f "${servercfgfullpath}" ]; then + serverpassword=$(grep "password =" "${servercfgfullpath}" | grep -v "//" | sed -e 's/\password//g' | tr -d '=\"; ') + if [ ! -n "${serverpassword}" ]; then + serverpassword="NOT SET" + fi + else + serverpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # slots + if [ -f "${servercfgfullpath}" ]; then + slots=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + if [ ! -n "${slots}" ]; then + slots="NOT SET" + fi + else + slots="\e[0;31mUNAVAILABLE\e[0m" + fi + + # port + if [ "${port}" != "" ]; then + port=${port} + fi + if [ ! -n "${port}" ]; then + port="0" + fi + + # query port + if [ "${port}" != "" ]; then + queryport=$((port + 1)) + fi + if [ ! -n "${queryport}" ]; then + queryport="0" + fi + + # master port + if [ "${port}" != "" ]; then + masterport=$((port + 2)) + fi + if [ ! -n "${masterport}" ]; then + masterport="0" + fi + +# Serious Sam +elif [ "${engine}" == "seriousengine35" ]; then + + # server name + if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "prj_strMultiplayerSessionName" "${servercfgfullpath}" | sed 's/prj_strMultiplayerSessionName = //g' | tr -d '=\"; ') + if [ ! -n "${servername}" ]; then + servername="NOT SET" + fi + else + servername="\e[0;31mUNAVAILABLE\e[0m" + fi + + # rcon password + if [ -f "${servercfgfullpath}" ]; then + rconpassword=$(grep "rcts_strAdminPassword" "${servercfgfullpath}" | sed 's/rcts_strAdminPassword = //g' | tr -d '=\"; ') + if [ ! -n "${rconpassword}" ]; then + rconpassword="NOT SET" + fi + else + rconpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # slots + if [ -f "${servercfgfullpath}" ]; then + slots=$(grep "gam_ctMaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + if [ ! -n "${slots}" ]; then + slots="NOT SET" + fi + else + slots="\e[0;31mUNAVAILABLE\e[0m" + fi + + # game mode + if [ -f "${servercfgfullpath}" ]; then + gamemode=$(grep "gam_idGameMode" "${servercfgfullpath}" | grep -v "#" | sed 's/gam_idGameMode//g' | tr -d '=\"; ') + if [ ! -n "${gamemode}" ]; then + gamemode="NOT SET" + fi + else + gamemode="\e[0;31mUNAVAILABLE\e[0m" + fi + + # port + if [ -f "${servercfgfullpath}" ]; then + port=$(grep "prj_uwPort" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]') + fi + if [ ! -n "${port}" ]; then + port="0" + fi + + # query port + if [ -f "${servercfgfullpath}" ]; then + queryport=$((port + 1)) + fi + if [ ! -n "${queryport}" ]; then + queryport="0" + fi + +# Source Engine Games +elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then + + # server name + if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "hostname" "${servercfgfullpath}" | sed 's/hostname //g' | sed 's/"//g') + if [ ! -n "${servername}" ]; then + servername="NOT SET" + fi + else + servername="\e[0;31mUNAVAILABLE\e[0m" + fi + + # server password + if [ -f "${servercfgfullpath}" ]; then + serverpassword=$(grep "sv_password" "${servercfgfullpath}" | sed 's/sv_password //g' | sed 's/"//g') + if [ ! -n "${serverpassword}" ]; then + serverpassword="NOT SET" + fi + else + serverpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # rcon password + if [ -f "${servercfgfullpath}" ]; then + rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed 's/rcon_password //g' | sed 's/"//g') + if [ ! -n "${rconpassword}" ]; then + rconpassword="NOT SET" + fi + else + rconpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + +# Spark (NS2: Combat) +elif [ "${engine}" == "spark" ]; then + + # query port + if [ -f "${servercfgfullpath}" ]; then + queryport=$((port + 1)) + fi + if [ ! -n "${queryport}" ]; then + queryport="0" + fi + +# Teamspeak 3 +elif [ "${gamename}" == "Teamspeak 3" ]; then + + # ip + if [ -f "${servercfgfullpath}" ]; then + # check if the ip exists in the config file. Failing this will fall back to the default. + configipcheck=$(grep "voice_ip=" "${servercfgfullpath}" | sed 's/\voice_ip=//g') + fi + if [ -n "${configipcheck}" ]; then + ip=$(grep "voice_ip=" "${servercfgfullpath}" | sed 's/\voice_ip=//g') + fi + + # dbplugin + if [ -f "${servercfgfullpath}" ]; then + dbplugin=$(grep "dbplugin=" "${servercfgfullpath}" | sed 's/\dbplugin=//g') + if [ ! -n "${dbplugin}" ]; then + dbplugin="NOT SET" + fi + else + dbplugin="\e[0;31mUNAVAILABLE\e[0m" + fi + + # port + if [ -f "${servercfgfullpath}" ]; then + port=$(grep "default_voice_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') + fi + if [ ! -n "${port}" ]; then + port="9987" + fi + + # query port + if [ -f "${servercfgfullpath}" ]; then + queryport=$(grep "query_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') + fi + if [ ! -n "${queryport}" ]; then + queryport="10011" + fi + + # file port + if [ -f "${servercfgfullpath}" ]; then + fileport=$(grep "filetransfer_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') + fi + if [ ! -n "${fileport}" ]; then + fileport="30033" + fi + +# Teeworlds +elif [ "${engine}" == "teeworlds" ]; then + + # server name + if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "sv_name" "${servercfgfullpath}" | sed 's/sv_name //g' | sed 's/"//g') + if [ ! -n "${servername}" ]; then + servername="unnamed server" + fi + else + servername="unnamed server" + fi + + # server password + if [ -f "${servercfgfullpath}" ]; then + serverpassword=$(grep "password " "${servercfgfullpath}" | awk '!/sv_rcon_password/'| sed 's/password //g' | tr -d '=\"; ') + if [ ! -n "${serverpassword}" ]; then + serverpassword="NOT SET" + fi + else + serverpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # rcon password + if [ -f "${servercfgfullpath}" ]; then + rconpassword=$(grep "sv_rcon_password" "${servercfgfullpath}" | sed 's/sv_rcon_password //g' | tr -d '=\"; ') + if [ ! -n "${rconpassword}" ]; then + rconpassword="NOT SET" + fi + else + rconpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # port + if [ -f "${servercfgfullpath}" ]; then + port=$(grep "sv_port" "${servercfgfullpath}" | tr -cd '[:digit:]') + fi + if [ ! -n "${port}" ]; then + port="8303" + fi + + # slots + if [ -f "${servercfgfullpath}" ]; then + slots=$(grep "sv_max_clients" "${servercfgfullpath}" | tr -cd '[:digit:]') + if [ ! -n "${slots}" ]; then + slots="12" + fi + else + slots="12" + fi + +# Terraria +elif [ "${engine}" == "terraria" ]; then + + # port + if [ -f "${servercfgfullpath}" ]; then + port=$(grep "port=" "${servercfgfullpath}" | tr -cd '[:digit:]') + fi + if [ ! -n "${port}" ]; then + port="0" + fi + +# 7 Day To Die (unity3d) +elif [ "${gamename}" == "7 Days To Die" ]; then + + # server name + if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "ServerName" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + if [ ! -n "${servername}" ]; then + servername="NOT SET" + fi + else + servername="\e[0;31mUNAVAILABLE\e[0m" + fi + + # server password + if [ -f "${servercfgfullpath}" ]; then + serverpassword=$(grep "ServerPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + if [ ! -n "${serverpassword}" ]; then + serverpassword="NOT SET" + fi + else + serverpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # webadmin enabled + if [ -f "${servercfgfullpath}" ]; then + webadminenabled=$(grep "ControlPanelEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + if [ ! -n "${webadminenabled}" ]; then + webadminenabled="NOT SET" + fi + else + webadminenabled="\e[0;31mUNAVAILABLE\e[0m" + fi + + # webadmin port + if [ -f "${servercfgfullpath}" ]; then + webadminport=$(grep "ControlPanelPort" "${servercfgfullpath}" | tr -cd '[:digit:]') + fi + if [ ! -n "${webadminport}" ]; then + webadminport="0" + fi + + # webadmin enabled + if [ -f "${servercfgfullpath}" ]; then + webadminenabled=$(grep "ControlPanelEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + if [ ! -n "${webadminenabled}" ]; then + webadminenabled="NOT SET" + fi + else + webadminenabled="\e[0;31mUNAVAILABLE\e[0m" + fi + + # webadmin password + if [ -f "${servercfgfullpath}" ]; then + webadminpass=$(grep "ControlPanelPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + if [ ! -n "${webadminpass}" ]; then + webadminpass="NOT SET" + fi + else + webadminpass="\e[0;31mUNAVAILABLE\e[0m" + fi + + # telnet enabled + if [ -f "${servercfgfullpath}" ]; then + telnetenabled=$(grep "TelnetEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + if [ ! -n "${telnetenabled}" ]; then + telnetenabled="NOT SET" + fi + else + telnetenabled="\e[0;31mUNAVAILABLE\e[0m" + fi + + # telnet port + if [ -f "${servercfgfullpath}" ]; then + telnetport=$(grep "TelnetPort" "${servercfgfullpath}" | tr -cd '[:digit:]') + fi + if [ ! -n "${telnetport}" ]; then + telnetport="0" + fi + + # telnet password + if [ -f "${servercfgfullpath}" ]; then + telnetpass=$(grep "TelnetPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + if [ ! -n "${telnetpass}" ]; then + telnetpass="NOT SET" + fi + else + telnetpass="\e[0;31mUNAVAILABLE\e[0m" + fi + + # slots + if [ -f "${servercfgfullpath}" ]; then + slots=$(grep "ServerMaxPlayerCount" "${servercfgfullpath}" | tr -cd '[:digit:]') + if [ ! -n "${slots}" ]; then + slots="NOT SET" + fi + else + slots="\e[0;31mUNAVAILABLE\e[0m" + fi + + # game mode + if [ -f "${servercfgfullpath}" ]; then + gamemode=$(grep "GameMode" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + if [ ! -n "${gamemode}" ]; then + gamemode="NOT SET" + fi + else + gamemode="\e[0;31mUNAVAILABLE\e[0m" + fi + + # game world + if [ -f "${servercfgfullpath}" ]; then + gameworld=$(grep "GameWorld" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + if [ ! -n "${gameworld}" ]; then + gameworld="NOT SET" + fi + else + gameworld="\e[0;31mUNAVAILABLE\e[0m" + fi + + # port + if [ -f "${servercfgfullpath}" ]; then + port=$(grep "sv_port" "${servercfgfullpath}" | tr -cd '[:digit:]') + fi + if [ ! -n "${port}" ]; then + port="0" + fi + + # query port + if [ -f "${servercfgfullpath}" ]; then + queryport=$((port + 1)) + fi + if [ ! -n "${queryport}" ]; then + queryport="0" + fi + +# Hurtworld (unity3d) +elif [ "${gamename}" == "Hurtworld" ]; then + + # server name + if [ -n "${servername}" ]; then + servername="${servername}" + else + servername="\e[0;31mUNAVAILABLE\e[0m" + fi + + # server password + # not available yet + + # slots + if [ -n "${maxplayers}" ]; then + slots="${maxplayers}" + else + slots="NOT SET" + fi + + # game world + if [ -n "${map}" ]; then + gameworld="${map}" + else + gameworld="NO MAP SET" + fi + + # port + if [ -n "${port}" ]; then + port="${port}" + else + port="0" + fi + + # query port + if [ -n "${queryport}" ]; then + queryport="${queryport}" + else + queryport="0" + fi + +# Unreal Tournament +elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then + + # server name + if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "ServerName=" "${servercfgfullpath}" | sed 's/ServerName=//g') + if [ ! -n "${servername}" ]; then + servername="NOT SET" + fi + else + servername="\e[0;31mUNAVAILABLE\e[0m" + fi + + # server password + if [ -f "${servercfgfullpath}" ]; then + serverpassword=$(grep "GamePassword=" "${servercfgfullpath}" | sed 's/GamePassword=//g') + if [ ! -n "${serverpassword}" ]; then + serverpassword="NOT SET" + fi + else + serverpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # admin password + if [ -f "${servercfgfullpath}" ]; then + adminpassword=$(grep "AdminPassword=" "${servercfgfullpath}" | sed 's/AdminPassword=//g') + if [ ! -n "${adminpassword}" ]; then + adminpassword="NOT SET" + fi + else + adminpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # port + if [ -f "${servercfgfullpath}" ]; then + port=$(grep "Port=" "${servercfgfullpath}" | grep -v "Master" | grep -v "LAN" | grep -v "Proxy" | grep -v "Listen" | tr -d '\r' | tr -cd '[:digit:]') + fi + if [ ! -n "${port}" ]; then + port="0" + fi + + # query port + if [ -f "${servercfgfullpath}" ]; then + queryport=$((port + 1)) + fi + if [ ! -n "${queryport}" ]; then + queryport="0" + fi + + # gamespy query port + if [ -f "${servercfgfullpath}" ]; then + gsqueryport=$(grep "OldQueryPortNumber=" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]') + fi + if [ ! -n "${gsqueryport}" ]; then + gsqueryport="0" + fi + + # query port + if [ -f "${servercfgfullpath}" ]; then + udplinkport=$((port + 2)) + fi + if [ ! -n "${udplinkport}" ]; then + udplinkport="0" + fi + + # webadmin enabled + if [ -f "${servercfgfullpath}" ]; then + webadminenabled=$(grep "bEnabled=" "${servercfgfullpath}" | sed 's/bEnabled=//g' | tr -d '\r') + if [ ! -n "${webadminenabled}" ]; then + webadminenabled="NOT SET" + fi + else + webadminenabled="\e[0;31mUNAVAILABLE\e[0m" + fi + + # webadmin port + if [ -f "${servercfgfullpath}" ]; then + webadminport=$(grep "ListenPort=" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]') + fi + if [ ! -n "${webadminport}" ]; then + webadminport="0" + fi + + if [ "${engine}" == "unreal" ]; then + + # webadmin user + if [ -f "${servercfgfullpath}" ]; then + webadminuser=$(grep "AdminUsername=" "${servercfgfullpath}" | sed 's/\AdminUsername=//g') + if [ ! -n "${webadminuser}" ]; then + webadminuser="NOT SET" + fi + else + webadminuser="\e[0;31mUNAVAILABLE\e[0m" + fi + + # webadmin password + if [ -f "${servercfgfullpath}" ]; then + webadminpass=$(grep "UTServerAdmin.UTServerAdmin" "${servercfgfullpath}" -A 2 | grep "AdminPassword=" | sed 's/\AdminPassword=//g') + if [ ! -n "${webadminpass}" ]; then + webadminpass="NOT SET" + fi + else + webadminpass="\e[0;31mUNAVAILABLE\e[0m" + fi + + else + + # webadmin user + if [ -f "${servercfgfullpath}" ]; then + webadminuser=$(grep "AdminName=" "${servercfgfullpath}" | sed 's/\AdminName=//g') + if [ ! -n "${webadminuser}" ]; then + webadminuser="NOT SET" + fi + else + webadminuser="\e[0;31mUNAVAILABLE\e[0m" + fi + + # webadmin password + if [ -f "${servercfgfullpath}" ]; then + webadminpass=$(grep "AdminPassword=" "${servercfgfullpath}" | sed 's/\AdminPassword=//g') + if [ ! -n "${webadminpass}" ]; then + webadminpass="NOT SET" + fi + else + webadminpass="\e[0;31mUNAVAILABLE\e[0m" + fi + + fi + +# ARK: Survivaial Evolved +elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then + + # server name + if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "SessionName=" "${servercfgfullpath}" | sed 's/SessionName=//g') + if [ ! -n "${servername}" ]; then + servername="NOT SET" + fi + else + servername="\e[0;31mUNAVAILABLE\e[0m" + fi + + # server password + if [ -f "${servercfgfullpath}" ]; then + serverpassword=$(grep "ServerPassword=" "${servercfgfullpath}" | sed 's/ServerPassword=//g') + if [ ! -n "${serverpassword}" ]; then + serverpassword="NOT SET" + fi + else + serverpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # admin password + if [ -f "${servercfgfullpath}" ]; then + adminpassword=$(grep "ServerAdminPassword=" "${servercfgfullpath}" | sed 's/ServerAdminPassword=//g') + if [ ! -n "${adminpassword}" ]; then + adminpassword="NOT SET" + fi + else + adminpassword="\e[0;31mUNAVAILABLE\e[0m" + fi + + # slots + if [ -f "${servercfgfullpath}" ]; then + slots=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]') + if [ ! -n "${slots}" ]; then + slots="NOT SET" + fi + else + slots="\e[0;31mUNAVAILABLE\e[0m" + fi + + # port + if [ -f "${servercfgfullpath}" ]; then + port=$(grep "Port=" "${servercfgfullpath}" | grep -v "RCONPort=" | grep -v "QueryPort=" | tr -cd '[:digit:]') + fi + if [ ! -n "${port}" ]; then + port="0" + fi + + # rcon port + if [ -f "${servercfgfullpath}" ]; then + rconport=$(grep "RCONPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') + fi + if [ ! -n "${rconport}" ]; then + rconport="0" + fi + + # query port + if [ -f "${servercfgfullpath}" ]; then + queryport=$(grep "QueryPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') + fi + if [ ! -n "${queryport}" ]; then + queryport="0" + fi + +fi diff --git a/functions/info_distro.sh b/lgsm/functions/info_distro.sh similarity index 100% rename from functions/info_distro.sh rename to lgsm/functions/info_distro.sh diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh new file mode 100644 index 000000000..8b7b38cd4 --- /dev/null +++ b/lgsm/functions/info_glibc.sh @@ -0,0 +1,71 @@ +#!/bin/bash +# LGSM info_glibc.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="260216" + +# Description: stores details on servers Glibc requirements. + +if [ "${gamename}" == "Blade Symphony" ]; then + glibc_required="2.15" + glibcfix="yes" +elif [ "${gamename}" == "BrainBread 2" ]; then + glibc_required="2.17" +elif [ "${gamename}" == "Double Action: Boogaloo" ]; then + glibc_required="2.15" + glibcfix="yes" +elif [ "${gamename}" == "Fistful of Frags" ]; then + glibc_required="2.15" + glibcfix="yes" +elif [ "${gamename}" == "Garry's Mod" ]; then + glibc_required="2.15" + glibcfix="yes" +elif [ "${gamename}" == "Insurgency" ]; then + glibc_required="2.15" + glibcfix="yes" +elif [ "${gamename}" == "No More Room in Hell" ]; then + glibc_required="2.15" + glibcfix="yes" +elif [ "${gamename}" == "Quake Live" ]; then + glibc_required="2.15" + glibcfix="no" +elif [ "${engine}" == "avalanche" ]; then + glibc_required="2.13" + glibcfix="yes" +elif [ "${engine}" == "dontstarve" ]; then + glibc_required="2.15" + glibcfix="no" +elif [ "${engine}" == "projectzomboid" ]; then + glibc_required="2.15" + glibcfix="yesno" +elif [ "${engine}" == "realvirtuality" ]; then + glibc_required="2.13" + glibcfix="yes" +elif [ "${engine}" == "seriousengine35" ]; then + glibc_required="2.13" + glibcfix="yes" +elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then + glibc_required="2.3.6" + glibcfix="no" +elif [ "${engine}" == "spark" ]; then + glibc_required="2.15" + glibcfix="yes" +elif [ "${engine}" == "starbound" ]; then + glibc_required="2.12" + glibcfix="no" +elif [ "${engine}" == "unreal" ]; then + glibc_required="2.1" + glibcfix="no" +elif [ "${engine}" == "unreal2" ]; then + glibc_required="2.4" + glibcfix="no" +elif [ "${engine}" == "unreal4" ]; then + glibc_required="2.14" + glibcfix="no" +elif [ "${engine}" == "unity3d" ]; then + glibc_required="2.15" + glibcfix="no" +else + glibc_required="UNKNOWN" + glibcfix="no" +fi diff --git a/functions/info_ts3status.sh b/lgsm/functions/info_ts3status.sh similarity index 100% rename from functions/info_ts3status.sh rename to lgsm/functions/info_ts3status.sh diff --git a/lgsm/functions/install_complete.sh b/lgsm/functions/install_complete.sh new file mode 100644 index 000000000..5ea9a127b --- /dev/null +++ b/lgsm/functions/install_complete.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# LGSM install_complete.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +local modulename="Install" + +if [ "${gamename}" == "Don't Starve Together" ]; then + echo "" + echo "An Authentication Token is required to run this server!" + echo "Follow the instructions in this link to obtain this key" + echo " http://gameservermanagers.com/dst-auth-token" +fi +echo "=================================" +echo "Install Complete!" +fn_scriptlog "Install Complete!" +echo "" +echo "To start server type:" +echo "./${selfname} start" +echo "" diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh new file mode 100644 index 000000000..75ca40618 --- /dev/null +++ b/lgsm/functions/install_config.sh @@ -0,0 +1,349 @@ +#!/bin/bash +# LGSM install_config.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="220216" + +local modulename="Install" + +fn_defaultconfig(){ + echo "creating ${servercfg} config file." + cp -v "${servercfgdefault}" "${servercfgfullpath}" + sleep 1 +} + +fn_userinputconfig(){ +# allow user to input server name and password +if [ -z "${autoinstall}" ]; then + echo "" + echo "Configuring ${gamename} Server" + echo "=================================" + sleep 1 + read -p "Enter server name: " servername + read -p "Enter rcon password: " rconpass +else + servername="${servicename}" + rconpass="rconpassword" +fi +echo "changing hostname." +sed -i "s/\"\"/\"${servername}\"/g" "${servercfgfullpath}" +sleep 1 +echo "changing rconpassword." +sed -i "s/\"\"/\"${rconpass}\"/g" "${servercfgfullpath}" +sleep 1 +} + +fn_arma3config(){ +fn_defaultconfig +echo "creating ${networkcfg} config file." +cp -v "${networkcfgdefault}" "${networkcfgfullpath}" +sleep 1 +echo "" +} + +fn_goldsourceconfig(){ +fn_defaultconfig + +# server.cfg redirects to ${servercfg} for added security +echo "creating server.cfg." +touch "server.cfg" +sleep 1 +echo "creating redirect." +echo "server.cfg > ${servercfg}." +echo "exec ${servercfg}" > "server.cfg" +sleep 1 + +# creating other files required +echo "creating listip.cfg." +touch "${systemdir}/listip.cfg" +sleep 1 +echo "creating banned.cfg." +touch "${systemdir}/banned.cfg" +sleep 1 + +fn_userinputconfig +echo "" +} + +fn_serious3config(){ +fn_defaultconfig +echo "" +echo "To edit ${gamename} server config use SS3 Server GUI 3 tool" +echo "http://mrag.nl/sgui3/" +sleep 1 +echo "" +} + +fn_sourceconfig(){ +fn_defaultconfig + +# server.cfg redirects to ${servercfg} for added security +echo "creating server.cfg." +touch "server.cfg" +sleep 1 +echo "creating redirect." +echo "server.cfg > ${servercfg}." +echo "exec ${servercfg}" > "server.cfg" +sleep 1 + +fn_userinputconfig +echo "" +} + +fn_teeworldsconfig(){ +fn_defaultconfig + +echo "adding logfile location to config." +sed -i "s@\"\"@\"${gamelog}\"@g" "${servercfgfullpath}" +sleep 1 +echo "removing password holder." +sed -i "s///" "${servercfgfullpath}" +sleep 1 + +fn_userinputconfig +echo "" +} + +fn_ut99config(){ +echo "${servercfgdefault} > ${servercfgfullpath}" +tr -d '\r' < "${servercfgdefault}" > "${servercfgfullpath}" +sleep 1 +echo "" +echo "Configuring ${gamename} Server" +echo "=================================" +sleep 1 +echo "enabling WebAdmin." +sed -i 's/bEnabled=False/bEnabled=True/g' "${servercfgfullpath}" +sleep 1 +echo "setting WebAdmin port to 8076." +sed -i '467i\ListenPort=8076' "${servercfgfullpath}" +sleep 1 +echo "" +} + +fn_unreal2config(){ +fn_defaultconfig +echo "" +echo "Configuring ${gamename} Server" +echo "=================================" +sleep 1 +echo "setting WebAdmin username and password." +sed -i 's/AdminName=/AdminName=admin/g' "${servercfgfullpath}" +sed -i 's/AdminPassword=/AdminPassword=admin/g' "${servercfgfullpath}" +sleep 1 +echo "enabling WebAdmin." +sed -i 's/bEnabled=False/bEnabled=True/g' "${servercfgfullpath}" +if [ "${gamename}" == "Unreal Tournament 2004" ]; then + sleep 1 + echo "setting WebAdmin port to 8075." + sed -i 's/ListenPort=80/ListenPort=8075/g' "${servercfgfullpath}" +fi +sleep 1 +echo "" +} + +echo "" +if [ "${gamename}" != "Hurtworld" ]; then +echo "Creating Configs" +echo "=================================" +sleep 1 + mkdir -pv "${servercfgdir}" + cd "${servercfgdir}" + githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}" +fi + +if [ "${gamename}" == "7 Days To Die" ]; then + fn_defaultconfig +elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then + wget -N /dev/null ${githuburl}/ARKSurvivalEvolved/cfg/lgsm-default.ini 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + echo -e "downloading lgsm-default.ini...\c" + fn_defaultconfig +elif [ "${gamename}" == "ARMA 3" ]; then + echo -e "downloading lgsm-default.server.cfg...\c" + wget -N /dev/null ${githuburl}/Arma3/cfg/lgsm-default.server.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + echo -e "downloading lgsm-default.network.cfg...\c" + wget -N /dev/null ${githuburl}/Arma3/cfg/lgsm-default.network.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_arma3config +elif [ "${gamename}" == "BrainBread 2" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/BrainBread2/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Black Mesa: Deathmatch" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/BlackMesa/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Blade Symphony" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/BladeSymphony/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_goldsourceconfig +elif [ "${gamename}" == "Codename CURE" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/CodenameCURE/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig + +elif [ "${gamename}" == "Counter Strike 1.6" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/CounterStrike/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_goldsourceconfig +elif [ "${gamename}" == "Counter Strike: Condition Zero" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/CounterStrikeConditionZero/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_goldsourceconfig +elif [ "${gamename}" == "Counter Strike: Global Offensive" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/CounterStrikeGlobalOffensive/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Counter Strike: Source" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/CounterStrikeSource/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Day of Defeat" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/DayOfDefeat/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_goldsourceconfig +elif [ "${gamename}" == "Day of Defeat: Source" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/DayOfDefeatSource/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Don't Starve Together" ]; then + echo -e "downloading lgsm-default.ini...\c" + wget -N /dev/null ${githuburl}/DontStarveTogether/lgsm-default.ini 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_defaultconfig +elif [ "${gamename}" == "Double Action: Boogaloo" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/DoubleActionBoogaloo/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Fistful of Frags" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/FistfulOfFrags/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Garry's Mod" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/GarrysMod/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "GoldenEye: Source" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/GoldenEyeSource/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Half Life 2: Deathmatch" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/HalfLife2Deathmatch/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Half Life: Deathmatch" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/HalfLifeDeathmatch/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_goldsourceconfig +elif [ "${gamename}" == "Insurgency" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/Insurgency/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Just Cause 2" ]; then + fn_defaultconfig +elif [ "${gamename}" == "Killing Floor" ]; then + fn_unreal2config +elif [ "${gamename}" == "Left 4 Dead" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/Left4Dead/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Left 4 Dead 2" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/Left4Dead2/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "No More Room in Hell" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/NoMoreRoomInHell/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Natural Selection 2" ]; then + echo -e "no configs required." + sleep 1 + echo "" +elif [ "${gamename}" == "Pirates, Vikings, and Knights II" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/PiratesVikingandKnightsII/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Quake Live" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/QuakeLive/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_defaultconfig + fn_userinputconfig +elif [ "${gamename}" == "Red Orchestra: Ostfront 41-45" ]; then + fn_unreal2config +elif [ "${gamename}" == "Serious Sam 3: BFE" ]; then + echo -e "downloading lgsm-default.ini...\c" + wget -N /dev/null ${githuburl}/SeriousSam3BFE/cfg/lgsm-default.ini 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_serious3config +elif [ "${gamename}" == "Rust" ]; then + echo -e "downloading server.cfg...\c" + wget -N /dev/null ${githuburl}/Rust/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_defaultconfig +elif [ "${gamename}" == "Sven Co-op" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/SvenCoop/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_goldsourceconfig +elif [ "${gamename}" == "Teamspeak 3" ]; then + echo -e "downloading lgsm-default.ini...\c" + wget -N /dev/null ${githuburl}/TeamSpeak3/cfg/lgsm-default.ini 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_defaultconfig +elif [ "${gamename}" == "Team Fortress 2" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/TeamFortress2/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_sourceconfig +elif [ "${gamename}" == "Team Fortress Classic" ]; then + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/TeamFortressClassic/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_goldsourceconfig +elif [ "${gamename}" == "Teeworlds" ]; then + echo -e "downloading ctf.cfg...\c" + wget -N /dev/null ${githuburl}/Teeworlds/cfg/ctf.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + echo -e "downloading dm.cfg...\c" + wget -N /dev/null ${githuburl}/Teeworlds/cfg/dm.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + echo -e "downloading duel.cfg...\c" + wget -N /dev/null ${githuburl}/Teeworlds/cfg/duel.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + echo -e "downloading tdm.cfg...\c" + wget -N /dev/null ${githuburl}/Teeworlds/cfg/tdm.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + echo -e "downloading lgsm-default.cfg...\c" + wget -N /dev/null ${githuburl}/Teeworlds/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_teeworldsconfig +elif [ "${gamename}" == "Terraria" ]; then + echo -e "downloading lgsm-default.txt...\c" + wget -N /dev/null ${githuburl}/Terraria/cfg/lgsm-default.txt 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_defaultconfig +elif [ "${gamename}" == "Unreal Tournament 2004" ]; then + fn_unreal2config +elif [ "${gamename}" == "Unreal Tournament 99" ]; then + fn_ut99config +fi diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh new file mode 100644 index 000000000..5bd309f28 --- /dev/null +++ b/lgsm/functions/install_gslt.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# LGSM install_gslt.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="270216" + +# Description: Configures GSLT. + +local modulename="Install" + +echo "" +echo "Game Server Login Token" +echo "============================" +sleep 1 +if [ "${gamename}" == "Counter Strike: Global Offensive" ]; then + echo "GSLT is required to run a public ${gamename} server" + fn_scriptlog "GSLT is required to run a public ${gamename} server" +else + echo "GSLT is an optional feature for ${gamename} server" + fn_scriptlog "GSLT is an optional feature for ${gamename} server" +fi + +echo "Get more info and a token here:" +echo "http://gameservermanagers.com/gslt" +fn_scriptlog "Get more info and a token here:" +fn_scriptlog "http://gameservermanagers.com/gslt" +echo "" +if [ -z "${autoinstall}" ]; then + echo "Enter token below (Can be blank)." + echo -n "GSLT TOKEN: " + read token + sed -i -e "s/gslt=\"\"/gslt=\"${token}\"/g" "${rootdir}/${selfname}" +fi +sleep 1 +echo "The GSLT can be changed by editing ${selfname}." +fn_scriptlog "The GSLT can be changed by editing ${selfname}." +echo "" \ No newline at end of file diff --git a/functions/install_gsquery.sh b/lgsm/functions/install_gsquery.sh similarity index 100% rename from functions/install_gsquery.sh rename to lgsm/functions/install_gsquery.sh diff --git a/lgsm/functions/install_header.sh b/lgsm/functions/install_header.sh new file mode 100644 index 000000000..da8b7bf6c --- /dev/null +++ b/lgsm/functions/install_header.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# LGSM install_header.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="190216" + +local modulename="Install" + +clear +echo "=================================" +echo "${gamename}" +echo "Linux Game Server Manager" +echo "by Daniel Gibbs" +echo "Contributors: http://goo.gl/qLmitD" +echo "http://gameservermanagers.com" +echo "=================================" diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh new file mode 100644 index 000000000..c7ea4b789 --- /dev/null +++ b/lgsm/functions/install_logs.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# LGSM install_logs.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="270216" + +local modulename="Install" + +if [ "${checklogs}" != "1" ]; then + echo "" + echo "Creating log directorys" + echo "=================================" +fi +sleep 1 +# Create dir's for the script and console logs +mkdir -v "${rootdir}/log" +mkdir -v "${scriptlogdir}" +touch "${scriptlog}" +if [ -n "${consolelogdir}" ]; then + mkdir -v "${consolelogdir}" + touch "${consolelog}" +fi + +# If a server is source or goldsource, Teamspeak 3, Starbound, Project Zomhoid create a symbolic link to the game server logs. +if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]||[ "${gamename}" == "Teamspeak 3" ]||[ "${engine}" == "starbound" ]||[ "${engine}" == "projectzomboid" ]; then + if [ ! -h "${rootdir}/log/server" ]; then + ln -nfsv "${gamelogdir}" "${rootdir}/log/server" + fi +fi + +# If a server is unreal2 or unity3d create a dir. +if [ "${engine}" == "unreal2" ]||[ "${engine}" == "unity3d" ]||[ "${gamename}" == "Teeworlds" ]||[ "${gamename}" == "seriousengine35" ]; then + mkdir -pv "${gamelogdir}" +fi + +# If server uses SteamCMD create a symbolic link to the Steam logs. +if [ -d "${rootdir}/Steam/logs" ]; then + if [ ! -h "${rootdir}/log/steamcmd" ]; then + ln -nfsv "${rootdir}/Steam/logs" "${rootdir}/log/steamcmd" + fi +fi +sleep 1 +fn_scriptlog "logs installed" \ No newline at end of file diff --git a/lgsm/functions/install_retry.sh b/lgsm/functions/install_retry.sh new file mode 100644 index 000000000..7f04ac9ed --- /dev/null +++ b/lgsm/functions/install_retry.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# LGSM install_retry.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +local modulename="Install" + +while true; do + read -e -i "y" -p "Retry install? [Y/n]" yn + case $yn in + [Yy]* ) command_install.sh; exit;; + [Nn]* ) echo Exiting; exit;; + * ) echo "Please answer yes or no.";; + esac +done \ No newline at end of file diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh new file mode 100644 index 000000000..ab73ecfd2 --- /dev/null +++ b/lgsm/functions/install_server_dir.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# LGSM install_serverdir.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +local modulename="Install" + +echo "" +echo "Server Directory" +echo "=================================" +sleep 1 +echo "" +pwd +echo "" +if [ -d "${filesdir}" ]; then + fn_print_warning_nl "A server is already installed here." +fi +if [ -z "${autoinstall}" ]; then + while true; do + read -e -i "y" -p "Continue [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) exit;; + * ) echo "Please answer yes or no.";; + esac + done +fi +if [ ! -d "${filesdir}" ]; then + mkdir -v "${filesdir}" +fi +sleep 1 \ No newline at end of file diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh new file mode 100644 index 000000000..d6655689b --- /dev/null +++ b/lgsm/functions/install_server_files.sh @@ -0,0 +1,110 @@ +#!/bin/bash +# LGSM install_server_files.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="270216" + +local modulename="Install" + +fn_install_server_files(){ +if [ "${gamename}" == "Unreal Tournament 99" ]; then + fileurl="http://gameservermanagers.com/files/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut99-server-451-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" +elif [ "${gamename}" == "Unreal Tournament 2004" ]; then + fileurl="http://gameservermanagers.com/files/UnrealTournament2004/ut2004-server-3339-ultimate-linux.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut2004-server-3339-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" +fi +fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" +fn_dl_extract "${filedir}" "${filename}" "${filesdir}" +} + +fn_install_server_files_steamcmd(){ +counter="0" +while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do + counter=$((counter+1)) + cd "${rootdir}/steamcmd" + if [ "${counter}" -le "10" ]; then + # Attempt 1-4: Standard attempt + # Attempt 5-6: Validate attempt + # Attempt 7-8: Validate, delete long name dir + # Attempt 9-10: Validate, delete long name dir, re-download SteamCMD + # Attempt 11: Failure + + if [ "${counter}" -ge "2" ]; then + fn_print_warning_nl "SteamCMD did not complete the download, retrying: Attempt ${counter}" + fn_scriptlog "SteamCMD did not complete the download, retrying: Attempt ${counter}" + fi + + if [ "${counter}" -ge "7" ]; then + echo "Removing $(find ${filesdir} -type d -print0 | grep -Ez '[^/]{30}$')" + find ${filesdir} -type d -print0 | grep -Ez '[^/]{30}$' | xargs -0 rm -rf + fi + if [ "${counter}" -ge "9" ]; then + rm -rf "${rootdir}/steamcmd" + check_steamcmd.sh + fi + + # Detects if unbuffer command is available. + if [ $(command -v unbuffer) ]; then + unbuffer=unbuffer + fi + + if [ "${counter}" -le "4" ]; then + if [ "${engine}" == "goldsource" ]; then + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" +quit + local exitcode=$? + else + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" +quit + local exitcode=$? + fi + elif [ "${counter}" -ge "5" ]; then + if [ "${engine}" == "goldsource" ]; then + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -validate +quit + local exitcode=$? + else + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" -validate +quit + local exitcode=$? + fi + fi + elif [ "${counter}" -ge "11" ]; then + fn_print_failure_nl "SteamCMD did not complete the download, too many retrys" + fn_scriptlog "SteamCMD did not complete the download, too many retrys" + break + fi +done + +# Goldsource servers commonly fail to download all the server files required. +# Validating a few of times may reduce the chance of this issue. +if [ "${engine}" == "goldsource" ]; then + fn_print_infomation_nl "Goldsource servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." + counter="0" + while [ "${counter}" -le "4" ]; do + counter=$((counter+1)) + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" -validate +quit + local exitcode=$? + done +fi +} + +echo "" +echo "Installing ${gamename} Server" +echo "=================================" +sleep 1 +if [ -n "${appid}" ]; then + fn_install_server_files_steamcmd +fi + +if [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]; then + fn_install_server_files +fi + +if [ -z "${autoinstall}" ]; then + echo "" + echo "=================================" + while true; do + read -e -i "y" -p "Was the install successful? [Y/n]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) install_retry.sh;; + * ) echo "Please answer yes or no.";; + esac + done +fi \ No newline at end of file diff --git a/lgsm/functions/install_steamcmd.sh b/lgsm/functions/install_steamcmd.sh new file mode 100644 index 000000000..de371bbd8 --- /dev/null +++ b/lgsm/functions/install_steamcmd.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# LGSM install_steamcmd.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +# Description: Downloads SteamCMD on install. + +local modulename="Install" + +echo "" +echo "Installing SteamCMD" +echo "=================================" +sleep 1 +check_steamcmd.sh diff --git a/lgsm/functions/install_ts3.sh b/lgsm/functions/install_ts3.sh new file mode 100644 index 000000000..5cf2f0f85 --- /dev/null +++ b/lgsm/functions/install_ts3.sh @@ -0,0 +1,82 @@ +#!/bin/bash +# LGSM install_ts3.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +local modulename="Install" + +info_distro.sh +# Gets the teamspeak server architecture +if [ "${arch}" == "x86_64" ]; then + ts3arch="amd64" +elif [ "${arch}" == "i386" ]||[ "${arch}" == "i686" ]; then + ts3arch="x86" +else + fn_print_failure "${arch} is an unsupported architecture" + exit 1 +fi + +# Grabs all version numbers but not in correct order +wget "http://dl.4players.de/ts/releases/?C=M;O=D" -q -O -| grep -i dir | egrep -o '.*\/<\/a>' | egrep -o '[0-9\.?]+'|uniq > .ts3_version_numbers_unsorted.tmp + +# Replaces dots with spaces to split up the number. e.g 3 0 12 1 is 3.0.12.1 this allows correct sorting + cat .ts3_version_numbers_unsorted.tmp | tr "." " " > .ts3_version_numbers_digit.tmp +# Sorts versions in to correct order +# merges 2 files and orders by each column in order allowing these version numbers to be sorted in order +paste .ts3_version_numbers_digit.tmp .ts3_version_numbers_unsorted.tmp | awk '{print $1,$2,$3,$4 " " $0;}'| sort -k1rn -k2rn -k3rn -k4rn | awk '{print $NF}' > .ts3_version_numbers.tmp + +# Finds directory with most recent server version. +while read ts3_version_number; do + wget --spider -q "http://dl.4players.de/ts/releases/${ts3_version_number}/teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" + if [ $? -eq 0 ]; then + availablebuild="${ts3_version_number}" + # Break while-loop, if the latest release could be found + break + fi +done < .ts3_version_numbers.tmp + +# tidy up +rm -f ".ts3_version_numbers_digit.tmp" +rm -f ".ts3_version_numbers_unsorted.tmp" +rm -f ".ts3_version_numbers.tmp" + +# Checks availablebuild info is available +if [ -z "${availablebuild}" ]; then + fn_print_fail "Checking for update: teamspeak.com" + sleep 1 + fn_print_fail "Checking for update: teamspeak.com: Not returning version info" + sleep 2 + exit 1 +fi + +cd "${rootdir}" +echo -e "downloading teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2...\c" +wget -N /dev/null http://dl.4players.de/ts/releases/${ts3_version_number}/teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2 2>&1 | grep -F HTTP | cut -c45-| uniq +sleep 1 +echo -e "extracting teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2...\c" +tar -xf "teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" 2> ".${servicename}-tar-error.tmp" +local status=$? +if [ ${status} -eq 0 ]; then + echo "OK" +else + echo "FAIL - Exit status ${status}" + sleep 1 + cat ".${servicename}-tar-error.tmp" + rm ".${servicename}-tar-error.tmp" + exit $? +fi +echo -e "copying to ${filesdir}...\c" +cp -R "${rootdir}/teamspeak3-server_linux_${ts3arch}/"* "${filesdir}" 2> ".${servicename}-cp-error.tmp" +local status=$? +if [ ${status} -eq 0 ]; then + echo "OK" +else + echo "FAIL - Exit status ${status}" + sleep 1 + cat ".${servicename}-cp-error.tmp" + rm ".${servicename}-cp-error.tmp" + exit $? +fi +rm -f "teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" +rm -rf "${rootdir}/teamspeak3-server_linux_${ts3arch}" diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh new file mode 100644 index 000000000..61e2db7d4 --- /dev/null +++ b/lgsm/functions/install_ts3db.sh @@ -0,0 +1,71 @@ +#!/bin/bash +# LGSM fn_install_ts3_mariadb function +# Author: Daniel Gibbs +# Contributor: PhilPhonic +# Website: http://gameservermanagers.com +lgsm_version="271215" + +local modulename="Install" + +fn_install_ts3db_mariadb(){ + echo "" + echo "checking if libmariadb2 is installed" + echo "=================================" + sleep 1 + ldd ${filesdir}/libts3db_mariadb.so | grep "libmariadb.so.2 => not found" + if [ $? -eq 0 ]; then + echo "libmariadb2 not installed. Please install it first." + echo "exiting..." + exit + else + echo "libmariadb2 installed." + fi + echo "" + echo "Configuring ${gamename} Server for MariaDB/MySQL" + echo "=================================" + sleep 1 + read -p "Enter MariaDB hostname: " mariahostname + read -p "Enter MariaDB port: " mariaport + read -p "Enter MariaDB username: " mariausername + read -p "Enter MariaDB password: " mariapassword + read -p "Enter MariaDB database name: " mariadbname + echo "updating config." + echo "[config]" >> ${servercfgdir}/ts3db_mariadb.ini + echo "host='${mariahostname}'" >> ${servercfgdir}/ts3db_mariadb.ini + echo "port='${mariaport}'" >> ${servercfgdir}/ts3db_mariadb.ini + echo "username='${mariausername}'" >> ${servercfgdir}/ts3db_mariadb.ini + echo "password='${mariapassword}'" >> ${servercfgdir}/ts3db_mariadb.ini + echo "database='${mariadbname}'" >> ${servercfgdir}/ts3db_mariadb.ini + echo "socket=" >> ${servercfgdir}/ts3db_mariadb.ini + sed -i "s/dbplugin=ts3db_sqlite3/dbplugin=ts3db_mariadb/g" "${servercfgfullpath}" + sed -i "s/dbpluginparameter=/dbpluginparameter=ts3db_mariadb.ini/g" "${servercfgfullpath}" + sed -i "s/dbsqlcreatepath=create_sqlite\//dbsqlcreatepath=create_mariadb\//g" "${servercfgfullpath}" + echo "=================================" + sleep 1 +} + +if [ -z "${autoinstall}" ]; then + echo "" + while true; do + read -e -i "n" -p "Do you want to use MariaDB/MySQL instead of sqlite (Database Server including user and database already has to be set up!)? [y/N]" yn + case $yn in + [Yy]* ) fn_install_ts3db_mariadb && break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done +else +fn_print_warning_nl "./${selfname} auto-install is uses sqlite. For MariaDB/MySQL use ./${selfname} install" +fi + +## Get privilege key +echo "" +echo "Getting privilege key" +echo "=================================" +sleep 1 +echo "IMPORANT! Save these details for later." +sleep 1 +cd "${executabledir}" +./ts3server_startscript.sh start inifile=ts3-server.ini +sleep 5 +./ts3server_startscript.sh stop diff --git a/lgsm/functions/install_ut2k4_key.sh b/lgsm/functions/install_ut2k4_key.sh new file mode 100644 index 000000000..53b603de1 --- /dev/null +++ b/lgsm/functions/install_ut2k4_key.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# LGSM install_ut2k4_key.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +local modulename="Install" + +echo "" +echo "Enter ${gamename} CD Key" +echo "=================================" +sleep 1 +echo "To get your server listed on the Master Server list" +echo "you must get a free CD key. Get a key here:" +echo "http://www.unrealtournament.com/ut2004server/cdkey.php" +echo "" +if [ -z "${autoinstall}" ]; then + echo "Once you have the key enter it below" + echo -n "KEY: " + read CODE + echo ""\""CDKey"\""="\""${CODE}"\""" > "${systemdir}/cdkey" + if [ -f "${systemdir}/cdkey" ]; then + fn_scriptlog "UT2K4 Server CD Key created" +else + echo "You can add your key using the following command" + echo "./${selfname} server-cd-key" +fi +echo "" \ No newline at end of file diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh new file mode 100644 index 000000000..30de59ea7 --- /dev/null +++ b/lgsm/functions/logs.sh @@ -0,0 +1,102 @@ +#!/bin/bash +# LGSM logs.sh function +# Author: Daniel Gibbs +# Contributor: UltimateByte +# Website: http://gameservermanagers.com +lgsm_version="230216" + +# Description: Acts as a log rotater, removing old logs. + +local modulename="Log Manager" + +# Check if logfile variable and file exist, create logfile if it doesn't exist +if [ -n "${consolelog}" ]; then + if [ ! -e "${consolelog}" ]; then + touch "${consolelog}" + fi +fi + +# For games not displaying a console, and having logs into their game folder +if [ -n "${gamelogfile}" ]; then + if [ -n "$(find "${systemdir}" -name "gamelog*.log")" ]; then + fn_printinfo "Moving game logs to ${gamelogdir}" + fn_scriptlog "Moving game logs to ${gamelogdir}" + echo -en "\n" + sleep 1 + mv "${systemdir}"/gamelog*.log "${gamelogdir}" + fi +fi + +# Log manager will start the cleanup if it finds logs older than "${logdays}" +if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; then + fn_print_dots "Starting" + # Set addon logs directories + sourcemodlogdir="${systemdir}/addons/sourcemod/logs" + ulxlogdir="${systemdir}/data/ulx_logs" + darkrplogdir="${systemdir}/data/darkrp_logs" + legacyserverlogdir="${rootdir}/log/server" + # Setting up counting variables + scriptcount="0" ; consolecount="0" ; gamecount="0" ; srcdscount="0" ; smcount="0" ; ulxcount="0" ; darkrpcount="0" ; legacycount="0" + sleep 1 + fn_print_ok_nl "Starting" + fn_scriptlog "Starting" + fn_print_info_nl "Removing logs older than "${logdays}" days" + fn_scriptlog "Removing logs older than "${logdays}" days" + # Logging logfiles to be removed according to "${logdays}", counting and removing them + # Script logfiles + find "${scriptlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" + scriptcount=$(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) + find "${scriptlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; + # SRCDS and unreal logfiles + if [ "${engine}" == "unreal2" ]||[ "${engine}" == "source" ]; then + find "${gamelogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" + gamecount=$(find "${gamelogdir}"/ -type f -mtime +"${logdays}"|wc -l) + find "${gamelogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; + fi + # Console logfiles + if [ -n "${consolelog}" ]; then + find "${consolelogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" + consolecount=$(find "${consolelogdir}"/ -type f -mtime +"${logdays}"|wc -l) + find "${consolelogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; + fi + # Source addons logfiles + if [ "${engine}" == "source" ]; then + # SourceMod logfiles + if [ -d "${sourcemodlogdir}" ]; then + find "${sourcemodlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" + smcount=$(find "${sourcemodlogdir}"/ -type f -mtime +"${logdays}"|wc -l) + find "${sourcemodlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; + fi + # Garry's Mod logfiles + if [ "${gamename}" == "Garry's Mod" ]; then + # ULX logfiles + if [ -d "${ulxlogdir}" ]; then + find "${ulxlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" + ulxcount=$(find "${ulxlogdir}"/ -type f -mtime +"${logdays}"|wc -l) + find "${ulxlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; + fi + # DarkRP logfiles + if [ -d "${darkrplogdir}" ]; then + find "${darkrplogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" + darkrpcount=$(find "${darkrplogdir}"/ -type f -mtime +"${logdays}"|wc -l) + find "${darkrplogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; + fi + fi + fi + # Legacy support + if [ -d "${legacyserverlogdir}" ]; then + find "${legacyserverlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" + legacycount=$(find "${legacyserverlogdir}"/ -type f -mtime +"${logdays}"|wc -l) + find "${legacyserverlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; + # Remove folder if empty + if [ ! "$(ls -A "${legacyserverlogdir}")" ]; then + rm -rf "${legacyserverlogdir}" + fi + fi + + # Count total amount of files removed + count=$((${scriptcount} + ${consolecount} + ${gamecount} + ${srcdscount} + ${smcount} + ${ulxcount} + ${darkrpcount} + ${legacycount})) + # Job done + fn_print_ok_nl "Removed ${count} log files" + fn_scriptlog "Removed ${count} log files" +fi diff --git a/lgsm/functions/monitor_gsquery.sh b/lgsm/functions/monitor_gsquery.sh new file mode 100644 index 000000000..058351770 --- /dev/null +++ b/lgsm/functions/monitor_gsquery.sh @@ -0,0 +1,93 @@ +#!/bin/bash +# LGSM monitor_gsquery.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="270216" + +# Description: uses gsquery.py to query the server port. +# Detects if the server has frozen with the proccess still running. + +local modulename="Monitor" + +# Forces legecy servers to use gsquery as vat gsquery is not present in legecy +if [ -z "${gsquery}" ]; then + gsquery="yes" +fi + +if [ "${gsquery}" == "yes" ]; then + + # Downloads gsquery.py if missing + if [ ! -f "${functionsdir}/gsquery.py" ]; then + fn_fetch_file_github "functions" "gsquery.py" "${functionsdir}" "executecmd" "norun" "noforce" "nomd5" + fi + + info_config.sh + + if [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then + port=$((port + 1)) + elif [ "${engine}" == "spark" ]; then + port=$((port + 1)) + fi + + if [ -z "${queryport}" ]; then + port="${queryport}" + fi + + fn_print_info "Querying port: gsquery.py enabled" + fn_scriptlog "Querying port: gsquery.py enabled" + sleep 1 + + # Will query up to 4 times every 15 seconds. + # Servers changing map can return a failure. + # Will Wait up to 60 seconds to confirm server is down giving server time to change map. + totalseconds=0 + for queryattempt in {1..5}; do + fn_print_dots "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : " + fn_print_querying_eol + fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : QUERYING" + + gsquerycmd=$("${functionsdir}"/gsquery.py -a "${ip}" -p 1 -e "${engine}" 2>&1) + exitcode=$? + + sleep 1 + if [ "${exitcode}" == "0" ]; then + # Server OK + fn_print_ok "Querying port: ${ip}:${port} : ${queryattempt} : " + fn_print_ok_eol + fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : OK" + sleep 1 + exit + else + # Server failed query + fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : ${gsquerycmd}" + + if [ "${queryattempt}" == "5" ]; then + # Server failed query 4 times confirmed failure + fn_print_fail "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : " + fn_print_fail_eol_nl + fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : FAIL" + sleep 1 + + # Send email notification if enabled + if [ "${emailnotification}" == "on" ]; then + subject="${servicename} Monitor - Starting ${servername}" + failurereason="Failed to query ${servicename}: ${gsquerycmd}" + actiontaken="restarted ${servicename}" + email.sh + fi + fn_restart + break + fi + + # Seconds counter + for seconds in {1..15}; do + fn_print_fail "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : \e[0;31m${gsquerycmd}\e[0m" + totalseconds=$((totalseconds + 1)) + sleep 1 + if [ "${seconds}" == "15" ]; then + break + fi + done + fi + done +fi \ No newline at end of file diff --git a/lgsm/functions/update_check.sh b/lgsm/functions/update_check.sh new file mode 100644 index 000000000..579a84f4b --- /dev/null +++ b/lgsm/functions/update_check.sh @@ -0,0 +1,326 @@ +#!/bin/bash +# LGSM update_check.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="060216" + +# Description: Checks if a server update is available. + +local modulename="Update" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +### SteamCMD Update Checker ### + +fn_appmanifestinfo(){ + appmanifestfile=$(find "${filesdir}" -type f -name "appmanifest_${appid}.acf") + appmanifestfilewc=$(find "${filesdir}" -type f -name "appmanifest_${appid}.acf"|wc -l) +} + +fn_appmanifestcheck(){ +fn_appmanifestinfo +# Multiple or no matching appmanifest files may sometimes be available. +# This is an error is corrected below if required. +if [ "${appmanifestfilewc}" -ge "2" ]; then + sleep 1 + fn_print_warn "Multiple appmanifest_${appid}.acf files found" + fn_scriptlog "Warning! Multiple appmanifest_${appid}.acf files found" + sleep 2 + fn_print_dots "Removing x${appmanifestfilewc} appmanifest_${appid}.acf files" + sleep 1 + for appfile in ${appmanifestfile}; do + rm "${appfile}" + done + appmanifestfilewc1="${appmanifestfilewc}" + fn_appmanifestinfo + if [ "${appmanifestfilewc}" -ge "2" ]; then + fn_print_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" + fn_scriptlog "Failure! Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" + sleep 1 + echo "" + echo " Check user permissions" + for appfile in ${appmanifestfile}; do + echo " ${appfile}" + done + exit 1 + else + sleep 1 + fn_print_ok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" + fn_scriptlog "Success! Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" + sleep 1 + fn_print_info_nl "Forcing update to correct issue" + fn_scriptlog "Forcing update to correct issue" + sleep 1 + update_dl.sh + update_check.sh + fi +elif [ "${appmanifestfilewc}" -eq "0" ]; then + if [ "${forceupdate}" == "1" ]; then + fn_print_fail "Still no appmanifest_${appid}.acf found: Unable to update" + fn_scriptlog "Warning! Still no appmanifest_${appid}.acf found: Unable to update" + exit 1 + fi + forceupdate=1 + fn_print_warn "No appmanifest_${appid}.acf found" + fn_scriptlog "Warning! No appmanifest_${appid}.acf found" + sleep 2 + fn_print_info_nl "Forcing update to correct issue" + fn_scriptlog "Forcing update to correct issue" + sleep 1 + update_dl.sh + update_check.sh +fi +} + +fn_logupdaterequest(){ +# Checks for server update requests from server logs. +fn_print_dots "Checking for update: Server logs" +fn_scriptlog "Checking for update: Server logs" +sleep 1 +requestrestart=$(grep -Ec "MasterRequestRestart" "${consolelog}") +if [ "${requestrestart}" -ge "1" ]; then + fn_print_ok_nl "Checking for update: Server logs: Update requested" + sleep 1 + echo "" + echo -ne "Applying update.\r" + sleep 1 + echo -ne "Applying update..\r" + sleep 1 + echo -ne "Applying update...\r" + sleep 1 + echo -ne "\n" + tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") + unset updateonstart + if [ "${tmuxwc}" -eq 1 ]; then + command_stop.sh + update_dl.sh + command_start.sh + else + update_dl.sh + fi +else + fn_print_ok "Checking for update: Server logs: No update requested" + sleep 1 +fi +} + +fn_steamcmdcheck(){ +fn_appmanifestcheck +# Checks for server update from SteamCMD +fn_print_dots "Checking for update: SteamCMD" +fn_scriptlog "Checking for update: SteamCMD" +sleep 1 + +# Gets currentbuild +currentbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) + +# Removes appinfo.vdf as a fix for not always getting up to date version info from SteamCMD + +# Gets availablebuild info +cd "${rootdir}/steamcmd" +if [ -f "${HOME}/Steam/appcache/appinfo.vdf" ]; then + rm -f "${HOME}/Steam/appcache/appinfo.vdf" +fi +availablebuild=$(./steamcmd.sh +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +app_info_print "${appid}" +quit | grep -EA 1000 "^\s+\"branches\"$" | grep -EA 5 "^\s+\"public\"$" | grep -m 1 -EB 10 "^\s+}$" | grep -E "^\s+\"buildid\"\s+" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) +if [ -z "${availablebuild}" ]; then + fn_print_fail "Checking for update: SteamCMD" + fn_scriptlog "Failure! Checking for update: SteamCMD" + sleep 1 + fn_print_fail_nl "Checking for update: SteamCMD: Not returning version info" + fn_scriptlog "Failure! Checking for update: SteamCMD: Not returning version info" + exit 1 +else + fn_print_ok "Checking for update: SteamCMD" + fn_scriptlog "Success! Checking for update: SteamCMD" + sleep 1 +fi + +if [ "${currentbuild}" != "${availablebuild}" ]; then + echo -e "\n" + echo -e "Update available:" + sleep 1 + echo -e " Current build: \e[0;31m${currentbuild}\e[0;39m" + echo -e " Available build: \e[0;32m${availablebuild}\e[0;39m" + echo -e "" + echo -e " https://steamdb.info/app/${appid}/" + sleep 1 + echo "" + echo -en "Applying update.\r" + sleep 1 + echo -en "Applying update..\r" + sleep 1 + echo -en "Applying update...\r" + sleep 1 + echo -en "\n" + fn_scriptlog "Update available" + fn_scriptlog "Current build: ${currentbuild}" + fn_scriptlog "Available build: ${availablebuild}" + fn_scriptlog "${currentbuild} > ${availablebuild}" + + tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") + unset updateonstart + if [ "${tmuxwc}" -eq 1 ]; then + command_stop.sh + update_dl.sh + command_start.sh + else + update_dl.sh + fi +else + echo -e "\n" + echo -e "No update available:" + echo -e " Current version: \e[0;32m${currentbuild}\e[0;39m" + echo -e " Available version: \e[0;32m${availablebuild}\e[0;39m" + echo -e " https://steamdb.info/app/${appid}/" + echo -e "" + fn_print_ok_nl "No update available" + fn_scriptlog "Current build: ${currentbuild}" + fn_scriptlog "Available build: ${availablebuild}" +fi +} + +### END SteamCMD Update Checker ### + +fn_teamspeak3_check(){ +# Checks for server update from teamspeak.com using a mirror dl.4players.de +fn_print_dots "Checking for update: teamspeak.com" +fn_scriptlog "Checking for update: teamspeak.com" +sleep 1 + +# Gets currentbuild info +# Checks currentbuild info is available, if fails a server restart will be forced to generate logs +if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then + fn_print_fail "Checking for update: teamspeak.com" + sleep 1 + fn_print_fail_nl "Checking for update: teamspeak.com: No logs with server version found" + fn_scriptlog "Failure! Checking for update: teamspeak.com: No logs with server version found" + sleep 2 + fn_print_info_nl "Checking for update: teamspeak.com: Forcing server restart" + fn_scriptlog "Checking for update: teamspeak.com: Forcing server restart" + sleep 2 + command_stop.sh + command_start.sh + sleep 2 + # If still failing will exit + if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then + fn_print_fail_nl "Checking for update: teamspeak.com: Still No logs with server version found" + fn_scriptlog "Failure! Checking for update: teamspeak.com: Still No logs with server version found" + exit 1 + fi +fi +currentbuild=$(cat $(find ./* -name 'ts3server*_0.log' 2> /dev/null | sort | egrep -E -v '${rootdir}/.ts3version' | tail -1) | egrep -o 'TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}' | egrep -o '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') + +# Gets the teamspeak server architecture +info_distro.sh +if [ "${arch}" == "x86_64" ]; then + ts3arch="amd64" +elif [ "${arch}" == "i386" ]||[ "${arch}" == "i686" ]; then + ts3arch="x86" +else + echo "" + fn_print_failure "${arch} is an unsupported architecture" + exit 1 +fi + +# Gets availablebuild info + +# Grabs all version numbers but not in correct order +wget "http://dl.4players.de/ts/releases/?C=M;O=D" -q -O -| grep -i dir | egrep -o '.*\/<\/a>' | egrep -o '[0-9\.?]+'|uniq > .ts3_version_numbers_unsorted.tmp + +# Sort version numbers +cat .ts3_version_numbers_unsorted.tmp | sort -r --version-sort -o .ts3_version_numbers_sorted.tmp + +# Finds directory with most recent server version. +while read ts3_version_number; do + wget --spider -q "http://dl.4players.de/ts/releases/${ts3_version_number}/teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" + if [ $? -eq 0 ]; then + availablebuild="${ts3_version_number}" + # Break while-loop, if the latest release could be found + break + fi +done < .ts3_version_numbers_sorted.tmp + +# Tidy up +rm -f ".ts3_version_numbers_unsorted.tmp" +rm -f ".ts3_version_numbers_sorted.tmp" + +# Checks availablebuild info is available +if [ -z "${availablebuild}" ]; then + fn_print_fail "Checking for update: teamspeak.com" + fn_scriptlog "Checking for update: teamspeak.com" + sleep 1 + fn_print_fail "Checking for update: teamspeak.com: Not returning version info" + fn_scriptlog "Failure! Checking for update: teamspeak.com: Not returning version info" + sleep 2 + exit 1 +else + fn_print_ok "Checking for update: teamspeak.com" + fn_scriptlog "Success! Checking for update: teamspeak.com" + sleep 1 +fi + +# Removes dots so if can compare version numbers +currentbuilddigit=$(echo "${currentbuild}"|tr -cd '[:digit:]') +availablebuilddigit=$(echo "${availablebuild}"|tr -cd '[:digit:]') +if [ "${currentbuilddigit}" -ne "${availablebuilddigit}" ]; then + echo -e "\n" + echo -e "Update available:" + sleep 1 + echo -e " Current build: \e[0;31m${currentbuild} ${architecture}\e[0;39m" + echo -e " Available build: \e[0;32m${availablebuild} ${architecture}\e[0;39m" + echo -e "" + sleep 1 + echo "" + echo -en "Applying update.\r" + sleep 1 + echo -en "Applying update..\r" + sleep 1 + echo -en "Applying update...\r" + sleep 1 + echo -en "\n" + fn_scriptlog "Update available" + fn_scriptlog "Current build: ${currentbuild}" + fn_scriptlog "Available build: ${availablebuild}" + fn_scriptlog "${currentbuild} > ${availablebuild}" + unset updateonstart + info_ts3status.sh + if [ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then + update_dl.sh + command_start.sh + sleep 5 + command_stop.sh + else + command_stop.sh + update_dl.sh + command_start.sh + fi +else + echo -e "\n" + echo -e "No update available:" + echo -e " Current version: \e[0;32m${currentbuild}\e[0;39m" + echo -e " Available version: \e[0;32m${availablebuild}\e[0;39m" + echo -e "" + fn_print_ok_nl "No update available" + fn_scriptlog "Current build: ${currentbuild}" + fn_scriptlog "Available build: ${availablebuild}" +fi +} + +check.sh +fn_print_dots "Checking for update" +if [ "${gamename}" == "Teamspeak 3" ]; then + fn_teamspeak3_check +elif [ "${engine}" == "goldsource" ]||[ "${forceupdate}" == "1" ]; then + # Goldsource servers bypass checks as fn_steamcmdcheck does not work for appid 90 servers. + # forceupdate bypasses checks + tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") + if [ "${tmuxwc}" -eq 1 ]; then + command_stop.sh + update_dl.sh + command_start.sh + else + update_dl.sh + fi +else + fn_logupdaterequest + fn_steamcmdcheck +fi diff --git a/lgsm/functions/update_dl.sh b/lgsm/functions/update_dl.sh new file mode 100644 index 000000000..f23bd2c64 --- /dev/null +++ b/lgsm/functions/update_dl.sh @@ -0,0 +1,83 @@ +#!/bin/bash +# LGSM update_dl.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="020216" + +# Description: Runs a server update. + +local modulename="Update" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +fn_steamcmd_dl(){ +cd "${rootdir}" +cd "steamcmd" + +# Detects if unbuffer command is available. +if [ $(command -v unbuffer) ]; then + unbuffer=unbuffer +fi + +if [ "${engine}" == "goldsource" ]; then + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" +quit| tee -a "${scriptlog}" +else + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" +quit| tee -a "${scriptlog}" +fi + +fix.sh +} + +fn_teamspeak3_dl(){ +cd "${rootdir}" +echo -e "downloading teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2...\c" +fn_scriptlog "Downloading teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" +wget -N /dev/null http://dl.4players.de/ts/releases/${ts3_version_number}/teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2 2>&1 | grep -F HTTP | cut -c45-| uniq +sleep 1 +echo -e "extracting teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2...\c" +fn_scriptlog "Extracting teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" +tar -xf "teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" 2> "${scriptlogdir}/.${servicename}-tar-error.tmp" +local status=$? +if [ ${status} -eq 0 ]; then + echo "OK" +else + echo "FAIL - Exit status ${status}" + fn_scriptlog "Failed to extract - Exit status ${status}" + sleep 1 + cat "${scriptlogdir}/.${servicename}-tar-error.tmp" + cat "${scriptlogdir}/.${servicename}-tar-error.tmp" >> "${scriptlog}" + rm "${scriptlogdir}/.${servicename}-tar-error.tmp" + fn_scriptlog "Failure! Unable to update" + exit ${status} +fi +echo -e "copying to ${filesdir}...\c" +fn_scriptlog "Copying to ${filesdir}" +cp -R "${rootdir}/teamspeak3-server_linux_${ts3arch}/"* "${filesdir}" 2> "${scriptlogdir}/.${servicename}-cp-error.tmp" +local status=$? +if [ ${status} -eq 0 ]; then + echo "OK" +else + echo "FAIL - Exit status ${status}" + fn_scriptlog "Failed to copy - Exit status ${status}" + sleep 1 + cat "${scriptlogdir}/.${servicename}-cp-error.tmp" + cat "${scriptlogdir}/.${servicename}-cp-error.tmp" >> "${scriptlog}" + rm "${scriptlogdir}/.${servicename}-cp-error.tmp" + fn_scriptlog "Failure! Unable to update" + exit ${status} +fi +rm -f teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2 +rm -rf "${rootdir}/teamspeak3-server_linux_${ts3arch}" +} + +check.sh +info_config.sh +fn_print_dots "Updating ${servername}" +sleep 1 +fn_print_ok_nl "Updating ${servername}" +fn_scriptlog "Updating ${servername}" +sleep 1 +if [ "${gamename}" == "Teamspeak 3" ]; then + fn_teamspeak3_dl +else + fn_steamcmd_dl +fi From 97ee2d8d7ad7f7f42779742048cb432aab801ce7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 12 Mar 2016 23:47:41 +0000 Subject: [PATCH 125/434] Working on new glibc fixes --- lgsm/functions/fix_glibc.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 lgsm/functions/fix_glibc.sh diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh new file mode 100644 index 000000000..87b36db72 --- /dev/null +++ b/lgsm/functions/fix_glibc.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# LGSM fix_glibc.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="020116" + +info_glibc.sh + +if [ $(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1) != $glibc_required ]; then + echo "Version $(ldd --version | sed -n '1s/.* //p') is lower than $glibc_required" + if [ ${glibcfix} == "yes" ]; then + export LD_LIBRARY_PATH=:${filesdir}:${filesdir}/bin:{$LD_LIBRARY_PATH} + else + echo "no glibc fix available you need to upgrade bro!!" + fi +else + echo "GLIBC is OK no fix required" +fi \ No newline at end of file From c74e6e5ba9db5864f91cff1c4bf84601fd9fa7f7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 12 Mar 2016 23:47:55 +0000 Subject: [PATCH 126/434] adding glibc fix files --- lgsm/lib/ubuntu12.04/i386/libc.so.6 | Bin 0 -> 1730024 bytes lgsm/lib/ubuntu12.04/i386/libm.so.6 | Bin 0 -> 173576 bytes lgsm/lib/ubuntu12.04/i386/libstdc++.so.6 | Bin 0 -> 905712 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 lgsm/lib/ubuntu12.04/i386/libc.so.6 create mode 100644 lgsm/lib/ubuntu12.04/i386/libm.so.6 create mode 100644 lgsm/lib/ubuntu12.04/i386/libstdc++.so.6 diff --git a/lgsm/lib/ubuntu12.04/i386/libc.so.6 b/lgsm/lib/ubuntu12.04/i386/libc.so.6 new file mode 100644 index 0000000000000000000000000000000000000000..916329be756e318766e3a334bcea3dd59a24a7d4 GIT binary patch literal 1730024 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

;NLPT1x%$1URa`B-Ve+Q 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

^a$$(aFN4?yGmz$;MyXLk+&*aWwas9xEyNm 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%0DchvPHS+D+b#HubQP z=N#swpUR~^WK;W%Jg1+Nek7OryZ?{9F9D3Iy8g~2Ap{7#fT*Y_Q9y}yfvT0It;47= zOsS=yXrlskp|-V!k{Pu8Z4#Ia@_dY?)~@PTTWf2pwYGI@qc#h>8=GNs0Ypg%LfAqQ zS-#)z-1lbQ%$t`C2sEul=jE>FopbKF+d1dnr&2o)4RqEbJgO)Ve#Af}jt}KtH&I`! zFUEBvt=RplorUayG4+gH9{q7XEQp0`3u_~*N>2x?dY^_z9)=lo{4-~M3S^hmYtLn$ zu05A`TH(^rg>ZX6-xqGxO168}dTJZ~M8^s9KAYn1(Y&50tD$U0X)dKGZO}7H7?GsI&%2%;o>0|cb&bAAvmyv1{i_t5&rB@k(oLE;y`vh z_ezilBBfPAPlN8@gJx@le#=X7a~%BDjp;+<5~!0E(9{qxMP6aq4XgLP87~-QwZlsOE~+f znKW5Ax$n0LCoc&Lf0(b$4y0dU1je#bdO}~Hq$LnvL9mL!(6TWCkz~=v~zcpDD9sCA7_rC$ZxfY z{6!G?3vln?%+HG4zb|sn`*e$Y7QQy~%p{q|R=mlS_eqn7RNll3(#?2G-p%#ADbgeC z@(wL@_ROWG(3hAcW+n*z?Vxz(V|K~^J(v;v30gRKpV_*hpD?K`dvM(| z+=Ic2?pzCKfQUAfEUoCJtue;CLdmOP=M0uN42@vtHQo_n(j*`9C$;A?w|6 zeZKmiB_NiDztJda9JXGI?BV$y|30H=A7fi3)@&3tGgd3HgGSN8Ve4NYnOdXrBzG51P=xXUQoMffu%w$~`y%h>G_J75$YV5~@D z9~ng-F*X)42-A__fg>g&y#7AqK&jaqmW4Coc_n7QvT_Z?gA zGsrdkJB^~9e9H$C+hY{%VQihmnv9|*#+FO0)hKFZ>_x=1=lzGZ=Zg*xMZ6mEp@&S= zo<-z_#P+Xv&BWj}V(^*`gU_LG#oK1?+swt1X6jW%rdLES*7aLH|8Zi6kimZ}WDB}2J@lqf@a@^UU?2z)uKFRxgh`2PF( zh7IN$Hn0e`wz2jJGIzU~yPdh)ZMhTW{g%wkL(DES_aPpWnc0Zk5T8GY&oY8rRzG?-%RL{thTj@}u9sMXv|NQG z;4xF$YYD3_saTTu{w+|QRjf7Nu$D!z`Hb;rA#-sqK=`wbx!Y{Hzeld&w??3K60@Xd zIbw;@!>_hm-5ikoiwSOV#o|PK#-mh4t@*}U7Qya1hR-F;#SOxO&j-x?z?OR&at*&V z0{JCoNz-t|?9${#JSI&SBjRYUMFhX7Vo@S~e}m4a;!P8SH(3NKrWk$?Fc-%P1i$y0 z`@SuACiPT)YXo{+VwQCM3NgEMJ%YGM*Uy=eAYBopSd28+OL&uiAz!z!Vqqe_nJ8Sb z#>8k1i$Hr3!*?sz%@w%kSMc4++^x3U#mJ4%b)l}3Z z;=}tpDps3sT+Jfb*2nO7Qreh#?Nf#;_h0(cQbQ0+j2j^ z5+y!Aa(5D!PWenyZ0w^Sx?MUmQC6grdzM7$+=i5t^J67nUs+LU$G>hprFx0==Q`RrUE*4f%*>A!=LZf@u4{Yi~0? z%{cEiouG4lxdtYd**jiEnxVeWZTv*6Bf(Q~`9JP!$;+n|=Pwwrsd~!0Z{FD6Fp=ZR zOMF-vU-a0Dics&s{w~_8@^Xs1g7BjHmc0N1oYM(smK{!k1qT4&bSkgPK6~5t;+uOi|R-#KJg&0r7wcg9mABZFZVQh_5d%~ZF9Bz8Ywk4QY=d75D=qe zunmK;1F#k!e#?4#C}cxD3Pp5oTw#j+3-&PCz~>jl$MbslaK3im2vAECGrNgW%R!2_ zLIaPr7*uDdU|e%4O#pf3`j(c3p=1%f1o%OjdW?d!gHsz7ot|$fp2_!mi(nDL zH?e!<^NJu&C9q}~*>mPynKuRM6koAHKhy^h`w!pbQ_D$VzS>KyX@_cB$$=RJ`92naKq{axG-M71wPg~{;Z zyAcs6blY%bsboh}mas-#esR$kUHn)^d4TwpC=1aw{aE-idGU7+;Ez`@@oVBF#>v!`d&-;9jKSLTh&s2_$jy%los2;Q1e z&yQN@jf)i$84Yt#$eU3=lhVu=)geA5qka!;DT}X!m9YNnt$@7Dv$USyp+QnXM*V$A zQgUZnm5@9*qrL^n858Qh80M_-^7*jphiRlYoplX-h3!BYP4)O6`h(S%HXUi`zkt0i zG2@@em{50M4x!uyDA%!OOaNr1s5nxxj(?s-6^Qxs@>w5{+YWL#h})A~Gx6S?oTm7`4ZEX(trxKmv){rkzHT+9UHEfiJ zr8!k|!8Y;*D2j)Qj`%I=i0j8-W-%?kq8}_i%cd(%u03h8V|_NH5^1*mc1-_hCY#z} z4ACX;4rz&7MJ~s{w=o-!x9})|W}sx-uohTtBlKBRm9+4m5w=y*BBD#T%qc0PHB=_; z_e~JxE~zp7G3_JnlKMI13bZp+F&9bgW)<6mu>{auB$d8g0__!5%tcaPvWm&24X%>P z&vFU0A1Y`rl1gK3eGwkuqxlcxUx|!==e9Hc)eN!5zx>4U?@!3U`1eB@{{ZD$4uJG6 z?~Qd;AAW{o4Ax>vgWMn5%}gctWztM_4+k^Ln3_V) zv`Ekz?qmR^-D(0-+=cE+tNf=Jpvj}ZD(^B*_O{9&SXef%5=<22Q?K>P|A8;LFzlb4r7;SM^$T+)J#@Wj;OmLVi?gx9^g>8

|FMMBJ87aw0$F>`z^N*-Uw&_)NRo798s+vs-IAWNfW!XR6T1e)(6G4ox@ z9x%fi_=*@{5BM4a?ma-PbzDc#04+V>Tvgts2lQewmT$!XCOu#`0)X$*1Gcaj%hNmu z>a}uy%m(FMdcfbT^1qVuuoM1Rm3Qd@bFA{;mhvzhenXXa=>g-d^24P(dcY7>-lYee zhur!ec!2%!f9kvh&vaZ;7lvVUc1?C)jNG_@0?uv0Z|RG}A81-+E-GN%hhcR1Ez5?} zPrAGtx(_yKwQ#cx_N?dlEBh~ej^#?60kAfqr?JNJOiaA@SE|zj@N=sSu8(Gasc=Pj zVPDy5Qf|#~{gV&j`U}KaZ`E+5Mzed|P`D!I|EVwf7dI^Eh~*d4|2h0V_YYq|dGXLC zdW8qLtek@8Mb1_Egj6})^G5hce(5cANF0S6&I$7ABb}Pw2S&s}T}48nsUMnw)${OM zUdf!%=LNozk&VL(n};ophM>3*Gw;H_y5-Mac2_<`qXF#Y_FnHjpl-`gaXTF6c2ti4 zlkdsmgbHsLxTLNp?9#Jq?mrV8$7gZMhGzt?hs*gUEi@fSbmc2eZtn*KeGi<>8hb)63w=&;U{m@HD_>DbOb&TJug6lnvF=jt=KCwa6+`OpOnf_*suUT4Jw-rmV-vx(DUq#L$<1(ztwSmcYlpqA{pdQ>jE>H)|1|%~ z`IoX;MDj<0hqNRyAD{|9J^ zvUweb^?6`g*M>Q`0MTj<#X=Mo35UxY+%0<*uGL=~_C{$>#wv#cH8jk9H<3qmqRN5Z zL-FlW8{cmJ4fw_@JuFtqUv&JKe?iseOyF=6)-aXf7Vn+6!n0t;XD5g${q`Ukw+wa; z$1|0FM^S_+}9y@{__JU__u%i`Wa0{gVc^%8C#5om_}UBU-P1P+=uZfY=X^Cue6#a>JmAahgOix--?sqMwTM=rGA z@wd|dNv3f^Ol^OhfgJFQ`@I_@r=8DivE1= z_9=FKi~IDBf(<~p|GI>2xV(gfg#97$sl?;B*&`qgp(2G#XuQHB6tJ~L=!*&OSN4bz zT|?)?8Zjb}9XbcLh!KI@&}pzlj0oh3)P%ak_@^ulrMc)TB9Ao-68}x0*hOP4_kE zzFoR+ukJgb`#zfII|77cyw!bMbl(TMZ@cc>sr&Zmz9!w*I#u@_Htm19Z?o=uU-#AP zz7KWZZr!(E_q8DZkieL_fP=?@Y8)TT2;yK=X(oo)Esa>u7OwEXFSw*~c1s!Ziu=@^ zCN%7w7^gwrUw3#KX)8SiQ{sa`NE&=K!XJ_7_a$R0GDaBOEok8dNS<9!cn1$+$V!^_7wKBn+7J$gT@%((OzDi!~1b`>kvT`$O78pq!9ztQ^KTSikspL;9u zC;kep(3g*20e*w=^WrxSzbW`lpIuFuCTCu*JNP|vVEwf*&J?bXx33AU)Qeol1Jm@ro%?J|5=d&wRYZ2h^LTJ~$ke`aXc2|g7OZmVux71fR zRjc(iTm7FY_wey^KK{VR^L#Af1IC(C-!_&%poWZ@8BCeW$ItlqJs;2U0Vn!W9~?YN zeemO`^);zR;P_DLi}3MNJ|5%aSw0r=0f&oHAN(q6efwjLkR+chQO?H$eEg1&XZTpi z2W%>(zOAf}fe(#>Zo`x?A3x#aQ9l082ez)IKIpYeeebb6213;+Oqs*S{e1kEkH7Iz z%?BI?N_|^c9s{GeW@7^1H0S>Q>DKG^5nL{%wvHPfUo77N($^`}>sh0bY_D z8_!eE2dW6Z8{sw|m@wL!4^)vve5PvOL;s&%nPE;6{ZdU56m%2+*nIK9w@Bv|HagXO z@w%jcwYy`!cvdn#kBkm5UknmtBI9GNWQ`ZcVZM0vc5p|V|GRi7E&lC}4VU@v@kc}BOXdgt(x%<%TiVCKBela)Bc>;aU=|Bc5f*6)f> z{~M2O>wCqL#QsnD`QLa9CZxR|P+YXetwKmqa^+`M9DQYCHN7`TCCh8ylrw{p`KIA`HA7a;lV>C3^ zqt)wT>ro~uEy&>F&kS8Lqqo?o7Q*prcFnl~>7hs7t9wS`D^-t$j$HaHOamF$>1&~s zo(Qe9ezkFmq^qooBiu5U9J1>30Gx2@dhm;%om zo>ouu(wcueu) zar-ztrcc4+uIbUTG89f&!v;{LlqYgai%_NXW>hKtHma1)K$X&2rjot*|AkvBqdIHf z{aJv@2-l;ayiZobgfh(wC^*a;t|Sc6+Xry0zzcK7jI&f7DS)dd@Yk#st}cKV!i=6U z-$@Z#XG=5Dq9O_ZgdKTy&FOxV0jlLydue^c$chsgMMi9h-uucdY^nVK* z{*G%KX4kA3ZL&f1&9iGV5RZC~XoGTx9D%e_fG2_OYfNdKcH>a88(Puf8t+gVuC4Sy zaKYYdhHt|2#^H@K20P0`zipLYlU%;|5mPv$S9bPH7MYCgFJ{+FA4Pl)r-e_Z;FFm) zK2m;7a(O#GnGSq5T}6BjrG-zH;FFa$K2m;7a(O#GSq^;02|fqY!Y5ns$xa&|DZeJU zyd9rx2R@Zol0P4%g-<8Jr&HSaNclC%zQc6@Ri z_&jn2`O}gXKAi=h&S~Q#<<}&ax8u{n$p6jtKic$ZG5Esn&k3!e7ZXDnIib?PYa)J zf={=!@saXtlFQri>E^&^g_r!r_%#13O;+&!l%37(>-l` zr2LxX@^*Z>JMek>a`I@X-VxEp2?H{F>zQ zc6_uXeD-Q3UYKQTeK?_B;)TJy)&~cu67N=qa4x;XyMrOPJ(YO(F|-f9HG1Hn(t=FI z{VFA1n5k=hxIv-Biv>un4@;I3uUM^dZ$gQ;k!g(#H8a$#YFhR+-g@B$z>i=MRym3K zDb|A-xYmag>m^`>-B=o|}T zYoo*~R%e_`FY#_?8gAGq@$O-056+(JfmWV5pQ;BAn+VOc?58XTGkmQNH!hTT;Sf>l z!`&|>Ua`vKo`n+cPNwZ-sEMJbL`Y1B*}B$;6X+#gI2hFWaMwnOSFG4LcV6PHXBuwU zDDm!QXgBWF&;u=UrW}_W04KTz#n56onE7jc@VhPX!r`LUhr3=%yzeuFdlgE&A2ReI zL;D%ppAu4R{fLz)u`4({t!DAYw5Dp@I zUn<$N=n*#_Jf=}r;n0&Pp^5#OrNqqwk7<-rI9w2Z`?9IXVl8o_!DAX_8xA#XNb~}h z61NpRrcsLFz{2;nA-kqHD*sp361O8frcw6cfRs|=O)^{PE| zDREQ6V;aX=I4s#mSm;A?quzY(0^!otH99_jQdH;t1(T^M!B6hv8dreO^@H)4;>F|k zad=Fhf=9A$K-|W-tKUZ5z&7dzwox~*jk&rzb1A)xg zz-Q`zSz;hd3}onRhR$Z_READv2y2j9Uw4ME8>;nnGW;GLH)}qZJI_Kx1}Yo8b6M_O z);NQqGZ^a0P)~-iCa(2$VF* z)|X@WGj-hQ`8=)|O+?7lhn0BGW4ZHK<4lImWT+QIy%@rpxYpN|A+&9+F9DL8?=N8b z1uW5zA-D*Ycu!{tcXO6_u?DI2X$)aERO{<(__K7}Ci=YJgSiIOWy~{~F8U6Z>(6ri z8G=5k)^`>|r!aI1Ls%2n`noZM-FdAq6(p#ytbb@vQy=-ch3)7gFS&}s*V7Wdx&ace z8fFP&Tl&c6D_Qpkb#{H^?3g}sgXCT&kp2VokrxTNOD{7CuRBZP4{iIz=p!$@g00#4 z^9e2g$Ccfr z9Y-HoAoz3~edK~6r-==;s1^$p1Iosu`U$l`y_%8az z*!v+ra#pH6eIhFmUfcRZd3mh=usq~R&X&3B52cQD3zm1&A6oB+e976YH1&n7mY|{&XPyqu}$Ou76a1BuXE4boxhC(^~J_ z^-C%z(SM5jmye;3G(lpcYTNG~lRnZ!oA`VjeWZy{On*dp$EJ@|kXZjX=p$oj5#Gnr zM=D4O`Y6c9|NJ3MeJ}NGF8WHvxupF&%crZqG#gPVQcQVg{kHX)s+QFsS-yRJruimx zE0%ZDXS(5Yl={sCFnnKH`c0E8mQP#1X}-y>KVtoM^qUU++S6~^Uqkq*^_!~Hf46?~ zH|KB%eE1Yg5%6*Jn{j*C(dsi%GhsabSo%x=v&#?1(__?U3Rki<8?b$WGElG{dZ@80q=Eej3hEhiG z%Oa?gauVr9M}VxAVh7|Ni6clP1?~JcEpQp{K=&S0q06 zrJM|-g8E$jaMjK%+yajqm_7u~>fCzVe?CJSazjVsUwT|ZbGG{vh8x_z8BX!;aw zP_jFFX{J^fz`d>Gac^r8?rpsp_qKi;_qNW!y{$1n_9xYiOK9R5pT+cYa?ZGe4Qu+4 z4S&tI26Gt(hgNIl&D|`bwLWF)w0oI4?LJ4v<}gN7k25D0{F^wj{B&~S4_X2zl)Yzm z%>pEc>pXHEPKKkCaNa#!C6_UzJnx<%_++Mq4?N^?{yzEqy8HQiDWBrJdmJC>Rd-n}x9{K-iRAIv?#C;9xkJ3dlA#d-HQKF;&* zg9V??Y2kwt8^9;|{JJ|nQa;6b_c%Vz^X`vyBY$$!!Utz{fKT%Ib$5KEe2Vk#aeSQT z-SY*XE@|N-=hs&zpI>*!N6M!-?;gj;dEULOEBVtkEqvts`pV?<>+bkS`4s2f1UtgJge%&1(DWBrJdmJC< zdH1I~lRsKo_~7gqNPX2kH#}4n2TVn2ma%5nq^}t%g zzflitH2m-Cfp-o6dwSqK!@o@rY%}}~dH|=4cjaex9EW_hW`US@PXmqt_N_+cc&iMiLavT0h~c^(gRJY z&ixwxm3m;M;eS&PylME?>w)!#|7|_+w&CBb2R0l2_w~U0hQD49;FRr$df-ERwOkM2 z4EcUNu)mFSx3T>o_B%LhsSdB=LpZnr3RgmL5xf^G|4C};KRIz3%qgsI#i3KTv#n9vN;t*)j>p;7H}kmY{ad!R=v8V+eX;F^*T;fq@rKu)vI*`SUYu#( z^NKH!<;?3m$-L_|L4RWS2kC)9hJSz_7-0Ad^gw~(@2dy;8vZ_dppW72tp|D={(L=< zkMEi2fjoTOL=WWRTPJ$Jeo{83-!c4!dZ5to57Yw#4ga}%;9SFhwjMa!@SmXv&M^F^ z>VZ=Ye@{Ko)9`oK1KkaO7d_C$@ORP!DNer5#Ft<$)C2gw`}ukRUsyR$51eQC&(Q<; z%F3B~;7r4RnjXNHR(k1yUWUJi9_V5CyXt|ihCfFSq&T@c74m+O9=OQxU!VsrF#P@X zK!3yEPY?7n{AcNbvkd>~df;@!e~KPB#qeu-Kr{T^^guVm-&qg1pFFi~@ZM{qzOIb_xRceuvcID+rSR8UDrLt!W#8ZbHMYP1ljL?5NdE!*`;WSi z@Lyz^gx57l{Ek0=!uI$3a;5z<6WX6cTiqvZf4{vmIdP9CffLsLemasn(*Ax^2Jz`Q z`}=W%PsiEcS02d(e>%?oez4%varXC*943D{&i+1M@aZ`F`?5piPsiEcHy$KD9cO<( zMeyl3`}-9ikv|=0fA1B1I?n$7=~nWmo&P%S`+31LZcoPk<`cS~?{w%e7P-G|$}~T*dyM;e>-3Om?>rv+`4~tv z({bF-$H3bCH;(82KIsMGk8uL_`_^k@*B{^S_nPI{@8i7I*;@HW*uKHCugy6d7dpj{ zYyAyA2sHSgEyuME;H&hrYp$`R!LIL0x&N2qWB#9g{~x#S|4DL}2(bTz{eKH-zka{j z6Y3fye#gU~wEcfG+3>Y})`0NIweN2~Ku(O_o4^Tc|34VX9clmn$R6U;arXcDf=|cU z|CjA1e>%?ozp;_{be#SF6v3zC?EhEnB7Zv0{@*M3be#SF(>uwZjOPxV9Hy9Ev-bm&HP(3Q;vez2lrD_g^&{Vi-KTx8V}0LmV;xC%>6HeSJ}!)P2#oFCgLmY=E$xH;8}lk@CR%KGM8DTfneXieeK^jlXxGr+kG?E`;YQ|86X5fwB47J*8MWJ z`+U;AUj}tZZ#(zNIPhujJ{f5!8~&;9lTl#l&-CB>eZ8-(;|}zDZ(1AiW4%u%E^i!9 zaEV6R-`4||9pmFM-zNh!`2J(KKPH9->mU35G3t8|$8ui`5HQaN9f$j^ZQ~W``55=b zIOfw6bzjVqHz|p~TVqOM%wOui?Y@{~eW~4_><~Q2On)+{OYcwcC;P)1^5;qie_ZsX zcS-S=p8-#ponOE@n@9`(Ic7Cb#p~vk!nW=v{e&@-6H`GAK{XAKW9ZH}0$vsc@ z>|!o*$1k=Pxk^oPRQJQ6%|EWc7@8wNKXaVUkHx?quk&J-*c|8cVX5>VC(vK4Y9ZTv z(ju$P|NH#K;3k$$cQNg`+@W2y$XDbWXSnqDY6P_B{GOo!j~2PiN*$_FGlvE;waB?v z>UkwdjYQ8cs1d=iMaHsD!f_4b-qKE4rv{-5qIB~ z{|0V|cjkm&DY*ZhH=?Cl;Tz#2xh0>HQWUq zK9Z@GV{MIqM=Spw?&S?1$q1Gv-M9ZTiGh+HWRiFx6}JcqsV%E_uHIF6Sbsx{+}JZC zqXI~0{DTjcHHQ^c&9hjPXI0!id#B=2UsMZMyI8@md=#T5T0e4sBY{639 zfo*~>UI&DVH+t%KKmhFcyYdHD^EvsmM~m?4Yyh?MCo?)L^Jw{ln`;xqJjS1|Q$pM3 zk89nt<8__N@$;+%|szw0L7y{gVKZ7JqQ{rISDVw8$I)Na9a+bXNA!@&`BjrsmHX zaT?wFmuua(IRv`#r?GAR0BG^X?E3itkrsb&RjHFd`?bi;0FcC=PSIJNj+Q^TX*e~1 zT6h}0ZTWGn`%=8FQ+_tJ%^v_Q-q@-B4uD9DKNw1#{Ato6J^)DKPfm1J&e8G*Hy@|w z&-$+I^2fFA!|}RK{#3Tj9{?@hm{UI%AkyLwt^#)Q=YSSD4*-(*(>XdT_h|Wpo0wDc z=O0`bv@Jibb$=MI>*P-v`BR{l1+h8oW*j{**%9*>;rw5`4lgO**txzhK&HhnPW+Df zzFCXx!SW`FU%AJ?FKbQWnD2EipW5b^Yu&HJ>pJCVT@4zB1Eq<{P9sFv+ z{0{(0{OS^&)#YgAi{fiv=EmoLt}@%^muua#<8@Q;>u{UvBLFSl*ronetZmcc4+jAU ze_ApB13(ggx<+SpJzD;7_)E#3VO)H-%^%mghqzu>byM)?V4M5_(Bh3<>z@ROwD`kG z#KE7BF#iKU5`VfyXLUPT{&4zC$)7XgG`h|Iu65teZi_$7ZSn^|i#K+wpAQge@rR2L z2Y(J?{s(|0{^Uhx>T$IE;r1^jfBwOZecSwTt^31x-4y((Y?D6#TD-AG{igsTE&g~? z@#lyZ$pnBT{%Fxz+R^fd>VuU0`6cuf?eNE?Zs;3ky@q?^{;haTjoRO5l(oqp04?6A zHE2ot7Sw;mRIltlP^-Ti-qtUAx7O%s^(;M5Qvh6p-S4;aQ{O#l@(tz7wDL!h*Hq;R zeWs}@Gc>HJDm!##Q&n#0t4&q;p`xa$g3xVERo>8a=*l{4&-pqRF0GOCXwcJX&t)QJ z>T9T@L%t`T@6SY>CCu{vEX1>H@odDiZE@UQ?(1ZW=OCVA#i3?{vaM;6ClqN~lo?vk zv?x3DVAG=9(C?cT<%j;-w5TBTV$&jTXo(F`JH0PJ95U|AJg}~2NM#Lz*Fxc#%S*kC zI|k&359MofhWEi2rV=%I*Cc83u2iembTxUOJ`EyrC_nn$Ms4mJrz6~!R_{ULms+bg zj;c&*^|nzpNUdH8^;tEAZE-2LPtbbYUx&8hYWuKFxDecv2_v|;uI!7OQja3}y_$TIzb zvBuDT^m7nqBA%8Gu#=69SHKzDc=6Svf%6ho%_cj-aX9tge+F@51!yu#jJT>0y!FFX$bZ2Wx-q!;c_;;%!2m>z#!^?;ADKbU;^ z4tX7)uTt^X70yjIIQ`>rQu9~zi{NjM^!RJ)8+V|`ro~@3ePcBM*!X)l*zMr2Ljjo{ ze_i#6S8$*fxJ%;T+;9Wx}Z;uN9os{1yEq_}e`_{^F(7SI);P(&De1zVc=O zu<^Gq&~)(Ep}G=`SJvL-8O$+;XG`Eb4wgfYW|9T6a39fkH2^+^_`!> zE7IaGH(iePD)gP10ASf5>Lckmbb(%%ArjlVa7-46ab6sYO(*HsTXkUDsizYU4@id5sT zD;&|sn{XbD!%59w(XWEPUDM;Qsc*d_U46ZqzSRc+HvS$2=??xn6tL;>*Hw?Yh^si0 zF9vztw*0!n`JoLC*N1J6ze+zFKGa3=*S3Zji8X|EAB(wsiRowa@QSp?2RHrf7A#b4 z{Cx=QcJSAsuuYG@u6ozoxHvZXdl6pP4u4(YoNa^i9(mo?{HFA|;X}FU@z>PnKAEom z+fAQ42LNpR{Q}T*@YkW>O^?5>dfHChbC~>ng*<9oeqG_bME$r4Cme^9dVI*B{Yu^iPU-O%FBN@sy83!9A|2}o>Z1X`#^1g`)4^Ydf;v6^y6TzV zr{cln%M*$Aj#TRhS2z#b;M@|2bVEvofdx^$fLH$2Uj?6Q{85^)1z@XF8r-j{LM^{zotI@ z4!j~Q`E}E$`vAbkUwn+n$zO+pJw5(v=rSpF?2DkNviM?<*KPCH70wTBaIT2Map7;7 z;;$z?{^F&_RUdyb_)LBL)zrs-3;K910)&v1t3{}PgkD~YJSBkwEkX`KKd(jJLI7(X zZSGXmkL$p1vh?%eLmArKfaEE~J#s`5Yw0%+d9=9~s=B5kA0=$z{uMqP!KAk?chN!8VeJc7rTEXW}g7m(<;9I8Res_>!A;A=>s&vNLmNU01T$_iGH zUGP^9{TeAxg%4#1|A-X&Du<#-c?ipZ;Lnkw{FLtmwn&|e#aD1PQk9?bHzZXnzXN|M z0_C?LfL!ITe1(}ylEEIWoSI3-iGRD!0qfKo>27&ofGHFUf_K zfhcOhAM!15vU6 zn^5<|pVEi^@KBr%4?m7Vw{a%R$T0BVfif>78~?-o`V{~EBMto*h-oMxqjmKDBNOT_ z6DThbifKSfv>9plJOnU_b|dYcc}R1!9ZjppUb+>(zdz)|mu0kDpLkOJtuX)Yo~mu! zY0KY(_+k8>cu~qVyoPXv8OD`02}5bjt9-(F7$3y`blt>nXC%6n)2WspX~p=}M~0#QsFR4!z2^ zaDz2Ti`;{^S9d9I3PKLJw4NQOy5j#Ip`nw-@iE^xG;XnT#gaY*2{KNAGv}ZrN0Iiw8 zxGk0s{c%S*B?|{qkYj6zw(NN)2cMsw6T_!|BZef~e2acu z`VQ;C<4&AIK5%}Z1_&j~M|<`^7x}=F|G1-^Qa(Cyd~07mP8vR;zA=2<<->8_AyGbn ztekhih@F;vU_W-;neC7doS%3U2qnu$d-h8g`M{R@xTBm>KHfhw)*fy71DrH`u8rg4 zE+3Bb9*Ob+WaYfa8EMJ~^dZNc*$(-@`H?UXN|ulI?5{5J0hQNrM>(Z@EaGaY{qf_Z z;d5ymA9wk1oOel-57YiTAO1^ejUUiQ9(QItpS3<5B$@0;j z{o6%8VDdTcD5sQ7; zY0C?cm-B8=FQp|fC!%vW&$V%U z+}9@=2Vu{1mk%H-=N-GIIewgo#koU1aDI}0PRa7oo_~vre4L0aSxWg>6!#r!OFm8- zK9|PvX+u7m+msK>zXt9zd^ebz3y}GGQ`2ezV-Zx$Uu@hljaL5PF5BCQ`$@0;jf0T=SoCuRrO8K}g?i3j^#2$g>9&fRbRh z`{U=;_1)ox*^?&IcW4N>PLH**^jQ0*c&wG6xOlAnR043cdQt-LSfgW(c&u$efL=;C z<=xqsZ|s=Ydc-IX^H1T@8*0?~a%Z}A{sc9}P0d+C^&;epn_3(B;-=O{zPPEikuPp) zZRCranp=MCJi8X@38yOYQyU}!_^Dkk0k~&PlmOWGT?rI~=Fv~>QFpe*{Ly0mYG|e# zYHn~iL`|ss?sWP??L4I&f2h6vEq|!|L`SI&$e2)ffk1g2PQ-@?f~QnBahZY--QQ@Gqo>r@VSUlcv#9fz`!}gfrKi-_s3oJPR5Onx(NpTz*bB=2 zo1?Jk7f-1VEl;TjEKjKs=!G`_k(ZtKZ=NiFsb&2WJcWCmPfy`w2P%wPC)s~$5YV#P zxP1=f+ul76`D< z#Scm+w>A2flk59cXv3|PqF}D;YiNm>iSZ}F->M+_{)ETk28(}z5-yFDy#nho-nV*3 zL7MBg6R|jTtncA}bp;Tz$JeB;VMt2f7h#6exxN& zCqnt=kSF+e(f`jTPxN1P%9F$4D=m3C5h~b}^7JPC@60y4h_coG_;k{68)n1pM>aoF zhdiae55!fTOn}w_n0P&%$jNWy@_nF8*bZr^NeS zT;<91H{<n>G?ME*2-ATi(g}!qpZeNY#=A7@8zgnvM zd{WAj>96($fKN-FPDBTC$P@h4P60wTdAbqe<&-Cf16x}1bRve>l=5^HHK%5qJs9^* zZELB98+w9A6-_^F{>7?QIbsKJfiTiD)7@z3>R*-yOldC+L{%{Y$ zwJt4rIuRQXhdjX_t{4c}r_A$Wx<|r^NfXT;<91w>#L;{Owi)A)7q$ zdqqxpaya0nB~K?p#h+51I)MhO&2FGC zlj)!LWJmMQ3j-mWJn?%)PI+=T?4>17C&C1oQl6frbAs7s-6&h_%hO52?F<`k(08dHa2NcglTvzl8cz{17W806)ZS524&Rep&0aI*xwp?i2|-eqkxo!KmQe?*|NK)gq9qF(*z$Q&kRG5jJkFxirKnbZGybw&%fGIQ!y$A=OmgCoN1DYs zLgG$7t^7h&9L+i-%L%=gSv*^c!#nSzSgX#+b{2mRx%85K6MwO3(#n+(vr%Vsau$Ea zEdF~b4sXDR5deG9rZaM!#Up0%JEb`8Tl=0W4zJo7F|XP9hcx2QKSco z^l%g@M3H`Q1q+^uA{vTljv_geM2bbe|A|gpC&q?!eZ|BSKX9Ge|(8O)0Vi!Tqi zcxHB;;92fjT3-P5@{Dut%^lt~*eBLclE$-GM=|f~oG|gaz1p-s_+{!#^jf&Dt;2O; ztD~j)v$xarGddFk?!!>J>8;@{+K{z{wVsvw9t3fjBKS6>Hr$$9JSyA@57gOYXe)Zv z^=#%=^p~$vv|G^=MsXr*g^Yg@%Y|?&r1ugom0BT}7hyeDe?AuC7@J!mNoR4t&xY+T1sB!8yQGL}iuK3H*F)M~tYJ;$Z z3ToP*i8!1>hjWP-E9IkC( zbTUa^uUeBBSit`QHj(6OhIl}81KQT+@2f~0g{s4~973VpKmnbUAA`D15xyFEBz%&W z#U~B+Sfo!IHJB-*3Rq(_Urv0;3EnEXaa{r%3V{!?B(Ov_XbG5(1f~nz=!d(Toqk4L z>8FZY=+7kmWVP*nT4`dFenPR+AA{;bf2MZN#(oY_{&`&6K`eRUC=+AP{&l>I04}4tcPr!5}FmOMRDjJnc~(L>RnP5Q}W z7y1dsPJaxl3;o#+`dOo0`hkxN{Rx=JCT0!*oA&VvC|)e z>Oy}f2mP$kF8#pAh5iIgM*>q<`eBZ;)6b|Y{g_x3{W+wcJa(a_R`G*y)c!b)mnDgMQX%mww>mLVp6LBY~+a{V+G$>1WiH zek?r|{ar~vdF(lXqSHA<3fJ|rXzu=EB!E!+39E0m42$IW&P8Q z^pnRf^b?Am{uopj`nx&kXN`902R<(JCtx}fn7YyrbB>*UMqTO0W<=4SNBYTQ7y1ds zPJaxl3;lTx`dOo0`hkxN{RxV@(;tKCLVphj{jAY0 z{lLeC{sc@%0#jG|vG=pLKclYnW1p_**GNBk>_R`G*y)c!b)jE#(9are(;xbDD%wM* z$1xlO3}gFW6kb2Ofg9{#Zggg2w6sy*;8|S03g4p!SxwcR(5IWKGebk0sfq;ZtpeQ*5Jtf=%MTvZWy9J7p$D|At zC1X*heivo_ne)Lg6zfBH`C9oxYHeD2YUSUNvb~^z5qPI)8+LDFJ(@}H@~IK zXLUq2L8aaR1(kXO6jXde{YpIKdkNu|LBTQMmO`z(QQmW* zR{nE&&qZ4K)dJ*G!L!0GpVrE&CI2&8`L~c?KLB~`W`=)_QM6{*dM)xdq!|8nM$tOP zekZZFjH0&~`RG-8z-@S zM$taTd=hImikca_L}CYxqJzWMzW_|}#gcQ8bVE&&{>$*MHi}lWMyAwQYZR?zY#)d+ z{2Ps;jf{ODv3HH4cNtqJvG?5P-BgSST22JXb;ejJ2^311w$MCN*idM1Ac&Slq6xA|zrNlNE zMH?9Vyu{uyir!&tki@naMOzpZWL{2>@XN*_;(sbI~k({82&v* z(H_RONUX^yYGQ1S#9ED_R>l@1rakXJtUX_Jcqrnvhz~tvqP`4~nAyqjuQZBQvd;Yi z;Z39HO~%S4w%#aOKWu$ymf?TfD0&;A>4tx^QM4JMsfPc3qv(BvZZ!P$Mo~RN;|>3Z zM$v}|`3?VWqi8omUo!mrjiUVsU1IoKjG`8VE(C6efZL&=$e)UYVcK)vBg1`)xuJ`0 zh<~35CHk_&=~ealRSo%wc1JXRpT`Yx#WOGlf36vjJ*2X1IP}9c5TLSI9)y-iC=;P7 z31uNvA)#!9o|RB1g#IF-9EAQTq0R_BDxqA29+prSgnllet_b~DLfsJJcfQJIs8@RjhL`F8?QjxvdF5a7wYf%kO3rPFSi!T)?KU2 zYigvvI?u7M-O0vU>s-!rqP)P!u(6sQTO6$CXHYh_IazjVsUwO&>f} z+W>{{2G|ugtUx8`c-IR1yg`~8uCFwiG-hzy*`+t+O|5VQYw}mS^TiGvO0J<{f?Js*@ z3!cFVc^oI?uW~}ZI$YV!EXG-RG-u^eoRzN%S89p%!n+*9pHI{5s>8 zi(eP~y5iRjzdZc94s6 zi*;C#ECf3#Zfh%7x2|rER0hxSya8K+ImZED()dj~!|j+(2^{{$3sOOfREB=Qa$Zi$ zOY&WcOk|O>+bnW1i?pIcxkJfk5m~V;$*-RVGZ*6Jqao(zdZfHkEB^)Cr3$SZ`r5oV z(L7p&D~HF?6S@kawfnN;GiTRz1bTbT^_1Fy)oOv83?<@Q|cE#J?!@JN|_Q{z?7?e$VhPuzHbyfy+Yt z6?P@bkKpq>G6jv7B>-@XBmj7?N&o;?O8^izNB|%=BcRB$`A0PA0rBFDc$VDc&O?KBRK8^lQ*A|Jvx^Fx?K8 zE`Dbb%&+$Ty`23UeFz=1Ut}4+H^}w;w#JDQhHPvoF$K}I-!hxul$|(1uh9>qP{U0o zd)4@cVMNA{T^r4A4fC#yAsmV;S8rckr`~fq`{f(x-SUz%V*4#7FO_7yCVGh$8$YCn z3m`$ZOI7G=*0|x!`n-D<#(71$qgL<%kY5nl7|hex=?89@RKF5}zTk#QEic=m1uunfktwhAFA{m>S1~EC;Z0ibr+5Xu9uoO0pUGT; zB2870?bjs$*?tp&ft-r9@*=zxRr$S5pfzu2*#}y1m^i{zvNS&&DfJiOU93Ow2<&)T zd4E+6hbj{M*_#%jFG+t}g!f5*TZH$qzu_B;thgPU7rc*B#{JAD7~I#Yq^FS--h|!E z5*2?$;&A5Reg{<+NW7m`{s$E=llbLWKS{iySm2dv<@c!gEr<`~?oBHXsg$oR7#7K4=UTHZ26ON~FtJ z`3DIA+rF}RwKP3eLlJAd>J_wMbcPI4k=;%F3@x4j${Ymkrr1*iP zcuP{eH7Wj4Qv6U-{BTnINJ3nCi*3C1yrHi|pSWH1i6PP_mXd1ri8mww_H%!NKA}Z! zLOT&eY&>YUKSVAxtEgcp-Tn~Sdq}-0ssFayA0q!WE2{UgKScguC9!{G;d{6CcxNqg zk3HTG^S?cQxfc1RJzlCsu8YT2e~4UVra+$AA0n5=+$*80Vo4`k4ldR#@~hCtMej&JlV*X~=7=>&C6es1?_a}Qt)FvsbtAy}QN zmyJ}Z^sEW4jE=#dwbcYwsM04FAbq_`uVH#mmHtgkdcn;qeIe6Z*w;$EVZJGv@=a?| z0`GUc>0c_{@h0|nly|)8N9s*_OL$u)_~=;z2wSDS*8kcS+9BC zz=|y(tKDFKF5J2S7mj?V@GrXJS@;_r%|(#(Vy@l#FslIHBj#VP(qE{hF6N*2xu3!K z2T;tHWgGqPWFY(u082}``?Sw7qfF?$N@USvBO zCPxYspgmOqM+?1=mI${FhO4X;08^AeR8b%}9?7_c^{kG;T2Ze2YoqP17fA|9X4-b3GvKuh#E)71tBt?Rnaq{RoI4$gV}@;|*$kk5?>`g1CE=>wC3`SNosj z_6Tp!)aJ0iNyD%|WodJME^#d68SkXcxkut?7{+sE{9kl57wsa?;q9Ggd?z}Zi*_^K zWyTHB(Ok5f@vbwz939O?yBY5`V?=Z`7wu-e`;3dCquD5CyvK~QqNBM;H{;rjZqd

FRQ4z}O9ymnN^&h@Y}a=i7R<4;+JA=V=UF1oIamz2=OklJv)S6|A7 zV;)2|IzGR!I=s12jVIhsqFapQNEfR!M|Fj-6(A9i)mZsOmH731BvSh!17)46elF5B zBTWX$Yt$QMxMKfzfbX9Q{5z^-B6wXTo?(CGex#9_%Q2vV9&dEKH@vyBuzCTglz09P z9K$<3_P2E*eT{8lI$gD+Vm%$D~m61kr>K}lu!2`GjrUDn#F z@~v9rX%v#Rp%$TkGS`RQK_&YP@ns)+8-MksHu=YR6>cq6+skR6iB{$`R& z|74PS9!UhLT}@K=ARVM8t&gH(3Rpj4)elW#-46%@b-CXln<)Awo5l=Q9l?Bm8td-_ z{<^NeM`p{mIgR!A$Xr`{wYB~pnFpQ5NRQcb&GCO^W>P#+-xnR(DJefEDIQY*a`liA z9oZ!*ziU$5(ga%X@1B(3BPkwJ5GwfNE7?BO?ao_RwzW}4{6)cHJWHD|^VdiS7UP|? z`7(b|uo%y|`~RXNAygK;&Ub$&Iub%<#k<^ng9w!s?|S!_qaz_yR=nHYBcdZAR93wE z-4{hiLa3~GkGs!`j)YKIaqaGI(UA};6;B?2=5ckJ`%iE?WA&Esc8|{ars~`koTUn6 zQ(*~`(g%rZxjH}iyzD5Js;va{=+9p_@AZsY*gwj4=HE$OJS_k%tB-h=&RZFWe(u`H zk>HKmOGi9dmdW}RcVgjCKMT~n`qf8Jxt~-X{Gn$lX5`@c8Hh%& z9GZ`aMW5UJEC@r{MAdkF3)GJ%7w`^}EnA=;f)$vJ!&@2~`m?>D|Ju?BEMtY#euwgj zVhgOC_~Ldra*#S+s8Xv^+17A8MtTv(^Mq{;$7iJ9JQ(TrZ4Jk3Ory>hDBFzl1y!h! z>IHvP>5doh`~~OfEtNKXrFxwJ7gQBq;7-CE9pA=O13}rwEXFiX9?CXm7((VY<})#r zkY;XU&IGss=#_1Z*>Gn6^(;@?<dx1G{5+g z<`*C4H8m2e@!Xd*zxa~o7awM~gz`!Ai!W(@@#Q6zPnutRiSrBkKS+uHqkZ){<8CZn zci~{*)t$IP5o;^Gg_O1R2UyRR!D|4{6%xuqXc|IN<8IU_o0W~EZ%8K1t~W}EX4mT^ zM6>I7tHOg)As0zkN@f>?E|*YOgoaCq_SZ|T3jdS}G{jyYnKZ?BUldiS_Hj{W+J}|Qbr89v5tyX!0wOO3b1Srm-b)}g^WwikP zt`jIHvm~Huv7P{wgGCaiB}me%!&@!~n>SUO{ZZc18E;A3koy|IUSA24Xze}*L+)3U zA@_V3ak~oQgl6W@qIb}W z{lG5j2fT6pz%J?sym9@&F6sxoas9w9>Ib}W{lG5j2fT6pz%J?syfOWNYK=HQhoJT0 z7Dnx~46EA_2p@sXr9T*{##cGjdIa8Nr%DnBS}O76LmTW#WwSWq9s*-tz?Lw>l4SF| z_>ycj{Bn6OfZsu&Y!=61`Vh%iI#x&$2js<)1QSoSBynWs>iC6RJVXqDZP_f2&cBzE zK=ij#lEXCTS%F96aM>)5*Y`>i;LVjJ4%~Mm^g$d!S4aL;P=XAb$an&7Y;QDQtKP-7a+ViIvXz1!H=TA%V-X#8=(DSEwx0)rB z4_=;T$EqHY*m&u7{*njX;ILwyKV{U_|Crp8^9MYCC%&Ut=$Y%su>Jfcq1gS8V^CfE zkB{;E9q{4w1?-d0pC(|s88KJ?Ys~3(`WbblA0ngZ=lLW0soB==3G@?+o&Fe97y6I! z{1NbRp+5oB&4{_u&w~!O_K%&Epi&d3$qVe~kI{D&{XBnR@EtDgPbhZ!V^Ce_KbG?s zZTp`S!+PKwlYfwt!vB0oB|Opw(91wGMmLTa)fgI0?{Z8d#^`+`M(qm?l_r8m^$F{$qKREo2;Sc^N6s)KI zB|*PO|L$%m6f9{75?;8afbl-TNe$Pi_#oCV2!5&I5*5!aexl)9F?#9md*2XPBCswr&hWoABJdXdOE--OYzledr#vFCH8j-l*Nq6&g$5h`9U}reLW2x{ zSOquM+BNf`G)`CkjfE(gP|Nnuks%)%{{PA=@)81ko{j=U#~Bn zs@)7@u~enI|nOu{md0pwV6~2h^JhaYAv!AK%k#*n3lxv>-0C^_PMPQ zdII!+2wP%R)5)&T(=wT+*dAyNdZ^U`+T$>fi@vEEflDdH&}1#prJ(5hh}r^mwU8$n zZkOuNweDHN-Lv|+W(6N$Gm&QKe#(Cb3?r+8Q?MKV)Z<#HPZO~e`)8uQEv{%(`l0ew z@TOd-g-&l;tc7llLUWclpHk~)-`@g$-s7H79}>^^!|)h_{wh{28Gds8I3 zNBtVW3Hi+U`jGxnzhJUn9lb=Gy1)`5ac2@hmVeZ>$bvR(=4zG2fst7?aGe^CtP7B} zMrCa_vlb!?HKu(QS#PSWdNXTLmnzlXFf@Mw?L0_dp&yt;P4g=hO{kgwj=$nLlSr>} zpNjWq!V~`~u&4fVY&DYl2Yf}o&{U-bPlsbg@Mn`0MEm%&3I0U?hkBD9Zw&eD*-D<8 z7GbBQqM{w{+^ z!zrZU9eGiFeB0D7_zK>CkNN&MzQJdJ+5)ojcHk}9Xm+xgai)*6(!px$AN4VG=?xFV zQu+v%qv0P=xgs|r{($RpxxelQREM0K1NUEj?ZoK!^TQuBa-)fM&VhV)*{hXyMZ;7U zzK*UOq5p@zLg_RMR}@x>)sZ7l23n;Vo0GdJ^Uat7c*do^70WekP#0~`*YdSOfSFlM zP`Jm1unu8`sSUbu2(o&A4tdz$#_~2x-mT2*%e;lQyhV~XmU#o1$FbFd`A5mShIx6+ zv%fFe#{0g{JiJO@8U@ncqKJX7arPTb(Q~c}QHvim8 zCGszIsRaJ9NOVkZJO2&}{{%_!ueajg0L8yc+TvfH$-g`s|LChg!CaZ=!ark({<)XY z`>p-CXOCz1BrIA^$D-w8JNL|KlIxd?xQN6UoJnVwB>6Nvx+GirItzp`GFSKIig(O2 z=i_y;^)kz^i0d1z@<=o7XR0fh^;aanFNO-r6YO;p^~DpyJMs;0@4CIshw$ay;6t4< z;I+}IZZkTmF{&>;IO^U+xS7sXx(L)fsAnF=dq-$4E8d9@*<$?*#rJRd-nkl#kux> z9~2c45xXKPDt1Iv?8M$M78LBg#)1vO-m&3|y~o&Mj8S9P*n5jTY7~tzMvYlTjWPDd z|9dUhB$GW$%6ZOnp7XxPJNfvVxo75{x-+xO4#aS+v%a5(zqcHHEOA&0tNcDcOLSbi z#8G2s*6aK-LB?Zrs}G|_AIg?^qp$BLnlx+5>Ui^6PJlI^ZO+U234^7t`?#k(^~DOy zkP=Tz+_!|d+TMn^l(f`w9rxvka+X0p{5-LQg=I=Nb}VD=Ka;vksrRzc6%*uZ{pIMJ z1TMw_F%OfoUtD|>E=fzYA`yMqIr>OY`EKq5*IBB$Gt}z4BdIi+GOi;iH*Mc%d3Q= zHGEy=!%>;+(iis==#&y_E%r?I;@Sna?QMy^pj$b1W_T38vG8o9ZKmUFGh)+)THidC z@ki+RGw-pfEz!4RgP)7alemAZ^f4dX{`uy`3*G3pyEd79IioS#{6Dv~=bzYKY_xk< zb{L?$I>ut`Y;3lJG}okyg(f5L4>iHI8tNC)8 zbBeWmc8;xC&(}{6SN;w`;%}g19~X*sk?)N=Su890?y+T8Hou3&=4|)alooflib0=6 z=8oBw?Ia(PTE=FZe2<5Y_C+R3ILoAdF;?sRarYC(J&h_9Uy;{~rIx!T3+wL_lgZbb zj^&l*P9@7t9g}5^Il_vSKN@+Fo^#gw3+^YxpJ2M^VZOd;$w&`5wq&XAwBV&MEq10X z_%?3!oU8%NDEd&494&X`lq5xte`}E^vP)OblhyXN?DXT4R1WRNa=cq=yU5SEoGis< z&yDzkS8OV&k3QlY{WewPb4!gcTr45{Kq4|_!a3=Y(V8(@^xL#iSLB6Im!5I=BVA&C zir;974xsI$(J}`qtV8?QnSu0`KO5E75-opC=BRBP8Jc()$WUo?#CXX_*aav2DcJG$achD-9+@UDmTU+au<%H2M6IG&$JTq@SepVM}ou~c!1exAVKijO%qICze_myZe>5MZfU&iT2;lilYnM|@7^ zXQ5lpwsm<%{>{K6Qk_z(s zFY)YH)75r}B#u$*3C9RytTl~c+q9eybJ|vI(QMgT*{t>Yur{XsvYCx13vj_jPD;`z z#dcD%b+K)({w&+3jje%9mgr2p)Y!o8(dAr5rngjKV@ExXK9s3dTifRqmcF)wB)=^3 z!}v?K{q>=(0dHFao|c($Woh7CWTg^vzi)A=Km%#wbLx30CUO5;Z*8*e`G<+4^HZ47 z39os-5Oqd2-%$qY9t^d*iL;oT z!r8sD#u*;-`m>F0snUAfz8G6))S2H_-M0SL8xL9g{q1PpGI~^Y+p4FzlZ9c4$LlY0 z(lwQ4CH6J7ePt)qx?H9_nBTTwo)6P)n7M?>IiDroFc`N9o33)75xX;l!_As5;!#5R zxBcb3myjj;h)emm(;}Y6Zo22e+;(nbB^bCbalV$6442i|x$z#;MEs=9vcLRn^Zk6L zY!LQWSPog}C|5pZ;XJ3?H)fMmTSqXlyuK{a?dg@~!l^lG>ywpA+^?q9<9IstldM() zTl3j0(erZ3OFulu_R{x=nJN9!P(B*6L@%@r^_yf2m3|qT!Zvh?ZRna`hf2Q;{c(fr zU#`w_J#S;1-?bUG{Tmy7QpdUZ#dBkv-!ES=+xTk}$G1eE&7Iih%-`BHkKcp~WsJ4y zcDW|Vjg$4k16jR3Ox`8>J^8VnQ=~IH&l2v-(bpn&=43L)YT0DVOWPYUA!o93iEaL} z+B8x0YMI74ssvluEk4Vy=l4o-B64AII1xQG&TO%^8Cbtf{VE}TL2R^4X?1d==Rji1 z#=oJ~`nCl;Jzchkt0lTddD}6Wfs-m-`;T$YmO}2?63#{+a&2|cc0Kg6P4b~_5S(ldOW_5;X)3aVC5)3*gq(d+#rw(m^g-e+u-#qiCr+Hk{bfZeu4hH= zN6Fowx9!wzEi5%pBeQTH;~l?FE}2=W`Srv#P#Vu3|Dztqy-jYM1-o7^p@$yKamL@Sjgj(y~mwj|%njYc%Scjw0>wjI7$P6-N2Bth3EyJY9 zk=(|1Jf*cwJjFIK$L}FVh<@%oz&6dby)und$?;%!DzLS~@qf>D{3lLt4NAvt@u+zW zlX?2H8o!^4`+wW`xs3S@3zYdKL}oY|EuCC?<<{T&c&+`Ew%N(?Z=3$wRNL{-sk_3j z(@Uo@{pKX6&uN=}kum+*-=>#NWBSM>r~fuy*0-%OecW%;OQ$h?V3N~+WSc&hG5y%z z)?Ye}=^uaYc>SC0l|5m+NprF`w6%72itRmG4SxJxBEcF*BfJGIW65H1;|JL}c+bHJ zuV9IN@u{a-h8=L{bykRp(mif6hoSIhWJ@>XuuFcz}BHOeKPrYyD#x-adQ|0(LBWzRkr z+pBG;+}3kv<}LH&3uf6Y#W~<>SekfSs<|Ak#z^uaj7l4y$F>~2KC{tQ9aqaB7d}sZ zD96azHMVnx_35}d%+EQhlckqCFTGus8nhPT&ij?#+$noI%WIg9Z1pP6k(ozKw~Y7U zUY*NfRm*sHy4Y;ik7Xss2hexa_OHxeX3~?H7_U{iK976IyktOQ2E@n4+8VIR^Q!Ut zEIVx*p^B?zWVZ5yT%ty6g{P%qrWjXQtfN(Ir%<_QXJGm}@^)6{^lJ&#_bb)`cVrts zo6L1KdXOwzCg-CrvhU?yp=ybJwllQp?8+%QgzG6k35%A$0UR^a_V1V)tgvaU=+!ck zb5uIsB-_Tf4t3$AdLlMj>aB~U=hm+aLx^k>VeMVY+V*Iq7n`1=#GHmkAxEpQ*BFy_EKDp1Q*`3HKX&as zKic=U7PPg$(n9;ZlZpxVE!4$QOr~OXK9-#;Wge05ao@~ucA?gqDa)G#>zU546Ra9E?wDqmgK3`kkdhN?%>zk&1uJpx5uPMcA z<_K>uIQ>8Uj8|g~+xp9Dd9zwRtd=hq#X=m6rh6=x&>s`#H2#hByTcFlaDidW=ASN2 zs)q&^FYXi^+OSxOfHHw)irXrj__tV+_0?)Rn4)@U5>5Tq^gqtVHp^lqDwHT+zLbMD ze>XUB!G3EkvASB)SWm$t87b{`EZnlYJ=A~I|7T!UVrq#4HZr(wO^Q<0P^7qq8g>An% zs{d_O0~}2C+fch@v9!@}zQ!)wjh%SjKhy*{;#YQeRcgVVn251+qw zbdqp&OXZd(O-k2PZtfoG)A$s1%2dj!a-EP?-3BI(U9Wn(>J97Fs~T3*Njk$?gxEUj zH*8QdtZL&HQrVzM{hEz~t4n8CaQ(!=HA6$I)~*>Ubs<$lYBsiwS2b~9)fzP#Gu$?Q z&3ZLM>d=<-)UR1Jv`OQd^=mc=liuJObOhH5u3j}PxM2fF%Pw`r{ry?Jq>BfGxMgwb zjSP@$g6-ae|xh0ZIw$#bhmp7fiD`Q{%n6T^3j|q=47WI%xx~aeV`p1Oj2uBdy zae;bs15N3XdGtX>aI0-w9>OU(Qb9hzlx39V;p4I26}j@+u6_>EJfh4)$a+XyvM$E7 z(r=LZze2`0rvJ12EA7cR#xnesw4bN3Jd#FR#(a%+Hij|EuSK?LQsti==BT|tYU_{2 zH`c*O*@uq0jdkOL$0W-?JIqmof7I3=jc>o-jDCLi`me{69QU$5l4izw%QVt0#aM5n z9U~KmCjM*G87b2k-9{SinWvL(W1dDD=K<+AFPo!onch*o)EVt1HT=)&WgX1qJYn=3 zZQJLc4L8Q8sb7mxXP?rRecd1R8|(aQ!`ksj)BMpec|FPSsJ?x>L^y@_8OXmK!uxjX z;MBSM2i+r`1|>%Sz8yMsaq1huzr&v{^goP{keoNEsf7I?WBrT)vX5l{*gm$f zjhytfMq6(aoaAeR&oRiTGxE>c|D$Q84LQb)w#ZSYZd>Ocwf|?++8W@6CdYqL#kd|x zN|AAY-9CRZt!)DSVY?e;q)}(&A1%L(^GDMfZ5WM{f4luZn%35SrT@Y9`IBjlFMqau{%G3Y+LB)~<+%Le{WLh62HJuE%FEXxuow0qA zYG1~8G@X4rNsaSo?I$&z(f%kpMq>=3F&5)69uqJTF^~tTD9zW^BP$$djYnupK+F6T7e*d$1S#upb9-5QlIWM{pF!@Fk8zzIuETr*Il) za28+T9M0nczQ#pdLL4sR3ckTre2Z)N4%hKLZr~ z8I(milt%?rL=fIXB~(TgbU;URLT7YASA2kO=#C!fiE#8nZ}dT5^g{&tBN9;1WU0DA7eQ_!3unemG}&+uo`RdIo4tw)?))UViPuF z3%245Y{Pc!z)tMKZtTHc?8AN>z(E|sVI09x9K)A5juSYEQ#g$?IE$}v4(D+JU*jS! zAr6;u1>fK*zQr|shwJzrH*gcT@B?n+M_6$OcM*?!xQ_?;2@mlz9^n@}#uGfnGd#x& zyu>TK#v8mv0!HE8{{JuC|L@NKPE|PmtD+jJqXufC7HXpof>9UmqaNy`0U9C%jnEjO z2tyMzMKd%<3$#Qlv_>1WMLV>|zia+Onb$B3#|VtXD7<_9|Chf0+4qT`>L>e?Ozy*Y z_Wop=KWoz%?%bZc&VBzpS1z%C#UIVXl}olm+zPn<3njG-uG}s-#BGS{zmWa>ld%uq zm3Ldqc{2@0+ASiK^OwL50rbrQ5b`<7>|jVgvpqKX_$don1gv(fQ49uC0K^#Sb>#T zg*8}<_1K8b*otk~fnC^xeK>$aID%t1j*~czvp9zfxQIAh!Bt$tb=<%$+=dl*aSsph z5RdQ}Pw^Zt@fvR-AATi+3*@)DyFz~BrTi*8`E3}UkiSxv30aU0UXb52mJ2?}3ttp~ z{Cd11@Pque`2dteAj+T|Yy&_L4F}$2pU6vpJ!7vM@zIuTeL?< zbVgTnLl16`cX1C7 z@DPvi7*FvWFYy|0Aus-9a6wAA!VT{5fG08_6S6@5HkKE>kqbV^3ttpKAryfh{2{+n zyCmfAQOaN1EQbmRg8VhEDyW7UsD(PHi+X4P`5TvwA-^BJDVn1t48sVF!WfLjcud43OvV&U!wk&A9L&Q4EW{!#!7?nz3arE` ztif8W$3|?%R&2u#?7|-G!vP$^5gfyDoWyCI#W`HSMa1C>uHqW5;|6ZwHmtaddw76{ zc!bAzisyKV*LVx3V2TeuA??&2OE;2|F2F`nW%Ug9<0!pVjG z4;RR9(Qt(u+~EOFWPm(nmj&721#jen5Awnn1yBe@;0J#MpdJ- zg*vEvbu zOvEHi#uQA$49vnD%)i*C0yYKcX+@P z86eMjP(G}g$1L5e6zKB3124E0|U>HVV6vkjI#$zHTVKSy*8fIV?=3pKc zU?CP^36^0wR$wJoVGY(|JvL%9wqhH0U>Eja9}eIUj^G%M<0MYwEY9HqE+P(Ba23~Z z9XD_bw_(Ly+`|Jr#3MY$Q#{8@yvAENrDXrZ1u5YQH@L$Cp2&bq$O8E-&R+0FF8ClX zd{F>}Py~MPM*vD95M@vf@=K(HPzhB~4K+{;bx;@e&;TKj-%TBcrf80qkl$h57VXgy zozWHD&;#M*oGb0g+17Z12}{uIELdmiPJcXbGU$uh{F|J#Wh^V4cx+QSaBEk z@Bk0-2#@g;&+!tk@fJ?0*#B@rO1Q!e?(l#oG9VMOARD~kja=|SUihK_3ZV%6;Ew>5 zL?Ftb94a6Pl~4uMPy@A42X#>o4G@CH2t!jeM@zIuTeL?6`cX1C7@DPvi7*FvWFYy|0A#eDT z!38Pd3OC4Oc^>dY24q4OWP=yHkqbV^3ttpKAryfh{2>qYl|&%Qpd2b72$fI;)ldVq zPzQBU4-F84#t1`GG)GIcMq9K;M|4J4bVCn>qc{2@0+ASiLE!f%I}O7KjKUa<#du7_ zBuvH>Ov4P!!W_)Q0xZNLEWt7?#|o^(Dy+d;tj9)d##U^@4(!4n?85;Z!Vw(9ah$|y zoW(g@z(vI23a;WBuHy!7;Wn(ei+gy0hj@g?c#7wEiPv}w`EpA#xF985;Rbhjz!Mpe z30aU0UhqaP_#iKQQ2>Qd1b*;G07@bdWl#xxF985;Rbhjz!Mpe30aU0UhqaP_#iKQQ2>Qd z1b*;G07@bdWl#8XNjc*Yc{saQ0+Hzr1l@x zl+T-_$R912BA-1;IiV?^LrM8rQ$9y=Df@jGCD=Gizqk%&zIBnM2cCGpA-Q&D@$k znt3&SHS=p0&@8T5TC)W(UoVnw>P4YOd5=qq$wv z_N7B7KK{+aKa^yeDKt}Rx@o4-bk|I)>7nVVnO-x4W=74-nprfnYkFzs(Dc^KshLMJ zucohN0nI|1ewxKJ{WXhg256ShETtK!SzfcIW-ZOynsqdTHA6MSG@EEP)oiBOT(gB{ zOU+iAtu@*SfXm-{7K(m`>cg-G}JvGBMdujI8?4#LNv!7;! zW`E5{%_z+QngcZlX%5yLqB&G^nC5WJ5t<`4r)kd6oTYhI^PJ`d%?x=HkLS#qSv0e1 z=F=>r8Kl`+vx{aA&7PWZnwK?gKk#B!&c2EBOQxAz(?v6dW=hReny#9uHQhARXu4~r z)%4Izr|GGgUNeJcM$Jr`nKiR$X4TB5nO)OMGl!T~ zIYe`)<}l6SnjDv+Zq@ukbDQRN%^jLMHFs(5*4(4HS971{e$4}# z2Q?3A9@adfc~tY5=9iksHBV@s)I6nmTJwzNSHTg_{l-)Uag{9f~h=1t98nm=gX*8EY^s(DBAuBPqb2wwNe^4nhiPVSnXnwd1S zX?kn=YWisgY6fZE){HEY*lv{O08QH$85p!AAaQu3l8M<^GgLE7vx#O?&1Ra-HCt%5 z)NG~MTCkODG)HTW(Tvs{t2s_{yygVWiJCE*lQb=wlQm;Cr)W;qoTfQlbB5+j%~_hW zHRou~)tsj}Uvq)xhnfpDKhj*Jxma_F=2FdNnjdQ}*Zf3th32Q4D>XmUT&1~MQ+`{K zl+QKSYOd286=R(_J&I zriW%a&H9=RG#hG$Xg1ai(`=&IRI{083(c0Atu$L}w$p5{*+H|TW+%YNpb3)l9AFrkO_5T{Eqwhh{oWPtEk288kC$X41^8 znME_JW;V_2nqHbYG`%%*YUa|+t?8qgM>DTxK22ZE{F((c3u+e9EUZ~Xv#6$@W-(2F z&ElE?nk6(#YL?Or)GV!8MzgGDInDB#6*Mbq25G*hSxK|9W);nou;Q|dd&=)88tI$X4cH2 znN>5JW_C?4%^aHEnmILdY3A1S(afWnS2LfcuV#MD0-6Oi3uzYCETUOd(@(RQroU!! z%>d03nk6+$X$ESR)-0o0Rw8uJ{4Y@pdtGeonIW@F7z%`nZTn$0wuYqrpAso6@iwPqX5wwmoU+iP~v z?5NpEv$JLw&90gsXm-==uGvGgr)IcjFU{VXeKh-O_S1~e?5`QA8KpTubD-uR&B2;O zG>2*q(;TijLUW|%D9zEDV>F{R$7+t#9IrV+bE0O9<|Ivv=48!S%_*8wHK%D#*PNj_ zQ*)N)Y|S~Eb2aB_&evR^`Jv`Q%|)7vHJ53AqParzGtE_+t2NhXuGL(pxn6UF=0?p; znwvGZXl~W~LUWtucFmodyEXS{?$z9H zy)|=b=GOGl%%hoCGoPlfW`4~AngulrX%^NjqFGeaPqUb&zh-gG0L>DbB{fTF25Oep zETdUgvz%sm&5D{qn(t{=(yXFcRkNCAbHN!NU zXg1YsrrBJxg=S05R+_Cf+i14cY^T{?vx8-9-2Kh!!>(p z_SWp9*;lilW`t&c%}C8C%>kMNH3w-9)*PZaRCAc-aLo~#BQ-~9j@BHb8Lc^1bDZXQ z%?X+lHDfd?^D49%IEvovRG&e5E!IZt!G<^s(RH5Y1rq`63Q zvE~xZrJBn$Kh|8X`HAKV%}+H~YJR4~ z^Q`7qn&&jnYhKX&TJxgjCCxa^%bHg-ztOy^`K{(P&F?g?YkseJL-VHQEzKV^Z)^Uj zY1O==c~>)D^Pc8?%?Fx4X+G5aS@V(RFPe`vpJ+bSe5Uza^M&S1%~zVQHQ#8y)lAT| zJv=4vo8=)YN;1vlnl73tG*fD((sb2Kt?8zjM$=t0t)_=&I!#Z_^qLtoGiqki%&eJ3 zGplAc&Fq?9nmIJRHFIj_(#);tqnSrDuVy|?U(NiQ1vCq47Sb%NSwyp_rk`dpO@Gbe zngN<6G)roh(hSrrtyxC1tY$gQ@|qPiD{2O5zNcA9v$AFt&8nK!G^=aY(5$IhOS86S z9nE0Px|;86*3+!7*+8?QW{74Z&BmIcnqitvG@EKR(`>HULbIi2E6vuLZ8Y0zw$p5{ z*+H|TW+%vo=V;E=oToWobAjfEnhP~Q(p;puSaXTyQq5(WA8Vezlz3h|qj^^IE6sD7 z=QS^Aeyw>?^O9zq=4H(*n%`(%)%;fTn&x+!*EPS_yrFqh^OoihnzuE7)U;~e(Y&h} zuX#`NzUBkXpEMt8{;c^(^B2v>nol&JYCh9^uK7aqrRFQm*P3rM-)bgk+AdQ1k36O) zU)6R;I%Gmtcp(?$N7sIkA5E1-1yn*c)Iwb}Kw~sTOSDA?bU}CYLO(=dFywb6jm9`k zgauPD9kVbO3-A$^;A5=7XIO)E*oe*e0z0r9`)~+HaU7>0&$yq5Jl}p9-{LxM;x_K! zJ|5u-?=0SdUHE3i;DQyRa8Wa0>D< z!#9v;z3<>5oc0`d&>ZtTNB9EE&m_zcb?4&Oqa zZT=DRJoC?xXP95Xi5Eo*q()k#M`mP4PUJy;6hUzWqC6_0I_jW48lx#%p*=dI8^X~S zkr<3&7=>||gsGT?`B;RHu@awS6SiY74&wyA!Xt13ib^=kP+FC6M0b(ekg%5sE8`4iMnWrFtk8hbV4`u zLIeh47)C>$+2oH(*`Cv!P0F*Gi?JM^L7u_f1bOaqH{@B%qmbt-zk)nd`3h&3(_J3vcemAPyj^{fYPXd%BX?bsEhgtK`5G{1zMvWI-(1@p%?mL z00v_i#$Y1kSwwjTaRHWK1>_k+dA3lVDU@dk3P3`*9dw;uOx~GUT~8dEQN)bCc)Wp5PVaBAE(l;EBxeLT(g5 zag;(?R77P|M{T^1h6qJ7v_d;{!UyPyK8V6#4993pfIKTU4f2ebJRc^{hAn|S6DH4t z$+KYVA1O?3$#W%bVL_)Lr?TZKSW|6hF~~GAsXWmgUOhR8JLZE_z;V*6wC1` zR^fB3$0lsWcI?7l9Kc~5!wH zEj*DCS&$vx$c?!$epx1=BGLbFly)VF^CQ3Ven&Sci?+f^FD|J=l*!IEv#qg|j%1i@1!d z_zpMl1FVS01N@A~c!rmF1No(L$&nJN;f{33fXv8-9LR+{@I^rsK`{iN6w07Hf>0UN zP!o0VJ{q7A!q5yY(FX0&30=`0;pl@1L}3tyVgyEGEGA$QVlfRfF$eRp5R0)4pI{|c zV=XpdGrqtM?8ZJE#1VXnlQ@HO_!@Ee2G{UCZsAAV#eF=)FL;UO|$hl#LY3Z`Qg=3)Up!V-Lp75EHm zunrrs1>3L_d$1pea1_UJ3TJU17jYR^@f~j92Uro02lyF}@eD8V2J*);k|QNj!yW06 z0hy5vIgkr^;ERGNf?^0jDU?BZ1fepjp(g6!eKbHLgrON)q7B-k6S|^1!qEp2h{7NY z#R!bXSWLhq#9|s|Vh-kGAr@m9KEX1O?3$#W%bVL_)Lr?TZKSW|6hF~~GAsXWmgUOhR8JLZE_z;V*6wC1`R^fB3 z$0lsWcI?7l9Dt+ZW2!7fcXbpt)dkTlj8e?#AZ7fvj~d0#=pg0uR$&w$I!d58 z0^tLr_|RbtD@nKX8^wnX`5f2LbXBRZ38M@$I>`RYsOmsR7o&#^MqN{Xce;C+`U}$C z+tlBXZu7kC`};85+`fIkERRv@(P5sq^qc1$Zr9(yZhYxCk1xw1AEVdfuQ{EQ;w z$~5MEVbqz=Z66pDkahk-cQ?~GvaCiich@s2$#7G*td~)w+q`Tc#sIRBsoT6AlIjj) zeA$-f`N}z6>g%I0jAA~2G^A42rw8fMI|4CDB~C_Z#ZTQZ%aVa9aj814h3_|Rc2i=$yin~sLb&roH4j)ocYW3a85 zk8kOA)NfxWKZ7-jeYbgB8D`(6xz0SUbT>B|b9Nq-xV=9#XhA>}Cq)yJoay%ME&XtbpWLl{=ii{`oX=GH8RUyaj`=&ZMSIfBO zWsy3Ww^3x7%x%lK=JRw@yWuj-JY42!z6KfVO0}&>f3S8-$ZJaGAmqZr%U{+cG!+K*>`{YzW2kImCbTT(CU zVHDX;QfHLfbeQ{PyP5l?O>@6=o9_W+UG4X$`Tks%*}SjidN13wFpMH~vQ6#lN;#;L zZE8QBTs!RR$~dT#>xlh$nn3j@Hl7x;a`eN9*KheH^WetYcE^BE#(0N9r7{ zlhiv}FR6F5Zc^`P{iNQ}I!e8x^^|%?>nin**4NR#lX3lF6dA|dFY9IQm-R9C%X*mm zW%iRjTi*Qia-$7lZgSsdObpssK4Rla9$U)s;2X#Xn)X8<* ze!Ivu+P+S%(e`z6ZMCnHYps2qT+{9AnroLUthVG3W1!@jUxAJ=6<>6H!%j1a^EMzBTRMjnv?5} zQToy$_ku=|erd-jaxZ1>kFx8R`!DlwxoWOcGm5n7 zs9u)U{P~M4tGQp6)xKZuQ;j0aZtj=)nEU0vMeePPBE#+LWPR-GWS#8m!W`7e@|o9D zmdD&L``6qr^EdZ*rC+8oimbo6U)neKOSidSwyC*a+Bf$b6c|TuZPqPf>C7pjz$kD{jyv#o>8Pu+A-J3ddT`1MfR_38yVNUjbuDg zA4ZY>#zqe*$DthKMhT^3fYC$Bel{$|{GEh6MkQIu)Lq!rJ=D}a+|-@V)Lp>TZT^{)d0Q4U zjbs1wA!CsFKE1V3N&1?)^P9S>n7WNl^E%}F&`J^dZfWXnW$HE``)y41 za{V`o`Fzmcs3gtT9`pILlW82eh8aaZ$2E$a8;xSVesnV`N%Q%%hpAq!Q${hLhkF^7 zWN%ZqTw9FN*XSV4*KPClLC(`gF`uvH9>OT*>&HN&k~ClY%-3r3J-qomH_SAx`J6Yx zRR8WcPuv)P_c(udd?s$Uzk7VXJKp|tj<^56o&(<h_BUy0k{Uvs;w>0i)J<@rm&yX=w<}6vWW%tVAoikT% zpFDZ<`Q|TBuu$P5Mg5BT7Y`^=vQ%K{GG)t^uTU}Qy-Jmjc+*zh3-9g$k1WK zM~oabdQ9}#apNaUjG1Ja96M#|wCOWu&YC@E?!5U6K3w?GqQy&=F8g@-Co4W(`Pr(~ zYd&AQZvBRhn>KIR`o*^GJ9h5cy=U*f{Ra*nI(+2lu`iFGIC<*ynX_M=JAdKpi5%~$kqMcR1z92U$qp~%fXp)|av?W- zkOz5@55CBc0w{<=D2yVI?+W^%82nKja{SAAOAep(e&h5YPE-ebsTy7HMxEy&Lm>p-rl@_D~}e@s4Ws}H$W%4f16Xau`xewHKm?D9P>`TkaG$oIA6ds_1StoG=Dj_8EW=mPn9-v{W1?&tye z{!}>R=Xt%+2Yt~G5$KOd$oHM(drtB>_aF?0e2+=KzcdW;eI@yx(nyTLXpBKL#$p`C zV*(~329sdHWW-_$reYeVV+Lko7G`4(=3*Y^V*x(ILVScpSd1lDie>m1%kc?T;8U!` zXIO>RScA{87VEGc8?X_Zuo+vh6<=T*wqpl&Vi$H}5B6do_TvB!;t&qw2#(?yzQl2y zz)76KX`I1Xe1&s3j|=!37jX%3xQr|K23PSduHide$M?8_o4AD^a2r3uiaWTAc-+H% zJit$Qh@bHYzu+;R;3=NrIbPr;Ug0&~;4KnxxQI1j8&>0EEWl)pKwor37|wvv9hR%T ztO;U2zUyO6@b7C)XoL&Be{TbIw=fEk*c@R^n9cZq=C6+TXYDu|KE-Ys2Gie8>po)H zL|ytzYn_i~8ggsDzed`Sb(qNbE#U{LbF@7FU#R>*>`awTdlC}dwaa!RBn|%BUMlBguE|}}d8XFeB5lUgOKz34 zNB&Yl;?0xo4odE#5`Xc2GB?}(gEW@bDe*3g8;NAjDU#btGH2)HPTX+)R-QghNJx?L z*O}XOIMXlwv4m7N)zvd~Yv)7r@P8PboEmA@NEsm&(jhl0BdOxdRLPU4O3o^|CTEJ| zDbgiRo+e$U%$bv?OP4%%^7L-fYSJYkAz@?_3R$@nW!0)xMSO#2_|l)-`)EJ!`Sa&z zkNm1;Rz}I3vEqh|Gkk+Hq^B@Eos=mz%Xze|J~-{klPBHX4+gmJur5pE*Evrb+Hw21 z?|W`BAH}6^TWx4+noPa^>Ur0R6DPWk^{nQ~^r?nD+@ET~gbArqMTMkdRiV*%tBSB*w*O@y zC3inr`NZ{S6U@)fCTOGEL7K_DK{f{eCr*{PO?11+^s;Ger5qbbwo&O>mqK(qv8hhF z2gt_af9o=fzihKC8>fxa?Iz3P#-_U@+b@m{DBCdq=DBBOJL+Plc0KW4tZq*>=|opH zX&&9KGXGR;+T6N**~Al4g~&$ce_gHLZEHF9k|{Y_%v|XIBMi13yZ>j?o8CWFNi0df zjY=Gz^qVPJ8M|VB$CdP3t)$;%rJ%j=4jsFMYrC#w|1JZ%M0AfFELE~?BfAWWlx`_< z^6AhivU{K2wqD!5i0tq|VowtPx>4U5R(70cLGD|}J3CdWmdCb^|aEFXn1|`9n*EUU0QkFUkWE#2el>1OQ zpUF7#ci~o`INdoBN~0l=lV>@6!i<+;EZx0OH!bgZAor7U?>fti`+FRtjWsA(n)hc& zs>re%rL)mN%J%xT$hP{m?C-bsz-{5<^i2N913 zUad8IYM;4t+RU9)VcTV|Tn96zI8>{4v)i-w4~RK7cuQ1`iv6D#+PgI8syyc_^}Ty0 zf3Cd6y*B#4YP73O!|&&;x&QIrwapfm4DI*&$Jr@gAN0-s*|@fy+P%0wW!lDDpRb-- zq<`0ptp^6r@@TcE`{nt;S}3&JVK}jwssdNvk}=dXHaxAlHNj-t#AV9nM_(uv;dtT*K>SkMld}QR6F* z2Z3E zy`H@3`KrYGT^?`EQpU^k)$FLAZ)%*g?TGXiAWlM=kH=7<@vHE4{C9kGAH@<&p zagN|!6YHk0lBMdXR!(j6{qi`tR&1`6*H)GZ4n5qz$nM*py3bv)e^%dYwSNl!=3J}F z;WI9z?zlF%eDz{SK7JfHt4+X#6kZoE%ilPBR}!~?^Yv00yL3x^vvU368_&ev2+mX6 z|6bV52@l3brQEu6lBLY_r9XVqq}SK}{RfVDQ|+seyBlM_Xtc;LaNe#fA;*5c*n4~i zzrgGhf(Oqy(Ea(jy8hFDHj8iEB;U#VBVS$j9{yRIUZYFX6^A^VwCz@= zUXxOD#|N)|n`d|0oWXB{x-Ks^@6&pBPYiWWzi3j=!-H!tIo!_QBW`Ss$Derx`K0T= zdPB1wE1osJ)bZ-46B26HoYmf?Yn9^5_YZ7ScFmVRUFvFmIJ;KlxXIN<&*}Mk>Cj=* zFJ%vUIJ9bfsaDgUWp37PZTQqTuBpD6vL^qAFK)LU)N1sRrr+GH)#t&U2Mywygk}%A zR%6+|nEoH__8JhH{p|cR?;lunt^DZ$X-99^)Azx>CjNulKmYpuk9s|MHGbl&=$1ca zJY0QhmE|#|DpwzT{$=aOC!5!LUhH|Lk*%v{vt};*xb=IMg6(Sb7_#M?=Y5@~9>147 zZc^Yd>&BWhrX~-c^zEMO*St?zpbd`Ug!0O}iLeDemgwmkm~XW&W|}%$C>4~DJ!}>i74A`@0X!ef_ z{II6*&B^B?>t6dh^y-#P*5BS|y?c%QcW(jbeIFEwZ4hzc$02X0Ov|<4dDg0~KZP~A z9@c2*hKz-+JwqZk6n@p9+58`Bb-42Iyhr$`JwNo=HnVN!ng_gF>UAQ{TcVor@4FbHqhGuzN zv34=<8Vm1+HyqvJ;h=4cyTn&rdo;i!?TA^Ij>j);I(zu#`XK>%PNa_ZO7-=cM@5cK zsa&D#m^Ztst(;x5e!4>YCUyA5rJ>j8&7U0Xm1D@9^Ye~v%RIH*+p9}9HmI3;d$|d7 z?i}(=fAVrs_fvCA2Hb1cWkdc{YpousA3w-GJo)`Tlgsyfw4h?h@>yS2&lPP%6FST-xw2a0yWf3tJUaf_=O6vp{ee$V)^2XOhHTH%_hn>2SFxV@YQpY{GpZ$YoO}Q{&o*j(cN{UWu5!&2?*$5rYOj+;naH>LCyMJnlbp=g=qj3Xa$k_iS;G zWv|a!UEVv9@w+d3jEN{QEOybU>v6AF&Yg8|&*UU z!O}_hXKY@%V$JN!;iu|{PZLva5EL#IriHu?SeFXo-w^8eWT z7dW}A`u-n3o2;0usLRDFO7%lv!)}tjWV3`2l90`2lPqj@m%RWX;4nKgyE|rfW}Hhl z3sIuQT9qocXlun5TWr5p6xz~@Ek&xZM;=X+>KFWC5+%MnAvj>zvPL=CiXG z!li!uc>Mp9y!PDQ=YD^m_c@=<|8buGFVi30_`y@&fA=?Ddgzxgy6QB1g|B2U(zGL9UUGF<(_&XubEc`lknOJnfyg{?!-i zesbCy4}ax5Kj`}O@7;H}?n6&*|JwcU_^)^E|5D@N=pR1x%Jpx$s^L%je)@|)>AvXv zZ~n#mcAxc=%m3qse?09U%st27U%z|rpWpV@FaFJcWPkJ1pV*Rr^zCPS#N;pB^!-n4 zczD8ZI`orwUihDPt$gskvw!*dZ~WPn15*#QWnNv{_tKkBx}z`gVEdQey#3DH2TI@l z@#K-)&wBf#!xw+(pYJxU|NQQg{^j!Xo<8vT?oU2&*#%Fo9{s%!e|_7jAA5P@pZwcd z*X_7){FmE)`$O;hm6_P@-2IW2CwrIQb^N@CKldlEY5wHEk49f|_4c!V{=T>8>XUst zcYWej%V&kAM5&>pt=QO{bi@<{K~ni_X5L zrh9*@;dhf?x}>qUuBBsqks-Q{y`SAw8gtAtB2MSb=QR&}xsLr)onsB{6mz4Fz2p0e zpWbH~9on=ue(Ei7|4bdM%U`?Y|CX)ZZ4!6daL_9pZFW~^n$#XzYf<#;r{8s>^eeTQ zHy=JjVXi=bR^xAV)Uh|Lll@=)=jE0j{aZfx>0g)qN^PpO{SEYQ>@B~_`o;d(-ETUl zj_ub9^w&-7Jx?@sqThK*zwD*|`RtX4WH096v46e&=1@QR3s3xw^!3`To8(Iruk@E* z%oqKXPV_rJkv>)7NZV|*`a>t|0%Aw>A}AH!tZq1G@$3V zQ(@Mj|Eq2P)vp6t>34qpw5y~FXZ-Pdr)}QRtDLQ`CH_>;vzO+fEaBB!SN$)|omtjD zjvIk^7n?vA5F0`KjPrqb5f^}NunY8n-Jloj0eitd&<8FCmjLlF_JaX12!_C=U>J;m zQ7{HB1DAs%>fG!Tm^2lC*Jpa6yW|uXqg%qKZ2tmwwClKm54w>wDA3Y5RSs9&PqDw7pHl zyodg$Zvg9C!}?zIpMp8)*UkC=VfAV$T@A-!B z-}0Bfe=+Xk_>=#?B$vS40`JCeSiO>zW*8;ed}Ys|1W>#`+xa&zMuFH-+%fM z-~Vgel6TW5{(XKt-l6HqQa*LP;3;kV$T?d$rg#YzGe;Hwf=~n!| za_oEl#l-VM;tb+gDm)Xo&Ar9Zd=2&Y0)6Nwnx+pdkv`dn?fl`>9`Qd5ZaU==|2EVc z0=>-jr#pM;qew<*qV`MaZ#ngmN_=6wq1uR|z7YlCEOJ`F@I92i}gL0-s?1$r-bkZZ{Xr#G3g=UYQM#|&GL?N9odATx}@F>hl zEh!fKx?RC~*<8t+j_31~VJYY3#@~=iRO2Ds=`^LE%ND%}iZ37xs1}47wFr|MRG>$? zC$rP3Y{?Ad$P`thI?Yeb7Sjo8A|Nw^HUX{0d@7NiNGH6hcp*6xFQgV!(vYiDZ@iF- zAF^dnbFkIy(KZq({nh$tsb9}jI+G;$qDNv%sidh|&^V^k**KP7d_0>gOvf{sS&vpp z?Ivx3C5W_?^5R}1N75!}gB9;3Z)xw&8=*%0jViH8FHuR3(oJnt0xZ%>bJk|WsS(;l zE=w_%p@(*fv$fOn@3rz!Jfx=50;G$AGF<*z$`_hoN5YF^pA=k+u1`x91@uRb4n z&Qped>BE0yUeUH^C^#xzkak)8EY_$0%-s2&FZ=%2z`6JPeh$3(Grr&akG|jgRo}nn zE37mB!S^3}!1rfa^L!CxSa;q9wtUC;{}HSwjL&?Rc^JR1{VeXx&0DcMn|b=yKlJ@y zLVXSN7lE_C_UzV8FLeBi7W6Y%zL5EUhNu>GzKODrIxJTHQFrN8{j>hxN;v@d`g%=hFOG}5>6S#E+>Y1qDuSr8RP2Z_;3)3q5FW>Npe=q9K z3OBsf#r4f=ohoyPXOo8SA6b~@Uy0a#=`9Q06@D21SBQVGT#Y-l|I*hSr?599BGR`g-qq5WcE><(y0BjMi`=%e(~fA-%W@$Vs?XNwKr zdG>x3$8AA;nLs_dNc_<>EftUK?|S?Z|A9xJJ^H`@?ENU7WDwsCfqL^I@ki6NR6MeO z__0U)b%ZHA5Yfy0*&6d*f%&$G{n3a%4CjSbuOg1*+#~)<)D3|ua|qd=D7FRuqxAiY z*hSr?597Z9TG5AbhxUtwadJR=W+eRM)Rn@E(o65v{5ooW;oMuR!oD;iYqKOczy{Cx1S^B(h$bUo%zp8uHt(B{Yd13=~|z5>me7d+-a2<`^=fi5r# zj)GgjN4GrY{{WDj`9FBhD_5G6PBJG&xNlVwNyR%Md*82Hxsv}?Ir+Lef5i&^zwGCq z^vmG8VCuC``UZ6p{9kY-<|og5(m#OyOQ0X~!U>cikT zIQ?PVK|e@>qu>@`BJ#Epw3V=NE!9$?&6}W*sxE0(F%+C=PxCYz=?gew;)>8oLoq^r`s1E_TnO71P z@W4)R4LAmF1^0r7fO!=(paTqnJh%zm3GN4Tpz#dc!4SxUo4}pmelQ0bUrji{@7BQW z-oX8#fW|;0IuCS!onQ!D1M=V)xCz_}!my+^o(nw~0(o!~xD(tD=0IaJ?%*156Sx=5 z0j~u=AP;T=_kua#t-~H119yUlK;wGS1M=Wja6d2`2p1e%3k~MEz|ITohfwq2CU7gb z7d!+^D{+9G;2LlY+yw3f_k%gm*hbi32;{*{;7;%mFzxsUJHa*J7`PRLWzvCOZbLxs zc_5mbfavZ7_k#PuLtqY=4&nqJ=l~loeahbk`oUEo1CD}Q!0q5}@E|x2&K!moTm_DT zTfpt$KJX|wd4%vlKgfU^!R_Ea@F+NW6nD@MGT=t=%^RNb9|t~o-P@k>+rc2nf%kwr zz?Z?};N`!FI~W8x@E&jn_%e7Ly!`FBgF%o3?*Vs!Z-STq(o_CLAP3$9?f_o~{lt3} z$bh5Z7H~Vb4?GG^Cf*I8A7sFd;C65ycodvWyck>?*{nBf>UT1)tukk?lGH-tL`)#RzXjA9jgcg^@4i&TVb}IBz2{^aD_8( zv-b67yR|>b?6Brl<|6A}Z@TL}>u;A;>rIbUSDD>bZ8W`B^~@fdo}Ff|jsKY0ce29o zFnx_ucbbb&RywaSmo!Q}X8Nu9UbEktP2Iq&M0bt3M(HNW6Uw*8Idzc#DXHY+h|Pba znYHQ)b8S!_*I9LyIU2aX$*P{Y-sWSKITpCTb(Qi{Z+^k5tIQ2nZ8UGQs%L&N$p71e zaPAMv`R}dTXue`q&wMo~_pb%z{`H{TAGG=M%s*Ror}-DF9y9-D^XZvyS#_s*I4Fnj zy-MYAuX)6(UfrWsJ*K5xWj(h7{mL5DV_pt8|3CKsI_|DtiHyLnaku#a?)jcl*HJf6 zH%-o7$Bp)bNDlluH=h5I+rOvQZLAxt%huJE=KQ~S!_N*El;`~Oj?DSrAkJgOIsYo+ zKNFO}Y1ujdUDNZ^a&}-o6F*@(ADo%*xF|`FNl5B~4M z#K(WO>G{#`&H3N^-8uh#VE8r{_j#y)_S^KSPt5rb*Q6&G(5T$*{w+uUan$Q6%Xj_e zoWBKCe$OSmpMGS{{}i|-;-|K}fBs{0{?GsZod1K5&iS7QM}cS*hU}&9$L`8I=KNC# zdo$_zT2OCq_>gn|Q_SE0@SOk4;B!HmUW=a}{+~JjzsbWEaN1`G`_KM&;m%L}Y}4~6 z_ssc)znt^mdGDN`1}cvyKTSPJLQA=*ozB3V(9D9CaP`_x;73|95}u{I-6P z{``eG|4)JWoB3fx!@K8mbN*-ldd~kK^#4SCd^D&N#V>o&ma%&+cua9X_u4Nz`;k9) z>hFAM&i~PUbAA$>0p#at>^=|v0NOwMJpTHg@Q>EuoQt3EGoaQ!G~c|8+ugX`e9063 zI|KYCYFB^_sAmGHqWQOgR{B@>J3Hxr1a=3IS$-0OPx$WwZviu48axU90elgB3j8tn z82B)FKe%n^3I8|1P2d;7QBVL=;Pqe>TnrSp;GzGyzY z{fEG>f_H%HLF2#^ei`);h=a?)e$WFh0AW0@L4Qib9NI_Kdm`zI+Dm`+=o9`3=mQsl z^T2v=7I-CiDG=R{N1pH>2j2$&7yLc=9QYIPyWoA`UEnQX226tlH~1do7!1z!VS0-ph&1b2XsfDeNAg13V=fg(tQFuY69cZ2gmD>xgR0bUMX z1P+jot(3(a_zrjwd<9IB$8#g;Qh09+@*Rf#Y}Iz^WF=uV1$8q<{0bu$sL}9#z9#Od z+hY3b2={H^J>V0h{|lg&&Jgc&f!f{wCcKz@`~mn2@MUlkd0hvT#@al~ynE~k|2X9m z#Vy#~y@-8C^YAimCtpSz1a}1Z4(ibWCDbI4Dw>W!m45f-&QAKzfExqIEI&v8i2iWL z^0?s-7Si=&_e}nlb3b{JFqfl$zHSea#~Z=!zkR}g)#sN-=8FsIy0CjDf6KWa|H8sB zm!p5aZuP`>H~G|_bctWxvB1I8W;gOf#tjSs^Il_(BD;ei$7TRK|fpf8~*imAMkIk`*r_!>we9@XOU{I z#vIBwPQ<6vNbgB{aVl3VW#iK+E5cVS=kvLO(*jBhZ)5dX^5U%Uq^x z1uJ*OlOD2{Wu*NGDV~l^Wa5)W$uhPUQVGd*O2BTp5ah?DMIx8g==Z0lbHt5|VJ=~X zIKw~)JQR!c;z+M1(pDsKCS97UWW@|9KcuLbDp(0Tg?%WSo5`9HY!>D=Og_OKD$V9o zhGd2MnsOPLMSONT5dRBgDAxucKabmL;<*8H5{!bbh}$_4{c}xM z{R7)1^?4JoC{ab=C zVyL?!;dv2#Nc(Kn`kFBQBRM~vi-q^OfabOnpk2&=)b5vR!pPK^`!RQc)4@O8@9^5c zd(yua{S<2Bcc1i2-*>9?S3Ulu|5+ftu=`2Q*ny?{-jn_-AFH~BG@)Aw_fzMp?itKm zgK(m>QT->Mc+wY6Cl28n(o*+B((nV${{NFc_7r^#b=@hPd!6=_zYnyY?$jRir@#Cu z>n8gszJOUH4%gZ2+`0jEAJCksJ9qB^9|nH}?gd{5-vfFpQ|p-BAhzu6#eKtaLU$H4 z2~5XJiK&Y0Kld8SnK)M&j^ypl2p*gYW$hEWOvX(i3FPLvH^A+Oid$&oB{Iw=c7ihq zpQke#UdOoyQN+F)jcgdKkrQXIO_{N*O$EdBK}|OYUmvk)md#bo5u2;7tHz6nI#U0- zi*VI-SG}oXZ!ab=kS9$r0j7>j#mme%-2Dh{Igmd@U`cmM(>p6t8RN7>(`cN0rx>f5> z?J2Z2wd-Hhs2fIW4%ewsw`b!|;ne=Lr%-shKdiLqPJ`n4MWC?X50tJi0HtjM#M-x9 z0kOu9J0aqLv7)ZRQTvN)u;hxnx%X6e|Mpmudm~#B*}Ve++iUXwO8nY{eY(!9ka`2} zN=hZ5dQ|VjFE%fd`EOR4lcYAj%)A&?@64@|`Q}s1YSe4K^>d~H_1F!sH7`NEwP~$6 z8TH=JwVIcrJ~Vlrc^Rr%y`8rlU7oY4QhPa@){tj^%75)oc@bTDBF1H=(q_4mpuz~ z6!)HZXs5AGKb5^`B1y6Ksz+rv3hNO0qq~|*y-lXQqX&Y!)9B{^lI47ByucR1{_0F< zZe^vLGIjOEDRw8VxqPXWQJvb%4GDi!BWS!gt`D(hxX zYnqE@T)`sQ+-fRJrj<+k^Mdit?pf8jDwP!wIE9w%;g;XrIzC%s6QH$uNT60(Z?d^o zIVW>mOj1Pd$0H83_C*}9Z>aPAANhq`iS125UQuWjJE@;sYho&uIMk~BOi*IB7aU{G zO=gQ775Y#^I;lBb8_cBGpxF%zDi`Il_8R-n8n@7&^579)tdvQ{@KvyHJvvuglXav8 zx7J17%EeUc;Y1i#sGel|d1wmNT!HEd4X6~QuJ-F!r$5DfE;k`fz&4oX{$JXeZTHUR zDikZ#@2n}FNfk5 zJWHAxGVC--UgAvT%Cx`fI2Y^KXQJXke#0=f1pz5e{cd~gKm8wo2f+j2K5!hgyyi!K zKS+Y3KxW~tK>aN0gWw0?bpTWk6>}ZtI?Q#L>pTy?9RSrs#f&>Z#axHCRm2B@ zSw(!SFt5g}(Q-BB)x?K8KqWrhdHcB$pkiK4e5;6$fbolpc{S$Mm{()Q9lsp_mH2SS zZwEldO!)4%0uLloQ>)crM)kZEY8zlhJw|}p!;C%dV1;cw_4qpn!gEj^A!a~}tr1}MFk_E9IFL&vX9e+Z<`X2y0stm^A9>zN$eUzE|60JD7x2Qz9t zivcV|M9I{tv{v9BU`EA1ZW=gN;I1^xkMRQ%&ce5;5L75}(l#vcEG`1n!eN=aSN z5;5CEVV09=jQ@K4163_K zqS|aB)}5-1090iPvuVV=5%m<*Q?SRp3iB$=t1#Pwr&?{{*PW^Y0H`Vq%=ibWr=XsK zJ!bq9H!5ajfFBug1t5!PhA?`d19#NA4%|F|T8CPPy~?0kK(!gh4S$W$oq~D_{u=Su zhE5B)u9qUW`Iikm~GUJ#NSATG*X~w0V)NI8F%~< zeQaY=FLYQwNNPD=^Kd&CpTobpZE9+%e-1;Eq|v6AUoqUMmO{*GizG zT}d3cH`3u7$$ca4nCmcOj~ni0g@-?|g1A?L6~w&~tRU=_#DRMw?v1!N;*J@A0C&u! z)BdO}{xdQwIRMpG1Vb$r9tID04|mJ}6?e?eS);y4>+9D*4p5QJ#q2=_HDuaff~l zW`K%2X0zh0L_m(sv190up<-O2Khk4|YH6Tbf#VA7L}P!JPCD7+PB=D<3T@zqA~*9^ z=%iN|=)<4<$iM!C>2YykCpS6i5B_Z0lmHtB_Hwsjqn923<<|vhWN>!4*|6nS3G-Mz zqW}b|TmIBH@>laLW;Inz=pj{8(D~p>Xko+0x1nVd#%&t()xd!(Z9Uuk3;B zg76dubfH~9t6*Gu}6MH|J!AO*@+$YvbIjp>sKdx>v1RcqQOoMQbmuOoJC{pc zL4WWsi_o797i;TRZaZ<4S$Z@sUM#F%%r-FG_*K%~jXnOX9kZmXjujZuyP~0pm@OFt zW>D-{H#D_n8xOhd&&!$Uu3PZG_ zQM~*r>33lo;TdoB2S`G z7}!~(t0fl}dlcDQH}tAy(Z~-5`EyZwPA|J44VF&v*f{ZL!;vb#(4*oQ>J^wvM>K5^ zxHuJ${1Bef?b2bxB#>i}9iu?hTi()$Dm$A{9AsyKR&Jt2mHsX0<)(zlkNoNvhNUp- zM29Lr@+-aUj)~C5haxx8$x5_RadUQ|e`{&olunxt#m!G?P@IY{4C5_?r!c~J!}Q6o z>|C72c$z(rd8@o*kn49$1?{1c9YDuVG)6SoNwozj8t9#!{K($9@aX8}mtS$k!Gl*{{rcC( z#(sj-6pw|9|hkCYp;UT3p z^u)90mIBcX59V@NuYDmJB0}eugb~kMYQbY>)?qAbTxL#ZIG`i<;2l< z(Q_ieVK8rj6)G}9VY+N~BqS3)d&fDdbz83S9TK3h zxC)fOjo?5G|KMhDJGc)#42}c2oqP@aP_PY*f(*C;+yd?bYP9G`Bs=p&&CyUnZS)l5cM`(dop#n zeWIMnI9*n{OnQ7Wk%$%Bin+FpCN`Fx;Q%Q%%wvSpDHDsyjmB8aA+p7*aIwQ3CQaCf z+Y(MSeR~H6hkMOrXo>um?OE!wXKnYIn-AxBQEy#KM~e*&uZ}jB948D#fK{x3L|MF; ziqUWKW}=Wv#W*@iAGQO3Ko8vnJ|LW~4LC8AthFj6kbBFd<3+=pl4bH9#x$8K#TZhM zf*2WW-Pp0YYjgWp&q!Ch+1@uW+B-bZ-QT*SoG5mg?fTogBeXS8wRZLQwlAP0a7)WE zRFygs`ski5^Zk@2w%~)mi_`avbV5(;oe}r>sp~Y|10#L0D>k)twQjs%^A;s4UQDFZ zi~F!nW^ACZXK;7#uD-n@SNN`~qRFm_CLl00j-VFC%V`d&vXQD&fd;lQ+XPKpTf1!| z?ZrdXRw*ZH#&n(}q#ZK8ZJ*yPIJ`l;qt#o-Q--BN-rMGN1(6lg)13C=dmY}b+j_6d z+o1_UGf5?$OfHv)$^}HDTdR{xqC41ibzs?wC?f%Q+qQe>2We3<6i}hCh{w%W8&!WM z#fdf~H2#<(fif`JBDHogcLZ5=Qq9hDu@)7d3McfVN|+x*=u#oKBvC(mdjA`&u2j zW3-7-jA0T)8w;Yhj)6W_ERSnAV?D&P^%o%Wl{Nbj=Nc`i%;n7Aqf=$Gr;s)y@siw< z@mV=bfublCs;tvNTd-DmkPCjw1!*phXU(3}xY-{snC^T56+0rjxSU}PJ;_2hZw7ht zbs%@x>`o;_Uq%*MehOBD$HbJprZe)GlFwOrMOaI|SI+@-EM+;!VBx!n*DK|lwvwnB z>&(#LNZ%Fa^#^AUT+QF?z|{!fH|3j3O_N|6Oqlge2~R<0G|IR4_4arhyEdQK>7_Sr z$$EQs_w=;VLd_+qOwt=kPxJIGG6RfN$(_kV`(@{n2Ib)L70{Z{Md^SU-U)27bz zoQW{a#MdLF*3FNG8W6GW@2)k$eLt&k}hD!4;Hv-Ud4@NQdw(GXD1lq^kvK} z%?-j>Hm6=fS43yV)1{(v(9gf z9}*{}+(ax>85a#Uu~IHJozF5x1qAfGDghHgv6R%fVm;$VPAjB{c|>Si6Q+GUooz2p z8D*LTv!Ksq^+GWzvHp1ZH)EFw`$zU();qk*jPza>>+ij+w_nEzql4a_zALtRrm48_ zUxVoz*fVG@?;alLW4!Af9v&Pv`?~u_4H?iRR?gB9o3rUmi#a?&hs&0s|C=krCf^{=pIn~WZi`vo5)Y4jwouq z60DdHPZY_nqI3aSQ#G8K^)^@G-o#1jdrip(8o1lQ1j75J>HLJ5SwC*t(V5ZxL%aKi zO;g*tV!QraVSk#R*$E|6`C@xMS4mGWGWjAEzF3$6QB(uPZ!U6?EAe# zOuKxVwbtcOI+JN`skJ6qi0hP73ta+wRh3J-%}!I1gPD=Oy~CsX`vxM~^-XNz1BdP_ zBHC8#fH!lnDSvfKgK1*yzz!ueSe+}@8CU*6AUT-GY z@EPvzVEgW6c&OWQI3#~&dXJG>DR0_ddND(l_r>v_O_NWB7bapCQ}`hqY~m!uMV^yPQek45H*;my^1NqVWWrJ^ z=(R<74i&Brl7q$8AOr-R4^>Lb*QW@px5D>mun^BpHEI{(V)UqH!ZvAL?4U0H;j7}XW@sd;L(kqk>a*-Qaob>8 zOtWmzo9DEXRK{bPU@b8}+5K!CGhU|+yEvOoOcfZIuf>yd*u-1z8KojLl69u>ehO#N z;9vn+){2*8D@k0od6xJdz!YJS>YkB4-90KNtc-b;O%x_0h%IbssUytcdTKwk2!sxm zW&0pM{h~LZ@$4>}IO18B!wY<9ja;!TW^yIlDJIynyZU$iFYE_4-AZXHKCN_Xy&HMJ zT}(53SHSk2LDvo(by18s+Y*Yb3ay-+m*!#swMyk`ltnHUp}Ird#!4L0yYRNcvrI*N zyCE4o)h{oqK4dp-Sx@nz{&S$C4+Ev1X$6aFKGX*+|tA*d%eJ&g!)z{Rz8 zirq2;D^=u3_e%nDDwp@-jEJll2zz+Xh*$YkfTPj?60|sXIZlZt24(;S9A?Qj^=jRy z6OZH5PP244%c%>-AqF$mY|@O_LN3}q77Txt@c_}!LXkSrXAK-jI`mx`xb_FH>sR_# zC4aUKD{t=4v##C~9HASsb5hrFeV}rIasHf9^-&3E(R+v8!3QAX8JbQ~Px^ag!VI`N zSG6W}jWA*^XQ8Ap#4YM^&-`l`upLbkbDph?nxOl<02QNwt=e-UUP={KZp4zyCL|zf z_Hj+K8hy?yFnaMhhn(Y&Rx=w(cs{&`SaszNq_R|T8KKptya5`F9Ym>8w!W&;poeEu zsbrD6F{yY~GR*^aVz{DrpzjKMRmP23)~~YY9Ew~)$s?!DBv8$!okBE-M!f_rs`@#F z-Ra^X?~P@Io|&@}#7)Kt7hmb}G*c|wJ##rD9G^XLR(8m&W{-th^`fO6QxBzP-5^$J zNS9!v?#S-L_WsapyC>WmCX6KeoLO%MqRQb26{!OZ76fK+Cd=TF)VxgbQ3-0OtUJQ% zu4W${qnu~33YHw^(lT6waPmqsRH%4qB)VyoNVQi#*5N+S(LL_2;O;7uO1mTpKbYdV z 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∓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

=$B z-o0G}!VNkO%OmzI!cKVG!QblfJU{}BT4=!7H4zCz+)0$PZX(fZC$nNKg2PQzqVa%h7XDjCTtAj zu4GOYIR4&C+DG-AWZ|j~KkXL2y?TDX>RI_t!`lJxh`^Ug3G0^~|p{Yk2Fyw_Jyx)Z!b+BM%&!H`aa{iQ2T^ zHn5!t=6VT;sS|V7tXb`C*4Qqu=t{g%?UcW6(x_K_3%rnWJWIAqzKj1Ig}hXGC|1{$ zIq}%y@zxNeLE#y|*j{IRbGE?jO_x)UGOIy`VD*42XJG&Lh5V71j#>ZZJ^=gBOkw^L zwaFqSXh}6el`}R^TGtfIElblTAJgPx9S)YOz?~0P`nr#0;M`AB`I=1uZ#%AdUj+#zth0%!Y;@w=L{ zG>Kjc>a7bn)P?y}IqQKQCS3XJ**9fnD{U8{IMU%C8d#a)be?S?E>zHmf*P5x`WHS1 zPP!MX|EaHTM2;7%HFxtS&cml|QnL3nG=R+xo^;;~6m0oQyT2|2NQ+(UT;l)M)N1{w zKGFxiedwfpLpNMAVbu{pV@fL>d#Bcuj9fd+bqCooHz}(^-U+;Tlm(GbY%JWSZ9JZ9H)2aW0%pU z`4Y+wEv|Ga+QrQJdpGeOealJrbG9uio6J2d&73pRT8dE&CjC)x{bMKHzWDST5(mwi zLY~wwPnj2=%o;@WwRn3D`55tzZ93_e*g9;WUO02WiCk3S8@+1LI*8=0^81We?>g!J zP?bWjSYz9h-HkNJiquW!fA0SG{^km`y=Kj+g>dEX_SSw0XZKlliEZ>u5BysAlW}_H z@`^g{g{2?m6^(4v@w<)i+s9c;Q@-f8W{(S7D$E|2)hV|7dMEy`wj`D12w|4I=cKzi zQf|7>2B)2klcm1!&{18l5?0yqy6O=1b#HJ^Q|)EXLYZfQrc8e7!5jedBQI{dw%=(k z$eHw_Yu1bEUaw4(pI*ZBzaLrVTXh@6d#jNGBg120wu0Fh=K00mm@wr<7L0Mbz?OXw z-CKw~;$hADe>=$?2Rr)VlkOXX@gr}23q9|gk;2NWfArfWR8@g~V*t_k(eSUV|9$kN zyG?lr^(kE>GA_Me5#;w8`*z0w;g^2g+ha-iVY2~sZ?k{iw}EK4f@uR|*1?LWF;<%R zr(%g{m@7&1dz?7tKN0Mg@#Ir?$snPiq!Y@2fW7re&o98=X8ecN4(mS79lIxFr)-B_54}-zVi|PUuRUdL#r^Pl;r$}uky*a= zdkkK~=h(x`w++|EZgDQOGM&fTB4u>=?O>WcjAx@>UQzjqa5o7&)yYz@2f?OQPUJ?i zzro>VEA+{SBSI={7uemOKk1&~8*FesL@L?4{y5mHJqmVwM_@mtGlR)%hZCqtY-_1W z)w5)72e^SRoOB--Cv&n{Ru>nCG~u&^@A^`p<8%(?_F->}vLHQIL|2+8p@%UDQ zpA7M}^!aV^_{9d_i2>@x-wA#s9P2fp{3!UIc>ILHUmD`2uUg{q>ka>;p={J!F!1JFh^b_kl`0WB@;DA=7}Iq81cV!e3Hla7fC5NB^FF?F*OY%6nWbpid< z@OuDS3$zc}@ajJtP9IKOWxJ2D@6zD1;11&72=#%k)q1@ZZurtQi+_wh_(yLHG`a>1 zbW?tK)9}8+-|GLImEiIdPDDqail?)h@`D}vr<3ltieY7e>W~htpng3Hb_w$FD&^m_ zTfrFB<{T(Gl$bg>K=>Z|-?Nn#KhnuZp>2ZJFG60NXvl*7AY8K`HN6+5w~q?hqn83D zi%X7Bzr=Hi;^9YeFM~F+bKV^gfw(vF&L8@oIoV*6+QL-K(f3UMTA@VLJ;4Pa z7VZI1y^TXV@lW%1f0&7zy70!5TO)&r!tVzA`AB%R-(hIW$nTYWTb=K;X|Sl~&n&zF zc%Sg<*;%#GN!(aU2eNHn^%L?n6^;e?9Wn~rO4vGh8F>F_!4nKXjTbJMYP|5gy^R;1zYh$M06<*I=K%5T*j<>G%C#BZ zad=PTTR+PC1hnLy=zgKAE7EMJU_hNxdMU8l(Cs-;4{OC z)q}|vW1~2?M{3vRvF1MZQxQ&a*t)#SjJsL>Y=CzR-lxS|i_2>(yuqJTt!dIt3?H;xnb5N$U0gpV801QUE-8|A!?O@x$nt7g&_4a3~ z9oE4gfd5A;Z=Q@_i4pT1J5n-cW*cGwATJ-q)-dZ(8>4q9L5DF+5`-v8);7T(gTGo~ zjr{b(F(2Ba9DLNko&>uCtlnG})>urf!%pJOrS|;bUYnoe;A+2Ds2A1|EJ-H2;C2!cT0H*K@H*l7 z@vFa;|BC(wtx56oeCXPZ4x6TJTub1M#>AC@HyMdbZQKEE7qq7+uI5Lb&+mE8Rr{9j z2n)_gwKP)8!kT z7b~3VcphFqybHwRNAgtpYsM>R*NZ@-bDtU2%z+;!;44zs=~#iue?7Qe;PS^V*+}j1 zN`83KeXHWIGFimVdRc*;HA=V+!sW-Q`q~C>GrYHXapEs`HsZSxZ#TU3;h6HnYmed0 z!y75WQ{5~+PWj+HP3iHYbZVg;j={IUEC06;Uk|<$+7f7gs|cuvsIKZ|8+K%gO%o3P zWUonUoUpZo&2LlXZ3nzAc)sk4wjWw2v==Kae$2!p(7or0&($zy}fqxA3)tZm@7 zqxWwt6ydvnKw z475qg@K^AaH}7uwms?%8&-%Z?909|yT|ED~$McoSPetyyMMWvyZG<2F=}GsA3eS)F z*)C|~(E3%!rcUrTdN%lqiY3m^?F2LsGx;Psfo2JJ^yo?V83{j}88zsmtd>+9ElV7v z9`)8r5OR6S`J+gYX>lg?Iz=C$7<;;fDBFLhahfysMdHW2PJBYqlVlKmV~WFwg>gyd zwh-5*U!8j_RR25xb|=`qeA{+#cKbT=IK19ppNzaOlenQ2rjh>>(Wy1@>l8fT5x5*3Hx!_*ACeRAM9=_4Frai(r5u)9bTc_5SIY5{UVLs&L zIjSQ(xvrCwqQIW<{40}$-$D383UB?ZcH)9B)?e~c!_>h(0k-G2+~Mb?WzKTShGj(G z+md3H+8j<@X>LvCY=-JT{d?-4Frx}%&T@G7Sm-X`6<(*uURC_9U{8ZxCTw0GrTlm0 zHafZl*Z^UYzvCR7)e{YNea{wwd19bbq))elEj!`eACwn=P**Dot4iq{Cu}WY_wb!x zPw$STBW%^b<3|Adc8hJ`P8Kdzei5snkusy`+Tk~V&HSEz8OVCr=3bt<^tNq5zivt; zo-B1$#PF1?jT3MA^hx*6ln2Uc+KT&V)Ku#GJKd26a@PrQ@0?7Y5d!Yw&TdVe_SexR&)xCc0seJbj3EYh&Q!DZ%FF05PuxmLip^0Y4_a(w|#o0Oi!Itv#TfwcPFg<;Cj!S zc7MGvlFlld&TAs6u$(pLL@p`el-4WGTR7F^r^{+!qh&WK8%C$8J(f&kFI7&v&*2;S zDaYHuu}gCmVo4fO3;gN}rtNr*4qs^&8heo$Bf|#M3#J9k3v3*fC>e&@;pB@f#Q3+y zz;uIohQ*X$tp$)PWqlDpvgvg!I9@Qe|E#0 zhPO&Q!t+d)!r$(PSH4ETR6i!HUmQBaiB4NC>Go~#m%)FM;xO^UB!21d-S8UVy<9xz ze_V()xPY3ax3VfA=Z(dk05=ZqjZqvYALZij@PLZ1YLvG2-zj5_+#)_c;V@=t;30z8i2;5t?(z|FD&Jcri#UD2N!e=Cs*0^7Jm%J zKJ9{i5bV~ArrlDDW&egAo8#3v?bx6vEKgl)x1cq0SFt(2xH5IM{b)*Ymy;%VE&g4v zned~-JL}j(8cXN!Z#@njm7j)oiI{cTTWmxtBH{h0uku+zK7xvyopJF+r79`5)-dV2zD! z(!vkorL_cJC%mWUrp3wwRxI;rrPT_i2h6iPOmvSWYc_$on}**Hc0Jfe4?8U5Kgs)2 z*w`AHYx&&_W*eBb9>$wjFhF^!W`s5y2h4iZ0q}>xZ}9NBV|$fueb2M%SBsKk!lwya z^+)9W@zd7NV&`O+X->v&1EWiqf~g173Ff6SX<@SFq@{sW;ra--iEzU);kW{(Ae{Q( zHo~1CT%8v#dM~7O(th~!@GHdUN321wo^Pv5N-%t2m7eC-0TfiTtU3HI-bz-7w?FU0l z9wqTy$ERsc&jjSccl!}gP{nzaLd@+C0`r=9jBbsd!9f?9DJe3Hq$sk@+rAt?{$m9hT;`a@k<#ySUigjNRaZV9e! z!;F-*+2p+Np47stP@>K#e(g4qujC`~htkx->qW+YzHdcp;f?!oZ z%GkFgxgNZ)zzrXvwFcY(hw)->+q{SP)X=7GbOIvXg+OCczr1l_}A z#5UYYHP;3BTx_aA$=MX)ks^f)5{b}qah@Da{s;PPc_>HRkX~{KS{t0-v)e)F+k&!X%*SS$x`{_`k zw50EqxpjXWS}(L8|1YZhtNiK>>poQWxfMs<-&UmV13RT?-3R8h^Ab|Bb>Ft2wB*=O zSoiCY`)+7Qp^n=pMfULTfrC1y)~33iW`D!?n5Nm-_7D zM`8bb>;ZR1gPAp^{>S&(wSFar!V}h0fxdic5q*g((6cQ=sf!z{Y^6v0tg3npCvW#f zq5eDuZ7Z}cX#JsYBgo;+eu{xI4k!+DVVp~EV?6E9*R6a6gDEf7+nff|`9R77%7bxx zJW_6fqm*-$gVU$+;bi3iwK5mvHz-w+avCpFZaIU7c%;htNVs?8)9ouSEvfm!1MVG~ zn{u#Pv!ih3HqrSQ&+1VDC!JyjqWLuo+}y5~tnpf`y5TE~==+6f4)> zvndCwVh_(MZ;(l_=W>0p{J5v}A%C#xF}a5w^SoHhM{|l4gG4C3jgfV1KFL}OzuU>{ z_)pKc^$9<(iMvZB*=Fa;Lg%$%-R)UTeAa$s#XORX((9rwPZQVrXV1Hzyok82RVzpl zvSr6KhdF4mF}W~NM*J!^d*2p1W07xqR6ySv`NlK#e{|~VzfupIBX!7}-_)n+(5Z#3 zxqn{v|Lsp?DNI*Vk+|9MRi?8m`1(rl^*;YgngZJkvFhZ3l_f{dxNo4ZmGEW>lV>qk z>q{03n`a??#}DX?1YhqBzCIOvak#-7Th<3(ZwkJGr5?c2PE+Cao;3vcHA!rllPrF(dkS;W5SvMvYI`3ly zM37izTZrO0%cos`tA0#rNqyP0yWNW?s#BdeM>lY`q;`O51-}#gn#KI#Yzq#AC7xb| z24Ps0L~WEa%zkKv!hT_x*$*aM_5)kQexN1o2S@GmSOEo;AG>5^ZG&6_prNki$a`Hk1>T(YZUI z1=cyDuRdIPQEADJmT9-QXde!`Ztzj053lxn8ud61XG+sSA2&&>sUK4JZL7=)A$lSujCY4bloIg&&b#yv^?h!R#vNP`CQ5 zfbw#ma)HjPKH9Ju<6H*IXL9y%ko9I?_KE7X_AW%sf;Mvg;AW~)DV z`3|Ilp(r+u*r;L|k6;?H1&pn$*bu88a$RxJMqC)@{c#*S-zj-&Y02()O}ppGhf`=P z1#_9uRtn6Yz-S80AEthi*2sh>00#z901gbIfE5@-0V|*cAHJ=$lYCcio_2p#%vL)3 z&~2qyJ0^Cd{cmO~J@m2p<#Cb|JJQB7VpU9R?Z&ppLoY|H9rJ&-Qh{=f9h+m-SZs(K z&wW(0$A)<5<7Vt={s^WKJD|qSC1OLwGGenE%XsK@6`Oc$=Zvl0*r;L|v1!DXBetK% zrtzn+m16bP|Jh0fx+K=@inV-Vl}v1ihhZx{G2T|XH*Un^3=HN`Z7u81Tc_RIbU@PB zIf?HkWUnUvN(($%)3fG}ITsvb2nF^}p|KR0J%L3Od<3BiF@b4xmZhEmQ_{fxfGp)` z_(#sc;&Za=V~O(?Xjx24W%!}(2j-pqzy{2tu;6bgk^hhAKNw9oBQP`sg0k3I05gg*s$mFu~H9 zR?WV42_AAJ!o2h-snElT=JU3QnQ$EGs3p384(*u8)cD0@%9i6lHfZOiF)5MLbdlu##;Vn5#ki&%U z{j+)ZkhfQg8(zCggYjua@WuW^Z_Em5;a4!lXBo-DSfH{W0p(Bd!5WxNl>0B}k2{{j z{{E-WyMO8JJK^F)Yz^;nTuxN5{yT*+=n?3vBD_8zc!(Nd zO@6{Y1O1%`y*r=4w3#Mm$Cw}H75N0LnOwx`hfg4EPv3~i?dAHl!r;N^7 z?D)Yj#BBINL2+2zwYg()JnYZ&{5SdDSb)-XK1L&X?#3Rr<^PY~1aC1X?p#r!JJ>fTAme&{`WA zq4GZhCAgHV)ctj7$)>t_ca!dON-V?z+Q=oKUJxB1wz05p-hQYC6|RSH<$s)ZH>o^{ zg^33ft{3PQ!mT?q?Q(>uU>xM#D92nJhrp9}5=`#lraCUGtjy$$h)oZILiBPaS3bYA zr2TpG?uE*y{^qv^TFC>`?uCp!`sv`$dT6cBpLc(!F=&NKlQ*Oxk){%3!L`Ck&R zzx8^X`QQMg`Cq$;#CVnWzYo-GPjvNy=>MwK=->JLbN%gyH}^p)B1dv}{*?b~&-KewQlS2xXHrmY!`3?);KY-34yR{B&^7vS%ZiZHvgp>vM0! zpv?#~O_&T}UgE{=?O8Qp%$`-f<(DbEqoN9Y?XuF6{hxop{Yx+GAo4KEcLw@V=-*T3 z&0ccu9rU-QFR!Rdtb9s%H=5MGH0z+81XHW@K_g79e8?Z>%%s^%OtUstluRwZuyo4q ze!_?mhkCkknI+G(?ZB*G7=)0lsO-AaE=c|&AqH%s5 zs=leKDoS`{p>(RXqGYh7BDt}2wMSUt6No}>l_k!G{kduNK`;Ni(vlA7uh94%wiRVz zW93bbISk_bK0KyjinYcZ+@OO>-y4dNNmYWvVcG_aj9-mnki>v~NwfPqXWUzg=y&hV zm^z2o;R^13Sz(_4BX4x3Q2nn;tpb~w%9UrH?t3fb{Hqpq$Ds6k5~tWJR)qV?+o3In zw(OtJxYG4@{zVaU-#4h!^KAwB@}4Cm2hqDxxgpc0)knPNN77P18-iB%-7_vrn(AkD zSL*({7TwNf9>dbjK)Np19M3aPx#~VQd}q=7`bzs?0sG z_m?toMyt0mr7?MFV`<5j|Cn|sgK%JS>!#1ytqRX;ot5^<#=O?y3dVK*rvIoG(v?vq zX@0ko-gL=~z5C9nPM)RWGAnaoItobl2ki$_UOMAmr!g8#bS!AD;C<7}E0!g;P@aMY zYf3c`q-=R(_!v9r8`K_|L_jQ@OHsFU4$pw=rFwM z3uo+IqhWtA^|V5z$hj@d_OtR8$S+}TP(CPX#(#T7^E2vS`Kbfb4JJRY_3&EZjllby z!sn&w#6EV;gc7(9yRWtTIi%@n|Gc*cF7 zu+6-Nbh*LaEG*(;Y*XEDuW}p%yX6TpuIfNP%FAhJ+o3gyVEQ&Mc5ygBeOqJPVjLPr z;Oj1+d|CE%;XtW<7#kVQu|as}Yo#<$-Z0ms*FX#2J)&8S?j0e$?N6L>?+DW4o@DL@ zTt3KE$%&_ydRG*4CGj3!Ecs#N2IJt$GUiFnD#C!P9XM%U`eEt0D$UIW=kz9>E{PdaN-8j|fVrae4TKNv@ zbDfnB@$2DlJ`2AC{(-ab`{B=@g+C6z_8IZ%?}XoZ7XD%Qqi5lthQI49{KY)-Z~}fN zQhxu98dHAw)wS{b4*0ES;rGK|e-{2Y{OxDq?}UFOhA){q48Q!D==h{%VP@ zAH|5&W>2J|7Cet9sN8j}=-+3}xD9+;xjtjJRUjVT#xDs*m+OkHm#-k!$zba%lYfnOEqjc|_U zy(!;dA7Ll{=rksiO04xu9BpF;7mY1dmvbIAGvj_ox>)yr<0LXqiSxvz_acgUEPV)e z1K4cyjQcYUl6f|dk+bHCfn;K+_`JdSL=ic_Qhk?!Q&rK-LI1#`J$x=*ZM2_!blx%J z*7NPlr9YmjjgG@#55MMN)KzD(y7JyEZMXvay>G@%C|>G{tNnRrZ_NhhaxQp}jM=KI zUabm&4%94-i@%Xx`YQsK!&m%8ay~KO? zUTiF1uDD3oR2T22a({2&PwS(u#=-7--;DdQ_`2G{qn)PkdD2bc?<*!iEvdv^i;7g1 z@hwP(%GYA=O%<;f@oV8P-i=Mfw?8KOZ*Pj<3cntHCdy}FT{cw>v|ji<@ZTgp9h65k zkd+=|zJigTqofViCU6JAJt21<8P4%gxz4;wl2`JTDW>}QcM8~hr;iio<~=hH>Aeh< zGkqoY?!FoKH-TMN;Opp0>?wZ5fx>qYe)l(L++QX6qnLis#CSz~_$`EA_s=u#4~xB@ z@x%o=FI&7UVijsmuW{k1^8bSw_fe1X)5os#-o>~lCv;*8BeOAl2P5%yVvoFwajWHe z&tlXO-7+R2`|q2vcT1bHMfGnQ|9e#FqALm0N0?)T>E=7XK4?~Mc+T-eH>cLwnJTj~ zGgv9z9mG-j)6mw9`mLD6al3AA!ji}1gjq(I;y&@T!~CL>`Cc$6HsRjQ$q8{t#_QT? z58{zdMTXOBh8^~Nu}XsME``(ve+T^A#ivg6ZVM~)l2|4Mnp`pxC3)YTqS`PJNC0rs*uS#7S^l1TiyZ$m^I*Z4Q9 zh@*`-cK>R|eX30_%?3J?j~?hppnq9(Q!fM`Ola2Od^qyLyz1f@y6+9gXWVjOFDi5T z&tI;87i2CftLQ&((U)H~!#m_z2D7K2lYmsww{HM15if#&gTY_KzaBmV{<-n^W`nN| z@k>hZzmfL~&_~Hfzp9k_Rz2P*#f1-^tCdVOnt77)vz7Q~;`9GO6aP=b{2v1Uo%sCR zX7K+R;*<30kH+Kw!r+r({*ROYwqJYsf6*)b{NJG5^YqC?e*U|O|BBzl*8i(a{9g(4 zvkCk&z{k}8-x>Vj5WgFIG9Is-S1@ICSPqadpneKE{?x5IpZwlaBl*Tv=? zPRS^X4U38U7ZQB@xBkU7iJvlImG+Z%8fHytW8#K1?%QN1vwS(o z?R?28Hcas4;2&dD&=;FGysz-WgEt2>wyaogaG3%dhNf5>!Tu-y?df@UMr#k$sJ+jO z2g7piGjqnh9qy0hb!L(4y4dPQB^&>#uJg?~0gzhAj=Lx~=Kx)5Va~bE)IxUYg)rr0#UbB|M-zWH80PUy12OZl+W)ZK0t)+vEDO=IA0%WyNWgxeaO{Wtq>FE0yhh&BeB1HbzTMQzpG)B# zT{7=pe;$9Zlh*4mi6ahKyD3_{#FEki($hs^L5H*m$tsoo;0h1>5p1=BKt4!fE9v!- z7fpq1Ub^XJ)^9oqZwTHC)USw zKQQ`!%ntnGN2VGH?5^9h?!_ydRK(-v&PoRzGT=4rrawnheF#dZCR+ zXp)ryXosM^L}hQTm?*t`Z~;4P%yVXeWl26{+svc8p8A+sSMeJ=H`N@qi=Xfg*&d6= z0z0=Bot22k|N8C1|Msl`z7zZ}E{Ki)^9KKsF#b{SQ}OuM8~n#Z{4Vexj>oSt_{k7| z0{mb+{&5EXq_>&;OHUlQ3I7Fk>94g8J6u(So=`m>hgV%X>u#3*ZmOu^b=P*b;h28@ za?b$PT8yw&H`CtFnYVL1`fo35u7aP%Jol#sb@^FVrV^LZtIYRm^}{s3<+mW8<+H*2u!GEND|NO;f(~DG zQwQb{7;mkziYY4dNgP7R|b^;oIsX#rKMw_y)l22J>dgKfVx_ zyn^gHN4)q@z^aGsU`HN3>z*pN@ojLzIkIy_q#D4t0XYJ`qk7g&cw=@{A9-s4U5Q^( z4F!&*MyBV5j-+1Vtn0>~@}ya}IcST*woLp(F@Fxrf^1+ch!tH{gsP{SjUL%TdfBIj zdPH)*16p0ptbH#KakM)KE&d?9Zg}RMNU+jh$DoZt^VaptuQmcIv%|g#ntU<-Hux_9 zYugD?$NE*XtKMtiPs4w`$M@_k`81FxbqKRyuI^)Gq#b<2(`MZ#Ne{C&>+n$c3x|`} zsvdNgDov?tr({8^4BNo40tD@V)^lcf4GUL9wK`&BFG8Y8B`4LxJlt(KA?9?y5gcrdK%jt3VsS4@^B%vxi< zBXM<#5v)K|=sn6`3ktlobJo7QYVyY z3;~m`Jh?LY+F49kjsI4*!~x=H>7TVW1FgeeUfcfA`=A#~Ted>-R@TSiFXuZy?G=h9 zZ?A}CqMk6j2=j)tABMhoh3BuD^ZzVp-e)^O^y zcch@+J^$7u;dc}Mu)(b2&(r2%a^Wi-6X?cnfFUQbXo=Ow6{5I^TEwjNMmSOaN8to(@ zW>RZpsSZp#m>a=U-=6=I-Q$dPlJhqBo8TM&C;r0HHG_#44s*f^KpK7@{A2L{fp2t! z&v!T;LJU@aYy#8v!CCjOY+r7mEm!lnE29`=%xkLN)#Tvs+{H_ezt$o-lu{;NJp1CVzit@V^f8SNl@-gHxVWft(fO zufdrul0Rfe^|6ceHpQp6z@+!dFn=e&zbqdAZIIQAK5g-7;y*zC_LIL}zEyulew}VB zzmSxN26VtX;^W+H;=C)&Lm&7%;_+`X_?K9`k^f%X=65O&$kG+Vi57eX@&fFY-QEX( zDe;ww&yRHD5VSgIW?vLK>`wHyu$!TGK)*ylengvq)*YcqZgxZKgSJheVtQ>wMT5hp zmjeBP+-U4f-hq8e_!lWWTBq5(Z9bUnqX%FsN_`qTwievtkIcI72-+W=&!GUbM)4Hi z4zF z@Jasl@X}Y$dH$KWK3n^R`-y*K$NfIO3w$N`nE2;FRxjFR@v8fVm$BYMojjaAtMCH~ zUw`Idg;#x4qBAzc*Wc4keN=_@*8u+J`1(6#`rzge-v|DN`1<>isgDDn59)6V_~*yh z--iu;O;~>e494rIzi{jUUN7iw=QHe|*-yIbST_vfNh}ssq($<;$_h2zxQ* zjwy3nVwK9AZzQcuDSR8@Yd-n#!lwy8M)>5XX5E|lmj0xOSK%cbPW0LNwCZ68m^Lu4 zvKTYJ-Qe7!<*a+GrEhhG^i}6)V*MF)OQc)Acxj+3I>9fC$It(n@EQI^x2UYk?!w+C zA3Fklm}j$JUeU)BFGUpZ3R73>34i?4v+nVrt~HMH`LpbDr?~cg(t9vGv$+8TWb*F4&mp!ggNonORc)OW`kh1$Fs_ zS@++BB`t3bNM9J_FjIrf5-qxGdBRKv<=jgH?IK+Ai{ac+zOx24QF-Q>(dmcKf#qL{ zZKtJwse0f37ePBE>GLOuGqA&Q{a_^q|1FDG9*&WR67bvkMyBczs9_y{c&8O9lZOt) z8J~wq6X%vN4 zwvKA+R7d4DJ>i$214hBeEbNru^WKeR(!+jro`<|643xbG^fqXEWs~3HnxE-_*XFXBj<~H?89YvA-vg zAi;(Z&j&kz?m76?*ml_TY?bqxFy9m4C*tv420s$wkAfeI$JZMC+e3UMeYh_kf7;aJ zju77fzAYZV+u$cdd>{Ba@G){UX7CsDFYP4%U>n;b+L60Y^DRB$?SE-u#Q8wfcUld5 zJ=nuwcM40t%nT-OU=8&h{#FxkCRUW3R{;?SS@`kC{{&&Y;OD^B|yr4g|fWILg|5pazQy<{_!T)tU z{y#ugFS;efZv+2W@G*Nr_89z&EMEO}m0pRokU51ztpMnw}bqt4IXa(GU$)qZ^q`Y{%=%& zXTtog1K%2tPa1r!&7azQEBM-Y{J~|4|G6Rl5cu+V{APpi2=Ph!^ojkk`R_6K?hwBe z`~mPW^}E#I|Iy;rcdA}z>-WKoVGUr{AzN`{SQq>%+V%wTBF{y~upuyQwS{BYX6Q@E z_ro2-ju5_{cyF|67ahY&USC@Bs`J9J#K=Fil5aiyblVA^K1aI!VB7^^x{{kC=&Xr@ zv18cQCdtjO8Ux)@j;O1^ zBwLRdx>yBZ-JCm)V99Rl2YUqUGlXTH&s{ksX+FoGXQ8hV-Pn&NF#8?tqPzO%4lwC| zVXaIU#_x^|j=3>`)q&O^L$FkyqhODL{X1d#Q9EU!Reo>QeRW(rarr?aag{1G-`H3Y zw@*Z6YJDU9?U1*Qz+N5pahWxdZs=ps*DC|;ms(^C%CI`_!V9F(5W)BKGBg{6GEARw--FKxO%4w<_A}z(@|2raoE>B4|*Av(AqqA-!-}(`43|h_4ys^ro zZH1Q3qwR!Noku$WZE+s$D72~wElr$RXqC`1e5(wD4kwe@S(>_L%JffR7H_~82Iigs zgWrY&UB2H&m}Owb&w`OJvI|TW%myzWvu9(aRt#94=X#S+wwqF`!s92VE;bXk<>z7F zRsBprTL-O4@$nAF*)QVzk}z#xGUvdo12X`|>{~^DF}J*Sqk~f{xzBV;#WN0O{wx@c zm%G69AH%i?^cZ@>m&L|N)v`|93jPH6`d>2_@?@X=##gH0SELZ!ieyXbD*bmEi{1RU z98DMfPn)FJHsleFZNF?I@^*aIy)=yP#X{jhX|gfB#705ds?%QKe>3ZD;afj7{0>0d z3hjKwVd`SR^>%piPw{7ruW}o>(cgN$QqEK+IA3VDm1u*fhwaY&v24p7Qiw58Z712|Zw|PtUqH0kz|rse9g)ZZ@05H7<>U=>c<5 zkZ&{RLlJpyn#$du!02G>{g}#k|ExW?2TgT!8rm=S9uM|r zZE#jBT98q{WcKIW6n0Cnb^I>*d+kT{_UWKAqW)jH5?Fr9?yAdG+JYS_7p zI-$tdXnXu}(^dmuc7S<$83BBK>W_WzNJbi~(cmY9FFoa!R!8t;*{ngHiJphcn0+Tl z!EbuvDOa*a+m^E}&&c9w=&yg^ephN-KWTo;--JE`d$u;J19J?_Bi%+L#Jl}Tr*hh8 zGqhcM9$Xu#O%H(IMjX2&$N6>HR9Khu;Oj4aaCpf;Et~ZAKl4=neK%$epqLCOPhEt` z66V3Qm+)iYGwCxA3NM{93I0p>hwZ3-bO_qms#9)Bk$zp+Pc&Wm$tl-FO8<*jAK*-*C!J=eE09uWhPW>g>$h2PFmBNwmqg zFu!>tGI{}j1oi3Zl-EV8ldD(udbMlq@9xN7%;IYOjc;}n1ktGs-NZlkj#Ks?MdAB{b?3kw2Ge;C%siM8Fdf7hrWNk@ zRa)t{V(*?Ko(!1jv&5r*+5@KcowOt0`VnnCw4Mk}bD1${TcNEG$dq5VV_N)nc!%Ld z?X*c~$#@>xD2wEMqDDF74&OF*Yv=L~2o-{^Oj!|A{BT65o#zkp(O<8$BT+Olr z3!)l&>cMS)-kG9jEtH22_?OIuvaGpHFSOId{n9`_!+9QeT!p>1k&DmlUx6Gc&FzHm zIZK)c;D0h3rYYGw3N8EYQ@;NxI#-Tvk2G>x{x;74jz2hTJ=pc{IpzL}G-S7RX!YIP zTF6dpYbKd}Lq`6=HoW)TSkwMsllPu-6;ADMZ_~B=n76}Q4DY!fPix6_-rO?{?Ew6G z_^i~he+Yisi{G3T;TV>`mwFN%b;(ap#jP7$(Q*o(Qp3tqzW;n0ynA0P{s{(uy~V41 z2T6Y&=|9;^e^}=XDWCFo0^SHbZ?8+aSx?gg0Dk$|*fs9VyDy98oolCk-J>?C12aS% z{vEiUE~BU18dYUxzSRj<>6y9)@nUSR3~{W3z6JVEy>z1c@>f*Uv*R@9{60>PFXvje zgj0ET5l{W*Q^C0~)pa=sVO7^1@Q=W6f&WVlNVI1(9kbVaZN-3-_+YU+G@4V1e=zhs zn>yGFSHFq*;m5F@h+1)b^>8yYWaFq}q_~pFk2&AJf}6j*Pct6NmgpyZ=eASsd(Ml= z8}pFFzd1#W{YrbZm&}@w(##Nk;9opFYWgg;f_K9_&3;eb)WED^ z^b=+?VP2z+cBXB}Cuc~^cEZHv=jWvA{L22>EOlu2D(@ux{Ett$w-H?72e~Xe{W{M- z;hh($rLRBcYuUKI_Kl}y>1$Ju&-#6>6a4J1So~WIzV!(KeiZ!o;_=rR{K!)R{4VgH zi^pGT@E^2z^|j6KqW@6FAl2-puPPv0h7r|J$!Qn*Ap^^CDXdN4j)MDwa7H$wd8(23Fh@bC zQz_g5!u6ml59Wq5^Ji^=oyZF(yI%5}9H;Q;-7Og&+03FFsy z^bQijye=<@(O12MX(5cUHz+^*9o7yzw`;qD@r8`S?}vYj@?rS8(}UYuxmVHOh%33+ z0d5kU+5blUczY~#KJDhH60Qe(6l~SeQ|`Yg&b+$x&OkMA{=C4Yps>~N!5$#&i*v)8 z`t-uq@h)tEr&PMRgRmzEyGCJyvU0B}WmOsa;aC4GI@hMo?HM~ZfRa(`?l*P46>Jw+ zQ*W@$n0u4g*O#X*)0c5oap+&Vzl!(|6J|YO9&6LDwjcc!5aDcwNc!?yP81J{3H zg%FSOUH4x64?p+n6T1iLwFeW{;_~qi5+YcVt4^>zzc}SK%0Gk|k6+0wofyZbwUO`( z`%4zB#?LiIn4w>uaz928g~1WUbP2_%11pNp-UYVoSEt-pc-WQZ+yX~csAMT; zjWb8Vbc6YpFsA)Yd82LEpm+-|rd*j~PicWz1U6m$y^Mdv`!&@gih_FJfFZfPo@v>3 z+nsf5bsBaz*uLYZ?7gta0@$@16RNObQwth{M!=N+=9D`bw2SHU(R_9}2aD%Ovbvw} zqrW|6&m~e$&p$<1)Sa#nj25K2xlgqm?d4wzAe%qA8GrciPPtduvQ$#r9BAaoBri$G z;im&us>@n%^(Ribm`l;V=<> zXXPk2@)6aw%=5L+IPs>^;x%vgBV>r9?fz52J(~q~7H-8bcQ z89%e+JqxCxG8>%p9d_s=$-OP9tL2wv9fp79Gphao;}N*4{C*J}^nKC7z5BSdgzH;v zt=YA)R`A;{$hsZUcLlOk=iFG(j;s^pmQhV>^z1ls?Yc1Q?%{9xgwBAWTsUfs#SrLO zv{453Zm?ZdS@#pd=B2A~|Mhw4Hp^X}*HhKE%D3R(B%Wt^@n~GFvu8~AN=|FxABX?Z zTpi{4m+G9;dFjZ&R{!oMT-QZe_wN<283%MGNQ1?`y_wWYs7qC)wME9j?gnel;!qaP zjthLOR~o|td9e!3=%w9+nI_E1+e+vvu=#2bs{tQ_NBc3o+TdJE7orE4wJgb<+M(>j*h^sV4CbTE$MCh9b(P=xZcS|( zT%Ae``+sXb)@0s+={L8<>T&4s23Y==%Y(KAr+aH+BR+g zpZtrgdux0fcO`0y<)bkryJdjzOY5?MZ@Az*x+Y<7Dy$#X!7jp%6ZW}hOS@HdPPOC= zF>w!ZFm4fV)km1mKbx^HkcDvU3&*a;Vtx~P*Rz$NZc>SAl%U=Eh`YN!>wYCJZu$7l zMG5(N=F;9|f~cb+(ZnFsWcK;)C*A{pn{|I0Ul)Ce_o^N8<84e~<`u|;?@vji?Asf? z_8}Qglu{0cB8wSQ=R62g^}KDC(I;ahSV1{c9{j?Yt8WGUy;!ab_n(W*qSEl zx`^##>RR=Ycv`W##!fh7I#ga=W8_MyN9##9@HeJ#%oZ)D@?7>Y?DB zAbswg#|>bYg6&$9b$?vNA7S4Mb#`;bw3GP4LS-UP@Qlw$`lg>a=5Nfpi_82t3Uph8 z^Nk`gP|2qME5Em9-9HQ3J1@NU_kX6i>@(vkS`TWE%5BW=Zp*s&$soupn;A=K565Xx z40%PvW#~vg^Y6IF^x9g4+?YZX3cwN}Q@(NXQ9hh?Z;RKb4bEqZWP>5S(~CIT0TuC5 z;+`hnnvGfaQAOfqh;V+AH%=>@>U+t@X)nS(PMd7<>cx}OgQfWC3Y(mM`=RrT=E#iy z#JhV_*1apx2k6_i-njFD=z2bGU^b>iE~qu-nIwGj-mG1(Az#7TTH0YRO5jLX#dWU1 z<*SP+!fC>F5>Cym@(eoHnRO=BQPn4qZ+K-v9ffy_sgAzonG~4bTv?XfqrR-Nv=Xj< zbJo2(Y2z$159+gb{T9lO`rs(x`?p{(czv+N+PoVRZMet|djmF_RM?$hdq0@fc0_CrjkW8+c5KbM zPqgK2AV*yP(~5V%0`Z~muoI1p+1s}r{CM@596wOqYeS#U0r*Qkl6C)9d846TjnAiw z&tuTriqPkw_d_>twy0rwF;n;|l;C6@y#{(M^sV>|^p_WFRfX2l`o`pLMZr3?*N~7e{ z=)+HBT`m3VN3<$vbTZAC=*Ap);u{J3w|9NGX`}Uo-#<~KSvS_`y%*~pJC3vL436BQXhimz+}d5OfQK2{BFKeYc4 zh_>{`mbDcV3w7Q(7*Cd``uW3K;RC9?bP#s*bNE6O*7Px*ZS11A>}8iCZwBKBS6@7c z4m$nC*fpn)YOPTnW)hAt3SUCsJsgj(G59%)SART8KDx;V-9h_j4lcBwMJ@opZi8|A z;NR4yQ^j5WS^OKH&$`cX_=ECB?^jD~&)o;3GA;vu`U_dRkJ!^=8)bWH$%%4j|FES%iz6O-u*R$4NYx9MsyoP*TZu7;Om~4w};I@Ms zP&=A@70k)H5(zUM$g@jVoB7dk!k_p?)~$;R&)!lU70I_un1_GTGv1;e6EhCUE^PQb z_S;m}{XO6L`7+~BOuQ>ny2+`){td>rapLXVowfT`!tzGPw+81(p|vTwI7HaWJz0Cl z6!J!eqQLMS(%h__8+%6+(pKep2m2+!{y6X>p!2*v)QMk2Wga`;Up<%G13UY+h&ihG zBtLD$m;5I38^l-8PGhC!HPZa45%Y%=#inyjDTd_&@zHoYPI{B1*L@)CuGD44VLe6X zVn<68Up11MCm1VII7SO5Ld@X%G>wtG=C*jT8&aE6uL2vLYT7BeUH|$5NRWmi`jT_TYC1%~gh@*z z-Z&_1)lTePuy40w$Iv+Vy;^Z0(Yt z@W_Xeu~9H(r{gio+XR>ln9nF4#-dVt2m(u-yKEh94pTW`33~+Wez2d9V%a}p?!Dz6 z)+n~@%gFcr0d_#kVjN^3QXW=xxO^uP?^3YSV83MJwOI4wld#-6>0wnDU0{dKWOMG! zUI%Rqn%_@^8-aEpLQ6y246W<|Z(XNA9&BHo1hWZ@AD6-%f_4y^H@_-+=Iu0?@_EKn z@Mk-#s4=?cEBFJz{2aNSw6fO$e>406 z@y~J=RCO{0cKShJ7lWMun<<$qxC6awiy@v zk_%hD3){MM&OPO0CH-c*xwflwr=$V5q|#vP!ER5?#mbm4onVfGIl#B%reioE$zjyB z@*ue%0JA9>=2>mJ3EDwuYm^Vhj5fkZlsw&L_7Ez+yTF}ZFz3F};u^@S=H+ItZH|+v zRWTHl&T+7v=g;NriJpfx0?n^4)oogH}wG~H8rStY)?N;f3*g#Mi@rU~ldme+*jkG4b&#?Hynm&Ve}$W<8j@z#G}Kx+svn z2FUYZddOdQFyG6wRdp6PQ7YRp-&j>Olqimde?opqXG?-VjQ!b?duJ&%=p;T=%n@(o zSh6`p9H;h#^`LphIJ9Nlar1<;=8Z{dvAp4w%CSkc{6UT-JJZBF^w>FfUisBJ1%ktU zXGSA9>^wH2!(34Ls-7$@xjvFFwP_u+%;V>B_WgI=YJGbO(+0mCzTc^m@ipG!lkf>!y2 z_;eMn9!x8kXt-8r{m{Mv-^g5^zEl18fvKsUvpyBV`D+tF{YHO*8~4`vd~(kIT@`=5|MBp6v`MItjOPjY7Cg3JczvWiL^^=1<* zqf}CRN|cv*#h*G8oCS!^Pi~6bWhd;CZ(uKw&gGIvvyNc4FkrirfPX#nh2^3cGy)wgDnVEpN-=PmGm_>Hh{q@nGA zHt=M|2fh`?^GgMHBnWdD%=WWjG|tR}ISgh4-;xjXqA^*_w8nUatnZ{|3Vrhw#u*QX zdC_EC#-0JBJp{^YE4Xdoo+cbWN}~(fZfKq@U3s!^my{*_KMgS=fr?@?#mzu;T_>UM9u+y(uslc8*=9uGoW zM|@r%T#PHs)VDcpjF76rg*y$ddg+|K)1NrQ`c@~TzR}LA@AMwx19#_xsP9&=JD>N+ z*Y{T9o%q{1_tOudz7G?oHd9#N)6g@}&sN`6d+A?gh4ozvea%0G^{x78fYwfY=QM`T8D%Qp(E-vcYn!w0Hiz{P`ogI5#IK8+B4)Qy{t5aOChtXHSv*Qt#4F>j}T)syX+{K(0;w*?olIvyX%qY`)K+ptZP znDe@uj9)ab8cqAE&Z@tK|MF(ywslq~dtz|Gb<72M-&(u9J!4VW7O>T~%(*QE*xSI~ z>S3GAzPxo{8@lJ*4--ypVa`tCVPb!dV#GCmwfRWH-U4Jwq0o0;)}1`}pC zn4@RGnDz%V59a%dhdpIx*z~4~5wpw4O4YZ~w=WK{k+YrNe&5jN*#NftCA6jDkIq2$y53O@^$N+dx!LJQ$-JlF*xOF zrr3$6qDqVi&mzH0P1kG}wNyt+#vjv)8V5xH?U{B7w3EH-qT` zBb&o-dj@|4(HOo9em{I~JgHnG??Q&faLzbb4}-NakAbUvY4LcJPVzgYCFvNx(y4)8 z2Y)@^)ImD;E>zyK^X!pUa3kQJDI7nllP+jmq4{!02hu(jvmb=h5vKZNKc>Nsg6-&? zJFBmG0?g1^Fv{;CFcV!>qcTTrj3>_ekmtem-!bR@nlO}${jmw-+6!^I z$3|Y{73RLC+J9#K{bk|YPP(!I+B#_Gd;Ole;r$}H^7P2o>%6h^TJwKn@VB+W))Thn z&N=@)9BYyZ%rH!F&PsSDn6cHif|~&M6`Rk2Qf5K62H$FH5L-=l;sM3iH|N`lmABI_ zY3RqGcR^pP@J7~Teba}%`<^t9Ec-70Ixs5&jP?7d4Qt>Xgtt#T>d7iWj1lA-ccf`U zhBPyFw1Hjc-f!PNBrR`lLMV-}fg7bon=Z>4z`O&pMsJJ~_IFgy2 zcDZ?Pn>8n@*UTN1zujQ^zl{_;QZgW#1 zRmN?EKe2AkU1{a4txfCV=ph{LT1D`upJuK25ZKCB&bc3trgf#4*5l8eR@J{SKEDcm z;iu*4Jn1oisYLCqay5V*>i6u5ymE0qCM;G<&YcE9+YJzY$2||OT-(7Oe)U}L{Rw7& z%4KXMI37uCRY78^!xMxrTYv6yrNJ)#9`pUzdh;XGXIRLlrhWY^%rY=N=fHG<*$w9F z;ORTqT?v+c%>H2pKdbkK!1TTD?3is}s$U<@`OUooI41r4NRJ-?(*ma0{RpP~@O$9P zR>O9m)M0DxQsE#TCXK%lkcQP5zWDo;e<0L#(yO)5TA+>D@Do~?eBp3nHJbH$qp+Zx z@gLkoBy2169%v_^jVmnc0a2UprijUBZ;OmRdUR7{1h@A`sw_K+Z`m8>+!`yRy0h5& zkyz|^HiSJw`8fu*;fCE6|FqX(&uB{L}D_Eymvp(*UhzFg{Ed z{2};JKiN8H6VN&dk4)%2zMQqd7RcjZPJp>H+K0V+v7EO=M4fH1BMYaR_BQTow5Ksv zTBg}(W$!~fMqHH}=G;#zy-+9X79=!jpp%WSLglRbSNxUW{XC1d1llfWO^Smb(Uw6w z9l@zS+Mv}8&$(9!Wc&(=tA@2ExYxc9)(5{GzQ#^F7O{U6|EczmD*PDyb!XvEz~2P_ zN`(*Ne^n6wLHLJq!UOW&%~kx<@U!q=pzx+&!@t|6pN3TV1NH-KjM}O2U+MKT&)!}N zrtKV<4ltwVz^n(eKOd9l``H2}ITH9{8ywzA)>yw2dMorszNrVc!P+&HgV2Yd|BdMU zsGW{Mn~2cVmrp}G0?qVCiil6IU1pM*)_69O>MQ+2+UxJ6kK2WZgFSA?z@Hb7f0@CL{3yWhCJ%k&!Hm&n z45CwQ_3#w87)QV=U$vC|lEYTX1nfG1N;p9KKSoT@P~;nZywJ&N?D@P_&FlVOrB^n*VOvc2yq#*Q4@$c@G{;X1&LzGKdwJCEXIFoM(KkM#HexTUnUw>DDFbAen-qrqq& zE?@0|+h@+QOOCgL9RVBFL6gvSM`&qqhoF_bGw3q~>;J->2D9ue7^PSJBjyKSjNg^N zMXQ6h37YIi{YY15plyM6LWEHMLO+fcn)9cjPFLO>)Yiusab@1+*}F#8(2v}&VY*Xu z>duNXoK(n&{71XMj(~l9oZRWY$nO`G0sC}7q1VmGd)1H8Z||A2`=3l6uBu3T?_JlC z?o#-D@Yi_djgIBy*1i|2?Eq#&w#{n~VMYlP?k&yhBWrc;>!W0rt3z^T>}*K8LO#2~ z%%(|yl6cqM>y1@jeN}P*#?%)=rv7^j%ov!5g5{c0zj|^^PuT(7aE! zEIRyCD2`xGq&7Yd_P__`BI|5OD!oZ2qDwWzZ zbMUtN=)WJC%emKF<8=@8&LZ>y=#S^4e|Is=3$>8*}RR8=G{|vNi^iBUMIJ4B9*ByZ= z&3eKeAe@=cdT-I0`@|ymI9!4TbBoZNN7Zwui9(9n?Ws zS~*zW&0pK)a!RJg$iT)0B$Tu4EB!r9oSTT#A48l(2Ds!((sZWx9xDYeN2j{ z6>JCC{CLFcfj3%&r?wt~Hwn-8&qVdxEqa+ zQe);cxZU7>kBN{k@6GnyRGYn)1L?^bhqxS;4Oj)k5Y9`b-|}<%_owFE5Am(^+0MX? ztU9&eokU<>orcv1?ijdheVo~jw05I&w=s*%zUfV1(w|0$D34fcESIk|=OwuO->5a_ ze9P^@IHPx#0ozZQ>d(+lMat!^wY4QKEw=WxA|*Xg_6ycaCqmhc>H&&#cadYE*8fAe z4BUP=Nu;Pu!)9BMs>1jm}qEJt1lVb*oKM|6%`c?l@t?|Y#J&m%49Rq$d-~(qD~_t zTegyn6y4lVXDvlrMmBBPD$->Wj=DU*_vgN!bDrn?dD!yxJFnMs&U3Eob6@xW>%Q*) zyz5iTGXQNPw7W!b%aO71o%mInyDp%lWLtHlB{S2o*$}f6nI%7GJSmGzna|vAkutwl zjpCeBE*nQ!B|`(q{Gh=xW7=ikZ2Pob z{tY?lO~&dB{6b{q{S|vSjjp_iLa&1UQQlRqMJtEam`1CH)(*|sP!6sE+6oUXirZFb zE1}i!u6*naV)*5?S%m>fWqBo-5iogb*ArzbaV9vEF0L^|McC;4)!+xcsVGjyaNqOr zo5}MfrPIn(d5uop&1t(!Dll2XTa4a^y0q#*Kfw-Hg9X~loJF0lqiPI zoxHW_wGM3Uqi@E4oh`jC^QIR%%-;TG2a8BAg*E&)+P}x>d-Cq7TW(l&|NPBam9(j^ zRk*Kw+@0@J8L5X>+~BK^kEkWtEZcmhd3L?)Gf_PDvZ&8ke?e^d!#TL{j4(^ zRRd*LoMGnmq#L9|Yru|z)mAL91#Fr(GMb=og1%UE6HiV=(p>KXq%5RSF)y~A>jAq1 z?DY=z1~!E=mgTLBWm+hZQO;}3xK2jluSL#QWR{KYLMB~>44KDfm#H+K`%mmkWR^MM zGF$jWxe=9kD_#@u zx4}PRx_B+|k5?&1^R{Q%&tTgm_jbu-Lh>hwH(1k0r5f zxoyoKO22l1+X^mSzp1?R!7F+`wGXozS{1Z}&XVoA4q68^rKj>M*-yM7cR3ecb_N?W z*DA@~PTaNO?h}qXZ<}Il$}gp5FF1|8l)r|4!QFDlojIeeGgLjhLMB^cK4pU$+l_*0 z0>25o=|f$V2pB&+as>JOOxh2bMw3A8>BP4%n-+5ogN zfiQ0tn?oeHVP(U5Qx6;955YI6_^;%Sy_%kNIP_yoDK&YcavIo9{R4ZK#TJ^=?PO&! zcAh{=x0isc_=8hc$cryIc5@~4I_M_dsgrc$Oc?5+w?kiI>&jfKsn|$Jk8q8rUaJl) z1Ka;%_BzlHZw#I{U)Mkj{L#%wHgSIRC%ETY+3b5(%m+T>U!|*=CyFQ|AgtpD&pJ-d475>>x zf63hetrl9kT!pXTKlE?l?J9i2R)8Ja4XpfZ20M|(Pla(AyyzA;okZ(}Rs$`e=jGoZ zv=z{HCv2O+4(|pwirnxH*6)DzD+di=O28Dq{APR=?6ZnhkPP7%!Dm*mhcOSGiXuFf&qhJTYcHnNh zaa#GcL;i1d{g)oho5X);|BD`!yGqg7dmpdlrK}n1x<2g@0M-CD4msO_if~ zR6?(VK3zP7YX&#C8@L{D;lJ%#-VnHk-N0=Dw`MnRc`?>IZJXX-rCS-eCUEKLSq;4} z3%wEgSQdJl{QG;V9Hmna^eX7L@y;5po*azqMhytki3l=Sr~W_-tRZm2;M}_()A}f! zf2iYzGUos1M?&+BiN7{=2{c1PmjF*crbc#p6#q)zqJB)ceOT>NDr4x&45MbuU5ePBiMhaZ+$M1Akhj#4m%urD$BjG_e{k1+-R++%Ecx%yU-&nBd(zx`{fNRV z2iNGqooV+LYeByWvSihR=_b5aIkFlo#@zJbjaLV_mB_lz!Lh$YM`MJ8oHmn40EKq| z+;4Am!>jT(3~d{3Pmzy=Sdp3z>!4Ns zhqYk2gxA>c%s(W?%m3mWyf#l~H`{xw1u(?^t=L)JA^UyDQ(`6 z`WU=Ai~itJi%eBz?V+v6>_?_!V-&ES09yn#$^-=wHa1IMC>WRk=@YHk=qTndavEX4uKs8Yto6dbjIxx*SO4&oaTmi zE7-Dv-3xC)I2c&9o7f7lMSJg_+-9)dV0R}SR)P)evwLz!z%JcQ>;%|tyMdK{EXoZA z8s0aVJm1Ey?P9{p(T{WC_xbRva9dd*j-#*B;Y(`I1?>p(YzH;K2H(Afv#P@-APC)vq z1iaY?yI)?gEwV`8xmEk+&2F19YslcQw|K>?ZALIqL6`@5M;DZt^u_G`wp9hDKQ$ql z`}u~U?O27O-VKBFRUUYsFjN`*MvIq?wUaQcAPkji=iNLqcSSjCY8r#DWJx#H)hdm; z@$caMeZzNPjl#Fi4c{>M8UFa!O!$uDn>1DU`u4DSaLsh#dnZfyoHeqg)cezme8U$! zPT}je{wY2U;6Df6C;fh7;#0%76TS)-s8o~Q4<^HxR_=6n&C%IR$i-$~#76wv{DDco zeGw(K3g3CwKZS26_%;6c?Z*p$7qN1}H%|E4Nbf+>HcJa1XTsNl zzF6}?-}GB^g8aK2U!6M82Y#hLzQf=LT>M7qE`NND!9VEYcY?3;#}^s=n2Rq(FO>V^ zx0>|b;^G^?7lQZ6|J4TnIlhUn?7E7X!NA-DChgh)>Q5JABFwK;qu%aJP6INRC4Jfq zb{Oms@2cm2SUN^|J!n zDCsp6;!k$HTWb!gK(*6BbiGA?DE-=TU;UBE#NJxxEGWCui7i*g7}NNZ%6<%8HStm3 zx)L~5W$|+-C(B|9x?|KIKYEJrTU~rT_*MS+9)th4i(di01N@$ZEg((5$9%88uQ&Ky zz9}o}Z#L%#1Es_jGu$_=LZ3Hzv^KS65tDf_<9%L5B@9Qed^HfOg^3A;x~a`;*Y<>;1^oF%Hir+ z)X@Vc<4Q(-DtXpHD}Yv=nzn8`#u;?s&@ZwnVly5VMMmE2V4!%;q#g62EO!Rk^TIhC zTACyKUun_4XE4y@pBAkqtlMm!3qJ_H%0F%u20z2bEegJyFw_%R{je z-f3ixyJ08;KL@-|evBG?tqp_fbirQK1H$lLZGwLMJNIM0;oD%!OSSb+X|xIa0)PCs z4F2D4_*N4><-wgvU1$17ZeFuCDD2msCfI_1`+VG2&pmaz!Z!n7o$wW)S6(~BR}bB4@bBjvyu!Dg z@U0=e84mK(LzSUB6Y1x*3G80t4*c7GsBik!Hz<4uSpSs2tHE#b$ImhN8W+C>{Az#v z_A?~^6c=AW-S6?o4;y@&i?0OV>W^Px@XK6$EBIRQKKWl~@Gn`s+O%3O`&&wRG3y0) zVH322je+&E3HspolD8AcMIU6?1j^45FzYBU@1^ZmyA*gIHdX0le1?A;UK#pHPz_L8 zyEHGtaR?bhZc?a9hkE4Ze_}FmH*2juJBg)jTd!etVtZUw#{&{Wijx3ds{_h;zkK=wb?$5RI zb)Np|UBOe0UB57Lj@c8Xbtd8cvHw3e>A8c_l$&bppEv%f#9fn_D`mK?#O*TNHpmb1 zIsLxc^gA9Ducf$Ijhh`atecFrH0n1m$-Z5_11D>6-#TwH{&|0$)u=njGiGiUN7$vF zapwpI_B@B|Jrism*CA(ub#P5NVVGNlJzwRHIXUsBr_;&(TTx9%WXy{xPg-%e6nADF zyXw&L5EV#wliWZOn<`}VXD_&6aHpYKr27FinzL_NsUA9zI_&h0q-)oK-M(ltKA<+8 zu`Ui{Ov(&C=s=mTQQB{p|J9T6kEZGf!tLZWeubWtzK4`j2dm9}rDgBO{yJ_l{!?UG zon-pF#Dp1U&w)bHK?Ka%LBDaK7`lBQ2GH4Cqap(a!JRDU|a?Eu%vyQlsn%Mta5 zh?5b{W_sz?HMohMG#S6iapT+>YtqKi3zflhln7~A$o8aciJ&$(kAt=wkZJ5fbEZ0* zA~+t1Qwf>KizEu1nO_xtF8I=uC*yzDM5DRm;8r$I#{a}SWyC!b&74vRj@C|VHHN^|Trg?(2;hHLkd1MSwHSK>UL(9j zyXnkXFPvSFSf6bUCNT4J!iS5|N8rz~^@qIDeR!OvXO5v*&p8yAYKD1s7#AuV<>0q} znR%gP*~rq)-fV29v<#>=?d($AcU(l>Miz05ax@)HS#Yt^LG@%M{1Nz1I{c%}nR3UO zva>jHVRFxj!af4F>Eg-w=TvbL`H;B3=nvkbi0!=v+rclr0^KRuCfzjBvVLBKUAAFJ z#XN-{#HI!#JtvHrn?Kjioh$9j;je~o+C{?;GWEaK)TLT@Tj81gz+hFsnxF-)bnBP= zXoFS?t%`T+2mS4ftsmm|!f$~8*(ASqcJw@#KLo#h8vbVZebew`@Q2~g^UC-5U-Ti$ z>ooki@QbhVcV7>`W*UAQ{Pt=1z3>O8;Sa$dpN78~etx@u_+s!Yrr{TTI2dS|hCdg6 zAAG<3sfRy24ZjV3{)2D%y6@eE`=MR9-@FU=F~_}c{zq;2{rGd?7f%!ZdiWcsi@)RE zPkyiC-j6>7zZCz?-U(9&sUO@is*0%kvl;$4{%7My;m6?TU+t~K7H+e)BZ^2Kc@3{mMu?{2};$aqNS?Z5sE(@bj+mmp=}_1pbkP)#?~pQ)iEw z!oL%KHGDt+iw~sVI1Rr7er)wyo_&4B7Gj~1)q4%_KX9%)W-i^{3T-Je4|Bpq%RwuB zy*aVsd^;~))p zy-lC{jsCae2ii7x0Q^t=@dp|FUtGNO)w}qs_QH&(r_P_A^<(wvKRcN0)8|otU-HL) z+~Aj6y!trXh*$Te?tHIX2#!*}Mn)GIvAJI|%Os|EY9 zMz_q%MrndpiTmpv_vVfRmgG8XhtJX*>kZ8~Mik6S@crN)7M^}Wt=4HWA*R_fEI?y} z4S}h+4*MY)=ZrOBjlo}Mv4OGSRL*0#uepBGp6Q02c`oH#aV<7)Mye>s%!Hv$^u59VHWOh;T zrYyEJXS|{^G&5V@aFNk*J8;-@)1y4I9kVXJ{D$0K0sZlAR0r;ryq&qMWaGxR$fQtM#_ zdg6(DeD%;*ek&bYzcHy}TfpDzkN>>E|Lz%sS9ogsW+vOJ}wvGy%&B8AD9l;H5~`_5$i{R#u~MPM12<`e+-Sl~wzTM0Y*apuqNU@ca1tjW|lcfRQa?vT<#*UU0u z^qF*O6EZr!H|aSu1l7qfoMUUTo8Rca>WI$RLlLSU+>4uG+#D@`siTDPT-#iq>4b1z zMD=q7+}8fd_&0d>(Lt5ETO^~zRz;41n5KVhS{5EkdvKT2f2K@P?$Ewm$3sY^fEPvD zO?Ozjy$4(P?q2To=4@Q)o-**ONE@@S7u}UShoU1#YuXZin`~_@o^_0iZv_7(fBa(xzt+X~fM4j3zuDm5*qjWH z^wmNB_|pvjc^AJOe6BzKAcG%w@lopbUmx^MpMSHRxOmp<7O(sa9FG3H;GN`|G#PEU z)|NADmr;MH-O9sC+=t0e*Y3kM{IadulHUk_4*UuYu9&tit^L$kcX2pVK5)73m;3t| zo2Q6a_l&b)kFdR?wkurk?t@?;l2N+kMhLYbDqCA{zifcD^Hz^E($FXFuSj0ECai3t z{7<02e>9mqKZ2u~!qPEwpqC9!#y9hxu47nq%r&~Kc;cwm44uu$`q`N(+x91rIgHGa zWIMqA4m7rc$6ZCqBY4%Ys@)g>U-Q6ZJU59?Yd2_1gSRRSX)0}AgxfGOa!*kNt66~=B1e)@A8JODDlkwU9ackumvCLRd2Bj0$;Xe9P)6lkA?RvW9 zv@lYeO=b%+`;b{e-TzUt>}TY8W2h>dokwMOpXix|ffE5UVxWdPihub>GM@4C$@uqp zS2{BP$yq<_iVUw`d$dzW%D}9=>#exz3z%rFV{cVM|HMhIy%mMs0BvX&@;bmYWs%nl z{m&<+${U21_X{_lvxRRHnDQ+0wn6_!n!KIR>USY8%7MM%Eb`_;|3aF)8fXK^bM^&f zO}|z!WBr-ww*va>C#1%=4_a&*c}n9EFiRhrKF_v->B!>ePUu&q`B_koeZC8MVXqvo6XoW-5r^zxf(Jb=%p#QNpHBDASYubgpF)-Wj%uM46=r^Uw3w(l+?% z*EVWgsUO-hXp4APJH+m3HmR*Ob6~^phJ1LN;Z6APcEF21nkiFlNx^4GZ+MlCe_nft z;Y7E=bK0It@J--PbMVew8@;#SF~He@Xy)3aV$HmHEBKY*jgC!gCs3zcoRre68h6#W z9l+gA+H4l3#J=q^5`vQ_X47Oz;pT@JG3L>8r#2@fRC>m5bNe zuj>f=L4-Zrx>D(-zC2sZw4*e*-VMF&?-fv=-}Vpxi$?xzSAHe<7yQF>x50nL#kYe0 zi9h~)ga5pXuj72xx^94b2 zo5(Md{tdV8GW~1O1&5FNhX3*jmH++R{Otfg(;t77!QbiPSA&0*^zq5B83sS>;#YE( z>sG@5u*%Q<-&FXWGXWW#>I#QGfLUt>s2Gt@`!G_0K1Kcks*k39Fw;+_&omCN7am7F zWb|R2anjn*0om+lI&LzQ)7R#)I!9%88T#e-Px+?V7dS$rcvkpdNu99<{LlRHdl>xj zE`BTcZ-Dnnv)_U&o^`j2ALSg^)#QoJC1 zC(_pp{sHZ9pz3!3mjIfSVKQ~9)aE|nIES+&Gms>bu0 z!L)!mn|HMVx;MovU(~K+yR60d*8^@1xVgfSpIw^AV_BkPaaO3otO2tLOoNqG;A}i+ zZJSEQLeuZu3?_f$^x@tKrXI|6enr24eGR7C36Gh(Nz4;F;i&@C55}}_rVJ8)jy+Gr zKZ@ICFvDQXd1VPq+I?!>U^avKKd)cJDj`Q@FYtea`8U30ujzG_jdn^@V*Cqyxj(+t z;BRs9jo=Hw`;@&MrmSvo@l~9y+C-R}awvPzTa>qz_MUo*AH(_@1xySmtL(K_(!Y4d z8Lw42FdcOcOkW;y=3(ubFRI&pU`q(g;fgoK;A})`fn1coL+~o#CC;ld`I0z~2TMno zaWHLQ{L)jHz&!K^7{9zzIOc#^4d!6s35VADDjc#wD&ehzcc|rYm6x4MsfRue{SMMa z<=AU88QsIUd5+zbhQySSezPu1vip!RcT=kDa_DQI*FyiV{6x0*Op+63_k@CDSbpAB zbEJpTegbzzznhGYD@=>VGz9+9d2U}(GB!dReSR{&Dmh-{S(A8x_bigCNG154;Hx)J#`j9j?WBz_$^H)2 zW$O%@GAciN&{>}y_ti)LdQ1A~Lwq~>XaxMe;C=MV&kg<<7r!0+Yk%~`Uup2QE`E&j zU6;M+*l%}|`n#~7Yta!8`-lHkBmV$beh2v5{KNl%!7p&}tHEF5kN>K{AMN5-a&~JW z@iq3_Ybz9f=}2Guxqv!-^q+P={iUxC0>8WI-wOU+|L|v|e;sG8t|a`%ey%X#pVoff zg#4%c!=I7<0qXI6{^8F^f9b1h{qY&;U&xuLbBM1=|C^TYGW~my|MW|~>Ho#IRsQF= z`73?(1AqL-4E_=qza4xhc%S@w-ISllUA)eIT}AkfE%=8ng};`Oa9>-HgIfaS$o~U% z*B#M|0`49f6q)ZwW zPdje(KbTrDM+igPpvCeDJ75If(rMgBak3Rm517x(J>fPsrOuz1P3hPQc}Jt)!T8w< z(siX^M!_WRit>#0F!`aWPj{@R8hiuz82CeyI^ET;#4`BH%rP5IyUHB1Q5p;&YkW&~ zTWB4;?eP4Z2ehToW*ds7t%TMJ&DiA7Wp@rh>w}gUXYJB~Het=^SvRBb$KfZ| z-OJ55v>3Fn@^0Eu%(WA{*wh|gzqSI>PWbiYQQ~aB8`y%7cGpCuokvTbw6pQ4IF9^y zm31_d&qw8?A6>I}n{PRp;#j%jSt>1#J+uk@$H4pSuU%{K3-|`FFt5hXCj9J7>Xfwg zINJaHscd5!^CBuE+i}0{Z|s-#v-#xym&X0tR8_?2J!8WeGs(^#*6JmUPj|g#&)A}j zB-e$MX@g60S%_IjqI_=yAOCc!{W^}0`tgKs+WkAovXNQMIg^RB%cpMN4BjX0er@mz z_;%860zZ5I!5MJVrQJo@(@uHYj(`9Cmv8v~6;k->tbf7}g8vhEpYZ+C;J?7P6Ta@_ z>Hq(8GX8{r_*z3(XAhsL|F~a)f9_f>x4kiaA>G?CoZY?l`eaNO)5t0wb86AoH@ua3 z_e@!k9juvoTL=E5pK|k7VQYrgy`BD$f4OT74gT+88$oUpVKZm9q?S9)zd+G)a=U&> zhYJ6u&z3K-mu8eC^v)`C7oYQ)icfF97e8uR7wdc-D~?A4PuC3Fy!NOvYF9 zEXZz##G5Alr__^R;d(&6`OEV?^C>P%h z{x|;k`whO)#rJ}Lz#o6P!MC{hQSi5b_esO~2EWnbWv2|Bh<)~klZGar(R=o+p}X8{ zwr#~2*fP?4$VuKa zX_het#ah!)R(-e7E*i>c0c^a>>lhEae)si36ZrQXky__Q(N)L4|=$UBw&Y~s$r;p#HzU`LUDZM2lyQlPgYsw1A%r-X}js4ZfCd@Tzk)_1MFdkIHH4oZoqha^H>n z%{$-QSuRoBZ^V7|wbP&DwjIp!($sXRLsyKy>zgixdn;YK3zF%w4E!*7pLE#*lDo$( zUg2uu5Q9ym;~?+e_TPKfrS#Q{fhoWJUytk~nb){s$U}cT?2rGt!9VEY=Yqe(AAgF$ zKkVY0!C&c*KhWUEU3@S2)BW+UnKazy;zz-M4!lnqK5Xz+d{eee`+qw6l{DO)x;_SW z3s}Fpz5{*-`S+U5k7WD*d#C*`gkE$8{#~7V)}Y#j4)n;Fe>@9Ky6kY{xf=W$|9EaO z@ocv7R2}HS-}3l-uS1(~Ux$D1V08Q$`4suG?_mj(=wb`Qv8` zeI}b;USQ5mD>;+(WLNFJ{;dc9;gZxe8bOFkZXmEeUc@E!BIVzwo z_kj0FBOU)*JZrwit9)oQ-b*sV0EM9u6pD@%BhWBDqsl6&gC#;$2Tb2t< z+1&1iuMzx8@IGZ>+=Q=*Z%5};o@4Xiy@qcS{@t4I8@@XZP@d=zYp1>ksK1x`k@_!Ir{M;iQXF1```k^cC1O?nNv_#W{4_~V~4_;oIR1pFHj-}JrB;G=vKU)8n# zb8Y(WPF>pwwwJQySJx)s&n0iCt7`>KtY5!8wXUfgmO!r|-0#({XvY1-Wz*Xg-C+J1 zb=w0|{-LcRec!9UTW~+N3xC633I@LF@wb@x7D3xNYs$_iU@w?`%%{0?Epy@L&z_3U zPxf^(_TNW?f5>8w%#W~vHDj*DjEk%P*n`~gUQ?bipR_St)(zza$Fm4t5MiJ_V+dE1 zIFh>!xupeDajw4f+CScP|K*{DvVWLhO<9h_xIa@Z8EYZ2tCUWa=aIg9XHO^b8{uz- ze-ZEM`_y)E)Cb2VFa=}6)d9bJpQ-qDso`S6#W{~{n)o*Q#8-N+1if@v)K{+@Rw}*H z`_ZIcsRuvHAOF^&!aw8USAhT5hkfNgVeos;Ny;Ar|BOHWn+E?MSN=BeKlaC;Y4Cd< zoRnWg-M-l$e~7^!Z1Gw*6+55$OuGNb=1X*u+3TfUjO0vp7qL_WrXf&foYkspG6wRlF;}Z3B0Ra3*aKh>qYOv-MF(4e(>|6LXfG zLCxu&kQ_r+z3c!}zTZ^*13@dp8KXsz=RCqIveir0D06a%sqozEm(Mh-*>mBnXV{F~ zo%>JOdlZfSTFCfyck(=M`MncNThUbfo8c6{y>+i=&rnZDzN9GyP9wM_YsM&D>b}f; z#|NkET07%6^VA$AuA%cN{H5^A;Qx$wrJHnXnGVG@2zxh#^ws-6?pwc({*>xt$sum} zM~}R9h%bI$gP-BzV}zlFFnlmMALUtZcdlo>ozs6TxsdSy^uu9Vh(nmo8bQ|cEf39O z!)|+u1I-!R1$#OXalW}fu^IO*gim#bGS$d}oRhWNmwWomYHA%iqD6Ho*DJvm5ckBI z#EDjxrW7}Crj{c&FSXD5+H6bt?45XdEws<2Q}H!6d^&G489tWEm?gXl zUj_VfupNg@CC|h0&MRoChr7sUf!z<3D4U!DFc8A#kSxYX|d?&u^_%Gax&v^)GL?}>U4 zJ>J#=`Pb+0-MjQCqa2K|sFUmEg15Vy#K{qhX+pP%yV5fffu7ISraiYT?W*DauC z-EQ8+l<%X^1x{F;^ISRS!|GBddQ+6C>SHp%Q#Q_`-Qp@#p<@)JRU~AK4V7S-&D1dMh$kFPw_!s&42`Sqk?loG-yC z6V$#Nozl(tJM4l>=>II9GW$=Gd7L;;@(6Dpqkm8H6tJqu5>JvE+ol0oc}GvhA4#T7 znk~0z_DGK15}Br6xs2BAKVO@=1cNkLK^WH{xAmB*_+I(^G378*ZaB1WwlrA~34P1x z^EAneBcaQ((K)DTmXVW&S9P-M-&^Vbo;;N}!?`S2IXhekuO52oDYR?6s}0q;JmtK$ zLNAAI^q>j58OJkv3bhy<*0Lgnp<{D=N;-nG{+hogj9 zy?E;KP-iaJ#3i;K7#R~_M^8+lmOOm8S$uMLjxehQ)Yw zo>^PLTIo>sa=0iG`ct+vWRw1)Y;;}uV#3>ppCxBa*)?#)`C8&!2X77ZM(Dp!mMb?6 z6KmeJ&oN`I4)uN|8oYu z`L@Ahm#EFY?V@CxEq&GGkMB45Q5U}xe3d`G#o(WH@uk%JIsW*$2EW6_H%K@6b7UkfOj?KCFvP$Qg7+Dh+HS(oX7MV^n+ZcHVSX>;QgUB(8T}*td#~dT z^|;^prRm2z+QGcDmpk4eTciits`IDf*Yd8kThv8!A3k-tIkp}fQFT>iX-M+H{lnra z7n!rf%@J8T?#k#rVI^}b*pcQbyKb8zcXU_ixaB&niO$Tt$O$^x+1N(;m(yPX=Us~# zg|-8lbhkc|R}L+D!BqTfBB0wjycv01L%@!6^^df7P-UwDTpPF#3dcuoTcIt3W^Dfj zvrACdOUz<(=d2dFtpe8zuK3GS@liQUYvZap>#tKQOg)z7LUaC%_d??8h{CW1IjfK} zUvl^;?RG%h0vAk7tKC`^z~vCb?IV5gB2lUnBk(PQ`EMU2(1H4ApTbgtjNG zUt1M9!5l^nHVV52Y;((0;{J4qgPnOwEDx)n#!YrCK zy1pO$R`5TR|7qz!-&uzYq%0U;sIzX;ju5yg6=K2~LvF=IZdkc@TxRd`V6zRY(yq9T z_<%W3e)CcOl|fquZK(*#dt)mfgRNX;Gap+y3acL6I5=nAr{FAmcw6vTQ#9>fv34*e z7f;0xRX&)wElRGx)p0qmro{x&rd+MTUG$Qv`2IN4r-)}1S}C-HML?FlYuj0`gf2MX zYrgvK`fH@Wj&4ut^(OFdU+#-vV(`Cp@hic<2;N6G9boVeU7eJ_4*Wy@_`iTGo^^}G zOBb!Wg8mli)R;W8gLb(p(f54IV>DBnJtnCPV3pymxbOe!RD6fhnS|v`Pj=!{*gJDW z$6|pbltmPF!IiAXzHBOSN3U}yNAQcLyi+;Vew2eLApBp;(g)+rC2I!TJ#nTCH-T@w zVk%ye%;z+Fl{y%FGK;-Z72)uqjImN<*B29xVdT!ea?0)xHF?hXiajHJy~^)6{A&0z z`}GlRJG3fjGUN0SEqqllPzg=Z(MPl*XcZo}QD~*m>#Rctg;3rnYmkE@4(IEv!^ONPf0p5<>?*HZZQLe*7TsWu;MdrIbh&K5 z)nLcK9vZgtv#eQf41Hf_B_?&sI4(BZg~80!M2zB_*G~I-ZE9K-LmNn=l|fqt&6`$L z(E2?%b_&ccI1T4HTH2@M5-eT93$2{?nT*D zT5dw_vg;TVv}Il6EQza;pLI&Qv9DE*cY+YQ}hhWkF;pJLOcl{0T?dg=diJ^;gr zMg^#1Nyisn!+NFV=szb7(eWI9S+hKGRfWcZl-3pChE||+Ely)bl-qjKoR2s%g_X=^ zu){Y_#jjBKt zX9#P|=xTJqb4C|bf@uH~>t;;Fug`eG?2!{g-&emov$En|Wwaj|b>Et@cbz2D?Mjnw z8eNlT3%S-r>8CQd3H%!HC-Ls4Gd)N6lD8fH4)_ly`RVZsUgR{ zbIXXy`?=8jpnu!a(S_M{meRBdY{9pu?EOl~I4D7NB%dxW*|5F=TsOEC;I>Jo(Ve=3 zmDz~nXQC%Jvg2+kwSr}QILUjH)KdBJuS=p}>$S=B$v5GK%WcN`5I&*Ibp3J!- zC1@H`5UL}gk1$M{C=}9-bFM=_-{I;!mHoNUN}+Y}u5`xGGbZpN6Dz`eCOg}mv}yv| z12!lFisg) zKgXl9Z2hbRQ+Ic=FO*-e1FBD*sk~o=F{YxuIC7pT3P!)Rf?oyxZsdFP8}loi4WP3` ztFeVRU?NK_FGRVg4a3>ISclBOJyXd&v|Qyjo6C`P^}+fIyx9sr3O_Nv22GZx=srY@8W7?dwvM2kL!{0LUq&jkHwmgx}qmBpK zk?F*hd2f6~ih3;C1i7b=~Ga94caRD6-s zPEl7G^W-oOMzo)>ewco^bir1zl|OLCW76VB5(jTi>r2mz9FuyKD>5XfvIoZ#I zwQ}geCC6^(MQUu%GjSdqGL$w;ky9`*mDrb=PkC9w<%A~Vs+_h=WvvffGdS(V&zdhf zD}7a#d?9t^ejNAJKb(qxXgc@0CohXeQ8|EB2)!Em(GK4F zbD6v`>ADeq8~lrt{Pecn*5@7IM!?l2anfrVxwrRk6|Nw>gHws~bf<0GE5R-Wdv1y> zo0sz=Cz`siv}^`93~pCp>j4-3v47ZB!>@w>1E<_e$74U6v%xA7DjvlpKgYq2J}?zO z&W26x+3BhybbimWZGj#44&TW5KRAv~$X?E9vpMG_vz$0Os|xq4S2NC~jm^w2?P<@| zVJAJ6F>$I9N=x;&73`{qrtCd)On97VZ2_jEf?ZCvl__d$fj+QpzjVelpsCEPhPD!# z+E|qthHDIV6#5`^a?X5A{Gkm%YY|1|(%iGgI9-jYYUZFN$q9d*_=CIKrfI>ko#9iK z2N@-_?H76^c)7g*Zob(=Tn@hVS5xsObpq4$iD|1B%%<c#2@zmF>tKSnJw)%HJMn ztDr@BSDqzw#Q^j{=pS?F=aTP=#|ZRw(9PHiHjiw!uJB2w4|bzuI( zWZUrzHNlJ`Quo(Vo~36ByJ-)faMsm;J5%i{%Xv^UrVN(DZ-j69x$wW_grx?08}yrO z7&+rD_e7&INmTV%G>)OLsLgEyI}Y|f|2o%`6S_28nl6Z(otdOci;c*fyTMsIr#_iE z_rwMv6h)K?!D2Hm90S`uI+Z+oRP9Cn&6GcAbNs@zX!fR@;2+6Q%(axUm4y-2u^QaB zJvkM>->;mQ`QCT4xTl8QE^?ZA$0Z63sb`QAu-|;)#&)|=#ziDF%y6-demu&rT=D(**8BEI=W4{$4uJRkSf4`sdoXNq= z^jfRG8{qZAOX%b%_*Q5up_wyes5{chondajoNp6Q^>iheO<>mXPMVZ0=?a^x%1*Lr zrz!D3HP0}(w#~#VOLt;A{iGdQ8RP`Q zq#mne@>rXi;c~^RE2UyeSQzR*RW+cI)7m!FT2wjQ!OaMy;{T6qRGbunkN*7-vnN z^dwC$7TqEW<*ja^RQeZw6M280iWfQMmkBCzz-^(W!xXOya3xzP=L#2Xx$SRaT`UiA zj*m$KlUHg(n!!$h<#?>@Z3uTOg+t9MYnjSLz3&VyFwdOLJc8V1uP~pKlYO!A!FxPIlC<2{d)z1bhLyN)n(>Zpm&hA4-hGNY zrqBq#{M9LY=bqtnPa_SiS?aeS@?~Baow4cJ4R!_CHMUG`$vfGcPiO}ewf0gCh+}gP zfi3>KGp}dlQYPB1Se2R0@N3{_8|zRW$KbcXKS1fGlDN1te45(1;JtX{wuRAe5x;+A zm!mek68>l2h{cJ5`G{5rtra(kc~7#~gET!{E04GmCxa3__{0s_bnAS2jUE%3ptCzucRxt!0su23s=?7};MHD;eK> z?Y-GwZMdy?-Dzv-Uvt_NBhl9W!bg+Ui8+r|U@Nyz#s82jqiOwft!=E%R&@wIqy8CH zhZz8+{Z8bLzLAdGUf|j07CD13Jd-JIR+BRr?yU3>|aE&{r&nM~NZg2zO?n<^( z)J2X))eJ#sJm{&63ymE<48G(Y)&cqD>k{3+w>GOv2?b1gr8R5w&Do!YOo*(0H#vq} z8Dv0AWw;c2ER8N5QU$#-?j5tw$e&s*rOfDOlfjDj7&`2JqBU->x!yDs#(Yzcw|Hl8K@7MV4@6}OZBIkEVSHviS8 z)R_i_c{{VbLi&n0N*^_YtqH|EXQ#2|`D(iyTW!e-`0enUc~=`})?appj#UoUnKlxG zGrYmHJ8Qs>fHiX|V3TJpRR%9fLb25)cMI6U@a|#rdl_#5`*kM_9=RRqa_55GxEt7V zWHo^;%Z_|6))2B9 zL~X(GGzNB}g5Sze<`*$~9&uZI$*c!ENEvP7op90Dl3m*j zNb9`M(Dn*5M%4js2e^onHr}yWXCBmdj7wn}!Tq|KvBcb#`dnw2+takLoVC~qD@65X z0_@yKEWT1i0{S3Pxf&m^d{&^6ZzR0JjZ07{fTw6flXoOaXn`*~TXI(WmUT63kPnnmV>IOR(Y}CIjRO$+hEP51+ zDx;A$w!Olz6}f@EV(|?MgH30~%$OJH3Sa7EqD)$&FADk?e*pWM#X55+^rY#$UEqKd zc6|ld=7Ly!z+x+{{mZPH2BBH$V2THl3*k3|odE09!CIZdCwd3;^1Wk;G0j?ynu^{F zy(J5MHS|?k=%dibp{qS2jOk(Q!dSeYca_Ot^%X{~CWqsVzTB?(;pRxk&2m;`_2)F1N}%$g@>2MH`paPEI~aHFj^>3hswJX% zF*Z~s*i~R%b<@y-<>h6)nM1{m(=&t10?+i_zm#W$FK_Sq(2Y+t4`R>trN^2I(^!Ok<&S_oU*0#uK+s= z_6%Xu@(wTA>6Nk&&!lZDZg$}2Nh@D#57iYl!(_?J7ia*bPx`?27R6G=s8&N;2~F)^ zx}VP2YooEX(tDB4`15w$&v}0=e!9xB=19B3C<1doPVoCql~t!z{ulSNp5+6vfqfxTw)Y@3-n$v8^H|u*|uhk`9cl) zq{kGa|JNd?*|rNa7LzR?Bc&u&2J`NsynHwo-)PgNk#sSa643e7&NQRSv~Wnepd9ST zM`H13le!>nJc+h4be%CLXQz%6R!6SL5;BEB^`;xS)pKGQYb{nmZ-kzh>oZ*fW(*jY z2p*rNlQ)4~c2F$QcQiWLEOc4a6?WzxHOw2R!oQthHy`ZSD5m^+*I$+e=|-j$;3}5b zq+Icc428SuZW7{SvG{?!lmC@Wu9))E0KEu$qO8aUX@yn@ZHch>X~uF`fMf=9xC>El z*hVq|jf{Tq<>0mSQJ*rNHPFhSHH+ZLD8m>qG8TJeoIN{_`@q90x7%>j;*k@Dwi8-2 zG_%%-aNGH`Mp9IB&DOq*-a~jx{4tVU1!e?HB8;NdLmT$c6z&#iL(t4Td1koJaN=GS zImd=uZu)T(K4kaZ$j%wVO)YNJz9iF!wRc(%ApQ>ctv-DDS-6Vv2l$CK%E}{8`kw8C zbCK3CCepVWH{-ZTq=E9f0orD06TC|=oM3ddrW!SWisd$s>)y>Wnd(S6kZ$n3ACJYq zZ0$|mBZ6+UOCf{K;3wlhr+bRLDSzv5x9QNB-K&p3=TZJtzQ>_&gWfCuNpEl4D*b$3 z+W089&r{%80Fl_Qh%@PiIrjzwm8Hr0SIb1vF=pKmLxNfu>vZ!>SZcvG9TrQO(~Tmd z8G1W(#|CrC8U>$pP+?b@=>}7BxSNKuk^7;|f#&Q@G;5a3EI*}19w*$6g4^hED?i7f zjY4y5oT%*O#2Odf+bK-oKH8&cFe(poz(hY0i(e}IbmjJ3x7^m_rsaQh(~X-U-25-~ zV+1$hvfX#1bl!oRTHHu|>myp;59psmlitxs^`sbDH8jVj%sDyGmZ-)O7 zIWXzMQZ@`D$*YIg4$q8P^Iv_T7HGZDKEb=iv((PPuYfn0hVO$mngt)l`4GHuc;-An z3iB~$Z4xc1U3Rcmm~k*gNBCnDroaH}m%t?K!A|Yl$GA|rFNW6!FYMGuY!yuWE+&UV z^cRy&qUobmgKao6X77DLUD)tkW6Jl!$oXa+fYPNE+&XZxgRN(>ZCr_9OFl}H?=H2!4 zxa4?>;#I)p<(l2}vjXh4Y2+#08^O%^lw;F4@r*isZrKhU@XO&J%DeJ~(E(HUdZE|& zxKo-A!Eb=Cc0(WewGrA1XwvY)_f+G+|$n_k5Q65av&|bUcABY3PJ(1~mJZmm7MTajz+H)1GZYcGc%& zb`KV^jeV&lhQ>IYABlq70j3qqCA_=!z*z_jN#(2P$HBlCH@jmwidQMLZU4+3uL}4z z@K+$WSO%|&muLM-=)Tm+I41nff|dn#|7;W|-MDXFK>6fd?rqpBZO|b_c~*m231+&m zkAb=8_o-pu2CZe9u;)EM`-9xmrEn8rcjf^@pY#TuEI2>xnF+M_yjSCX2MO1HFtnOhUH_x9mOax9E<0InFEm@L1rn0Df+yeIY7u>X{gSG?O>f>VZQ~b)G*7F44&C<1; z?{lyEVly98^Aq&T39_)#J$tz;!>e`h z11HlT+9Tnw=75)n=Bu&Rf&cExDKjP*1s20iMMErp74OO~Y+B~uSU1GlVI`n2#jCMb zz?eKBK5C;X+3#Z7ANWe&N-&>!-c4Uq|DkpGgjeam6#fWuACm!=J)M}3JTiMi1)s~( zgSP9(HX?WK7t#O8^!Ln#Kb4vc3j0p*SB<%0H|^g~(I4l~UfHsxIUUAI={&Q6QL9o^ zw$wLN|E2tB_bKWG78e_kv;j9aC-m5o(J7e{CL7~$lQbV)DR39y3- zhe;zhF2M^tIm%X{K2L2_21jwS8TSp%?ih=;cQlISuB+JzW&q5-$$Eevi8F0No4pf` zETplX7xTWAu5RQCu(!k7Zo$VRlm&_Kh17H(lizoZYTnR4F zx@(y#!y{nJ!5$?4`G__Kt=2=6-`k+IK>M`P-kd)aKHDsJaMlValaxmVYZyQJN-X|U z-fg*a$Ap~us9KIY%FH9mgwmrH_u)&u{R!IsI>%YkSOD3 zKiqNbOno@D0s&DxR^z7WYq9t>yb}+NZ<#f{Y*axznHprmu^HSjxKFBX+O;{SnDsuM z&Wqw4g&qDm?a7rf&t63hE?$+?bH!jv!0ZH*=u2}CZev&Q3}ahLMm7A>t7t!YS6s{) zA`CE?xk}nC)t6!P&AMxR=ec*bX`cJ$uO;WXC%~`r$B!EP1unjr`n=2^ztZ5pkR%N7oU$l*m|{ZdiEIn zOp8|@PW%Gz1Gp8tz$skIz^VKt?x!i;@JYYwQv9k0 z)6yP`pOeHeSI>oiiSi$X-U4Q58jR}57WC8;TShe2NMiO@OR!8iDS4RlPOo#r*=5c${GurX3}FQ-d1}DagZXqaOzymh z+1qBqbaOVl&h+0TqX!vvow4|H$u=R)MnFbx=n$>drQe>`8^*n4j3HzDidftvm~Yyg zkZr-RNgLUyMZcmybW<$8E*Y1MaBK-?zf6lYLtN~gWx_X#+*ahyxy7AxF?F4ZbyIJh zHgqMJRxr+9ZRHDwISm&XbDd)*YTQ@#rGPsAgC1WU__r0RF9m!bXz`WcmxK4IUq3VW zMvIrOiw>jnzd>I;hd-1NXEQzf)i*jJv1?8yWhcA1` z`cEUloQ~ornM>h!5dZ7Mr;2cR4*MmqCY7`w+NM!2m3n~S&eCpWyNqm_$_xH&Z|G#v2X6P;W7v?+*%9KefnNr{m3PvQew5Z$ z*?S$MkjCJ5z;AQ-nC*<^F6{~}HA4|*j4B3Z9L&drNu;l{ZdqfBMURsH@UL+A$?@Gv zW^j{>AQnc>SnP@7|I|4*2mU}9jJcu%B3S#W{V zXxno^qa)P+-dOxI9!!)$7IU5nhc4MtZTlTHU=Mx5?N3K>)9ARrSnkOy^1|+SINj!j z`T@(p^x(%pm_Md0(+^FYZxfp5?FS^=qaobne~+;iM=m{dR$ZRR2++4oFQ5?mIG6!2 ziM}0Pn*Pxa=&PZ>UvBwmd^V54i1GXX=2;uY3O0-+wZC)VowUx4m-Oxmbjapk`0Cxl zLFwH!Y|wS|?hyDPfBY7rO6%UHuo$OXR z6kzbI?598ABj*$8>43$gI$Vvr;k(ciNq62hp*D1APHOU*_~T~u?&;&-f$UY_0{75f z&ft&H4{5d-{d*Zk85ZGub5f8N0(nmgS{N~xkfoCugMHX+0RzqvY{_(45K;U}o1 zuR+}A{lr;kX2OMR=e%U`H#&SX=Wh5!&h8U4_dQR*FT#C8Y8ho#EjfQz8TtS@kWr9q zTUfdQ9k`k?S;Y;dkQ~2dgQHdrX>3>xl-h@Sur)u8#RJKHjK)?qAWswZeb4wU4pdfF zfG;?`OPlj!g`g8Xu0_UyCoZYKplQ9uUs@e8yE3ylInL6hlgO(314~#x) z=kiBMUugRnils%N6{g|Jp-Eo82UiU(U0#DDFX2ZNd@HmtZY$*0$)hsOAj&vKmna-7 z!9>&i9Dr8rp+&(BLo0%|ly@tO^1wK{k;UMi?C&jLmV!A;71-g})zsIrvJIS<0OHRbAl|%v{&mPMK3*Q2KNu z*y>-!5@#_u^I|&X=ms{1*s)Pyfp|RU$Tc~SqfP(3=dC#}yf3gK|JIy`W(6LeHHMf^uBP8wb%(mRMIf1uxEHm|A!3#N+ z=WdA59_b6Ms8`7kk}a zm-E?ghXPMJqGn#163nrj+&|?6dJ;~bN)>$0VD7y$0-I+zsd;to(>Z~6owSYoI4AcP zIf1_?{yv(MJDL-CC-FB`(#-bU^*MpJ64{a}h@^Un3z!mde=_Is(1zT=+fLd)2>ORyY3}?jSeb*e`b$nO&GWB=r*XHDI%n8I34xY)$eIX}sqr=_1Q!h^jAIp6y zFYt1n&4+@&Uj|^7@biJ^bf6l)}JI!nrFVfp6sIzCJT>lSlS>8YH z;A@c;gI2`4)ERzwwJJcnCB5>eI1-W&-42Lzw^M> zfIFGrlkoEi$-&K;yg$bKdHh}jZwwRqon6s@Q>vGI^5<%TY}po zc>g|b4}`Y?S}*U*kdX^+3cki}KLq_I=>OsW4Lq_nV~$@<@D_o+8(b;8Uqk;G|Mw&e ziO-ABKMw8zet!e~eGY@afd~1&1vh>Ceh_y($Z3Re7XPPso+nKX<@p;lniTWNCoI3@ zISP06;4k1Q0rPKYbCB^2e%--yFwYq7hM~O;_P_k<^9FeB^LT^*Z}NLJZs#I<3HYbM z1xTy^gZ3Q!Yr#Il^CM)NefhApzwbHl|K)wuk$DvOc|6|)t3AY8N1(Ij_D9|)c-I`~ z`}lnqOd+&S@vMM$E#dn#ZkF-81KJh5e-gj$hIcvmCf?uXS;uoeew_>MRpjgZi`md_ z1^*boEBMck`Fx9)mCzUS?+yIRfww=jyP*9Qw{P;h2;R^6-3I?sexKsm$omTXoDJq4 z@XzAz1)dM^u5|&L7r&qX`C#?gk9VETx&SvH#O*b_tM0zWb2V;0%1V;kSq9AjiM8;Dg91;PzX$WbAGaTar}G{6Cv0Ej|8e-C&mwT=;b%Ae z4gBh(H6Ks$+k)FQ{GJ275&k|rd-MDZ`Y1A9=l3J{(Tl8Saq}CVdw7O%^M8)4+4$E9 z_Bk-$hW8@xv+(oB@W0Q41s3=Nzmq(N!SCkx5@;Pf`p`ZF)OXp7=b!Lq;QwcM-VgtB zWFCQhEVIC3-We(koC4;@ym#V9E5BQyErov*|3A$07XH7>uRfo(KYCYcOySvfIbKR9!KWcxM5ffOoR| zg!UmY&o~&#{F(DU1pNW*}JoBk2N{^ScP_zxcfx?8Ur)9sK$H9>FsX z?Rwn&PWiy^OW+RTcP(z4`MngmFN41qdWi7;0s0)=Ji_~v&~8PBKF9O_1m5HD^eM;P z@wopJZokj(Nzilg;}#yX_7Uur;HLQhQQlt%9|QLVWYXCRtj65{{1c)7)A3^mGOmTL z`G5<-Mfts$-+tU_TxB`$=Yv@d{$|O9|0usVIqqBFe;S)AA@!p?w`SrHfX*4Mxf{MzKrKN_#?=v#ve1+%Ktg= zkA-(T&%4O$=XWFS{sKmy-y@G@y;{N+_$X=cB)re_e1otB!R*a5!wJtZ$ZCZC7Ec%M zWbP+EpTdpCph}RjKl~|p>-j&#?>lmX{O9@YK;F^N_63(b@CMx19YG&K&L_cY6WC^c zAHmHx`5oi;Cfwcy?nuIM8GL=N;=O_Q6L~)jw`DxvBfOgP`W;U(%Q_lNU&>n_g$8!O0mf+?cc!xue;^xo%{>SlCcT=6o`>Ws<^7|*;$N4>k|JVP& z_Ra-9=kopI-!T(~jTweKA#z%iv!prHkBAi&k!@@kv&}Zgl$9bv6FG#e-%kf}7*UeL zQz(@f2{~jrgwSsisZ{^>^*q;Yx92yfe*F)>*WdN(v+KUE>vJ9M`};i49{0Y_6TDn7 znZ2utJqvC}?Df!P>4}paX94r~$o(j_>eKUJcyD1F27bogmUxapoM*9rjO{UWUu^Q3 zg01+g;=6(QTm+waMFlv3C@z|bL^q$VDhGe?bI?7 z!eA==;&5l7Ujd8Z{~ayTj`1W=hw=Ty-Aw+fjMtOzMq?3}GQ z9ntmRHX`;Xe52sJ!JM-gXFGE@{dYna!#*C)U0^o8qj2_14r(NVPVnTrf_mVKgYyQq zS=icZ4^W-b*voSbYzZNEH!y(whwyI%UFd%W5Xr@UFaFVt&yjl$^D)dvQL7EyW6Ud& z^ILrHVVjS>h1f0d=TTe!W)uUjD7>-6(US8BKL(@6z!ga*?malo;K*6b4(yvH54_@5 z|6VrFAxWb05dK}@sLo^1Po1gs+6I&$wu0_i z3pn!m)j`r5NwOIiCbkUv4txdS`^p5ZeVU$Iz@;sZ$eFZAmeo&DI0fK{G(c}8Z*2`Y zqidc*zByK}+(znrWRem$oE|2_ZO6Dh;6%vj0E}!RZ)G_Bi8~Chr1pHL)kh<(Wnzp@ zQOvaX4STu}Al79jsn*1CqV94Y$B3C&jq#{u0x;q1X4 z%ry(wm`d8GiO-^!P4v0h$8P)=X>u&Lu7UXE|55xA=&8h}=vYt}?rqqck~dBFX&r0a zjBSL@HN;7U`#O^t%O0uDQree`xQEqtK-cmO`CeqL3z$z--n)!zTX{^4_ShTCV+F_; zA3TlYZfs@AAu`CTF8qvQUqoKleU)()_IIG#KgPB}KrW}5eH0m0;4^ANS8QRCK)clMbe*8ZTd8;C7GxrvzLa2k^DJF6$*w$^+hKKAKWu6L;&sJ%4M zS`zz&?nfrRC+WpsW8Tu7!r7sF(}*0^GJxJ|X6Iq2ue5uyGM zwPscIkMO2&#%Udyo>!Zw*RgLT=2wlo6aBj8s%P!*Yr4OuhYj2Y3JIR549r`Qw z?>ytXsXvGO6RgiqPyU96?y7!>@2-iijAAcdWJx0C?^z^mvmmyZgE^@P#cazuT`6=ID zCHJ(5xaemJ{nxVkYD4~laGHSte7nJ$jO%(sJU^d;|0}$*%=Uoy>7fyv9_X{^5PB%B zYq!EY!`ArUV|`uWu4eo``9=1SuNUKy8{^KrVShm>30>vHNdzlS_!z-Dak z6LSmC$M4WV*iwMVKed-5)R>}cO=fJ%GnzYr*a6@HfGds z(mJg)_Xj%PMectvu42{vm>MEW&>x_`A^%tEZ>M=rYEQy@$$Bix{9WdCbYFTC*A{MZ zaadB$iusQGKf{TpUKn~gyg$&7Vi#$ky~?qQ@Vsb#&8s zao?%erL)!Zv$}uckARy*4Ur|_1|1hczeN2r=pb_cLXB4BdI$a~(AX2fzkhZ8%{6D3 z?$h~N_)!-d&bN%`@ow=&$uUuOjXRctfzipgp}MbNn08bFqi& zb7C>JcH}Fd^>I7*QmYDeMV?gq5v}jF^6wYyr18kF4Bm&oQ)5=D7Uw5Q8p0X}seLl` zp7gki9ILTyC--mkxla4{B(;9@W4xL?Wr*>WBgAaMceloF)f#nJ->cXUSpkzYz8}4G z$G(sH8E|SaH`0#zBy!CFf$-nde8qJiVs$?aU-T+sj8xYeU%_j~x`J>V)EvUO8+@Sk zUecU{t(>7g`z$d<;MaunD!CIG&(|7}jNd262AvCcl;&zd|Jk56`Tije;twT0h`xGvPVgB%Zn;^2VRF*TaY`rv$qK8(JBd?FPpqRuJ}RsJ7W-nW|68@zX>XWQ5#Ph)Xo>zDpC5fc?$eJ@x58PWF|Uv_TzeAJ zEvzAse%it*g%;_c{q(_S%X<8GS&yj|%wMABhc=0ElCEp9<`MT9wGGjn&*>fyB}aFy z+ZA7e+8_1F`2cJDh8$}&&v0v<3w4iP)I28iEua45G`1$Zb-Ior^!NfbXKKE^j1x=( z^k&U%nVkN_S0(od?bZ0cXFh-$ark?pOR>+@HU1Uy-$u<|)}BaQdAQZdwM%n#U|d@J zK1R$*i~pnc+`y{)Hsfg)M{?c=&QpI6C<#P9A=mxXGV--gOetOeDf$fqw`*KM)-aK} zF9Lu1%GTcgMy}NwBRMBCuBFMxYMmREE9MEv$43a_o^ z$}h%Ux*yp=*|?6RC{;Ed*C+EhK^&e zWj#lrdt?tajIbZtN2|AoC+i7g4+JbHMaTJhNZ;8!QdBlzY}PoxF5%GTc1(Y_Yy zdT*uvdN0-UGgaec(u7RvB)2wHQa&d6Rb4?L^1CNe~ad>g>J9o?^%N9|T`y zAmcIKp%blI)NI{b8MkJQ8R%ExenZ}O#fWrc90JPfzI{o~m#w(BsGFodZv_9=Ajeqk zZ31JFZg3i_Z8&-$dEV5y_@^na1AWxN*HLSfCa$2aEtzpyd?IgP+ok)pnAk*oAK?28 zeU`k%7*D~U>ZM=!d7AtpKWgk~^gG0dYhJIH>yE7{wk68@lz9w!2arDq+dAeCF)zfm zo5y?$Xk)EM@|?By=_dF_R$+gd`5@)TYEL(#gEc0Md_Tiks+{Wj7|GE*FIcrgwD(Qe z>aj12=}}}Ixt5aWPMzlxy93(~n#0TD_Xl;GDd#KVXKTJk7#G6+yTyMje-my~>0Q?~fSmV{uPyTk^mwhe8crLyp~SqQ zw#MWSg);;0yPCf>&3F)?Qyl zp8!u_t51$_baQ%`hkiuYC#ee%`#3pDur6C}B6bD71sDsV@1f@Nx}M%z&+r%OJQ&Ub za;>Gt617#)y%%l;?8E8#Vd|Ii$szs`x-J=Cm+L!leFv`Z!1W!tz5~~H;LR!Tn%q& zaVG+u3|wo1ogDm;XxCceK_-Y;Pdqx%jSpmiY|$TJ3oGp8e(23BvBEV{uuzB@=Br(w z1v||)Q3tp-2RrGY@fL475Euhyg5<~$ zXAyb>*a;4TpFvPyh*J?X0{4Q4K^zzirU)WKoHx<$f{(!0;5hIL3ULC#vd9pp0=g;a z4EliKU^3W+Pvi~8AA&EzDNwW|y@Ki>0z3wWf-zt^cpH2GJ_Y-M$O*JxsSu|$s16!{ z4j=(M4JLzm;63m$I0$|Kg@Qwzvfw5@V2G27e>7;% z_$BmGkid8ydN())ZY&+*Q~~3$w?MBzcR}|ByBMDbBN3O)w=!8uU8T!>Q*Gyp9@B=}E|X!?u= zeL*@H08+pZ@HiL=o&jUQL@*g_1Jl85Fc-`Ni@@7p1y~I}1RsIVKsMM3_JRZ8FgOPO z6D08Q0KQi_z=<9f-~@sQkc%x6{XZ$;awum>^yG`@mg};^%y!<_+8ouFBfA@iI#~-! z{0pUEQC_#2ggTK+^7om5v0=R4m#vgywLH~v}u6oQxI-q~Y-VH6k8=}=d z2z?&=aJ2mXSU>9O9y=4@KP-t=MlvVOg}TOW^m_a`;3NnL=k<^}t_nd;ZuuZ593257 zMOO)O+?9izERYLwKsJcJH^>RRC&)<$ZV(P!;8GI(AUPuOcYyZ*V{~}OASa`Jkdw?f z8(Rea%mn8B$PFSuI>-eXBZwQ!9Bq&_gxW*#fpC1`=t#8Kb0;u=fj%d~pF~}B)=Tg~ z^mKAhgTpxR4e%QFxvULjzD^zH;Y+YD#=ZzUaA#p>9M>EcTq$G!}C7ooD10uVYbTWWQay0P+7!O4E!yk(;nY=wpI+=HR z->Y1rJojqwJlW(uJn=`KWbV$+n@?w+u_JFjpLwp_Y>5be6Z1&F66nH^DXZi_j=z`=Il^?An!e@DeuY-cKU&IAh9>_ z8kF-jvAcpj_iS~>Cid;Mc|X^T=lyNGkEH7onQ~x z4-SGO;5hgvI17FQg?K++0+a=nz-^#52nY2+W6%slfYzW5Xb&PmXV3*igLsexgg*!j z2P45~kO8KHSHXO+5M+T3U^CbWB0(~k0#<i7F!~5Mrdrl_9Lyq49{=uUp^m#ns1wmV)X8ZDB0`-^;E|Tt zK|06*F8tBLIpTfJ$a6;?AJ+(&auskk$59l zsxN;wsAXLnvnQgZhbzU)zw_N~^7^;qFEuu6lOC^>UmibAefqnWc=_!m&mTKR>KeIH z{XmGVseghsR%pxfo^c`=0mcDY<8;+#y|b8Sg6(5VU$XAi)-Pp<|AtN#fJ%f^JlCHxaR!HMd_&&y$0p=pB$k5cceBwXYwJxtOD@3xiO7&) z_z_ZW_Df^}pQy@j(FhB(C)p@?ZAxb(#Fpn|KfZX-UWR5n3O= z;p=&i&SN%tE$`F0{_b_m;mGy(>>qa7zuYCfpSSiezw4jN%}D7>06OA5_MMxJ&Eq#? zqxbrl=f@=@@JCszbn5yelx$|w+%PEO8@fw%i0&-*hPkDVx zXP$gIZ~x8fljrfN`!A2jtJ!~f{d1Ai&Y$@+xw)?L_?PSJrq+eWzvjQ%{m<|9RUSWA zdVRX8#}BU$SM&Pwzw!ETq5u3|7}Ul;XGfOfy|ny2#r%8Q(B*xhK>h||-Ev{v9xd?_ zD>=-+&ke!EnLNfWIwm1LCN<7`r(X8hP$w>}Z(NGrxVN5ppOmCQ$r_N!yl+x!n!248 z%;OW|(>xrEWuFUm663s63E7CB`H-ZP{+^Ik%#&kMQ-{QQ6V8=+N>W-&zAT{sVnY{@wja5%5ajrRKQe$@MU%KOnb(VUAfdMJlpUpLhAT|Hux>*GFC z&N=h@A4w~?Nb;Vw%U14%LpSD&ABv)4$6+qFouPBa1k%qjMVH z;DjG3?CfCtEjTN-t-KEBBl4Od-?dX29g&Y;9*awwl%8>L)oUT2&rR!d^8a{U%h>o>OH&u#W}er9ZNz}7z+&HCf{<^BV|>DqSOq%EVy zH!3o4?#B<#YhGi5-@1;K)(qUUu0n@pO@8h$_uP{7=iA@5?qs=r?bePt9I^D1^6kDq zc4X1hty=W&)@k>KHK%>Av2Tk!rZ0I`@8!yST`%Nkp2*7c7g@7-y$ref(uL}Dh7mxu z{O!VU9&YZI40h6zHSlr zb54*G!}C3s-<`bn#VX`6S_z2G!M0KFiLgRF!<-qsx0_m+Gwl4I|Gxa|^XofseFv`Z zz}4?`Rnt4Vy*vA`v0q5KeBoJM{vKE zul!Zd|Gk&U|5rVKk7|DRqQXvJ?wQHvgW(DBJ$u!;Bdl(NuvEDX!C4tsGsFo??VFmG zk`~j`2}?{$iwo=p!kH?I`Oe;YSFT7owS%fj>p$GCbh2<7CS64b=Ux}PD}B6 z26GS=pOkpfB#Io8QGHQRQ{oaN+&f54NOQu{;)bRbg%&6R}S5(~4UUA83Q7kYaj#A#h zw4SM{5+0ux6_b(@GtAUV9n@1BFqRmai@(sF_F~b(B%x~#xi)YQ6WAzU zfUV+Ey$Wr3M;G%R6XbR0^$B&o#XAqjgTdnQimX*c?u#(_&Q&Yp2!50=*-$aOy%z68 zZaGJ=%{bL3A>lx-rDTvZU%{sO7hg9Clh3+J-GWS3aaJs_&$>+NGjPN%JULSq$ho2s z!;?3m#etj$7@mF3X?TSx>ZuDan_Pl4#zqXUoW*O+*@D3MgloptEnXWq0&`7mUWCPq zh9js@-c)rQmk#fTCy!BChn#Z?av95>ib!4AkB6;%2^~Tm!BA{QgeQ>iMi8^)lQVUJ z@BRrd*5b(-vtX8NsESKq-}@2( literal 0 HcmV?d00001 diff --git a/lgsm/lib/ubuntu12.04/i386/libm.so.6 b/lgsm/lib/ubuntu12.04/i386/libm.so.6 new file mode 100644 index 0000000000000000000000000000000000000000..23c73207a8dbddfdb51aa5ca09deadcfead6b79e GIT binary patch literal 173576 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 Lg06)>(xUr6O`|c! literal 0 HcmV?d00001 diff --git a/lgsm/lib/ubuntu12.04/i386/libstdc++.so.6 b/lgsm/lib/ubuntu12.04/i386/libstdc++.so.6 new file mode 100644 index 0000000000000000000000000000000000000000..614f0ec234e609c6339e82577e744701e8f60595 GIT binary patch literal 905712 zcmZ782|QKJ<3I4Z*QIN}mTXCvBqSk~q`G$5LP**q3CR{hmTQ+(NJ0{lR1!jzBvH1C zNSjJp9!io>RQiAJ^Zk8)uixu`p66}m%*>fHXJ*cvb1$!=j4e$l6bkw8#znZuzkAzh zL>q}x4+Q_s(k4toC(2|2k^4{ne-A(y7b5sCZcZA5{F^TxCrHFI{-ev3kcX7! ziqNu7kXW|;$G->Qq?~-(|Io(%e<>o32=lArunvl$^A z|2^Io`J7|^|Lwo$w?qE_t$$<|O4VRe4d^T;n@wfJ7_tkDMf0iYuY3f%_&J@ zL>W{rf^Pob4Fm5XGl$r-=_J4LG$)x#T)2n;o5`bRUqo$n8>F%5B^1V7Itw|RO#_u1 zrOFd@%*lTfX!7RhCl;L*%}6z}K|e&h(aO;|gvAyjEF&MfG-0vuKL%{&xo8T5O^C6$ zauRw2NqlqV8HCEBEA#AQTC%9x^w~z&B9evNh-g15zBx^Im(BYnh7%rozOI;$lUZ4OlBrdCqoHj z6)2g~!{yQh{ z&`;ABvT$|0bTSan;&q~kGv|s^-Kbm?P7{fS+2cJ-+=T)}pII4uIS=!YSA>R!uoOCx zPN&@AB@&|AQYM6Ez-N$8SW<@UG&cSH&J{FKw2Vm4;pL`cxVR|dB}r;@nkvPZtAtXH z`7B3giRcqoH$%eBBs3=GIF)T6%4FvgsxoDRs6L@DmLf&F2-S|wVA11jDD*ibnkmmT zR;2PQrKAz6IE!aDTF8U>MA#&Ag8_?WPk3mgk<2rvr%g7BV|zw_FX1RUWCHr zWyovu$q=eR6GqO3DnOxf?mq>#2Ck!=!O$`DV~`Cj;;}Jy8WsO%lVGG0DQYG+pEgZU zip?a%jaiD~R5FKQK}Z=qR2TZCtaRNk+-R&H!?|FPJ9xZ7}}Hj zbZsIkFNxKM)hN$%oVAHlmL}V*z@(9UZU!}ua~vT8#6y}_3UL;VkwURyk5L3!ylldz zlg360NmZip;xJ5q7LCwSuj#B>%10Pztp+D`3qzD<%zlq`!ki+ms)EK{V=0g-g*)tw zoknZyR>y7Ndd9}gV37D!!nh+;!lWyj-7_F3ZAoRc2$f1zq!K3D&vp_O#gfFLFeoIM z>`;&*%s6SZh@YKbL7{P_Y1mMSO(q2^mk{R`C#eZiJm&iGh`A6-v;mceumns

m_% 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%0Dp( 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 Date: Sat, 12 Mar 2016 23:52:42 +0000 Subject: [PATCH 127/434] Updated functions url location --- JustCause2/jc2server | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament99/ut99server | 2 +- functions/core_dl.sh | 2 +- functions/core_functions.sh | 2 +- lgsm/functions/core_dl.sh | 2 +- lgsm/functions/core_functions.sh | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/JustCause2/jc2server b/JustCause2/jc2server index ccf5e3c31..2f037c799 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -81,7 +81,7 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- # Fetches core_dl for file downloads fn_fetch_core_dl(){ -github_file_url_dir="functions" +github_file_url_dir="lgsm/functions" github_file_url_name="${functionfile}" filedir="${functionsdir}" filename="${github_file_url_name}" diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index 5888477b3..0cd432645 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -75,7 +75,7 @@ githubbranch="master" # Fetches core_dl for file downloads fn_fetch_core_dl(){ -github_file_url_dir="functions" +github_file_url_dir="lgsm/functions" github_file_url_name="${functionfile}" filedir="${functionsdir}" filename="${github_file_url_name}" diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index edd64523e..c6bc5ef42 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -75,7 +75,7 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- # Fetches core_dl for file downloads fn_fetch_core_dl(){ -github_file_url_dir="functions" +github_file_url_dir="lgsm/functions" github_file_url_name="${functionfile}" filedir="${functionsdir}" filename="${github_file_url_name}" diff --git a/functions/core_dl.sh b/functions/core_dl.sh index 579fb2788..d6d841637 100644 --- a/functions/core_dl.sh +++ b/functions/core_dl.sh @@ -188,7 +188,7 @@ fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" " # Fetches functions fn_fetch_function(){ -github_file_url_dir="functions" # github dir containing the file +github_file_url_dir="lgsm/functions" # github dir containing the file github_file_url_name="${functionfile}" # name of the github file githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" fileurl="${githuburl}" diff --git a/functions/core_functions.sh b/functions/core_functions.sh index ccea1f07d..8f59a57fb 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -26,7 +26,7 @@ if [ -z "${lgsmdir}" ]; then fi fn_fetch_core_dl(){ -github_file_url_dir="functions" +github_file_url_dir="lgsm/functions" github_file_url_name="${functionfile}" filedir="${functionsdir}" filename="${github_file_url_name}" diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 579fb2788..d6d841637 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -188,7 +188,7 @@ fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" " # Fetches functions fn_fetch_function(){ -github_file_url_dir="functions" # github dir containing the file +github_file_url_dir="lgsm/functions" # github dir containing the file github_file_url_name="${functionfile}" # name of the github file githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" fileurl="${githuburl}" diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index ccea1f07d..8f59a57fb 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -26,7 +26,7 @@ if [ -z "${lgsmdir}" ]; then fi fn_fetch_core_dl(){ -github_file_url_dir="functions" +github_file_url_dir="lgsm/functions" github_file_url_name="${functionfile}" filedir="${functionsdir}" filename="${github_file_url_name}" From 09ce09e1027f011b03f7b6bb0ce8c05b65a9d0f8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 13 Mar 2016 00:02:25 +0000 Subject: [PATCH 128/434] Added glibcfix to run on start --- lgsm/functions/fix.sh | 1 + lgsm/functions/fix_glibc.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index e4723e649..f10f44f6c 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -42,6 +42,7 @@ if [ "${function_selfname}" != "command_install.sh" ]; then elif [ "${gamename}" == "ARMA 3" ]; then fix_arma3.sh fi + fix_glibc.sh fi # Fixes that are run on install only. diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index 87b36db72..cd753882b 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -9,7 +9,7 @@ info_glibc.sh if [ $(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1) != $glibc_required ]; then echo "Version $(ldd --version | sed -n '1s/.* //p') is lower than $glibc_required" if [ ${glibcfix} == "yes" ]; then - export LD_LIBRARY_PATH=:${filesdir}:${filesdir}/bin:{$LD_LIBRARY_PATH} + export LD_LIBRARY_PATH=:${lgsmdir}/lib/ubuntu12.04/i386 else echo "no glibc fix available you need to upgrade bro!!" fi From fb38ef5ad0e6dc4d3ecd925eb75e6ba3611926c3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 13 Mar 2016 00:19:04 +0000 Subject: [PATCH 129/434] fixed line endings --- lgsm/functions/fix_glibc.sh | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index cd753882b..3a90f23db 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -1,18 +1,19 @@ -#!/bin/bash -# LGSM fix_glibc.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="020116" - -info_glibc.sh - -if [ $(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1) != $glibc_required ]; then - echo "Version $(ldd --version | sed -n '1s/.* //p') is lower than $glibc_required" - if [ ${glibcfix} == "yes" ]; then - export LD_LIBRARY_PATH=:${lgsmdir}/lib/ubuntu12.04/i386 - else - echo "no glibc fix available you need to upgrade bro!!" - fi -else - echo "GLIBC is OK no fix required" +#!/bin/bash +# LGSM fix_glibc.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="020116" + +info_glibc.sh + +if [ $(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1) != ${glibc_required} ]; then + echo "Version $(ldd --version | sed -n '1s/.* //p') is lower than $glibc_required" + if [ "${glibcfix}" == "yes" ]; then + echo "applied glibc fix" + export LD_LIBRARY_PATH=:${lgsmdir}/lib/ubuntu12.04/i386 + else + echo "no glibc fix available you need to upgrade bro!!" + fi +else + echo "GLIBC is OK no fix required" fi \ No newline at end of file From 5a13e5afbc4ec390853f66232fa35640adddf7f7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 13 Mar 2016 00:31:10 +0000 Subject: [PATCH 130/434] fixes --- lgsm/functions/fix_glibc.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index 3a90f23db..b1ea50d4b 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -6,11 +6,12 @@ lgsm_version="020116" info_glibc.sh -if [ $(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1) != ${glibc_required} ]; then +if [ "$(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1)" != "${glibc_required}" ]; then echo "Version $(ldd --version | sed -n '1s/.* //p') is lower than $glibc_required" if [ "${glibcfix}" == "yes" ]; then echo "applied glibc fix" - export LD_LIBRARY_PATH=:${lgsmdir}/lib/ubuntu12.04/i386 + echo "export LD_LIBRARY_PATH=:"${lgsmdir}/lib/ubuntu12.04/i386"" + export LD_LIBRARY_PATH=:"${lgsmdir}/lib/ubuntu12.04/i386" else echo "no glibc fix available you need to upgrade bro!!" fi From 85ea727dc6434882f788780c4eee8746a2626185 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 13 Mar 2016 00:57:47 +0000 Subject: [PATCH 131/434] Removed functions dir --- DoubleActionBoogaloo/dabserver | 2 +- functions/check.sh | 67 -- functions/check_config.sh | 17 - functions/check_deps.sh | 218 ------- functions/check_ip.sh | 33 - functions/check_logs.sh | 16 - functions/check_root.sh | 13 - functions/check_steamcmd.sh | 73 --- functions/check_system_dir.sh | 13 - functions/check_tmux.sh | 20 - functions/command_backup.sh | 64 -- functions/command_console.sh | 48 -- functions/command_debug.sh | 59 -- functions/command_details.sh | 682 -------------------- functions/command_dev_debug.sh | 17 - functions/command_email_test.sh | 22 - functions/command_install.sh | 38 -- functions/command_monitor.sh | 110 ---- functions/command_start.sh | 182 ------ functions/command_stop.sh | 217 ------- functions/command_ts3_server_pass.sh | 62 -- functions/command_update_functions.sh | 37 -- functions/command_validate.sh | 47 -- functions/core_dl.sh | 202 ------ functions/core_functions.sh | 454 -------------- functions/core_getopt.sh | 441 ------------- functions/core_messages.sh | 204 ------ functions/email.sh | 68 -- functions/fix.sh | 75 --- functions/fix_arma3.sh | 13 - functions/fix_csgo.sh | 43 -- functions/fix_dst.sh | 16 - functions/fix_glibc.sh | 144 ----- functions/fix_ro.sh | 27 - functions/fix_steamcmd.sh | 41 -- functions/fix_ut2k4.sh | 27 - functions/fix_ut99.sh | 25 - functions/fn_update_functions | 22 - functions/gsquery.py | 125 ---- functions/info_config.sh | 868 -------------------------- functions/info_glibc.sh | 71 --- functions/install_complete.sh | 21 - functions/install_config.sh | 349 ----------- functions/install_gslt.sh | 37 -- functions/install_header.sh | 16 - functions/install_logs.sh | 43 -- functions/install_retry.sh | 16 - functions/install_server_dir.sh | 32 - functions/install_server_files.sh | 110 ---- functions/install_steamcmd.sh | 15 - functions/install_ts3.sh | 82 --- functions/install_ts3db.sh | 71 --- functions/install_ut2k4_key.sh | 28 - functions/logs.sh | 102 --- functions/monitor_gsquery.sh | 93 --- functions/update_check.sh | 326 ---------- functions/update_dl.sh | 83 --- lgsm/functions/command_details.sh | 2 +- lgsm/functions/monitor_gsquery.sh | 2 +- 59 files changed, 3 insertions(+), 6348 deletions(-) delete mode 100644 functions/check.sh delete mode 100644 functions/check_config.sh delete mode 100644 functions/check_deps.sh delete mode 100644 functions/check_ip.sh delete mode 100644 functions/check_logs.sh delete mode 100644 functions/check_root.sh delete mode 100644 functions/check_steamcmd.sh delete mode 100644 functions/check_system_dir.sh delete mode 100644 functions/check_tmux.sh delete mode 100644 functions/command_backup.sh delete mode 100644 functions/command_console.sh delete mode 100644 functions/command_debug.sh delete mode 100644 functions/command_details.sh delete mode 100644 functions/command_dev_debug.sh delete mode 100644 functions/command_email_test.sh delete mode 100644 functions/command_install.sh delete mode 100644 functions/command_monitor.sh delete mode 100644 functions/command_start.sh delete mode 100644 functions/command_stop.sh delete mode 100644 functions/command_ts3_server_pass.sh delete mode 100644 functions/command_update_functions.sh delete mode 100644 functions/command_validate.sh delete mode 100644 functions/core_dl.sh delete mode 100644 functions/core_functions.sh delete mode 100644 functions/core_getopt.sh delete mode 100644 functions/core_messages.sh delete mode 100644 functions/email.sh delete mode 100644 functions/fix.sh delete mode 100644 functions/fix_arma3.sh delete mode 100644 functions/fix_csgo.sh delete mode 100644 functions/fix_dst.sh delete mode 100644 functions/fix_glibc.sh delete mode 100644 functions/fix_ro.sh delete mode 100644 functions/fix_steamcmd.sh delete mode 100644 functions/fix_ut2k4.sh delete mode 100644 functions/fix_ut99.sh delete mode 100644 functions/fn_update_functions delete mode 100644 functions/gsquery.py delete mode 100644 functions/info_config.sh delete mode 100644 functions/info_glibc.sh delete mode 100644 functions/install_complete.sh delete mode 100644 functions/install_config.sh delete mode 100644 functions/install_gslt.sh delete mode 100644 functions/install_header.sh delete mode 100644 functions/install_logs.sh delete mode 100644 functions/install_retry.sh delete mode 100644 functions/install_server_dir.sh delete mode 100644 functions/install_server_files.sh delete mode 100644 functions/install_steamcmd.sh delete mode 100644 functions/install_ts3.sh delete mode 100644 functions/install_ts3db.sh delete mode 100644 functions/install_ut2k4_key.sh delete mode 100644 functions/logs.sh delete mode 100644 functions/monitor_gsquery.sh delete mode 100644 functions/update_check.sh delete mode 100644 functions/update_dl.sh diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 00b8c70f6..1887682e9 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -49,7 +49,7 @@ githubbranch="master" appid="317800" # Server Details -servicename="da-server" +servicename="dab-server" gamename="Double Action: Boogaloo" engine="source" diff --git a/functions/check.sh b/functions/check.sh deleted file mode 100644 index 69f62f0ad..000000000 --- a/functions/check.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash -# LGSM fn_check function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="060316" - -# Description: Overall function for managing checks. -# Runs checks that will either halt on or fix an issue. - -# Every command that requires checks just references check.sh -# check.sh selects which checks to run by using arrays - -check_root.sh - -if [ "${function_selfname}" != "command_install.sh" ] && [ "${function_selfname}" != "command_update_functions.sh" ]; then - check_system_dir.sh -fi - -local allowed_commands_array=( command_backup.sh command_console.sh command_debug.sh command_details.sh command_unreal2_maps.sh command_ut99_maps.sh command_monitor.sh command_start.sh command_stop.sh update_check.sh command_validate.sh command_update_functions.sh command_email_test.sh ) -for allowed_command in "${allowed_commands_array[@]}" -do - if [ "${allowed_command}" == "${function_selfname}" ]; then - check_logs.sh - fi -done - -local allowed_commands_array=( command_debug.sh command_start.sh command_stop.sh ) -for allowed_command in "${allowed_commands_array[@]}" -do - if [ "${allowed_command}" == "${function_selfname}" ]; then - check_deps.sh - fi -done - -local allowed_commands_array=( command_debug.sh command_details.sh command_monitor.sh command_start.sh command_stop.sh ) -for allowed_command in "${allowed_commands_array[@]}" -do - if [ "${allowed_command}" == "${function_selfname}" ]; then - check_ip.sh - fi -done - -local allowed_commands_array=( update_check.sh command_debug.sh command_start.sh command_validate.sh ) -for allowed_command in "${allowed_commands_array[@]}" -do - if [ "${allowed_command}" == "${function_selfname}" ]; then - if [ -n "${appid}" ]; then - check_steamcmd.sh - fi - fi -done - -local allowed_commands_array=( command_console.sh command_start.sh ) -for allowed_command in "${allowed_commands_array[@]}" -do - if [ "${allowed_command}" == "${function_selfname}" ]; then - check_tmux.sh - fi -done - -local allowed_commands_array=( command_console.sh command_debug.sh command_details.sh command_monitor.sh command_start.sh command_stop.sh ) -for allowed_command in "${allowed_commands_array[@]}" -do - if [ "${allowed_command}" == "${function_selfname}" ]; then - check_config.sh - fi -done \ No newline at end of file diff --git a/functions/check_config.sh b/functions/check_config.sh deleted file mode 100644 index c329cca95..000000000 --- a/functions/check_config.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# LGSM check_config.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="060116" - -# Description: If server config missing warn user. - -if [ ! -e "${servercfgfullpath}" ]; then - if [ "${gamename}" != "Hurtworld" ]; then - fn_print_warn_nl "Config file missing!" - echo "${servercfgfullpath}" - fn_scriptlog "Configuration file missing!" - fn_scriptlog "${servercfgfullpath}" - sleep 2 - fi -fi \ No newline at end of file diff --git a/functions/check_deps.sh b/functions/check_deps.sh deleted file mode 100644 index df955189c..000000000 --- a/functions/check_deps.sh +++ /dev/null @@ -1,218 +0,0 @@ -#!/bin/bash -# LGSM check_deps.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="060316" - -# Description: Checks that the requires dependencies are installed for LGSM. - - -fn_deps_detector(){ - # Checks if dependency is missing - if [ -n "$(command -v dpkg-query)" ]; then - dpkg-query -W -f='${Status}' ${deptocheck} 2>/dev/null| grep -q -P '^install ok installed$' - depstatus=$? - elif [ -n "$(command -v yum)" ]; then - yum -q list installed ${deptocheck} > /dev/null 2>&1 - depstatus=$? - fi - if [ "${depstatus}" == "0" ]; then - missingdep=0 - if [ "${function_selfname}" == "command_install.sh" ]; then - echo -e "\e[0;32m${deptocheck}\e[0m" - sleep 0.5 - fi - else - # if missing dependency is found - missingdep=1 - if [ "${function_selfname}" == "command_install.sh" ]; then - echo -e "\e[0;31m${deptocheck}\e[0m" - sleep 0.5 - fi - fi - - # Missing dependencies are added to array_deps_missing - if [ "${missingdep}" == "1" ]; then - array_deps_missing+=("${deptocheck}") - fi -} - -fn_deps_email(){ - # Adds postfix to required dependencies if email notification is enabled - if [ "${emailnotification}" == "on" ]; then - if [ -f /usr/bin/mailx ]; then - if [ -d /etc/exim4 ]; then - array_deps_required+=( exim4 ) - elif [ -d /etc/sendmail ]; then - array_deps_required+=( sendmail ) - elif [ -n "$(command -v dpkg-query)" ]; then - array_deps_required+=( mailutils postfix ) - elif [ -n "$(command -v yum)" ]; then - array_deps_required+=( mailx postfix ) - fi - else - if [ -n "$(command -v dpkg-query)" ]; then - array_deps_required+=( mailutils postfix ) - elif [ -n "$(command -v yum)" ]; then - array_deps_required+=( mailx postfix ) - fi - fi - fi -} - -fn_found_missing_deps(){ - if [ "${#array_deps_missing[@]}" != "0" ]; then - fn_print_dots "Checking dependencies" - sleep 2 - fn_print_warn "Checking dependencies: missing: \e[0;31m${array_deps_missing[@]}\e[0m" - fn_scriptlog "Checking dependencies: missing: \e[0;31m${array_deps_missing[@]}\e[0m" - sleep 1 - echo -e "" - sudo -n true > /dev/null 2>&1 - if [ $? -eq 0 ]; then - fn_print_info_nl "Attempting to install missing dependencies automatically" - echo -en ".\r" - sleep 1 - echo -en "..\r" - sleep 1 - echo -en "...\r" - sleep 1 - echo -en " \r" - if [ -n "$(command -v dpkg-query)" ]; then - echo "sudo dpkg --add-architecture i386; sudo apt-get install ${array_deps_missing[@]}" - elif [ -n "$(command -v yum)" ]; then - echo "yum install ${array_deps_missing[@]}" - fi - else - echo "" - fn_print_infomation_nl "$(whoami) does not have sudo access. manually install dependencies" - fn_scriptlog "$(whoami) does not have sudo access. manually install dependencies" - echo "" - if [ -n "$(command -v dpkg-query)" ]; then - echo "sudo dpkg --add-architecture i386; sudo apt-get install ${array_deps_missing[@]}" - elif [ -n "$(command -v yum)" ]; then - echo "yum install ${array_deps_missing[@]}" - fi - echo "" - fi - if [ "${function_selfname}" == "command_install.sh" ]; then - sleep 5 - fi - fi -} - -fn_check_loop(){ - # Loop though required depenencies - for deptocheck in "${array_deps_required[@]}" - do - fn_deps_detector - done - - # user to be informaed of any missing dependecies - fn_found_missing_deps -} - -if [ "${function_selfname}" == "command_install.sh" ]; then - echo "" - echo "Checking Dependecies" - echo "=================================" -fi - - -# Check will only run if using apt-get or yum -if [ -n "$(command -v dpkg-query)" ]; then - # Generate array of missing deps - array_deps_missing=() - - # LGSM requirement for curl - array_deps_required=( curl ca-certificates ) - - # All servers except ts3 require tmux - if [ "${executable}" != "./ts3server_startscript.sh" ]; then - array_deps_required+=( tmux ) - fi - - # All servers except ts3 & mumble require libstdc++6, lib32gcc1 - if [ "${executable}" != "./ts3server_startscript.sh" ]||[ "${executable}" != "./murmur.x86" ]; then - if [ "${arch}" == "x86_64" ]; then - array_deps_required+=( lib32gcc1 libstdc++6:i386 ) - else - array_deps_required+=( libstdc++6:i386 ) - fi - fi - - # Game Specific requirements - - # Spark - if [ "${engine}" == "spark" ]; then - array_deps_required+=( speex:i386 libtbb2 ) - # 7 Days to Die - elif [ "${gamename}" == "7 Days To Die" ]; then - array_deps_required+=( telnet expect ) - # No More Room in Hell - elif [ "${gamename}" == "No More Room in Hell" ]; then - array_deps_required+=( lib32tinfo5 ) - # Brainbread 2 and Don't Starve Together - elif [ "${gamename}" == "Brainbread 2" ]||[ "${gamename}" == "Don't Starve Together" ]; then - array_deps_required+=( libcurl4-gnutls-dev:i386 ) - elif [ "${engine}" == "projectzomboid" ]; then - array_deps_required+=( openjdk-7-jre ) - # Unreal engine - elif [ "${executable}" == "./ucc-bin" ]; then - #UT2K4 - if [ -f "${executabledir}/ut2004-bin" ]; then - array_deps_required+=( libsdl1.2debian libstdc++5:i386 bzip2 ) - #UT99 - else - array_deps_required+=( libsdl1.2debian bzip2 ) - fi - fi - fn_deps_email - fn_check_loop - -elif [ -n "$(command -v yum)" ]; then - # Generate array of missing deps - array_deps_missing=() - - # LGSM requirement for curl - array_deps_required=( curl ) - - # All servers except ts3 require tmux - if [ "${executable}" != "./ts3server_startscript.sh" ]; then - array_deps_required+=( tmux ) - fi - - # All servers excelts ts3 & mumble require glibc.i686 libstdc++.i686 - if [ "${executable}" != "./ts3server_startscript.sh" ]||[ "${executable}" != "./murmur.x86" ]; then - array_deps_required+=( glibc.i686 libstdc++.i686 ) - fi - - # Game Specific requirements - - # Spark - if [ "${engine}" == "spark" ]; then - array_deps_required+=( speex.i686 tbb.i686 ) - # 7 Days to Die - elif [ "${gamename}" == "7 Days To Die" ]; then - array_deps_required+=( telnet expect ) - # No More Room in Hell - elif [ "${gamename}" == "No More Room in Hell" ]; then - array_deps_required+=( ncurses-libs.i686 ) - # Brainbread 2 and Don't Starve Together - elif [ "${gamename}" == "Brainbread 2" ]||[ "${gamename}" == "Don't Starve Together" ]; then - array_deps_required+=( libcurl.i686 ) - elif [ "${engine}" == "projectzomboid" ]; then - array_deps_required+=( java-1.7.0-openjdk ) - # Unreal engine - elif [ "${executable}" == "./ucc-bin" ]; then - #UT2K4 - if [ -f "${executabledir}/ut2004-bin" ]; then - array_deps_required+=( compat-libstdc++-33.i686 SDL.i686 bzip2 ) - #UT99 - else - array_deps_required+=( SDL.i686 bzip2 ) - fi - fi - fn_deps_email - fn_check_loop -fi \ No newline at end of file diff --git a/functions/check_ip.sh b/functions/check_ip.sh deleted file mode 100644 index 2a5ae5794..000000000 --- a/functions/check_ip.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -# LGSM check_ip.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -# Description: Automatically identifies the server interface IP. -# If multiple interfaces are detected the user will need to manualy set using ip="0.0.0.0". - -if [ "${gamename}" != "Teamspeak 3" ]; then - if [ ! -f "/bin/ip" ]; then - ipcommand="/sbin/ip" - else - ipcommand="ip" - fi - getip=$(${ipcommand} -o -4 addr|awk '{print $4}'|grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}'|grep -v 127.0.0) - getipwc=$(${ipcommand} -o -4 addr|awk '{print $4}'|grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}'|grep -vc 127.0.0) - - if [ "${ip}" == "0.0.0.0" ]||[ "${ip}" == "" ]; then - if [ "${getipwc}" -ge "2" ]; then - fn_print_warn "Multiple active network interfaces found.\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" - echo -en "" - echo -en "http://gameservermanagers.com/network-interfaces\n" - echo -en "" - exit 1 - else - ip=${getip} - fi - fi -fi diff --git a/functions/check_logs.sh b/functions/check_logs.sh deleted file mode 100644 index 9b4f41324..000000000 --- a/functions/check_logs.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# LGSM check_logs.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -# Description: Checks that log files exist on server start - -# Create dir's for the script and console logs -if [ ! -d "${scriptlogdir}" ]; then - fn_print_dots "Checking for log files" - sleep 1 - fn_print_info_nl "Checking for log files: Creating log files" - checklogs=1 - install_logs.sh -fi diff --git a/functions/check_root.sh b/functions/check_root.sh deleted file mode 100644 index 01c89b629..000000000 --- a/functions/check_root.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -# LGSM check_root.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="060316" - -if [ $(whoami) = "root" ]; then - fn_print_fail_nl "Do NOT run this script as root!" - if [ -d "${scriptlogdir}" ]; then - fn_scriptlog "${selfname} attempted to run as root." - fi - exit 1 -fi diff --git a/functions/check_steamcmd.sh b/functions/check_steamcmd.sh deleted file mode 100644 index 81e0f31c4..000000000 --- a/functions/check_steamcmd.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash -# LGSM check_steamcmd.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="160316" - -# Description: Checks SteamCMD is installed and correct. - - -fn_install_steamcmd(){ - if [ ! -d "${steamcmddir}" ]; then - mkdir -v "${steamcmddir}" - fi - fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "${lgsmdir}/tmp" "steamcmd_linux.tar.gz" - fn_dl_extract "${lgsmdir}/tmp" "steamcmd_linux.tar.gz" "${steamcmddir}" - chmod +x "${steamcmddir}/steamcmd.sh" -} - - -fn_check_steamcmd_user(){ - # Checks steamuser is setup. - if [ "${steamuser}" == "username" ]; then - fn_print_fail_nl "Steam login not set. Update steamuser." - echo " * Change steamuser=\"username\" to a valid steam login." - if [ -d "${scriptlogdir}" ]; then - fn_scriptlog "edit ${selfname}. change steamuser=\"username\" to a valid steam login." - exit 1 - fi - fi - # Anonymous user is set if steamuser is missing - if [ -z "${steamuser}" ]; then - fn_print_warn_nl "Steam login not set. Using anonymous login." - if [ -d "${scriptlogdir}" ]; then - fn_scriptlog "Steam login not set. Using anonymous login." - fi - steamuser="anonymous" - steampass="" - sleep 2 - fi -} - -fn_check_steamcmd_sh(){ - # Checks if SteamCMD exists when starting or updating a server. - # Installs if missing. - steamcmddir="${rootdir}/steamcmd" - if [ ! -f "${steamcmddir}/steamcmd.sh" ]; then - if [ "${function_selfname}" == "command_install.sh" ]; then - fn_install_steamcmd - else - fn_print_warn_nl "SteamCMD is missing" - fn_scriptlog "SteamCMD is missing" - sleep 1 - fn_install_steamcmd - fi - elif [ "${function_selfname}" == "command_install.sh" ]; then - fn_print_infomation "SteamCMD is already installed..." - fn_print_ok_eol_nl - fi -} - -fn_check_steamcmd_guard(){ - if [ "${function_selfname}" == "command_update.sh" ]||[ "${function_selfname}" == "command_validate.sh" ]; then - # Checks that steamcmd is working correctly and will prompt Steam Guard if required. - "${steamcmddir}"/steamcmd.sh +login "${steamuser}" "${steampass}" +quit - if [ $? -ne 0 ]; then - fn_print_failure_nl "Error running SteamCMD" - fi - fi -} - -fn_check_steamcmd_user -fn_check_steamcmd_sh -fn_check_steamcmd_guard \ No newline at end of file diff --git a/functions/check_system_dir.sh b/functions/check_system_dir.sh deleted file mode 100644 index d5d57e75b..000000000 --- a/functions/check_system_dir.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -# LGSM check_system_dir.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -if [ ! -d "${systemdir}" ]; then - fn_print_fail_nl "Cannot access ${systemdir}: No such directory" - if [ -d "${scriptlogdir}" ]; then - fn_scriptlog "Cannot access ${systemdir}: No such directory." - fi - exit 1 -fi diff --git a/functions/check_tmux.sh b/functions/check_tmux.sh deleted file mode 100644 index 49f43dd21..000000000 --- a/functions/check_tmux.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# LGSM check_tmux.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -# Checks if tmux is installed as too many users do not RTFM or know how to use Google. - -if [ "$(command -v tmux)" ]||[ "$(which tmux >/dev/null 2>&1)" ]||[ -f "/usr/bin/tmux" ]||[ -f "/bin/tmux" ]; then - : -else - fn_print_fail_nl "Tmux not installed" - sleep 1 - fn_scriptlog "Tmux is not installed" - echo " * Tmux is required to run this server." - # Suitable passive agressive message - echo " * Please see the the following link." - echo " * http://gameservermanagers.com/tmux-not-found" - exit 127 -fi diff --git a/functions/command_backup.sh b/functions/command_backup.sh deleted file mode 100644 index d8d52f4bc..000000000 --- a/functions/command_backup.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash -# LGSM command_backup.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -# Description: Creates a .tar.gz file in the backup directory. - -local modulename="Backup" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -check.sh -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;; - * ) echo "Please answer yes or no.";; -esac -done -tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") -if [ "${tmuxwc}" -eq 1 ]; then - echo "" - fn_print_warning_nl "${servicename} is currently running." - sleep 1 - while true; do - read -p "Stop ${servicename} while running the backup? [y/N]" yn - case $yn in - [Yy]* ) command_stop.sh; break;; - [Nn]* ) break;; - * ) echo "Please answer yes or no.";; - esac - done -fi -fn_scriptlog "Started" -echo -en "starting backup.\r" -sleep 1 -echo -en "starting backup..\r" -sleep 1 -echo -en "starting backup...\r" -sleep 1 -echo -en "\n" -cd "${rootdir}" -if [ ! -d "${backupdir}" ]; then - mkdir -v "${backupdir}" -fi -tar -cvzf "${backupdir}/${backupname}.tar.gz" --exclude "${backupdir}" ./* -echo "" -echo "Backup created: ${backupdir}/${backupname}.tar.gz" -fn_scriptlog "Created: ${backupdir}/${backupname}.tar.gz" -sleep 1 -echo "" -fn_print_complete_nl "Complete." -fn_scriptlog "Complete" -echo "" diff --git a/functions/command_console.sh b/functions/command_console.sh deleted file mode 100644 index f7f2c1323..000000000 --- a/functions/command_console.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash -# LGSM command_console.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -# Description: Gives access to the server tmux console. - -local modulename="Console" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -check.sh -echo "" -echo "${gamename} Console" -echo "============================" -echo "" -echo "Press \"CTRL+b d\" to exit console." -fn_print_warning_nl "Do NOT press CTRL+c to exit." -echo "" -while true; do - read -e -i "y" -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return;; - * ) echo "Please answer yes or no.";; -esac -done -fn_print_dots "Starting" -sleep 1 -tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") -if [ "${tmuxwc}" -eq 1 ]; then - fn_print_ok_nl "Starting" - fn_scriptlog "accessed" - sleep 1 - tmux attach-session -t ${servicename} -else - fn_print_fail_nl "Server not running" - fn_scriptlog "Failed to access: Server not running" - sleep 1 - while true; do - read -p "Do you want to start the server? [y/N]" yn - case $yn in - [Yy]* ) command_start.sh; break;; - [Nn]* ) break;; - * ) echo "Please answer yes or no.";; - esac - done -fi diff --git a/functions/command_debug.sh b/functions/command_debug.sh deleted file mode 100644 index baa93aec0..000000000 --- a/functions/command_debug.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash -# LGSM command_debug.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -# Description: Runs the server without tmux. Runs direct from the terminal. - -local modulename="Debug" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -check.sh -fix.sh -info_distro.sh -fn_parms -echo "" -echo "${gamename} Debug" -echo "============================" -echo "" -echo -e "Distro: ${os}" -echo -e "Arch: ${arch}" -echo -e "Kernel: ${kernel}" -echo -e "Hostname: $HOSTNAME" -echo "" -echo "Start parameters:" -if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then - echo "${executable} ${parms} -debug" -else - echo "${executable} ${parms}" -fi -echo "" -echo -e "Use for identifying server issues only!" -echo -e "Press CTRL+c to drop out of debug mode." -fn_print_warning_nl "If ${servicename} is already running it will be stopped." -echo "" -while true; do - read -e -i "y" -p "Continue? [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return;; - * ) echo "Please answer yes or no.";; -esac -done -fn_scriptlog "Starting debug" -fn_print_info_nl "Stopping any running servers" -fn_scriptlog "Stopping any running servers" -sleep 1 -command_stop.sh -fn_print_dots "Starting debug" -sleep 1 -fn_print_ok_nl "Starting debug" -fn_scriptlog "Started debug" -cd "${executabledir}" -fix.sh -if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then - ${executable} ${parms} -debug -else - ${executable} ${parms} -fi \ No newline at end of file diff --git a/functions/command_details.sh b/functions/command_details.sh deleted file mode 100644 index 6ec515d00..000000000 --- a/functions/command_details.sh +++ /dev/null @@ -1,682 +0,0 @@ -#!/bin/bash -# LGSM command_details.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="230216" - -# Description: Displays server infomation. - -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -# Standard Details -# This applies to all engines - -fn_details_os(){ -echo -e "" -echo -e "\e[93mDistro Details\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mDistro:\t\e[0m${os}" - echo -e "\e[34mArch:\t\e[0m${arch}" - echo -e "\e[34mKernel:\t\e[0m${kernel}" - echo -e "\e[34mHostname:\t\e[0m$HOSTNAME" - echo -e "\e[34mtmux:\t\e[0m${tmuxv}" - echo -e "\e[34mGLIBC:\t\e[0m${glibcv}" -} | column -s $'\t' -t -} - -fn_details_performance(){ -echo -e "" -echo -e "\e[93mPerformance\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mUptime:\t\e[0m${days}d, ${hours}h, ${minutes}m" - echo -e "\e[34mAvg Load:\t\e[0m${load}" -} | column -s $'\t' -t -echo -e "" -{ - echo -e "\e[34mMem:\t\e[34mtotal\t used\t free\e[0m" - echo -e "\e[34mPhysical:\t\e[0m${physmemtotal}\t${physmemused}\t${physmemfree}\e[0m" - echo -e "\e[34mSwap:\t\e[0m${swaptotal}\t${swapused}\t${swapfree}\e[0m" -} | column -s $'\t' -t -} - -fn_details_disk(){ -echo -e "" -echo -e "\e[93mStorage\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mFilesystem:\t\e[0m${filesystem}" - echo -e "\e[34mTotal:\t\e[0m${totalspace}" - echo -e "\e[34mUsed:\t\e[0m${usedspace}" - echo -e "\e[34mAvailable:\t\e[0m${availspace}" - echo -e "\e[34mServerfiles:\t\e[0m${filesdirdu}" - if [ -d "${backupdir}" ]; then - echo -e "\e[34mBackups:\t\e[0m${backupdirdu}" - fi -} | column -s $'\t' -t -} - -fn_details_gameserver(){ -echo -e "" - -## server details -echo -e "\e[92m${gamename} Server Details\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - # server name - echo -e "\e[34mServer name:\t\e[0m${servername}" - - # server ip - echo -e "\e[34mServer IP:\t\e[0m${ip}:${port}" - - # rcon password - if [ -n "${rconpassword}" ]; then - echo -e "\e[34mRCON password:\t\e[0m${rconpassword}" - fi - - # server password - if [ -n "${serverpassword}" ]; then - echo -e "\e[34mServer password:\t\e[0m${serverpassword}" - fi - - # admin password - if [ -n "${adminpassword}" ]; then - echo -e "\e[34mAdmin password:\t\e[0m${adminpassword}" - fi - - # slots - if [ -n "${slots}" ]; then - echo -e "\e[34mSlots:\t\e[0m${slots}" - fi - - # game mode - if [ -n "${gamemode}" ]; then - echo -e "\e[34mGame mode:\t\e[0m${gamemode}" - fi - - # game world - if [ -n "${gameworld}" ]; then - echo -e "\e[34mGame world:\t\e[0m${gameworld}" - fi - - # tick rate - if [ -n "${tickrate}" ]; then - echo -e "\e[34mTick rate:\t\e[0m${tickrate}" - fi - - # online status - if [ "${gamename}" == "Teamspeak 3" ]; then - info_ts3status.sh - if [ "${ts3status}" = "Server seems to have died" ]||[ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then - echo -e "\e[34mStatus:\t\e[0;31mOFFLINE\e[0m" - else - echo -e "\e[34mStatus:\t\e[0;32mONLINE\e[0m" - fi - else - pid=$(tmux list-sessions 2>&1 | awk '{print $1}' | grep -Ec "^${servicename}:") - if [ "${pid}" == "0" ]; then - echo -e "\e[34mStatus:\t\e[0;31mOFFLINE\e[0m" - else - echo -e "\e[34mStatus:\t\e[0;32mONLINE\e[0m" - fi - fi - - # teamspeak dbplugin - if [ -n "${dbplugin}" ]; then - echo -e "\e[34mdbplugin:\t\e[0m${dbplugin}" - fi -} | column -s $'\t' -t -echo -e "" - -## script details -echo -e "\e[92m${selfname} Script Details\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - # service name - echo -e "\e[34mService name:\t\e[0m${servicename}" - - # script version - if [ -n "${version}" ]; then - echo -e "\e[34m${selfname} version:\t\e[0m${version}" - fi - - # script user - echo -e "\e[34mUser:\t\e[0m$(whoami)" - - # GLIBC required - if [ -n "${glibcrequired}" ]; then - if [ "$(ldd --version | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" -lt "$(echo "${glibcrequired}" | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" ]; then - if [ "${glibcfix}" == "yes" ]; then - echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired} \e[0m(\e[0;32mUsing GLIBC fix\e[0m)" - else - echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired}\e[0m(\e[0;32mGLIBC version too old\e[0m)" - fi - else - echo -e "\e[34mGLIBC required:\t\e[0;32m${glibcrequired}\e[0m" - fi - fi - - # email notification - if [ -n "${emailnotification}" ]; then - echo -e "\e[34mEmail notification:\t\e[0m${emailnotification}" - fi - - # update on start - if [ -n "${updateonstart}" ]; then - echo -e "\e[34mUpdate on start:\t\e[0m${updateonstart}" - fi - - # script location - echo -e "\e[34mLocation:\t\e[0m${rootdir}" - - # config file location - if [ -n "${servercfgfullpath}" ]; then - echo -e "\e[34mConfig file:\t\e[0m${servercfgfullpath}" - fi - - # network config file location (ARMA 3) - if [ -n "${networkcfgfullpath}" ]; then - echo -e "\e[34mNetwork config file:\t\e[0m${networkcfgfullpath}" - fi -} | column -s $'\t' -t -} - -fn_details_backup(){ -echo -e "" -echo -e "\e[92mBackups\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -if [ ! -d "${backupdir}" ]||[ "${backupcount}" == "0" ]; then - echo -e "No Backups created" -else - { - echo -e "\e[34mNo. of backups:\t\e[0m${backupcount}" - echo -e "\e[34mLatest backup:\e[0m" - echo -e "\e[34m date:\t\e[0m${lastbackupdate}" - echo -e "\e[34m file:\t\e[0m${lastbackup}" - echo -e "\e[34m size:\t\e[0m${lastbackupsize}" - } | column -s $'\t' -t -fi -} - -fn_details_commandlineparms(){ -echo -e "" -echo -e "\e[92mCommand-line Parameters\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "${executable} ${parms}" -} - -fn_details_statusbottom(){ -echo -e "" -if [ "${gamename}" == "Teamspeak 3" ]; then - if [ "${ts3status}" = "Server seems to have died" ]||[ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then - echo -e "\e[34mStatus: \e[0;31mOFFLINE\e[0m" - else - echo -e "\e[34mStatus: \e[0;32mONLINE\e[0m" - fi -else - pid=$(tmux list-sessions 2>&1 | awk '{print $1}' | grep -Ec "^${servicename}:") - if [ "${pid}" == "0" ]; then - echo -e "\e[34mStatus: \e[0;31mOFFLINE\e[0m" - else - echo -e "\e[34mStatus: \e[0;32mONLINE\e[0m" - fi -fi -echo -e "" -} - -# Engine Specific details - -fn_details_avalanche(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep Jcmp-Server" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom -} - -fn_details_dontstarve(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep dontstarve" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom -} - -fn_details_projectzomboid(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep java" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom -} - - -fn_details_realvirtuality(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep arma3server" -echo -e "" -if [ -z "${port}" ]||[ -z "${queryport}" ]||[ -z "${masterport}" ]; then - echo -e "\e[0;31mERROR!\e[0m Missing/commented ports in ${servercfg}." - echo -e "" -fi -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> Steam: Query\tINBOUND\t${queryport}\tudp" - echo -e "> Steam: Master traffic\tINBOUND\t${masterport}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom -} - -fn_details_idtech3(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep qzeroded" -echo -e "" -if [ -z "${port}" ]||[ -z "${rconport}" ]||[ -z "${statsport}" ]; then - echo -e "\e[0;31mERROR!\e[0m Missing/commented ports in ${servercfg}." - echo -e "" -fi -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> Rcon\tINBOUND\t${rconport}\tudp" - echo -e "> Stats\tINBOUND\t${statsport}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom -} - - -fn_details_seriousengine35(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep Sam3_Dedicate" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/RCON\tINBOUND\t${port}\ttcp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom -} - -fn_details_source(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the command-line" -echo -e "parameters in ${selfname}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep srcds_linux" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/RCON\tINBOUND\t${port}\ttcp/udp" - if [ -n "${sourcetvport}" ]; then - echo -e "> SourceTV\tINBOUND\t${sourcetvport}\tudp" - fi - echo -e "< Client\tOUTBOUND\t${clientport}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom -} - -fn_details_spark(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the command-line" -echo -e "parameters in ${selfname}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep server_linux3" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/RCON\tINBOUND\t${port}\tudp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" - echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" -} | column -s $'\t' -t -echo -e "" -echo -e "\e[92m${servername} WebAdmin\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}/index.html" - echo -e "\e[34mWebAdmin username:\t\e[0m${webadminuser}" - echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}" -} | column -s $'\t' -t - -fn_details_statusbottom -} - -fn_details_starbound(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the command-line" -echo -e "parameters in ${selfname}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep starbound" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\ttcp" - echo -e "> Query\tINBOUND\t${queryport}\ttcp" - echo -e "> Rcon\tINBOUND\t${rconport}\ttcp" -} | column -s $'\t' -t - -fn_details_statusbottom - -} - -fn_details_teamspeak3(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep ts3server" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Voice\tINBOUND\t${port}\tudp" - echo -e "> ServerQuery\tINBOUND\t${queryport}\ttcp" - echo -e "> File transfer\tINBOUND\t${fileport}\ttcp" -} | column -s $'\t' -t - -fn_details_statusbottom -} - -fn_details_teeworlds(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the command-line" -echo -e "parameters in ${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep teeworlds_srv" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\ttcp" -} | column -s $'\t' -t - -fn_details_statusbottom -} - -fn_details_terraria(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the command-line" -echo -e "parameters in ${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep terraia" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\ttcp" - echo -e "> Query\tINBOUND\t${queryport}\ttcp" - echo -e "> Rcon\tINBOUND\t${rconport}\ttcp" -} | column -s $'\t' -t - -fn_details_statusbottom -} - -fn_details_sdtd(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep 7DaysToDie" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/RCON\tINBOUND\t${port}\tudp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" - echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" - echo -e "> Telnet\tINBOUND\t${telnetport}\ttcp" -} | column -s $'\t' -t -echo -e "" -echo -e "\e[92m${servername} WebAdmin\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mWebAdmin enabled:\t\e[0m${webadminenabled}" - echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}" - echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}" -} | column -s $'\t' -t -echo -e "" -echo -e "\e[92m${servername} Telnet\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mTelnet enabled:\t\e[0m${telnetenabled}" - echo -e "\e[34mTelnet address:\t\e[0m${ip} ${telnetport}" - echo -e "\e[34mTelnet password:\t\e[0m${telnetpass}" -} | column -s $'\t' -t - -fn_details_statusbottom -} - -fn_details_hurtworld(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "hwserver script" -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep Hurtworld" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/RCON\tINBOUND\t${port}\tudp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" - -} | column -s $'\t' -t -echo -e "" - -fn_details_statusbottom -} - -fn_details_rust(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "rustserver script" -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep Rust" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/Query\tINBOUND\t${port}\tudp" - echo -e "> RCON\tINBOUND\t${rconport}\ttcp" - -} | column -s $'\t' -t -echo -e "" - -fn_details_statusbottom -} - -fn_details_unreal(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep ucc-bin" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL\tINI VARIABLE" - echo -e "> Game\tINBOUND\t${port}\tudp\tPort=${port}" - echo -e "> Query\tINBOUND\t${queryport}\tudp" - if [ "${engine}" == "unreal" ]; then - echo -e "< UdpLink Port (random)\tOUTBOUND\t${udplinkport}+\tudp" - fi - if [ "${engine}" != "unreal" ] && [ "${appid}" != "223250" ]; then - echo -e "> GameSpy query\tINBOUND\t${gsqueryport}\tudp\tOldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ]; then - echo -e "< Master server\tOUTBOUND\t28852\ttcp/udp" - else - echo -e "< Master server\tOUTBOUND\t28900/28902\ttcp/udp" - fi - if [ "${appid}" ]; then - if [ "${appid}" == "223250" ]; then - echo -e "< Steam\tOUTBOUND\t20610\tudp" - else - echo -e "< Steam\tOUTBOUND\t20660\tudp" - fi - fi - echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" -} | column -s $'\t' -t -echo -e "" -echo -e "\e[92m${servername} WebAdmin\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mWebAdmin enabled:\t\e[0m${webadminenabled}" - echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}" - echo -e "\e[34mWebAdmin username:\t\e[0m${webadminuser}" - echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}" -} | column -s $'\t' -t - -fn_details_statusbottom -} - -fn_details_ark(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep ShooterGame" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL\tINI VARIABLE" - echo -e "> Game\tINBOUND\t${port}\tudp\tPort=${port}" - echo -e "> Query\tINBOUND\t${queryport}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom -} - - -# Run checks and gathers details to display. -check.sh -info_config.sh -info_distro.sh -info_glibc.sh -fn_details_os -fn_details_performance -fn_details_disk -fn_details_gameserver -fn_details_backup -# Some game servers do not have parms. -if [ "${gamename}" != "Teamspeak 3" ]&&[ "${engine}" != "avalanche" ]&&[ "${engine}" != "dontstarve" ]&&[ "${engine}" != "projectzomboid" ]; then - fn_parms - fn_details_commandlineparms -fi - - -# Display details depending on game or engine. -if [ "${engine}" == "avalanche" ]; then - fn_details_avalanche -elif [ "${engine}" == "dontstarve" ]; then - fn_details_dontstarve -elif [ "${engine}" == "projectzomboid" ]; then - fn_details_projectzomboid -elif [ "${engine}" == "idtech3" ]; then - fn_details_idtech3 -elif [ "${engine}" == "realvirtuality" ]; then - fn_details_realvirtuality -elif [ "${engine}" == "seriousengine35" ]; then - fn_details_seriousengine35 -elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then - fn_details_source -elif [ "${engine}" == "spark" ]; then - fn_details_spark -elif [ "${engine}" == "starbound" ]; then - fn_details_starbound -elif [ "${engine}" == "teeworlds" ]; then - fn_details_teeworlds -elif [ "${engine}" == "terraria" ]; then - fn_details_terraria -elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then - fn_details_unreal -elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then - fn_details_ark -elif [ "${gamename}" == "Hurtworld" ]; then - fn_details_hurtworld -elif [ "${gamename}" == "7 Days To Die" ]; then - fn_details_sdtd -elif [ "${gamename}" == "Teamspeak 3" ]; then - fn_details_teamspeak3 -elif [ "${gamename}" == "Rust" ]; then - fn_details_rust -else - fn_print_error_nl "Unable to detect server engine." -fi diff --git a/functions/command_dev_debug.sh b/functions/command_dev_debug.sh deleted file mode 100644 index 46bae900d..000000000 --- a/functions/command_dev_debug.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# LGSM dev_debug.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="281215" - -# Description: Dev only: enables debuging log to be saved to dev-debug.log. - -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -if [ -f ".dev-debug" ]; then - rm .dev-debug - fn_print_ok_nl "Disabled dev-debug" -else - date > .dev-debug - fn_print_ok_nl "Enabled dev-debug" -fi \ No newline at end of file diff --git a/functions/command_email_test.sh b/functions/command_email_test.sh deleted file mode 100644 index 26a0b6a42..000000000 --- a/functions/command_email_test.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -# LGSM command_email_test.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -# Description: Sends a test email notification. - -local modulename="Email" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -check.sh -info_config.sh -if [ "${emailnotification}" = "on" ]; then - fn_scriptlog "Sending test notification" - subject="${servicename} Email Test Notification - Testing ${servername}" - failurereason="Testing ${servicename} email notification" - actiontaken="Sent test email...hello is this thing on?" - email.sh -else - fn_print_fail_nl "Notifications not enabled" - fn_scriptlog "Notifications not enabled" -fi \ No newline at end of file diff --git a/functions/command_install.sh b/functions/command_install.sh deleted file mode 100644 index 877896380..000000000 --- a/functions/command_install.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -# LGSM fn_install function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="260216" - -# Description: Overall function for the installer. - -local modulename="Install" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -check.sh -install_header.sh -install_server_dir.sh -install_logs.sh -check_deps.sh -# Download and install -if [ "${gamename}" == "Unreal Tournament 2004" ]; then - install_server_files.sh - install_ut2k4_key.sh -elif [ "${gamename}" == "Unreal Tournament 99" ]; then - install_server_files.sh -elif [ "${gamename}" == "Teamspeak 3" ]; then - install_ts3.sh -elif [ -n "${appid}" ]; then - install_steamcmd.sh - install_server_files.sh -fi - -# Configuration -install_config.sh -if [ "${gamename}" == "Counter Strike: Global Offensive" ]||[ "${gamename}" == "Team Fortress 2" ]||[ "${gamename}" == "BrainBread 2" ]; then - install_gslt.sh -elif [ "${gamename}" == "Teamspeak 3" ]; then - install_ts3db.sh -fi -fix.sh -install_complete.sh diff --git a/functions/command_monitor.sh b/functions/command_monitor.sh deleted file mode 100644 index 066d0dbdf..000000000 --- a/functions/command_monitor.sh +++ /dev/null @@ -1,110 +0,0 @@ -#!/bin/bash -# LGSM command_monitor.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -# Description: Monitors server by checking for running proccesses -# then passes to monitor_gsquery.sh. - -local modulename="Monitor" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -fn_monitor_check_lockfile(){ - # Monitor does not run it lockfile is not found - if [ ! -f "${rootdir}/${lockselfname}" ]; then - fn_print_info_nl "Disabled: No lock file found" - fn_scriptlog "Disabled: No lock file found" - echo " * To enable monitor run ./${selfname} start" - exit 1 - fi -} - -fn_monitor_check_update(){ - # Monitor will not check if update is running. - updatecheck=$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l) - if [ "${updatecheck}" >= "1" ]; then - fn_print_info_nl "SteamCMD is currently checking for updates" - fn_scriptlog "SteamCMD is currently checking for updates" - sleep 1 - exit - fi -} - -fn_monitor_msg_checking(){ - fn_print_dots "Checking session: " - fn_print_checking_eol - fn_scriptlog "Checking session: CHECKING" - sleep 1 -} - -fn_monitor_email_notification(){ - # Email will be sent if enabled - if [ "${emailnotification}" = "on" ]; then - subject="${servicename} Monitor - Starting ${servername}" - failurereason="${servicename} process not running" - actiontaken="${servicename} has been restarted" - email.sh - fi -} - -fn_monitor_teamspeak3(){ - info_ts3status.sh - if [ "${ts3status}" = "Server is running" ]; then - fn_print_ok "Checking session: " - fn_print_ok_eol_nl - fn_scriptlog "Checking session: OK" - exit - else - fn_print_fail "Checking session: ${ts3status}: " - fn_print_fail_eol_nl - fn_scriptlog "Checking session: ${ts3status}: FAIL" - failurereason="${ts3status}" - fn_monitor_email_notification - fi - fn_scriptlog "Monitor is starting ${servername}" - sleep 1 - fn_restart -} - -fn_monitor_tmux(){ - # checks that tmux session is running - tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") - if [ "${tmuxwc}" == "1" ]; then - fn_print_ok "Checking session: OK" - fn_print_ok_eol_nl - fn_scriptlog "Checking session: OK" - # runs gsquery check on game with specific engines. - local allowed_engines_array=( avalanche goldsource realvirtuality source spark unity3d unreal unreal2 ) - for allowed_engine in "${allowed_engines_array[@]}" - do - if [ "${allowed_engine}" == "${function_selfname}" ]; then - monitor_gsquery.sh - fi - done - exit - else - fn_print_fail "Checking session: " - fn_print_fail_eol_nl - fn_scriptlog "Checking session: FAIL" - fn_monitor_email_notification - fn_scriptlog "Monitor is starting ${servername}" - sleep 1 - command_start.sh - fi -} - -check.sh -logs.sh -info_config.sh -fn_print_dots "${servername}" -fn_scriptlog "${servername}" -sleep 1 -fn_monitor_check_lockfile -fn_monitor_check_update -fn_monitor_msg_checking -if [ "${gamename}" == "Teamspeak 3" ]; then - fn_monitor_teamspeak3 -else - fn_monitor_tmux -fi \ No newline at end of file diff --git a/functions/command_start.sh b/functions/command_start.sh deleted file mode 100644 index e9fa5d0d0..000000000 --- a/functions/command_start.sh +++ /dev/null @@ -1,182 +0,0 @@ -#!/bin/bash -# LGSM command_start.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="070116" - -# Description: Starts the server. - -local modulename="Starting" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -fn_start_teamspeak3(){ - check.sh - info_ts3status.sh - - if [ "${ts3status}" != "Server is running" ]; then - # Will check for updates is updateonstart is yes - if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateonstart}" == "on" ]; then - update_check.sh - fi - fi - - if [ ! -e "${servercfgfullpath}" ]; then - fn_print_warn_nl "${servercfgfullpath} is missing" - fn_scriptlog "${servercfgfullpath} is missing" - echo " * Creating blank ${servercfg}" - fn_scriptlog "Creating blank ${servercfg}" - sleep 2 - echo " * ${servercfg} can remain blank by default." - fn_scriptlog "${servercfgfullpath} can remain blank by default." - sleep 2 - echo " * ${servercfg} is located in ${servercfgfullpath}." - fn_scriptlog "${servercfg} is located in ${servercfgfullpath}." - sleep 5 - touch "${servercfgfullpath}" - fi - - logs.sh - - fn_print_dots "${servername}" - fn_scriptlog "${servername}" - sleep 1 - - if [ "${ts3status}" == "Server is running" ]; then - fn_print_info_nl "${servername} is already running" - fn_scriptlog "${servername} is already running" - exit - fi - - mv "${scriptlog}" "${scriptlogdate}" - # Create lock file - date > "${rootdir}/${lockselfname}" - cd "${executabledir}" - if [ "${ts3serverpass}" == "1" ];then - ./ts3server_startscript.sh start serveradmin_password="${newpassword}" - else - ./ts3server_startscript.sh start inifile="${servercfgfullpath}" > /dev/null 2>&1 - fi - sleep 1 - info_ts3status.sh - if [ "${ts3status}" = "Server seems to have died" ]||[ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then - fn_print_fail_nl "Unable to start ${servername}" - fn_scriptlog "Unable to start ${servername}" - echo -e " Check log files: ${rootdir}/log" - exit 1 - else - fn_print_ok_nl "${servername}" - fn_scriptlog "Started ${servername}" - fi -} - -fn_start_tmux(){ -check.sh -fix.sh -info_config.sh -fn_parms -logs.sh - -tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") -# Will check for updates if updateonstart is yes -if [ "${tmuxwc}" -eq 0 ]; then - if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateonstart}" == "on" ]; then - update_check.sh - fi -fi - -fn_print_dots "${servername}" -fn_scriptlog "${servername}" -sleep 1 - -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 - -if [ "${tmuxwc}" -eq 1 ]; then - fn_print_info_nl "${servername} is already running" - fn_scriptlog "${servername} is already running" - 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 not supported in tmux versions < 1.6 -if [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -lt "16" ]; then - echo "Console logging disabled: Tmux => 1.6 required" >> "${consolelog}" - echo "http://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" - echo "Currently installed: $(tmux -V)" >> "${consolelog}" -elif [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -eq "18" ]; then - echo "Console logging disabled: Bug in tmux 1.8 breaks logging" >> "${consolelog}" - echo "http://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" - echo "Currently installed: $(tmux -V)" >> "${consolelog}" -else - touch "${consolelog}" - tmux pipe-pane -o -t "${servicename}" "exec cat >> '${consolelog}'" -fi -sleep 1 -tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") -# If the server fails to start -if [ "${tmuxwc}" -eq 0 ]; then - fn_print_fail_nl "Unable to start ${servername}" - fn_scriptlog "Unable to start ${servername}" - sleep 1 - if [ -s "${scriptlogdir}/.${servicename}-tmux-error.tmp" ]; then - fn_print_fail_nl "Unable to start ${servername}: Tmux error:" - fn_scriptlog "Tmux error" - echo "" - echo "Command" - echo "=================================" - echo "tmux new-session -d -s \"${servicename}\" \"${executable} ${parms}\"" | tee -a "${scriptlog}" - echo "" - echo "Error" - echo "=================================" - cat "${scriptlogdir}/.${servicename}-tmux-error.tmp" | tee -a "${scriptlog}" - - # Detected error http://gameservermanagers.com/issues - if [ $(grep -c "Operation not permitted" "${scriptlogdir}/.${servicename}-tmux-error.tmp") ]; then - echo "" - echo "Fix" - echo "=================================" - if [ ! $(grep "tty:" /etc/group|grep "$(whoami)") ]; then - echo "$(whoami) is not part of the tty group." - fn_scriptlog "$(whoami) is not part of the tty group." - group=$(grep tty /etc/group) - echo "" - echo " ${group}" - fn_scriptlog "${group}" - echo "" - echo "Run the following command with root privileges." - echo "" - echo " usermod -G tty $(whoami)" - echo "" - echo "http://gameservermanagers.com/tmux-op-perm" - fn_scriptlog "http://gameservermanagers.com/tmux-op-perm" - else - echo "No known fix currently. Please log an issue." - fn_scriptlog "No known fix currently. Please log an issue." - echo "http://gameservermanagers.com/issues" - fn_scriptlog "http://gameservermanagers.com/issues" - fi - fi - fi -exit 1 -else - fn_print_ok "${servername}" - fn_scriptlog "Started ${servername}" -fi -rm "${scriptlogdir}/.${servicename}-tmux-error.tmp" -echo -en "\n" -} - -if [ "${gamename}" == "Teamspeak 3" ]; then - fn_start_teamspeak3 -else - fn_start_tmux -fi diff --git a/functions/command_stop.sh b/functions/command_stop.sh deleted file mode 100644 index ba8400879..000000000 --- a/functions/command_stop.sh +++ /dev/null @@ -1,217 +0,0 @@ -#!/bin/bash -# LGSM command_stop.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -# Description: Stops the server. - -local modulename="Stopping" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -# Attempts Graceful of source using rcon 'quit' command. -fn_stop_graceful_source(){ - fn_print_dots "Graceful: rcon quit" - fn_scriptlog "Graceful: rcon quit" - # sends quit - tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 - # waits up to 30 seconds giving the server time to shutdown gracefuly - for seconds in {1..30}; do - pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") - if [ "${pid}" == "0" ]; then - fn_print_ok "Graceful: rcon quit: ${seconds}: " - fn_print_ok_eol_nl - fn_scriptlog "Graceful: rcon quit: OK: ${seconds} seconds" - break - fi - sleep 1 - fn_print_dots "Graceful: rcon quit: ${seconds}" - done - if [ "${pid}" != "0" ]; then - fn_print_fail "Graceful: rcon quit" - fn_print_fail_eol_nl - fn_scriptlog "Graceful: rcon quit: FAIL" - fn_stop_tmux - fi - sleep 1 -} - -# Attempts Graceful of goldsource using rcon 'quit' command. -# Goldsource 'quit' command restarts rather than shutsdown -# this function will only wait 3 seconds then force a tmux shutdown. -# preventing the server from coming back online. -fn_stop_graceful_goldsource(){ - fn_print_dots "Graceful: rcon quit" - fn_scriptlog "Graceful: rcon quit" - # sends quit - tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 - # waits 3 seconds as goldsource servers restart with the quit command - for seconds in {1..3}; do - sleep 1 - fn_print_dots "Graceful: rcon quit: ${seconds}" - done - fn_print_ok "Graceful: rcon quit: ${seconds}: " - fn_print_ok_eol_nl - fn_scriptlog "Graceful: rcon quit: OK: ${seconds} seconds" - sleep 1 - fn_stop_tmux -} - -# Attempts Graceful of 7 Days To Die using telnet. -fn_stop_telnet_sdtd(){ - sdtd_telnet_shutdown=$( expect -c ' - proc abort {} { - puts "Timeout or EOF\n" - exit 1 - } - spawn telnet '"${telnetip}"' '"${telnetport}"' - expect { - "password:" { send "'"${telnetpass}"'\r" } - default abort - } - expect { - "session." { send "shutdown\r" } - default abort - } - expect { eof } - puts "Completed.\n" - ') - -} - -fn_stop_graceful_sdtd(){ - fn_print_dots "Graceful: telnet" - fn_scriptlog "Graceful: telnet" - sleep 1 - if [ "${telnetenabled}" == "false" ]; then - fn_print_info_nl "Graceful: telnet: DISABLED: Enable in ${servercfg}" - elif [ "$(command -v expect)" ]||[ "$(which expect >/dev/null 2>&1)" ]; then - # Tries to shutdown with both localhost and server IP. - for telnetip in 127.0.0.1 ${ip}; do - fn_print_dots "Graceful: telnet: ${telnetip}" - fn_scriptlog "Graceful: telnet: ${telnetip}" - sleep 1 - fn_stop_telnet_sdtd - completed=$(echo -en "\n ${sdtd_telnet_shutdown}"|grep "Completed.") - refused=$(echo -en "\n ${sdtd_telnet_shutdown}"|grep "Timeout or EOF") - if [ -n "${refused}" ]; then - fn_print_warn "Graceful: telnet: ${telnetip}: " - fn_print_fail_eol_nl - fn_scriptlog "Graceful: telnet: ${telnetip}: FAIL" - sleep 1 - elif [ -n "${completed}" ]; then - break - fi - done - - # If telnet was successful will use telnet again to check the connection has closed - # This confirms that the tmux session can now be killed. - if [ -n "${completed}" ]; then - for seconds in {1..30}; do - fn_stop_telnet_sdtd - refused=$(echo -en "\n ${sdtd_telnet_shutdown}"|grep "Timeout or EOF") - if [ -n "${refused}" ]; then - fn_print_ok "Graceful: telnet: ${telnetip}: " - fn_print_ok_eol_nl - fn_scriptlog "Graceful: telnet: ${telnetip}: ${seconds} seconds" - break - fi - sleep 1 - fn_print_dots "Graceful: rcon quit: ${seconds}" - done - # If telnet failed will go straight to tmux shutdown. - # If cannot shutdown correctly world save may be lost - else - if [ -n "${refused}" ]; then - fn_print_fail "Graceful: telnet: " - fn_print_fail_eol_nl - fn_scriptlog "Graceful: telnet: ${telnetip}: FAIL" - else - fn_print_fail_nl "Graceful: telnet: Unknown error" - fn_scriptlog "Graceful: telnet: Unknown error" - fi - echo -en "\n" | tee -a "${scriptlog}" - echo -en "Telnet output:" | tee -a "${scriptlog}" - echo -en "\n ${sdtd_telnet_shutdown}" | tee -a "${scriptlog}" - echo -en "\n\n" | tee -a "${scriptlog}" - fi - else - fn_print_dots "Graceful: telnet: " - fn_scriptlog "Graceful: telnet: " - fn_print_fail "Graceful: telnet: expect not installed: " - fn_print_fail_eol_nl - fn_scriptlog "Graceful: telnet: expect not installed: FAIL" - fi - sleep 1 - fn_stop_tmux -} - -fn_stop_graceful_select(){ - if [ "${gamename}" == "7 Days To Die" ]; then - fn_stop_graceful_sdtd - elif [ "${engine}" == "source" ]; then - fn_stop_graceful_source - elif [ "${engine}" == "goldsource" ]; then - fn_stop_graceful_goldsource - else - fn_stop_tmux - fi -} - -fn_stop_teamspeak3(){ - fn_print_dots "${servername}" - fn_scriptlog "${servername}" - sleep 1 - ${filesdir}/ts3server_startscript.sh stop > /dev/null 2>&1 - # Remove lock file - rm -f "${rootdir}/${lockselfname}" - fn_print_ok_nl "${servername}" - fn_scriptlog "Stopped ${servername}" - } - - fn_stop_tmux(){ - fn_print_dots "${servername}" - fn_scriptlog "tmux kill-session: ${servername}" - sleep 1 - # Kill tmux session - tmux kill-session -t "${servicename}" > /dev/null 2>&1 - sleep 0.5 - pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") - if [ "${pid}" == "0" ]; then - # Remove lock file - rm -f "${rootdir}/${lockselfname}" - fn_print_ok_nl "${servername}" - fn_scriptlog "Stopped ${servername}" - else - fn_print_fail_nl "Unable to stop${servername}" - fn_scriptlog "Unable to stop${servername}" - fi -} - -# checks if the server is already stopped before trying to stop. -fn_stop_pre_check(){ - if [ "${gamename}" == "Teamspeak 3" ]; then - info_ts3status.sh - if [ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then - fn_print_ok_nl "${servername} is already stopped" - fn_scriptlog "${servername} is already stopped" - else - fn_stop_teamspeak3 - fi - else - pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") - if [ "${pid}" == "0" ]; then - fn_print_ok_nl "${servername} is already stopped" - fn_scriptlog "${servername} is already stopped" - else - fn_stop_graceful_select - fi - fi -} - -check.sh -info_config.sh -fn_print_dots "${servername}" -fn_scriptlog "${servername}" -sleep 1 -fn_stop_pre_check \ No newline at end of file diff --git a/functions/command_ts3_server_pass.sh b/functions/command_ts3_server_pass.sh deleted file mode 100644 index eba76523a..000000000 --- a/functions/command_ts3_server_pass.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash -# LGSM command_serveradmin_password.sh function -# Author: Daniel Gibbs -# Contributor : UltimateByte -# Website: http://gameservermanagers.com -lgsm_version="080116" - -# Description: Changes TS3 serveradmin password - -local modulename="Change password" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - - -fn_serveradmin_password_prompt(){ -echo "" -echo "${gamename} ServerAdmin Password Change" -echo "============================" -echo "" -echo "Press \"CTRL+b d\" to exit console." -fn_print_infomation_nl "You are about to change the ${gamename} ServerAdmin password." -fn_print_warning_nl "${gamename} will restart during this process." -echo "" -while true; do - read -e -i "y" -p "Continue? [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return;; - * ) echo "Please answer yes or no.";; -esac -done -fn_scriptlog "Initiating ${gamename} ServerAdmin password change" -read -p "Enter new password : " newpassword -} - - -fn_serveradmin_password_set(){ -fn_print_info_nl "Applying new password" -fn_scriptlog "Applying new password" -sleep 1 -# Stop any running server -command_stop.sh -# Start server in "new password mode" -ts3serverpass="1" -fn_print_info_nl "Starting server with new password" -command_start.sh -# Stop server in "new password mode" -command_stop.sh -fn_print_ok_nl "Password applied" -fn_scriptlog "New ServerAdmin password applied" -sleep 1 -} - -# Running functions -check.sh -fn_serveradmin_password_prompt -info_ts3status.sh -if [ "${ts3status}" == "Server is running" ]; then - fn_serveradmin_password_set - command_start.sh -else - fn_serveradmin_password_set -fi \ No newline at end of file diff --git a/functions/command_update_functions.sh b/functions/command_update_functions.sh deleted file mode 100644 index 9c0ac4b90..000000000 --- a/functions/command_update_functions.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -# LGSM update_functions.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="270216" - -# Description: Deletes the functions dir to allow re-downloading of functions from GitHub. - -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -check.sh -fn_print_dots "Updating functions" -fn_scriptlog "Updating functions" -sleep 1 -echo -ne "\n" - -# Removed legecy functions dir -if [ -d "${rootdir}/functions/" ]; then - rm -rfv "${rootdir}/functions/" - exitcode=$? -fi - -if [ -n "${functionsdir}" ]; then - rm -rfv "${functionsdir}/"* - exitcode=$? -else - fn_print_fail "Updating functions" - fn_scriptlog "Failure! Updating functions" -fi - -if [ "${exitcode}" == "0" ]; then - fn_print_ok "Updating functions" - fn_scriptlog "Success! Updating functions" -else - fn_print_fail "Updating functions" - fn_scriptlog "Failure! Updating functions" -fi -echo -ne "\n" \ No newline at end of file diff --git a/functions/command_validate.sh b/functions/command_validate.sh deleted file mode 100644 index f4c46c071..000000000 --- a/functions/command_validate.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -# LGSM command_validate.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -# Description: Runs a server validation. - -local modulename="Validate" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -fn_validation(){ -fn_print_warn_nl "Validating may overwrite some customised files." -echo -en "https://developer.valvesoftware.com/wiki/SteamCMD#Validate" -sleep 5 -echo -en "\n" -fn_print_dots "Checking server files" -sleep 1 -fn_print_ok "Checking server files" -fn_scriptlog "Checking server files" -sleep 1 - -cd "${rootdir}/steamcmd" - -if [ $(command -v unbuffer) ]; then - unbuffer=unbuffer -fi - -if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" +app_update "${appid}" validate +quit| tee -a "${scriptlog}" -else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" validate +quit| tee -a "${scriptlog}" -fi - -fix.sh -fn_scriptlog "Checking complete" -} - -check.sh -tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") -if [ "${tmuxwc}" -eq 1 ]; then - command_stop.sh - fn_validation - command_start.sh -else - fn_validation -fi diff --git a/functions/core_dl.sh b/functions/core_dl.sh deleted file mode 100644 index d6d841637..000000000 --- a/functions/core_dl.sh +++ /dev/null @@ -1,202 +0,0 @@ -#!/bin/bash -# LGSM core_dl.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="050216" - -# Description: Deals with all downloads for LGSM. - -# fileurl: The URL of the file: http://example.com/dl/File.tar.bz2 -# filedir: location the file is to be saved: /home/server/lgsm/tmp -# filename: name of file (this can be different from the url name): file.tar.bz2 -# executecmd: Optional, set to "executecmd" to make file executable using chmod +x -# run: Optional, set to run to execute the file -# force: Optional, force re-download of file even if exists -# md5: Optional, Checks file against an md5 sum -# -# Downloads can be defined in code like so: -# fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" -# fn_fetch_file "http://example.com/file.tar.bz2" "/some/dir" "file.tar.bz2" "executecmd" "run" "force" "10cd7353aa9d758a075c600a6dd193fd" - -fn_dl_md5(){ -# Runs MD5 Check if available -if [ "${md5}" != "0" ]&&[ "${md5}" != "nomd5" ]; then - echo -ne "verifying ${filename} with MD5..." - sleep 1 - local md5sumcmd=$(md5sum "${filedir}/${filename}"|awk '{print $1;}') - if [ "${md5sumcmd}" != "${md5}" ]; then - fn_print_fail_eol_nl - echo "${filename} returned MD5 checksum: ${md5sumcmd}" - echo "expected MD5 checksum: ${md5}" - fn_scriptlog "verifying ${filename} with MD5: FAIL" - fn_scriptlog "${filename} returned MD5 checksum: ${md5sumcmd}" - fn_scriptlog "expected MD5 checksum: ${md5}" - exit 1 - else - fn_print_ok_eol_nl - fn_scriptlog "verifying ${filename} with MD5: OK" - fn_scriptlog "${filename} returned MD5 checksum: ${md5sumcmd}" - fn_scriptlog "expected MD5 checksum: ${md5}" - fi -fi -} - -# Extracts bzip2 or gzip files -# Extracts can be defined in code like so: -# fn_dl_extract "${filedir}" "${filename}" "${extractdir}" -# fn_dl_extract "/home/gameserver/lgsm/tmp" "file.tar.bz2" "/home/gamserver/serverfiles" -fn_dl_extract(){ -filedir="${1}" -filename="${2}" -extractdir="${3}" -# extracts archives -echo -ne "extracting ${filename}..." -fn_scriptlog "extracting download" -mime=$(file -b --mime-type "${filedir}/${filename}") - -if [ "${mime}" == "application/gzip" ]; then - tarcmd=$(tar -zxf "${filedir}/${filename}" -C "${extractdir}") -elif [ "${mime}" == "application/x-bzip2" ]; then - tarcmd=$(tar -jxf "${filedir}/${filename}" -C "${extractdir}") -fi -local exitcode=$? -if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - fn_scriptlog "extracting download: FAIL" - echo "${tarcmd}" | tee -a "${scriptlog}" - exit ${exitcode} -else - fn_print_ok_eol_nl -fi -} - -# Trap to remove file download if canceled before completed -fn_fetch_trap() { - echo "" - echo -ne "downloading ${filename}: " - fn_print_canceled_eol_nl - fn_scriptlog "downloading ${filename}: CANCELED" - sleep 1 - rm -f "${filedir}/${filename}" | tee -a "${scriptlog}" - echo -ne "downloading ${filename}: " - fn_print_removed_eol_nl - fn_scriptlog "downloading ${filename}: REMOVED" - exit -} - -fn_fetch_file(){ -fileurl="${1}" -filedir="${2}" -filename="${3}" -executecmd="${4:-0}" -run="${5:-0}" -force="${6:-0}" -md5="${7:-0}" - -# If the file is missing, then download -if [ ! -f "${filedir}/${filename}" ]; then - if [ ! -d "${filedir}" ]; then - mkdir -p "${filedir}" - fi - - # Check curl exists and use available path - curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" - for curlcmd in ${curlpaths} - do - if [ -x "${curlcmd}" ]; then - break - fi - done - # If curl exists download file - if [ "$(basename ${curlcmd})" == "curl" ]; then - # trap to remove part downloaded files - trap fn_fetch_trap INT - # if larger file shows progress bar - if [ ${filename##*.} == "bz2" ]; then - echo -ne "downloading ${filename}..." - sleep 1 - curlcmd=$(${curlcmd} --progress-bar --fail -o "${filedir}/${filename}" "${fileurl}") - echo -ne "downloading ${filename}..." - else - echo -ne " fetching ${filename}...\c" - curlcmd=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${fileurl}" 2>&1) - fi - local exitcode=$? - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - if [ -f "${scriptlog}" ]; then - fn_scriptlog "downloading ${filename}: FAIL" - fi - echo "${curlcmd}" | tee -a "${scriptlog}" - echo -e "${fileurl}\n" | tee -a "${scriptlog}" - exit ${exitcode} - else - fn_print_ok_eol_nl - if [ -f "${scriptlog}" ]; then - fn_scriptlog "downloading ${filename}: OK" - fi - fi - # remove trap - trap - INT - else - fn_print_fail_eol_nl - echo "Curl is not installed!" - echo -e "" - exit 1 - fi - # make file executecmd if executecmd is set - if [ "${executecmd}" == "executecmd" ]; then - chmod +x "${filedir}/${filename}" - fi -fi - -if [ -f "${filedir}/${filename}" ]; then - fn_dl_md5 - # run file if run is set - if [ "${run}" == "run" ]; then - source "${filedir}/${filename}" - fi -fi -} - - - -# fileurl: The directory the file is located in teh GitHub repo -# filedir: name of file -# filename: location file to be saved -# executecmd: set to "executecmd" to make file executecmd -# run: Optional, set to run to execute the file -# force: force download of file even if exists -# md5: Checks fail against an md5 sum - - -# Fetches files from the github repo -fn_fetch_file_github(){ -github_file_url_dir="${1}" -github_file_url_name="${2}" -githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" -fileurl="${githuburl}" -filedir="${3}" -filename="${github_file_url_name}" -executecmd="${4:-0}" -run="${5:-0}" -force="${6:-0}" -md5="${7:-0}" -fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" -} - - -# Fetches functions -fn_fetch_function(){ -github_file_url_dir="lgsm/functions" # github dir containing the file -github_file_url_name="${functionfile}" # name of the github file -githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" -fileurl="${githuburl}" -filedir="${functionsdir}" -filename="${github_file_url_name}" -executecmd="executecmd" -run="run" -force="noforce" -md5="nomd5" -fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" -} \ No newline at end of file diff --git a/functions/core_functions.sh b/functions/core_functions.sh deleted file mode 100644 index 8f59a57fb..000000000 --- a/functions/core_functions.sh +++ /dev/null @@ -1,454 +0,0 @@ -#!/bin/bash -# LGSM core_functions.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="270216" - -# Description: Defines all functions to allow download and execution of functions using fn_fetch_function. -# This function is called first before any other function. Without this file other functions would not load. - -# Code/functions for legacy servers - -fn_functions(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fn_getopt(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -# fn_fetch_core_dl also placed here to allow legecy servers to still download core functions -if [ -z "${lgsmdir}" ]; then - lgsmdir="${rootdir}/lgsm" - functionsdir="${lgsmdir}/functions" -fi - -fn_fetch_core_dl(){ -github_file_url_dir="lgsm/functions" -github_file_url_name="${functionfile}" -filedir="${functionsdir}" -filename="${github_file_url_name}" -githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" -# If the file is missing, then download -if [ ! -f "${filedir}/${filename}" ]; then - if [ ! -d "${filedir}" ]; then - mkdir -p "${filedir}" - fi - echo -e " fetching ${filename}...\c" - # Check curl exists and use available path - curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" - for curlcmd in ${curlpaths} - do - if [ -x "${curlcmd}" ]; then - break - fi - done - # If curl exists download file - if [ "$(basename ${curlcmd})" == "curl" ]; then - curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curlfetch}" - echo -e "${githuburl}\n" - exit 1 - else - echo -e "\e[0;32mOK\e[0m" - fi - else - echo -e "\e[0;31mFAIL\e[0m\n" - echo "Curl is not installed!" - echo -e "" - exit 1 - fi - chmod +x "${filedir}/${filename}" -fi -source "${filedir}/${filename}" -} - - -# Core - -core_dl.sh(){ -# Functions are defined in core_functions.sh. -functionfile="${FUNCNAME}" -fn_fetch_core_dl -} - -core_getopt.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_core_dl -} - -core_messages.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_core_dl -} - -core_dl.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_core_dl -} - -# Command - -command_console.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_debug.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_details.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_email_test.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_backup.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_monitor.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_start.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_stop.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_validate.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_install.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_fastdl.sh(){ -functionfile="${FUNCNAME}" -fn_runfunction -} - -command_ts3_server_pass.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fn_restart(){ -local modulename="Restarting" -info_config.sh -if [ -d "${scriptlogdir}" ]; then - fn_scriptlog "${servername}" -fi -command_stop.sh -command_start.sh -} - - -# Checks - -check.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_config.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_deps.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_ip.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_logs.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_root.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_steamcmd.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_system_dir.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_tmux.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# Compress - -compress_unreal2_maps.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -compress_ut99_maps.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# Dev - -command_dev_debug.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_dev_detect_deps.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# Fix - -fix.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_arma3.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_csgo.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_dst.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_ins.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_steamcmd.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_glibc.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_ro.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_kf.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_ut2k4.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# Info - -info_config.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -info_distro.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -info_glibc.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -info_ts3status.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# Email - -email.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -# Logs - -logs.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# Monitor - -monitor_gsquery.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -# Update - -update_check.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_update_functions.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -update_dl.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fn_update_functions.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# -## Installer functions -# - -fn_autoinstall(){ -autoinstall=1 -command_install.sh -} - -install_complete.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_config.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_gsquery.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_gslt.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_header.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_logs.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_retry.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_server_dir.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} -install_server_files.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_steamcmd.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_ts3.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_ts3db.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_ut2k4.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_dl_ut2k4.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_ut2k4_key.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_ut99.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -# Calls on-screen messages -core_messages.sh - -#Calls file downloader -core_dl.sh diff --git a/functions/core_getopt.sh b/functions/core_getopt.sh deleted file mode 100644 index e035f0c3c..000000000 --- a/functions/core_getopt.sh +++ /dev/null @@ -1,441 +0,0 @@ -#!/bin/bash -# LGSM core_getopt.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="070116" - -# Description: getopt arguments. - -fn_getopt_generic(){ -case "$getopt" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - fn_restart;; - u|update) - update_check.sh;; - fu|force-update|update-restart) - forceupdate=1; - update_check.sh;; - uf|update-functions) - command_update_functions.sh;; - v|validate) - command_validate.sh;; - m|monitor) - command_monitor.sh;; - et|email-test) - command_email_test.sh;; - d|details) - command_details.sh;; - b|backup) - command_backup.sh;; - c|console) - command_console.sh;; - d|debug) - command_debug.sh;; - dev|dev-debug) - command_dev_debug.sh;; - i|install) - command_install.sh;; - ai|auto-install) - fn_autoinstall;; - dd|depsdetect) - command_dev_detect_deps.sh;; - *) - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "http://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "\e[93mCommands\e[0m" - { - echo -e "\e[34mstart\t\e[0mStart the server." - echo -e "\e[34mstop\t\e[0mStop the server." - echo -e "\e[34mrestart\t\e[0mRestart the server." - echo -e "\e[34mupdate\t\e[0mChecks and applies updates from SteamCMD." - echo -e "\e[34mforce-update\t\e[0mBypasses the check and applies updates from SteamCMD." - echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." - echo -e "\e[34mvalidate\t\e[0mValidate server files with SteamCMD." - echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." - echo -e "\e[34memail-test\t\e[0mSends test monitor email." - echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server." - echo -e "\e[34mbackup\t\e[0mCreate archive of the server." - echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." - echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." - echo -e "\e[34minstall\t\e[0mInstall the server." - echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." - } | column -s $'\t' -t - esac -exit -} - -fn_getopt_teamspeak3(){ -case "$getopt" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - fn_restart;; - u|update) - update_check.sh;; - uf|update-functions) - command_update_functions.sh;; - m|monitor) - command_monitor.sh;; - et|email-test) - command_email_test.sh;; - d|details) - command_details.sh;; - b|backup) - command_backup.sh;; - pw|change-password) - command_ts3_server_pass.sh;; - dev|dev-debug) - command_dev_debug.sh;; - i|install) - command_install.sh;; - ai|auto-install) - fn_autoinstall;; - dd|depsdetect) - command_dev_detect_deps.sh;; - *) - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "http://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "\e[93mCommands\e[0m" - { - echo -e "\e[34mstart\t\e[0mStart the server." - echo -e "\e[34mstop\t\e[0mStop the server." - echo -e "\e[34mrestart\t\e[0mRestart the server." - echo -e "\e[34mupdate\t\e[0mChecks and applies updates from teamspeak.com." - echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." - echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." - echo -e "\e[34memail-test\t\e[0mSends test monitor email." - echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server." - echo -e "\e[34mchange-password\t\e[0mChanges TS3 serveradmin password." - echo -e "\e[34mbackup\t\e[0mCreate archive of the server." - echo -e "\e[34minstall\t\e[0mInstall the server." - echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." - } | column -s $'\t' -t - esac -exit -} - -fn_getopt_mumble(){ -case "$getopt" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - fn_restart;; - uf|update-functions) - command_update_functions.sh;; - m|monitor) - command_monitor.sh;; - et|email-test) - command_email_test.sh;; - b|backup) - command_backup.sh;; - dev|dev-debug) - command_dev_debug.sh;; - console) - command_console.sh;; - d|debug) - command_debug.sh;; - dd|depsdetect) - command_dev_detect_deps.sh;; - *) - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "http://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "\e[93mCommands\e[0m" - { - echo -e "\e[34mstart\t\e[0mStart the server." - echo -e "\e[34mstop\t\e[0mStop the server." - echo -e "\e[34mrestart\t\e[0mRestart the server." - echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." - echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." - echo -e "\e[34memail-test\t\e[0mSends test monitor email." - echo -e "\e[34mbackup\t\e[0mCreate archive of the server." - echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." - echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." - } | column -s $'\t' -t - esac -exit -} - -fn_getopt_gmodserver(){ -case "$getopt" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - fn_restart;; - u|update) - update_check.sh;; - fu|force-update|update-restart) - forceupdate=1; - update_check.sh;; - uf|update-functions) - command_update_functions.sh;; - v|validate) - command_validate.sh;; - m|monitor) - command_monitor.sh;; - et|email-test) - command_email_test.sh;; - d|details) - command_details.sh;; - b|backup) - command_backup.sh;; - c|console) - command_console.sh;; - d|debug) - command_debug.sh;; - dev|dev-debug) - command_dev_debug.sh;; - i|install) - command_install.sh;; - ai|auto-install) - fn_autoinstall;; - dd|depsdetect) - command_dev_detect_deps.sh;; - fd|fastdl) - command_fastdl.sh;; - *) - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "http://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "\e[93mCommands\e[0m" - { - echo -e "\e[34mstart\t\e[0mStart the server." - echo -e "\e[34mstop\t\e[0mStop the server." - echo -e "\e[34mrestart\t\e[0mRestart the server." - echo -e "\e[34mupdate\t\e[0mChecks and applies updates from SteamCMD." - echo -e "\e[34mforce-update\t\e[0mBypasses the check and applies updates from SteamCMD." - echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." - echo -e "\e[34mvalidate\t\e[0mValidate server files with SteamCMD." - echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." - echo -e "\e[34memail-test\t\e[0mSends test monitor email." - echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server." - echo -e "\e[34mbackup\t\e[0mCreate archive of the server." - echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." - echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." - echo -e "\e[34minstall\t\e[0mInstall the server." - echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." - echo -e "\e[34mfastdl\t\e[0mGenerates or update a FastDL folder for your server." - } | column -s $'\t' -t - esac -exit -} - -fn_getopt_unreal(){ -case "$getopt" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - fn_restart;; - uf|update-functions) - command_update_functions.sh;; - m|monitor) - command_monitor.sh;; - et|email-test) - command_email_test.sh;; - d|details) - command_details.sh;; - b|backup) - command_backup.sh;; - c|console) - command_console.sh;; - d|debug) - command_debug.sh;; - dev|dev-debug) - command_dev_debug.sh;; - i|install) - command_install.sh;; - ai|auto-install) - fn_autoinstall;; - mc|map-compressor) - compress_ut99_maps.sh;; - dd|depsdetect) - command_dev_detect_deps.sh;; - *) - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "http://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "\e[93mCommands\e[0m" - { - echo -e "\e[34mstart\t\e[0mStart the server." - echo -e "\e[34mstop\t\e[0mStop the server." - echo -e "\e[34mrestart\t\e[0mRestart the server." - echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." - echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." - echo -e "\e[34memail-test\t\e[0mSends test monitor email." - echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server." - echo -e "\e[34mbackup\t\e[0mCreate archive of the server." - echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." - echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." - echo -e "\e[34minstall\t\e[0mInstall the server." - echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." - echo -e "\e[34mmap-compressor\t\e[0mCompresses all ${gamename} server maps." - } | column -s $'\t' -t - esac -exit -} - - -fn_getopt_unreal2(){ -case "$getopt" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - fn_restart;; - u|update) - update_check.sh;; - fu|force-update|update-restart) - forceupdate=1; - update_check.sh;; - uf|update-functions) - command_update_functions.sh;; - v|validate) - command_validate.sh;; - m|monitor) - command_monitor.sh;; - et|email-test) - command_email_test.sh;; - d|details) - command_details.sh;; - b|backup) - command_backup.sh;; - c|console) - command_console.sh;; - d|debug) - command_debug.sh;; - dev|dev-debug) - command_dev_debug.sh;; - i|install) - command_install.sh;; - ai|auto-install) - fn_autoinstall;; - dd|depsdetect) - command_dev_detect_deps.sh;; - mc|map-compressor) - compress_unreal2_maps.sh;; - *) - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "http://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "\e[93mCommands\e[0m" - { - echo -e "\e[34mstart\t\e[0mStart the server." - echo -e "\e[34mstop\t\e[0mStop the server." - echo -e "\e[34mrestart\t\e[0mRestart the server." - echo -e "\e[34mupdate\t\e[0mChecks and applies updates from SteamCMD." - echo -e "\e[34mforce-update\t\e[0mBypasses the check and applies updates from SteamCMD." - echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." - echo -e "\e[34mvalidate\t\e[0mValidate server files with SteamCMD." - echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." - echo -e "\e[34memail-test\t\e[0mSends test monitor email." - echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server." - echo -e "\e[34mbackup\t\e[0mCreate archive of the server." - echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." - echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." - echo -e "\e[34minstall\t\e[0mInstall the server." - echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." - echo -e "\e[34mmap-compressor\t\e[0mCompresses all ${gamename} server maps." - } | column -s $'\t' -t - esac -exit -} - - -fn_getopt_ut2k4(){ -case "$getopt" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - fn_restart;; - uf|update-functions) - command_update_functions.sh;; - m|monitor) - command_monitor.sh;; - et|email-test) - command_email_test.sh;; - d|details) - command_details.sh;; - b|backup) - command_backup.sh;; - c|console) - command_console.sh;; - d|debug) - command_debug.sh;; - dev|dev-debug) - command_dev_debug.sh;; - i|install) - command_install.sh;; - ai|auto-install) - fn_autoinstall;; - sck|server-cd-key) - install_ut2k4_key.sh;; - mc|map-compressor) - compress_unreal2_maps.sh;; - dd|depsdetect) - command_dev_detect_deps.sh;; - *) - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "http://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "\e[93mCommands\e[0m" - { - echo -e "\e[34mstart\t\e[0mStart the server." - echo -e "\e[34mstop\t\e[0mStop the server." - echo -e "\e[34mrestart\t\e[0mRestart the server." - echo -e "\e[34mupdate-functions\t\e[0mRemoves all functions so latest can be downloaded." - echo -e "\e[34mmonitor\t\e[0mChecks that the server is running." - echo -e "\e[34memail-test\t\e[0mSends test monitor email." - echo -e "\e[34mdetails\t\e[0mDisplays useful infomation about the server." - echo -e "\e[34mbackup\t\e[0mCreate archive of the server." - echo -e "\e[34mconsole\t\e[0mConsole allows you to access the live view of a server." - echo -e "\e[34mdebug\t\e[0mSee the output of the server directly to your terminal." - echo -e "\e[34minstall\t\e[0mInstall the server." - echo -e "\e[34mauto-install\t\e[0mInstall the server, without prompts." - echo -e "\e[34mserver-cd-key\t\e[0mAdd your server cd key" - echo -e "\e[34mmap-compressor\t\e[0mCompresses all ${gamename} server maps." - } | column -s $'\t' -t - esac -exit -} - -if [ "${gamename}" == "Mumble" ]; then - fn_getopt_mumble -elif [ "${gamename}" == "Teamspeak 3" ]; then - fn_getopt_teamspeak3 -elif [ "${gamename}" == "Garry's Mod" ]; then - fn_getopt_gmodserver -elif [ "${engine}" == "unreal2" ]; then - if [ "${gamename}" == "Unreal Tournament 2004" ]; then - fn_getopt_ut2k4 - else - fn_getopt_unreal2 - fi -elif [ "${engine}" == "unreal" ]; then - fn_getopt_unreal -else - fn_getopt_generic -fi diff --git a/functions/core_messages.sh b/functions/core_messages.sh deleted file mode 100644 index 54b245193..000000000 --- a/functions/core_messages.sh +++ /dev/null @@ -1,204 +0,0 @@ -#!/bin/bash -# LGSM fn_messages function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="380216" - -# Description: Defines on-screen messages such as [ OK ] and how script logs look. - -# nl: new line: message is following by a new line -# eol: end of line: message is placed at the end of the current line - -# Date, servicename & module details displayed in log files. -# e.g Feb 28 14:56:58 ut99-server: Monitor: -fn_scriptlog(){ - if [ -n "${modulename}" ]; then - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${modulename}: ${1}" >> "${scriptlog}" - else - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${1}" >> "${scriptlog}" - fi -} - -# [ FAIL ] -fn_print_fail(){ - if [ -n "${modulename}" ]; then - echo -en "\r\033[K[\e[0;31m FAIL \e[0m] ${modulename} ${servicename}: $@" - else - echo -en "\r\033[K[\e[0;31m FAIL \e[0m] $@" - fi -} - -fn_print_fail_nl(){ - if [ -n "${modulename}" ]; then - echo -en "\r\033[K[\e[0;31m FAIL \e[0m] ${modulename} ${servicename}: $@" - else - echo -en "\r\033[K[\e[0;31m FAIL \e[0m] $@" - fi - sleep 1 - echo -en "\n" -} - -# [ OK ] -fn_print_ok(){ - if [ -n "${modulename}" ]; then - echo -en "\r\033[K[\e[0;32m OK \e[0m] ${modulename} ${servicename}: $@" - else - echo -en "\r\033[K[\e[0;32m OK \e[0m] $@" - fi -} - -fn_print_ok_nl(){ - if [ -n "${modulename}" ]; then - echo -en "\r\033[K[\e[0;32m OK \e[0m] ${modulename} ${servicename}: $@" - else - echo -en "\r\033[K[\e[0;32m OK \e[0m] $@" - fi - sleep 1 - echo -en "\n" -} - -# [ INFO ] -fn_print_info(){ - if [ -n "${modulename}" ]; then - echo -en "\r\033[K[\e[0;36m INFO \e[0m] ${modulename} ${servicename}: $@" - else - echo -en "\r\033[K[\e[0;36m INFO \e[0m] $@" - fi -} - -fn_print_info_nl(){ - if [ -n "${modulename}" ]; then - echo -en "\r\033[K[\e[0;36m INFO \e[0m] ${modulename} ${servicename}: $@" - else - echo -en "\r\033[K[\e[0;36m INFO \e[0m] $@" - fi - sleep 1 - echo -en "\n" -} - -# [ WARN ] -fn_print_warn(){ - if [ -n "${modulename}" ]; then - echo -en "\r\033[K[\e[1;33m WARN \e[0m] ${modulename} ${servicename}: $@" - else - echo -en "\r\033[K[\e[1;33m WARN \e[0m] $@" - fi -} - -fn_print_warn_nl(){ - if [ -n "${modulename}" ]; then - echo -en "\r\033[K[\e[1;33m WARN \e[0m] ${modulename} ${servicename}: $@" - else - echo -en "\r\033[K[\e[1;33m WARN \e[0m] $@" - fi - sleep 1 - echo -en "\n" -} - -# [ .... ] -fn_print_dots(){ - if [ -n "${modulename}" ]; then - echo -en "\r\033[K[ .... ] ${modulename} ${servicename}: $@" - else - echo -en "\r\033[K[ .... ] $@" - fi -} - -# Complete! -fn_print_complete(){ - echo -en "\e[0;32mComplete!\e[0m $@" -} - -fn_print_complete_nl(){ - echo -e "\e[0;32mComplete!\e[0m $@" -} - -# Warning! -fn_print_warning(){ - echo -en "\e[0;33mWarning!\e[0m $@" -} - -fn_print_warning_nl(){ - echo -e "\e[0;33mWarning!\e[0m $@" -} - -# Failure! -fn_print_failure(){ - echo -en "\e[0;31mFailure!\e[0m $@" -} - -fn_print_failure_nl(){ - echo -e "\e[0;31mFailure!\e[0m $@" -} - -# Error! -fn_print_error(){ - echo -en "\e[0;31mError!\e[0m $@" -} - -fn_print_error_nl(){ - echo -e "\e[0;31mError!\e[0m $@" -} - -# Infomation! -fn_print_infomation(){ - echo -en "\e[0;36mInfomation!\e[0m $@" -} - -fn_print_infomation_nl(){ - echo -e "\e[0;36mInfomation!\e[0m $@" -} - -# FAIL for end of line -fn_print_ok_eol(){ - echo -en "\e[0;32mOK\e[0m" -} - -fn_print_ok_eol_nl(){ - echo -e "\e[0;32mOK\e[0m" -} - -# FAIL for end of line -fn_print_fail_eol(){ - echo -en "\e[0;31mFAIL\e[0m" -} - -fn_print_fail_eol_nl(){ - echo -e "\e[0;31mFAIL\e[0m" -} - -# QUERYING for end of line -fn_print_querying_eol(){ - echo -en "\e[0;36mQUERYING\e[0m" -} - -fn_print_querying_eol_nl(){ - echo -e "\e[0;36mQUERYING\e[0m" -} - -# CHECKING for end of line -fn_print_checking_eol(){ - echo -en "\e[0;36mCHECKING\e[0m" -} - -fn_print_checking_eol_nl(){ - echo -e "\e[0;36mCHECKING\e[0m" -} - -# CANCELED for end of line -fn_print_canceled_eol(){ - echo -en "\e[0;33mCANCELED\e[0m" -} - -fn_print_canceled_eol_nl(){ - echo -e "\e[0;33mCANCELED\e[0m" -} - -# REMOVED for end of line -fn_print_removed_eol(){ - echo -en "\e[0;31mREMOVED\e[0m" -} - -fn_print_removed_eol_nl(){ - echo -e "\e[0;31mREMOVED\e[0m" -} \ No newline at end of file diff --git a/functions/email.sh b/functions/email.sh deleted file mode 100644 index 174ed3ff6..000000000 --- a/functions/email.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/bash -# LGSM email.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="020216" - -# Description: Sends email notification if monitor picks up a failure. - -local modulename="Email" -fn_print_dots "Sending notification to ${email}" -info_distro.sh -info_config.sh -check_ip.sh -fn_parms -{ - echo -e "========================================\n${servicename} details\n========================================" - echo -e "Service name: ${servicename}" - echo -e "Server name: ${servername}" - echo -e "Game name: ${gamename}" - echo -e "Server IP: ${ip}:${port}" - echo -e "Failure reason: ${failurereason}" - echo -e "Action Taken: ${actiontaken}\n" - echo -e "" - echo -e "========================================\nDistro Details\n========================================" - echo -e "Date: $(date)" - echo -e "Distro: ${os}" - echo -e "Arch: ${arch}" - echo -e "Kernel: ${kernel}" - echo -e "Hostname: $HOSTNAME" - echo -e "tmux: ${tmuxv}" - echo -e "GLIBC: ${glibcv}" - echo -e "" - echo -e "========================================\nPerformance\n========================================" - echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m" - echo -e "Avg Load: ${load}" - echo -e "" - echo -e "Mem: total used free" - echo -e "Physical: ${physmemtotal} ${physmemused} ${physmemfree}" - echo -e "Swap: ${swaptotal}${swapused} ${swapfree}" - echo -e "" - echo -e "========================================\nStorage\n========================================" - echo -e "\e[34mFilesystem:\t\e[0m${filesystem}" - echo -e "\e[34mTotal:\t\e[0m${totalspace}" - echo -e "\e[34mUsed:\t\e[0m${usedspace}" - echo -e "\e[34mAvailable:\t\e[0m${availspace}" - echo -e "\e[34mServerfiles:\t\e[0m${filesdirdu}" - if [ -d "${backupdir}" ]; then - echo -e "\e[34mBackups:\t\e[0m${backupdirdu}" - fi - echo -e "" - echo -e "========================================\nCommand-line Parameters\n========================================" - echo -e "${executable} ${parms}" - echo -e "" - echo -e "========================================\nLogs\n========================================" -}| sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee "${scriptlogdir}/${servicename}-email.log" > /dev/null 2>&1 -echo -e "\n\n Script log\n===================" >> "${emaillog}" -tail -25 "${scriptlog}" >> "${emaillog}" -if [ -n "${consolelog}" ]; then - echo -e "\n\n Console log\n====================" >> "${emaillog}" - tail -25 "${consolelog}" | awk '{ sub("\r$", ""); print }' >> "${emaillog}" -fi -if [ -n "${gamelogdir}" ]; then - echo -e "\n\n Server log\n====================" >> "${emaillog}" - tail "${gamelogdir}"/* | grep -v "==>" | sed '/^$/d' | tail -25 >> "${emaillog}" -fi -mail -s "${subject}" ${email} < "${emaillog}" -fn_print_ok_nl "Sending notification to ${email}" -fn_scriptlog "Sent notification to ${email}" \ No newline at end of file diff --git a/functions/fix.sh b/functions/fix.sh deleted file mode 100644 index e4723e649..000000000 --- a/functions/fix.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash -# LGSM fix.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="010316" - -# Description: Overall function for managing fixes. -# Runs functions that will fix an issue. - -# Messages that are displayed for some fixes -fn_fix_msg_start(){ - fn_print_dots "Applying ${fixname} fix: ${gamename}" - sleep 1 - fn_print_info "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Applying ${fixname} fix: ${gamename}" - sleep 1 -} - -fn_fix_msg_end(){ - if [ $? -ne 0 ]; then - fn_print_fail_nl "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Failure! Applying ${fixname} fix: ${gamename}" - else - fn_print_ok_nl "Applying ${fixname} fix: ${gamename}" - fn_scriptlog "Complete! Applying ${fixname} fix: ${gamename}" - fi -} - - -# Fixes that are run on start -if [ "${function_selfname}" != "command_install.sh" ]; then - if [ -n "${appid}" ]; then - fix_steamcmd.sh - fi - - if [ "${gamename}" == "Counter Strike: Global Offensive" ]; then - fix_csgo.sh - elif [ "${gamename}" == "Don't Starve Together" ]; then - fix_dst.sh - elif [ "${gamename}" == "Insurgency" ]; then - fix_ins.sh - elif [ "${gamename}" == "ARMA 3" ]; then - fix_arma3.sh - fi -fi - -# Fixes that are run on install only. -if [ "${function_selfname}" == "command_install.sh" ]; then - fix_glibc.sh - if [ "${gamename}" == "Killing Floor" ]; then - echo "" - echo "Applying ${gamename} Server Fixes" - echo "=================================" - sleep 1 - fix_kf.sh - elif [ "${gamename}" == "Red Orchestra: Ostfront 41-45" ]; then - echo "" - echo "Applying ${gamename} Server Fixes" - echo "=================================" - sleep 1 - fix_ro.sh - elif [ "${gamename}" == "Unreal Tournament 2004" ]; then - echo "" - echo "Applying ${gamename} Server Fixes" - echo "=================================" - sleep 1 - fix_ut2k4.sh - elif [ "${gamename}" == "Unreal Tournament 99" ]; then - echo "" - echo "Applying ${gamename} Server Fixes" - echo "=================================" - sleep 1 - fix_ut99.sh - fi -fi diff --git a/functions/fix_arma3.sh b/functions/fix_arma3.sh deleted file mode 100644 index ffc607ed6..000000000 --- a/functions/fix_arma3.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -# LGSM fix_arma3.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="301215" - -# Fixes: server not always creating steam_appid.txt file. -if [ ! -d "${rootdir}/.local/share/Arma\ 3" ]; then - fixname="20150 Segmentation fault (core dumped)" - fn_fix_msg_start - mkdir -p "${rootdir}/.local/share/Arma\ 3" - fn_fix_msg_end -fi \ No newline at end of file diff --git a/functions/fix_csgo.sh b/functions/fix_csgo.sh deleted file mode 100644 index f968640ce..000000000 --- a/functions/fix_csgo.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -# LGSM fix_csgo.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="010316" - -# Description: Resolves various issues with csgo. - -# Fixes: server not always creating steam_appid.txt file. -if [ ! -f "${filesdir}/steam_appid.txt" ]; then - fixname="730 steam_appid.txt" - fn_fix_msg_start - echo -n "730" >> "${filesdir}/steam_appid.txt" - fn_fix_msg_end -fi - -# Fixes: Error parsing BotProfile.db - unknown attribute 'Rank'". -if ! grep -q "//Rank" "${systemdir}/botprofile.db" > /dev/null 2>&1; then - fixname="botprofile.db" - fn_fix_msg_start - sed -i 's/\tRank/\t\/\/Rank/g' "${systemdir}/botprofile.db" > /dev/null 2>&1 - fn_fix_msg_end -fi - -# Fixes: Unknown command "cl_bobamt_vert". -if ! grep -q "//exec default" "${servercfgdir}/valve.rc" > /dev/null 2>&1 || ! grep -q "//exec joystick" "${servercfgdir}/valve.rc" > /dev/null 2>&1; then - fixname="valve.rc" - fn_fix_msg_start - sed -i 's/exec default.cfg/\/\/exec default.cfg/g' "${servercfgdir}/valve.rc" > /dev/null 2>&1 - sed -i 's/exec joystick.cfg/\/\/exec joystick.cfg/g' "${servercfgdir}/valve.rc" > /dev/null 2>&1 - fn_fix_msg_end -fi - -# Fixes: workshop map issue. -# http://forums.steampowered.com/forums/showthread.php?t=3170366. -if [ -f "${systemdir}/subscribed_collection_ids.txt" ]||[ -f "${systemdir}/subscribed_file_ids.txt" ]||[ -f "${systemdir}/ugc_collection_cache.txt" ]; then - fixname="workshop map" - fn_fix_msg_start - rm -f "${systemdir}/subscribed_collection_ids.txt" - rm -f "${systemdir}/subscribed_file_ids.txt" - rm -f "${systemdir}/ugc_collection_cache.txt" - fn_fix_msg_end -fi \ No newline at end of file diff --git a/functions/fix_dst.sh b/functions/fix_dst.sh deleted file mode 100644 index 5dadf4b78..000000000 --- a/functions/fix_dst.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# LGSM fix_dst.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="010316" - -# Description: Resolves various issues with Dont Starve together. - -# Fixes: ./dontstarve_dedicated_server_nullrenderer: ./lib32/libcurl-gnutls.so.4: no version information available (required by ./dontstarve_dedicated_server_nullrenderer) -# Issue only occures on CentOS as libcurl-gnutls.so.4 is called libcurl.so.4 on CentOS. -if [ -f "/etc/redhat-release" ] && [ ! -f "${filesdir}/bin/lib32/libcurl-gnutls.so.4" ]; then - fixname="libcurl-gnutls.so.4 missing" - fn_fix_msg_start - ln -s "/usr/lib/libcurl.so.4" "${filesdir}/bin/lib32/libcurl-gnutls.so.4" - fn_fix_msg_end -fi \ No newline at end of file diff --git a/functions/fix_glibc.sh b/functions/fix_glibc.sh deleted file mode 100644 index c46a1b5a0..000000000 --- a/functions/fix_glibc.sh +++ /dev/null @@ -1,144 +0,0 @@ -#!/bin/bash -# LGSM fix_glibc.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="020116" - -fn_glibcfixmsg(){ -echo "" -echo "GLIBC Fix required" -echo "============================" -sleep 1 -fn_print_warning_nl "${gamename} requires GLIBC_${glibcversion} or above" -sleep 1 -echo "" -echo -e "Currently installed:\e[0;31m GLIBC_$(ldd --version |grep ldd|awk '{print $NF}')\e[0;39m" -echo -e "Required: =>\e[0;32m GLIBC_${glibcversion}\e[0;39m" -echo "" -sleep 1 -echo "The installer will now detect and download the required files to allow ${gamename} server to run on a distro with less than GLIBC_${glibcversion}." -echo "note: This will NOT upgrade GLIBC on your system." -echo "" -echo "http://gameservermanagers.com/glibcfix" -sleep 1 -echo "" -echo -en "loading required files.\r" -sleep 1 -echo -en "loading required files..\r" -sleep 1 -echo -en "loading required files...\r" -sleep 1 -echo -en "\n" -} - -# if ldd command not detected -if [ -z $(command -v ldd) ]; then - echo "" - fn_print_failure_nl "GLIBC is not detected" - sleep 1 - echo "Install GLIBC and retry installation." - sleep 1 - echo "" - while true; do - read -e -i "y" -p "Continue install? [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; exit;; - * ) echo "Please answer yes or no.";; - esac - done -# if Glibc less than 1.15 -elif [ "$(ldd --version | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" -lt 215 ]; then - # Blade Symphony - if [ "${gamename}" == "Blade Symphony" ]; then - glibcversion="2.15" - fn_glibcfixmsg - cp -v "${rootdir}/steamcmd/linux32/libstdc++.so.6" "${filesdir}/libstdc++.so.6" - # Dont Starve Together - elif [ "${gamename}" == "Don't Starve Together" ]; then - glibcversion="2.15" - fn_glibcfixmsg - cd "${filesdir}/bin/lib32/" - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/DontStarveTogether/dependencies/libc.so.6 - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/DontStarveTogether/dependencies/libpthread.so.0 - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/DontStarveTogether/dependencies/librt.so.1 - # Double Action: Boogaloo - elif [ "${gamename}" == "Double Action: Boogaloo" ]; then - glibcversion="2.15" - fn_glibcfixmsg - cd "${filesdir}" - wget -nv -N https://github.com/dgibbs64/linuxgsm/blob/master/DoubleActionBoogaloo/dependencies/libm.so.6 - # Fistful of Frags - elif [ "${gamename}" == "Fistful of Frags" ]; then - glibcversion="2.15" - fn_glibcfixmsg - cd "${filesdir}" - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/FistfulOfFrags/dependencies/libm.so.6 - # Garry's Mod - elif [ "${gamename}" == "Garry's Mod" ]; then - glibcversion="2.15" - fn_glibcfixmsg - cd "${filesdir}/bin" - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/GarrysMod/dependencies/libc.so.6 - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/GarrysMod/dependencies/libm.so.6 - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/GarrysMod/dependencies/libpthread.so.0 - cp -v "${rootdir}/steamcmd/linux32/libstdc++.so.6" "${filesdir}/libstdc++.so.6" - # Insurgency - elif [ "${gamename}" == "Insurgency" ]; then - glibcversion="2.15" - fn_glibcfixmsg - cd "${filesdir}/bin" - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/Insurgency/dependencies/libc.so.6 - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/Insurgency/dependencies/libm.so.6 - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/Insurgency/dependencies/librt.so.1 - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/Insurgency/dependencies/libpthread.so.0 - elif [ "${gamename}" == "Left 4 Dead" ]; then - glibcversion="2.3.6" - fn_glibcfixmsg - cp -v "${rootdir}/steamcmd/linux32/libstdc++.so.6" "${filesdir}/bin/libstdc++.so.6" - # Natural Selection 2 - elif [ "${gamename}" == "Natural Selection 2" ]; then - glibcversion="2.15" - fn_glibcfixmsg - cd "${filesdir}" - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/NaturalSelection2/dependencies/libm.so.6 - cp -v "${rootdir}/steamcmd/linux32/libstdc++.so.6" "${filesdir}/libstdc++.so.6" - # NS2: Combat - elif [ "${gamename}" == "NS2: Combat" ]; then - glibcversion="2.15" - fn_glibcfixmsg - cd "${filesdir}" - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/NS2Combat/dependencies/libm.so.6 - cp -v "${rootdir}/steamcmd/linux32/libstdc++.so.6" "${filesdir}/libstdc++.so.6" - # No More Room in Hell - elif [ "${gamename}" == "No More Room in Hell" ]; then - glibcversion="2.15" - fn_glibcfixmsg - cd "${filesdir}" - wget -nv -N https://github.com/dgibbs64/linuxgsm/raw/master/NoMoreRoomInHell/dependencies/libm.so.6 - cp -v "${rootdir}/steamcmd/linux32/libstdc++.so.6" "${filesdir}/libstdc++.so.6" - # if Glibc less than 1.13 - elif [ "$(ldd --version | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" -lt 213 ]; then - # ARMA 3 - if [ "${gamename}" == "ARMA 3" ]; then - glibcversion="2.13" - fn_glibcfixmsg - cp -v "${rootdir}/steamcmd/linux32/libstdc++.so.6" "${filesdir}/libstdc++.so.6" - # Just Cause 2 - elif [ "${gamename}" == "Just Cause 2" ]; then - glibcversion="2.13" - fn_glibcfixmsg - cp -v "${rootdir}/steamcmd/linux32/libstdc++.so.6" "${filesdir}/libstdc++.so.6" - # Serious Sam 3: BFE - elif [ "${gamename}" == "Serious Sam 3: BFE" ]; then - glibcversion="2.13" - fn_glibcfixmsg - cp -v "${rootdir}/steamcmd/linux32/libstdc++.so.6" "${filesdir}/Bin/libstdc++.so.6" - else - : # Else glibcfix not required. - fi - else - : #Else glibcfix not required. - fi -fi -sleep 1 diff --git a/functions/fix_ro.sh b/functions/fix_ro.sh deleted file mode 100644 index 9364d3e01..000000000 --- a/functions/fix_ro.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -# LGSM fix_ro.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="010316" - -# Description: Resolves various issues with red orchestra. - -echo "Applying WebAdmin ROOst.css fix." -echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" -sed -i 's/none}/none;/g' "${filesdir}/Web/ServerAdmin/ROOst.css" -sed -i 's/underline}/underline;/g' "${filesdir}/Web/ServerAdmin/ROOst.css" -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" -sleep 1 -echo "applying server name fix." -sleep 1 -echo "forcing server restart..." -sleep 1 -command_start.sh -sleep 5 -command_stop.sh -command_start.sh -sleep 5 -command_stop.sh \ No newline at end of file diff --git a/functions/fix_steamcmd.sh b/functions/fix_steamcmd.sh deleted file mode 100644 index 86feb9e2c..000000000 --- a/functions/fix_steamcmd.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -# LGSM fix_steamcmd.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="010316" - -# Description: fixes various issues related to steamCMD. - -# Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so. -if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then - fixname="steamclient.so general" - fn_fix_msg_start - mkdir -pv "${HOME}/.steam/sdk32" >> "${scriptlog}" - cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${scriptlog}" - fn_fix_msg_end -fi - -if [ "${gamename}" == "Serious Sam 3: BFE" ]; then - # Fixes: .steam/bin32/libsteam.so: cannot open shared object file: No such file or directory - if [ ! -f "${HOME}/.steam/bin32/libsteam.so" ]; then - fixname="libsteam.so" - fn_fix_msg_start - mkdir -pv "${HOME}/.steam/bin32" >> "${scriptlog}" - cp -v "${filesdir}/Bin/libsteam.so" "${HOME}/.steam/bin32/libsteam.so" >> "${scriptlog}" - fn_fix_msg_end - fi -elif [ "${gamename}" == "Hurtworld" ]; then - # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. - if [ ! -f "${filesdir}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then - fixname="steamclient.so x86" - fn_fix_msg_start - cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${filesdir}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${scriptlog}" - fn_fix_msg_end - fi - if [ ! -f "${filesdir}/Hurtworld_Data/Plugins/x86_64/steamclient.so" ]; then - fixname="steamclient.so x86_64" - fn_fix_msg_start - cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${filesdir}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${scriptlog}" - fn_fix_msg_end - fi -fi diff --git a/functions/fix_ut2k4.sh b/functions/fix_ut2k4.sh deleted file mode 100644 index 363aa5d56..000000000 --- a/functions/fix_ut2k4.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -# LGSM fix_ut2k4.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="010316" - -# Description: Resolves various issues with unreal tournament 2004. - -echo "applying WebAdmin ut2003.css fix." -echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" -sed -i 's/none}/none;/g' "${filesdir}/Web/ServerAdmin/ut2003.css" -sed -i 's/underline}/underline;/g' "${filesdir}/Web/ServerAdmin/ut2003.css" -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" -sleep 1 -echo "applying server name fix." -sleep 1 -echo "forcing server restart..." -sleep 1 -command_start.sh -sleep 5 -command_stop.sh -command_start.sh -sleep 5 -command_stop.sh \ No newline at end of file diff --git a/functions/fix_ut99.sh b/functions/fix_ut99.sh deleted file mode 100644 index f7792fb44..000000000 --- a/functions/fix_ut99.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -# LGSM fix_ut99.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" -echo "${servercfgfullpath}" -echo "enabling UdpServerUplink." -{ -echo "[IpServer.UdpServerUplink]" -echo "DoUplink=True" -echo "UpdateMinutes=1" -echo "MasterServerAddress=unreal.epicgames.com" -echo "MasterServerPort=27900" -echo "Region=0" -}| tee -a "${servercfgfullpath}" > /dev/null 2>&1 -sleep 1 -echo "removing dead gamespy.com master server." -sed -i '/master0.gamespy.com/d' "${servercfgfullpath}" -sleep 1 -echo "removing dead mplayer.com master server." -sed -i '/master.mplayer.com/d' "${servercfgfullpath}" -sleep 1 -echo "inserting qtracker.com master server." -sed -i '65i\ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.qtracker.com MasterServerPort=27900' "${servercfgfullpath}" -echo "" \ No newline at end of file diff --git a/functions/fn_update_functions b/functions/fn_update_functions deleted file mode 100644 index 5fbb28975..000000000 --- a/functions/fn_update_functions +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -# LGSM fn_update_functions.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="230116" - -# Description: LEGACY FUNCTION Deletes the functions dir to allow re-downloading of functions from GitHub. - -fn_print_dots "Updating functions" -fn_scriptlog "Updating functions" -sleep 1 -echo -ne "\n" -rm -rfv "${rootdir}/functions/"* -exitcode=$? -if [ "${exitcode}" == "0" ]; then - fn_print_ok "Updating functions" - fn_scriptlog "Success! Updating functions" -else - fn_print_fail "Updating functions" - fn_scriptlog "Failure! Updating functions" -fi -echo -ne "\n" \ No newline at end of file diff --git a/functions/gsquery.py b/functions/gsquery.py deleted file mode 100644 index b132038e3..000000000 --- a/functions/gsquery.py +++ /dev/null @@ -1,125 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- -# Game Server Query -# Author: Anonymous & Daniel Gibbs -# # Website: http://gameservermanagers.com -# Version: 190216 - -import optparse -import socket -import sys - -class GameServer: - def __init__( self, options, arguments ): - self.option = options - self.argument = arguments - # - self.server_response_timeout = 5 - self.default_buffer_length = 1024 - # - if self.option.engine == 'source': - self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0' - elif self.option.engine == 'goldsource': - self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0' - elif self.option.engine == 'spark': - self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0' - elif self.option.engine == 'realvirtuality': - self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0' - elif self.option.engine == 'unity3d': - self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0' - elif self.option.engine == 'idtech3': - self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0' - elif self.option.engine == 'unreal': - self.query_prompt_string = '\x5C\x69\x6E\x66\x6F\x5C' - elif self.option.engine == 'unreal2': - self.query_prompt_string = '\x79\x00\x00\x00\x00' - elif self.option.engine == 'avalanche': - self.query_prompt_string = '\xFE\xFD\x09\x10\x20\x30\x40' - self.connected = False - self.response = None - self.sanity_checks() - - def fatal_error( self, error_message, error_code=1 ): - sys.stderr.write( 'ERROR: ' + str(error_message) + '\n' ) - sys.exit( error_code ) - - def exit_success( self, success_message='' ): - sys.stdout.write( 'OK: ' + str(success_message) + '\n' ) - sys.exit( 0 ) - - def responding( self ): - # Connect. - connection = socket.socket( socket.AF_INET, socket.SOCK_DGRAM ) - connection.settimeout( self.server_response_timeout ) - try: - self.connected = connection.connect( ( self.option.address, int(self.option.port) ) ) - except socket.timeout: - self.fatal_error( 'Request timed out', 1 ) - except: - self.fatal_error( 'Unable to connect', 1 ) - # Send. - connection.send( self.query_prompt_string ) - # Receive. - try: - self.response = connection.recv( self.default_buffer_length ) - except socket.error: - self.fatal_error( 'Unable to receive', 2 ) - connection.close() - # Response. - if self.response == None: - self.fatal_error( 'No response', 3 ) - if len( self.response ) < 10 : - sys.exit( 'Short response.', 3 ) - else: - self.exit_success( str( self.response ) ) - - def sanity_checks( self ): - if not self.option.address: - self.fatal_error( 'No IPv4 address supplied.', 4 ) - if not self.option.port: - self.fatal_error( 'No port supplied.', 4 ) - -if __name__ == '__main__': - parser = optparse.OptionParser( - usage = 'usage: python %prog [options]', - version = '%prog 0.0.1' - ) - parser.add_option( - '-a', '--address', - action = 'store', - dest = 'address', - default = False, - help = 'The IPv4 address of the server.' - ) - parser.add_option( - '-p', '--port', - action = 'store', - dest = 'port', - default = False, - help = 'The IPv4 port of the server.' - ) - parser.add_option( - '-e', '--engine', - action = 'store', - dest = 'engine', - default = False, - help = 'Engine type: avalanche, goldsource, idtech3, realvirtuality, spark, source, unity3d, unreal, unreal2.' - ) - parser.add_option( - '-v', '--verbose', - action = 'store_true', - dest = 'verbose', - default = False, - help = 'Display verbose output.' - ) - parser.add_option( - '-d', '--debug', - action = 'store_true', - dest = 'debug', - default = False, - help = 'Display debugging output.' - ) - options, arguments = parser.parse_args() - # - server = GameServer( options, arguments ) - server.responding() diff --git a/functions/info_config.sh b/functions/info_config.sh deleted file mode 100644 index d9d5d4dfb..000000000 --- a/functions/info_config.sh +++ /dev/null @@ -1,868 +0,0 @@ -#!/bin/bash -# LGSM info_config.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="010316" - -# Description: Gets specific details from config files. - -## Examples of filtering to get info from config files -# sed 's/foo//g' - remove foo -# tr -cd '[:digit:]' leave only digits -# tr -d '=\"; ' remove selected charectors =\"; -# grep -v "foo" filter out lines that contain foo - -## Just Cause 2 -if [ "${engine}" == "avalanche" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "Name" "${servercfgfullpath}" | sed 's/Name//g' | tr -d '=", \n') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # ip - if [ -f "${servercfgfullpath}" ]; then - # check if the ip exists in the config file. Failing this will fall back to the default. - configipcheck=$(grep "BindIP" "${servercfgfullpath}" | sed 's/BindIP//g' | tr -d '=", \n') - fi - if [ -n "${configipcheck}" ]; then - ip=$(grep "BindIP" "${servercfgfullpath}" | sed 's/BindIP//g' | tr -d '=", \n') - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then - serverpassword=$(grep "Password" "${servercfgfullpath}" | sed 's/Password//g' | tr -d '=", \n') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then - slots=$(grep "MaxPlayers" "${servercfgfullpath}" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then - port=$(grep "BindPort" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - -## Dont Starve Together -elif [ "${engine}" == "dontstarve" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "default_server_name = " "${servercfgfullpath}" | sed 's/default_server_name = //g') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then - serverpassword=$(grep "server_password = " "${servercfgfullpath}" | grep -v "#" | sed 's/server_password = //g') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then - slots=$(grep "max_players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # game mode - if [ -f "${servercfgfullpath}" ]; then - gamemode=$(grep "game_mode = " "${servercfgfullpath}" | grep -v "#" | sed 's/game_mode = //g') - if [ ! -n "${gamemode}" ]; then - gamemode="NOT SET" - fi - else - gamemode="\e[0;31mUNAVAILABLE\e[0m" - fi - - # tickrate - if [ -f "${servercfgfullpath}" ]; then - tickrate=$(grep "tick_rate" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - if [ ! -n "${tickrate}" ]; then - tickrate="NOT SET" - fi - else - tickrate="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then - port=$(grep "server_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - -## Project Zomboid -elif [ "${engine}" == "projectzomboid" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "PublicName=" "${servercfgfullpath}" | sed 's/PublicName=//g' | tr -d '=", \n') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then - slots=$(grep "MaxPlayers=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then - port=$(grep "DefaultPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - - -# Quake Live -elif [ "${engine}" == "idtech3" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "set sv_hostname " "${servercfgfullpath}" | sed 's/set sv_hostname //g' | tr -d '=\"; ') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then - - serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/set g_password//g' | tr -d '=\"; '| cut -f1 -d "/") - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # rcon password - rconpassword="${rconpassword}" - if [ -f "${servercfgfullpath}" ]; then - if [ ! -n "${rconpassword}" ]; then - rconpassword="NOT SET" - fi - else - rconpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then - slots=$(grep "set sv_maxClients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - port="${gameport}" - if [ ! -n "${port}" ]; then - port="0" - fi - - # rcon port - if [ ! -n "${rconport}" ]; then - rconport="0" - fi - - # Stats port - if [ ! -n "${statsport}" ]; then - statsport="0" - fi - -# ARMA 3 -elif [ "${engine}" == "realvirtuality" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "hostname" "${servercfgfullpath}" | grep -v "//" | sed -e 's/\//g' | tr -d '=\"; ') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # admin password - if [ -f "${servercfgfullpath}" ]; then - adminpassword=$(grep "passwordAdmin" "${servercfgfullpath}" | grep -v "//" | sed -e 's/\passwordAdmin//g' | tr -d '=\"; ') - if [ ! -n "${adminpassword}" ]; then - adminpassword="NOT SET" - fi - else - adminpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then - serverpassword=$(grep "password =" "${servercfgfullpath}" | grep -v "//" | sed -e 's/\password//g' | tr -d '=\"; ') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then - slots=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ "${port}" != "" ]; then - port=${port} - fi - if [ ! -n "${port}" ]; then - port="0" - fi - - # query port - if [ "${port}" != "" ]; then - queryport=$((port + 1)) - fi - if [ ! -n "${queryport}" ]; then - queryport="0" - fi - - # master port - if [ "${port}" != "" ]; then - masterport=$((port + 2)) - fi - if [ ! -n "${masterport}" ]; then - masterport="0" - fi - -# Serious Sam -elif [ "${engine}" == "seriousengine35" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "prj_strMultiplayerSessionName" "${servercfgfullpath}" | sed 's/prj_strMultiplayerSessionName = //g' | tr -d '=\"; ') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # rcon password - if [ -f "${servercfgfullpath}" ]; then - rconpassword=$(grep "rcts_strAdminPassword" "${servercfgfullpath}" | sed 's/rcts_strAdminPassword = //g' | tr -d '=\"; ') - if [ ! -n "${rconpassword}" ]; then - rconpassword="NOT SET" - fi - else - rconpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then - slots=$(grep "gam_ctMaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # game mode - if [ -f "${servercfgfullpath}" ]; then - gamemode=$(grep "gam_idGameMode" "${servercfgfullpath}" | grep -v "#" | sed 's/gam_idGameMode//g' | tr -d '=\"; ') - if [ ! -n "${gamemode}" ]; then - gamemode="NOT SET" - fi - else - gamemode="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then - port=$(grep "prj_uwPort" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - - # query port - if [ -f "${servercfgfullpath}" ]; then - queryport=$((port + 1)) - fi - if [ ! -n "${queryport}" ]; then - queryport="0" - fi - -# Source Engine Games -elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "hostname" "${servercfgfullpath}" | sed 's/hostname //g' | sed 's/"//g') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then - serverpassword=$(grep "sv_password" "${servercfgfullpath}" | sed 's/sv_password //g' | sed 's/"//g') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # rcon password - if [ -f "${servercfgfullpath}" ]; then - rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed 's/rcon_password //g' | sed 's/"//g') - if [ ! -n "${rconpassword}" ]; then - rconpassword="NOT SET" - fi - else - rconpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - -# Spark (NS2: Combat) -elif [ "${engine}" == "spark" ]; then - - # query port - if [ -f "${servercfgfullpath}" ]; then - queryport=$((port + 1)) - fi - if [ ! -n "${queryport}" ]; then - queryport="0" - fi - -# Teamspeak 3 -elif [ "${gamename}" == "Teamspeak 3" ]; then - - # ip - if [ -f "${servercfgfullpath}" ]; then - # check if the ip exists in the config file. Failing this will fall back to the default. - configipcheck=$(grep "voice_ip=" "${servercfgfullpath}" | sed 's/\voice_ip=//g') - fi - if [ -n "${configipcheck}" ]; then - ip=$(grep "voice_ip=" "${servercfgfullpath}" | sed 's/\voice_ip=//g') - fi - - # dbplugin - if [ -f "${servercfgfullpath}" ]; then - dbplugin=$(grep "dbplugin=" "${servercfgfullpath}" | sed 's/\dbplugin=//g') - if [ ! -n "${dbplugin}" ]; then - dbplugin="NOT SET" - fi - else - dbplugin="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then - port=$(grep "default_voice_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="9987" - fi - - # query port - if [ -f "${servercfgfullpath}" ]; then - queryport=$(grep "query_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${queryport}" ]; then - queryport="10011" - fi - - # file port - if [ -f "${servercfgfullpath}" ]; then - fileport=$(grep "filetransfer_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${fileport}" ]; then - fileport="30033" - fi - -# Teeworlds -elif [ "${engine}" == "teeworlds" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "sv_name" "${servercfgfullpath}" | sed 's/sv_name //g' | sed 's/"//g') - if [ ! -n "${servername}" ]; then - servername="unnamed server" - fi - else - servername="unnamed server" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then - serverpassword=$(grep "password " "${servercfgfullpath}" | awk '!/sv_rcon_password/'| sed 's/password //g' | tr -d '=\"; ') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # rcon password - if [ -f "${servercfgfullpath}" ]; then - rconpassword=$(grep "sv_rcon_password" "${servercfgfullpath}" | sed 's/sv_rcon_password //g' | tr -d '=\"; ') - if [ ! -n "${rconpassword}" ]; then - rconpassword="NOT SET" - fi - else - rconpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then - port=$(grep "sv_port" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="8303" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then - slots=$(grep "sv_max_clients" "${servercfgfullpath}" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="12" - fi - else - slots="12" - fi - -# Terraria -elif [ "${engine}" == "terraria" ]; then - - # port - if [ -f "${servercfgfullpath}" ]; then - port=$(grep "port=" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - -# 7 Day To Die (unity3d) -elif [ "${gamename}" == "7 Days To Die" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "ServerName" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then - serverpassword=$(grep "ServerPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # webadmin enabled - if [ -f "${servercfgfullpath}" ]; then - webadminenabled=$(grep "ControlPanelEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${webadminenabled}" ]; then - webadminenabled="NOT SET" - fi - else - webadminenabled="\e[0;31mUNAVAILABLE\e[0m" - fi - - # webadmin port - if [ -f "${servercfgfullpath}" ]; then - webadminport=$(grep "ControlPanelPort" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${webadminport}" ]; then - webadminport="0" - fi - - # webadmin enabled - if [ -f "${servercfgfullpath}" ]; then - webadminenabled=$(grep "ControlPanelEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${webadminenabled}" ]; then - webadminenabled="NOT SET" - fi - else - webadminenabled="\e[0;31mUNAVAILABLE\e[0m" - fi - - # webadmin password - if [ -f "${servercfgfullpath}" ]; then - webadminpass=$(grep "ControlPanelPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${webadminpass}" ]; then - webadminpass="NOT SET" - fi - else - webadminpass="\e[0;31mUNAVAILABLE\e[0m" - fi - - # telnet enabled - if [ -f "${servercfgfullpath}" ]; then - telnetenabled=$(grep "TelnetEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${telnetenabled}" ]; then - telnetenabled="NOT SET" - fi - else - telnetenabled="\e[0;31mUNAVAILABLE\e[0m" - fi - - # telnet port - if [ -f "${servercfgfullpath}" ]; then - telnetport=$(grep "TelnetPort" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${telnetport}" ]; then - telnetport="0" - fi - - # telnet password - if [ -f "${servercfgfullpath}" ]; then - telnetpass=$(grep "TelnetPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${telnetpass}" ]; then - telnetpass="NOT SET" - fi - else - telnetpass="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then - slots=$(grep "ServerMaxPlayerCount" "${servercfgfullpath}" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # game mode - if [ -f "${servercfgfullpath}" ]; then - gamemode=$(grep "GameMode" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${gamemode}" ]; then - gamemode="NOT SET" - fi - else - gamemode="\e[0;31mUNAVAILABLE\e[0m" - fi - - # game world - if [ -f "${servercfgfullpath}" ]; then - gameworld=$(grep "GameWorld" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${gameworld}" ]; then - gameworld="NOT SET" - fi - else - gameworld="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then - port=$(grep "sv_port" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - - # query port - if [ -f "${servercfgfullpath}" ]; then - queryport=$((port + 1)) - fi - if [ ! -n "${queryport}" ]; then - queryport="0" - fi - -# Hurtworld (unity3d) -elif [ "${gamename}" == "Hurtworld" ]; then - - # server name - if [ -n "${servername}" ]; then - servername="${servername}" - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - # not available yet - - # slots - if [ -n "${maxplayers}" ]; then - slots="${maxplayers}" - else - slots="NOT SET" - fi - - # game world - if [ -n "${map}" ]; then - gameworld="${map}" - else - gameworld="NO MAP SET" - fi - - # port - if [ -n "${port}" ]; then - port="${port}" - else - port="0" - fi - - # query port - if [ -n "${queryport}" ]; then - queryport="${queryport}" - else - queryport="0" - fi - -# Unreal Tournament -elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "ServerName=" "${servercfgfullpath}" | sed 's/ServerName=//g') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then - serverpassword=$(grep "GamePassword=" "${servercfgfullpath}" | sed 's/GamePassword=//g') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # admin password - if [ -f "${servercfgfullpath}" ]; then - adminpassword=$(grep "AdminPassword=" "${servercfgfullpath}" | sed 's/AdminPassword=//g') - if [ ! -n "${adminpassword}" ]; then - adminpassword="NOT SET" - fi - else - adminpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then - port=$(grep "Port=" "${servercfgfullpath}" | grep -v "Master" | grep -v "LAN" | grep -v "Proxy" | grep -v "Listen" | tr -d '\r' | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - - # query port - if [ -f "${servercfgfullpath}" ]; then - queryport=$((port + 1)) - fi - if [ ! -n "${queryport}" ]; then - queryport="0" - fi - - # gamespy query port - if [ -f "${servercfgfullpath}" ]; then - gsqueryport=$(grep "OldQueryPortNumber=" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]') - fi - if [ ! -n "${gsqueryport}" ]; then - gsqueryport="0" - fi - - # query port - if [ -f "${servercfgfullpath}" ]; then - udplinkport=$((port + 2)) - fi - if [ ! -n "${udplinkport}" ]; then - udplinkport="0" - fi - - # webadmin enabled - if [ -f "${servercfgfullpath}" ]; then - webadminenabled=$(grep "bEnabled=" "${servercfgfullpath}" | sed 's/bEnabled=//g' | tr -d '\r') - if [ ! -n "${webadminenabled}" ]; then - webadminenabled="NOT SET" - fi - else - webadminenabled="\e[0;31mUNAVAILABLE\e[0m" - fi - - # webadmin port - if [ -f "${servercfgfullpath}" ]; then - webadminport=$(grep "ListenPort=" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]') - fi - if [ ! -n "${webadminport}" ]; then - webadminport="0" - fi - - if [ "${engine}" == "unreal" ]; then - - # webadmin user - if [ -f "${servercfgfullpath}" ]; then - webadminuser=$(grep "AdminUsername=" "${servercfgfullpath}" | sed 's/\AdminUsername=//g') - if [ ! -n "${webadminuser}" ]; then - webadminuser="NOT SET" - fi - else - webadminuser="\e[0;31mUNAVAILABLE\e[0m" - fi - - # webadmin password - if [ -f "${servercfgfullpath}" ]; then - webadminpass=$(grep "UTServerAdmin.UTServerAdmin" "${servercfgfullpath}" -A 2 | grep "AdminPassword=" | sed 's/\AdminPassword=//g') - if [ ! -n "${webadminpass}" ]; then - webadminpass="NOT SET" - fi - else - webadminpass="\e[0;31mUNAVAILABLE\e[0m" - fi - - else - - # webadmin user - if [ -f "${servercfgfullpath}" ]; then - webadminuser=$(grep "AdminName=" "${servercfgfullpath}" | sed 's/\AdminName=//g') - if [ ! -n "${webadminuser}" ]; then - webadminuser="NOT SET" - fi - else - webadminuser="\e[0;31mUNAVAILABLE\e[0m" - fi - - # webadmin password - if [ -f "${servercfgfullpath}" ]; then - webadminpass=$(grep "AdminPassword=" "${servercfgfullpath}" | sed 's/\AdminPassword=//g') - if [ ! -n "${webadminpass}" ]; then - webadminpass="NOT SET" - fi - else - webadminpass="\e[0;31mUNAVAILABLE\e[0m" - fi - - fi - -# ARK: Survivaial Evolved -elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "SessionName=" "${servercfgfullpath}" | sed 's/SessionName=//g') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then - serverpassword=$(grep "ServerPassword=" "${servercfgfullpath}" | sed 's/ServerPassword=//g') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # admin password - if [ -f "${servercfgfullpath}" ]; then - adminpassword=$(grep "ServerAdminPassword=" "${servercfgfullpath}" | sed 's/ServerAdminPassword=//g') - if [ ! -n "${adminpassword}" ]; then - adminpassword="NOT SET" - fi - else - adminpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then - slots=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then - port=$(grep "Port=" "${servercfgfullpath}" | grep -v "RCONPort=" | grep -v "QueryPort=" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - - # rcon port - if [ -f "${servercfgfullpath}" ]; then - rconport=$(grep "RCONPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${rconport}" ]; then - rconport="0" - fi - - # query port - if [ -f "${servercfgfullpath}" ]; then - queryport=$(grep "QueryPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${queryport}" ]; then - queryport="0" - fi - -fi diff --git a/functions/info_glibc.sh b/functions/info_glibc.sh deleted file mode 100644 index 46c45d904..000000000 --- a/functions/info_glibc.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash -# LGSM info_glibc.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="260216" - -# Description: stores details on servers Glibc requirements. - -if [ "${gamename}" == "Blade Symphony" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "BrainBread 2" ]; then - glibcrequired="2.17" -elif [ "${gamename}" == "Double Action: Boogaloo" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "Fistful of Frags" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "Garry's Mod" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "Insurgency" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "No More Room in Hell" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${gamename}" == "Quake Live" ]; then - glibcrequired="2.15" - glibcfix="no" -elif [ "${engine}" == "avalanche" ]; then - glibcrequired="2.13" - glibcfix="yes" -elif [ "${engine}" == "dontstarve" ]; then - glibcrequired="2.15" - glibcfix="no" -elif [ "${engine}" == "projectzomboid" ]; then - glibcrequired="2.15" - glibcfix="yesno" -elif [ "${engine}" == "realvirtuality" ]; then - glibcrequired="2.13" - glibcfix="yes" -elif [ "${engine}" == "seriousengine35" ]; then - glibcrequired="2.13" - glibcfix="yes" -elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then - glibcrequired="2.3.6" - glibcfix="no" -elif [ "${engine}" == "spark" ]; then - glibcrequired="2.15" - glibcfix="yes" -elif [ "${engine}" == "starbound" ]; then - glibcrequired="2.12" - glibcfix="no" -elif [ "${engine}" == "unreal" ]; then - glibcrequired="2.1" - glibcfix="no" -elif [ "${engine}" == "unreal2" ]; then - glibcrequired="2.4" - glibcfix="no" -elif [ "${engine}" == "unreal4" ]; then - glibcrequired="2.14" - glibcfix="no" -elif [ "${engine}" == "unity3d" ]; then - glibcrequired="2.15" - glibcfix="no" -else - glibcrequired="UNKNOWN" - glibcfix="no" -fi diff --git a/functions/install_complete.sh b/functions/install_complete.sh deleted file mode 100644 index 5ea9a127b..000000000 --- a/functions/install_complete.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# LGSM install_complete.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -local modulename="Install" - -if [ "${gamename}" == "Don't Starve Together" ]; then - echo "" - echo "An Authentication Token is required to run this server!" - echo "Follow the instructions in this link to obtain this key" - echo " http://gameservermanagers.com/dst-auth-token" -fi -echo "=================================" -echo "Install Complete!" -fn_scriptlog "Install Complete!" -echo "" -echo "To start server type:" -echo "./${selfname} start" -echo "" diff --git a/functions/install_config.sh b/functions/install_config.sh deleted file mode 100644 index 75ca40618..000000000 --- a/functions/install_config.sh +++ /dev/null @@ -1,349 +0,0 @@ -#!/bin/bash -# LGSM install_config.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="220216" - -local modulename="Install" - -fn_defaultconfig(){ - echo "creating ${servercfg} config file." - cp -v "${servercfgdefault}" "${servercfgfullpath}" - sleep 1 -} - -fn_userinputconfig(){ -# allow user to input server name and password -if [ -z "${autoinstall}" ]; then - echo "" - echo "Configuring ${gamename} Server" - echo "=================================" - sleep 1 - read -p "Enter server name: " servername - read -p "Enter rcon password: " rconpass -else - servername="${servicename}" - rconpass="rconpassword" -fi -echo "changing hostname." -sed -i "s/\"\"/\"${servername}\"/g" "${servercfgfullpath}" -sleep 1 -echo "changing rconpassword." -sed -i "s/\"\"/\"${rconpass}\"/g" "${servercfgfullpath}" -sleep 1 -} - -fn_arma3config(){ -fn_defaultconfig -echo "creating ${networkcfg} config file." -cp -v "${networkcfgdefault}" "${networkcfgfullpath}" -sleep 1 -echo "" -} - -fn_goldsourceconfig(){ -fn_defaultconfig - -# server.cfg redirects to ${servercfg} for added security -echo "creating server.cfg." -touch "server.cfg" -sleep 1 -echo "creating redirect." -echo "server.cfg > ${servercfg}." -echo "exec ${servercfg}" > "server.cfg" -sleep 1 - -# creating other files required -echo "creating listip.cfg." -touch "${systemdir}/listip.cfg" -sleep 1 -echo "creating banned.cfg." -touch "${systemdir}/banned.cfg" -sleep 1 - -fn_userinputconfig -echo "" -} - -fn_serious3config(){ -fn_defaultconfig -echo "" -echo "To edit ${gamename} server config use SS3 Server GUI 3 tool" -echo "http://mrag.nl/sgui3/" -sleep 1 -echo "" -} - -fn_sourceconfig(){ -fn_defaultconfig - -# server.cfg redirects to ${servercfg} for added security -echo "creating server.cfg." -touch "server.cfg" -sleep 1 -echo "creating redirect." -echo "server.cfg > ${servercfg}." -echo "exec ${servercfg}" > "server.cfg" -sleep 1 - -fn_userinputconfig -echo "" -} - -fn_teeworldsconfig(){ -fn_defaultconfig - -echo "adding logfile location to config." -sed -i "s@\"\"@\"${gamelog}\"@g" "${servercfgfullpath}" -sleep 1 -echo "removing password holder." -sed -i "s///" "${servercfgfullpath}" -sleep 1 - -fn_userinputconfig -echo "" -} - -fn_ut99config(){ -echo "${servercfgdefault} > ${servercfgfullpath}" -tr -d '\r' < "${servercfgdefault}" > "${servercfgfullpath}" -sleep 1 -echo "" -echo "Configuring ${gamename} Server" -echo "=================================" -sleep 1 -echo "enabling WebAdmin." -sed -i 's/bEnabled=False/bEnabled=True/g' "${servercfgfullpath}" -sleep 1 -echo "setting WebAdmin port to 8076." -sed -i '467i\ListenPort=8076' "${servercfgfullpath}" -sleep 1 -echo "" -} - -fn_unreal2config(){ -fn_defaultconfig -echo "" -echo "Configuring ${gamename} Server" -echo "=================================" -sleep 1 -echo "setting WebAdmin username and password." -sed -i 's/AdminName=/AdminName=admin/g' "${servercfgfullpath}" -sed -i 's/AdminPassword=/AdminPassword=admin/g' "${servercfgfullpath}" -sleep 1 -echo "enabling WebAdmin." -sed -i 's/bEnabled=False/bEnabled=True/g' "${servercfgfullpath}" -if [ "${gamename}" == "Unreal Tournament 2004" ]; then - sleep 1 - echo "setting WebAdmin port to 8075." - sed -i 's/ListenPort=80/ListenPort=8075/g' "${servercfgfullpath}" -fi -sleep 1 -echo "" -} - -echo "" -if [ "${gamename}" != "Hurtworld" ]; then -echo "Creating Configs" -echo "=================================" -sleep 1 - mkdir -pv "${servercfgdir}" - cd "${servercfgdir}" - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}" -fi - -if [ "${gamename}" == "7 Days To Die" ]; then - fn_defaultconfig -elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then - wget -N /dev/null ${githuburl}/ARKSurvivalEvolved/cfg/lgsm-default.ini 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - echo -e "downloading lgsm-default.ini...\c" - fn_defaultconfig -elif [ "${gamename}" == "ARMA 3" ]; then - echo -e "downloading lgsm-default.server.cfg...\c" - wget -N /dev/null ${githuburl}/Arma3/cfg/lgsm-default.server.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - echo -e "downloading lgsm-default.network.cfg...\c" - wget -N /dev/null ${githuburl}/Arma3/cfg/lgsm-default.network.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_arma3config -elif [ "${gamename}" == "BrainBread 2" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/BrainBread2/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Black Mesa: Deathmatch" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/BlackMesa/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Blade Symphony" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/BladeSymphony/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_goldsourceconfig -elif [ "${gamename}" == "Codename CURE" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/CodenameCURE/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig - -elif [ "${gamename}" == "Counter Strike 1.6" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/CounterStrike/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_goldsourceconfig -elif [ "${gamename}" == "Counter Strike: Condition Zero" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/CounterStrikeConditionZero/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_goldsourceconfig -elif [ "${gamename}" == "Counter Strike: Global Offensive" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/CounterStrikeGlobalOffensive/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Counter Strike: Source" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/CounterStrikeSource/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Day of Defeat" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/DayOfDefeat/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_goldsourceconfig -elif [ "${gamename}" == "Day of Defeat: Source" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/DayOfDefeatSource/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Don't Starve Together" ]; then - echo -e "downloading lgsm-default.ini...\c" - wget -N /dev/null ${githuburl}/DontStarveTogether/lgsm-default.ini 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_defaultconfig -elif [ "${gamename}" == "Double Action: Boogaloo" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/DoubleActionBoogaloo/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Fistful of Frags" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/FistfulOfFrags/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Garry's Mod" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/GarrysMod/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "GoldenEye: Source" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/GoldenEyeSource/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Half Life 2: Deathmatch" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/HalfLife2Deathmatch/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Half Life: Deathmatch" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/HalfLifeDeathmatch/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_goldsourceconfig -elif [ "${gamename}" == "Insurgency" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/Insurgency/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Just Cause 2" ]; then - fn_defaultconfig -elif [ "${gamename}" == "Killing Floor" ]; then - fn_unreal2config -elif [ "${gamename}" == "Left 4 Dead" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/Left4Dead/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Left 4 Dead 2" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/Left4Dead2/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "No More Room in Hell" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/NoMoreRoomInHell/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Natural Selection 2" ]; then - echo -e "no configs required." - sleep 1 - echo "" -elif [ "${gamename}" == "Pirates, Vikings, and Knights II" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/PiratesVikingandKnightsII/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Quake Live" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/QuakeLive/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_defaultconfig - fn_userinputconfig -elif [ "${gamename}" == "Red Orchestra: Ostfront 41-45" ]; then - fn_unreal2config -elif [ "${gamename}" == "Serious Sam 3: BFE" ]; then - echo -e "downloading lgsm-default.ini...\c" - wget -N /dev/null ${githuburl}/SeriousSam3BFE/cfg/lgsm-default.ini 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_serious3config -elif [ "${gamename}" == "Rust" ]; then - echo -e "downloading server.cfg...\c" - wget -N /dev/null ${githuburl}/Rust/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_defaultconfig -elif [ "${gamename}" == "Sven Co-op" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/SvenCoop/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_goldsourceconfig -elif [ "${gamename}" == "Teamspeak 3" ]; then - echo -e "downloading lgsm-default.ini...\c" - wget -N /dev/null ${githuburl}/TeamSpeak3/cfg/lgsm-default.ini 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_defaultconfig -elif [ "${gamename}" == "Team Fortress 2" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/TeamFortress2/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_sourceconfig -elif [ "${gamename}" == "Team Fortress Classic" ]; then - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/TeamFortressClassic/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_goldsourceconfig -elif [ "${gamename}" == "Teeworlds" ]; then - echo -e "downloading ctf.cfg...\c" - wget -N /dev/null ${githuburl}/Teeworlds/cfg/ctf.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - echo -e "downloading dm.cfg...\c" - wget -N /dev/null ${githuburl}/Teeworlds/cfg/dm.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - echo -e "downloading duel.cfg...\c" - wget -N /dev/null ${githuburl}/Teeworlds/cfg/duel.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - echo -e "downloading tdm.cfg...\c" - wget -N /dev/null ${githuburl}/Teeworlds/cfg/tdm.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - echo -e "downloading lgsm-default.cfg...\c" - wget -N /dev/null ${githuburl}/Teeworlds/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_teeworldsconfig -elif [ "${gamename}" == "Terraria" ]; then - echo -e "downloading lgsm-default.txt...\c" - wget -N /dev/null ${githuburl}/Terraria/cfg/lgsm-default.txt 2>&1 | grep -F HTTP | cut -c45- | uniq - sleep 1 - fn_defaultconfig -elif [ "${gamename}" == "Unreal Tournament 2004" ]; then - fn_unreal2config -elif [ "${gamename}" == "Unreal Tournament 99" ]; then - fn_ut99config -fi diff --git a/functions/install_gslt.sh b/functions/install_gslt.sh deleted file mode 100644 index 5bd309f28..000000000 --- a/functions/install_gslt.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -# LGSM install_gslt.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="270216" - -# Description: Configures GSLT. - -local modulename="Install" - -echo "" -echo "Game Server Login Token" -echo "============================" -sleep 1 -if [ "${gamename}" == "Counter Strike: Global Offensive" ]; then - echo "GSLT is required to run a public ${gamename} server" - fn_scriptlog "GSLT is required to run a public ${gamename} server" -else - echo "GSLT is an optional feature for ${gamename} server" - fn_scriptlog "GSLT is an optional feature for ${gamename} server" -fi - -echo "Get more info and a token here:" -echo "http://gameservermanagers.com/gslt" -fn_scriptlog "Get more info and a token here:" -fn_scriptlog "http://gameservermanagers.com/gslt" -echo "" -if [ -z "${autoinstall}" ]; then - echo "Enter token below (Can be blank)." - echo -n "GSLT TOKEN: " - read token - sed -i -e "s/gslt=\"\"/gslt=\"${token}\"/g" "${rootdir}/${selfname}" -fi -sleep 1 -echo "The GSLT can be changed by editing ${selfname}." -fn_scriptlog "The GSLT can be changed by editing ${selfname}." -echo "" \ No newline at end of file diff --git a/functions/install_header.sh b/functions/install_header.sh deleted file mode 100644 index da8b7bf6c..000000000 --- a/functions/install_header.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# LGSM install_header.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="190216" - -local modulename="Install" - -clear -echo "=================================" -echo "${gamename}" -echo "Linux Game Server Manager" -echo "by Daniel Gibbs" -echo "Contributors: http://goo.gl/qLmitD" -echo "http://gameservermanagers.com" -echo "=================================" diff --git a/functions/install_logs.sh b/functions/install_logs.sh deleted file mode 100644 index 9f86f7129..000000000 --- a/functions/install_logs.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -# LGSM install_logs.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="270216" - -local modulename="Install" - -if [ "${checklogs}" != "1" ]; then - echo "" - echo "Creating log directorys" - echo "=================================" -fi -sleep 1 -# Create dir's for the script and console logs -mkdir -v "${rootdir}/log" -mkdir -v "${scriptlogdir}" -touch "${scriptlog}" -if [ -n "${consolelogdir}" ]; then - mkdir -v "${consolelogdir}" - touch "${consolelog}" -fi - -# If a server is source or goldsource, Teamspeak 3, Starbound, Project Zomhoid create a symbolic link to the game server logs. -if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]||[ "${gamename}" == "Teamspeak 3" ]||[ "${engine}" == "starbound" ]||[ "${engine}" == "projectzomboid" ]; then - if [ ! -h "${rootdir}/log/server" ]; then - ln -nfsv "${gamelogdir}" "${rootdir}/log/server" - fi -fi - -# If a server is unreal2 or unity3d create a dir. -if [ "${engine}" == "unreal2" ]||[ "${engine}" == "unity3d" ]||[ "${gamename}" == "Teeworlds" ]; then - mkdir -pv "${gamelogdir}" -fi - -# If server uses SteamCMD create a symbolic link to the Steam logs. -if [ -d "${rootdir}/Steam/logs" ]; then - if [ ! -h "${rootdir}/log/steamcmd" ]; then - ln -nfsv "${rootdir}/Steam/logs" "${rootdir}/log/steamcmd" - fi -fi -sleep 1 -fn_scriptlog "logs installed" \ No newline at end of file diff --git a/functions/install_retry.sh b/functions/install_retry.sh deleted file mode 100644 index 7f04ac9ed..000000000 --- a/functions/install_retry.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# LGSM install_retry.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -local modulename="Install" - -while true; do - read -e -i "y" -p "Retry install? [Y/n]" yn - case $yn in - [Yy]* ) command_install.sh; exit;; - [Nn]* ) echo Exiting; exit;; - * ) echo "Please answer yes or no.";; - esac -done \ No newline at end of file diff --git a/functions/install_server_dir.sh b/functions/install_server_dir.sh deleted file mode 100644 index ab73ecfd2..000000000 --- a/functions/install_server_dir.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -# LGSM install_serverdir.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -local modulename="Install" - -echo "" -echo "Server Directory" -echo "=================================" -sleep 1 -echo "" -pwd -echo "" -if [ -d "${filesdir}" ]; then - fn_print_warning_nl "A server is already installed here." -fi -if [ -z "${autoinstall}" ]; then - while true; do - read -e -i "y" -p "Continue [y/N]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) exit;; - * ) echo "Please answer yes or no.";; - esac - done -fi -if [ ! -d "${filesdir}" ]; then - mkdir -v "${filesdir}" -fi -sleep 1 \ No newline at end of file diff --git a/functions/install_server_files.sh b/functions/install_server_files.sh deleted file mode 100644 index d6655689b..000000000 --- a/functions/install_server_files.sh +++ /dev/null @@ -1,110 +0,0 @@ -#!/bin/bash -# LGSM install_server_files.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="270216" - -local modulename="Install" - -fn_install_server_files(){ -if [ "${gamename}" == "Unreal Tournament 99" ]; then - fileurl="http://gameservermanagers.com/files/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut99-server-451-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" -elif [ "${gamename}" == "Unreal Tournament 2004" ]; then - fileurl="http://gameservermanagers.com/files/UnrealTournament2004/ut2004-server-3339-ultimate-linux.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="ut2004-server-3339-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" -fi -fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" -fn_dl_extract "${filedir}" "${filename}" "${filesdir}" -} - -fn_install_server_files_steamcmd(){ -counter="0" -while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do - counter=$((counter+1)) - cd "${rootdir}/steamcmd" - if [ "${counter}" -le "10" ]; then - # Attempt 1-4: Standard attempt - # Attempt 5-6: Validate attempt - # Attempt 7-8: Validate, delete long name dir - # Attempt 9-10: Validate, delete long name dir, re-download SteamCMD - # Attempt 11: Failure - - if [ "${counter}" -ge "2" ]; then - fn_print_warning_nl "SteamCMD did not complete the download, retrying: Attempt ${counter}" - fn_scriptlog "SteamCMD did not complete the download, retrying: Attempt ${counter}" - fi - - if [ "${counter}" -ge "7" ]; then - echo "Removing $(find ${filesdir} -type d -print0 | grep -Ez '[^/]{30}$')" - find ${filesdir} -type d -print0 | grep -Ez '[^/]{30}$' | xargs -0 rm -rf - fi - if [ "${counter}" -ge "9" ]; then - rm -rf "${rootdir}/steamcmd" - check_steamcmd.sh - fi - - # Detects if unbuffer command is available. - if [ $(command -v unbuffer) ]; then - unbuffer=unbuffer - fi - - if [ "${counter}" -le "4" ]; then - if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" +quit - local exitcode=$? - else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" +quit - local exitcode=$? - fi - elif [ "${counter}" -ge "5" ]; then - if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -validate +quit - local exitcode=$? - else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" -validate +quit - local exitcode=$? - fi - fi - elif [ "${counter}" -ge "11" ]; then - fn_print_failure_nl "SteamCMD did not complete the download, too many retrys" - fn_scriptlog "SteamCMD did not complete the download, too many retrys" - break - fi -done - -# Goldsource servers commonly fail to download all the server files required. -# Validating a few of times may reduce the chance of this issue. -if [ "${engine}" == "goldsource" ]; then - fn_print_infomation_nl "Goldsource servers commonly fail to download all the server files required. Validating a few of times may reduce the chance of this issue." - counter="0" - while [ "${counter}" -le "4" ]; do - counter=$((counter+1)) - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" -validate +quit - local exitcode=$? - done -fi -} - -echo "" -echo "Installing ${gamename} Server" -echo "=================================" -sleep 1 -if [ -n "${appid}" ]; then - fn_install_server_files_steamcmd -fi - -if [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]; then - fn_install_server_files -fi - -if [ -z "${autoinstall}" ]; then - echo "" - echo "=================================" - while true; do - read -e -i "y" -p "Was the install successful? [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) install_retry.sh;; - * ) echo "Please answer yes or no.";; - esac - done -fi \ No newline at end of file diff --git a/functions/install_steamcmd.sh b/functions/install_steamcmd.sh deleted file mode 100644 index de371bbd8..000000000 --- a/functions/install_steamcmd.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# LGSM install_steamcmd.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -# Description: Downloads SteamCMD on install. - -local modulename="Install" - -echo "" -echo "Installing SteamCMD" -echo "=================================" -sleep 1 -check_steamcmd.sh diff --git a/functions/install_ts3.sh b/functions/install_ts3.sh deleted file mode 100644 index 5cf2f0f85..000000000 --- a/functions/install_ts3.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/bash -# LGSM install_ts3.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -local modulename="Install" - -info_distro.sh -# Gets the teamspeak server architecture -if [ "${arch}" == "x86_64" ]; then - ts3arch="amd64" -elif [ "${arch}" == "i386" ]||[ "${arch}" == "i686" ]; then - ts3arch="x86" -else - fn_print_failure "${arch} is an unsupported architecture" - exit 1 -fi - -# Grabs all version numbers but not in correct order -wget "http://dl.4players.de/ts/releases/?C=M;O=D" -q -O -| grep -i dir | egrep -o '.*\/<\/a>' | egrep -o '[0-9\.?]+'|uniq > .ts3_version_numbers_unsorted.tmp - -# Replaces dots with spaces to split up the number. e.g 3 0 12 1 is 3.0.12.1 this allows correct sorting - cat .ts3_version_numbers_unsorted.tmp | tr "." " " > .ts3_version_numbers_digit.tmp -# Sorts versions in to correct order -# merges 2 files and orders by each column in order allowing these version numbers to be sorted in order -paste .ts3_version_numbers_digit.tmp .ts3_version_numbers_unsorted.tmp | awk '{print $1,$2,$3,$4 " " $0;}'| sort -k1rn -k2rn -k3rn -k4rn | awk '{print $NF}' > .ts3_version_numbers.tmp - -# Finds directory with most recent server version. -while read ts3_version_number; do - wget --spider -q "http://dl.4players.de/ts/releases/${ts3_version_number}/teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" - if [ $? -eq 0 ]; then - availablebuild="${ts3_version_number}" - # Break while-loop, if the latest release could be found - break - fi -done < .ts3_version_numbers.tmp - -# tidy up -rm -f ".ts3_version_numbers_digit.tmp" -rm -f ".ts3_version_numbers_unsorted.tmp" -rm -f ".ts3_version_numbers.tmp" - -# Checks availablebuild info is available -if [ -z "${availablebuild}" ]; then - fn_print_fail "Checking for update: teamspeak.com" - sleep 1 - fn_print_fail "Checking for update: teamspeak.com: Not returning version info" - sleep 2 - exit 1 -fi - -cd "${rootdir}" -echo -e "downloading teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2...\c" -wget -N /dev/null http://dl.4players.de/ts/releases/${ts3_version_number}/teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2 2>&1 | grep -F HTTP | cut -c45-| uniq -sleep 1 -echo -e "extracting teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2...\c" -tar -xf "teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" 2> ".${servicename}-tar-error.tmp" -local status=$? -if [ ${status} -eq 0 ]; then - echo "OK" -else - echo "FAIL - Exit status ${status}" - sleep 1 - cat ".${servicename}-tar-error.tmp" - rm ".${servicename}-tar-error.tmp" - exit $? -fi -echo -e "copying to ${filesdir}...\c" -cp -R "${rootdir}/teamspeak3-server_linux_${ts3arch}/"* "${filesdir}" 2> ".${servicename}-cp-error.tmp" -local status=$? -if [ ${status} -eq 0 ]; then - echo "OK" -else - echo "FAIL - Exit status ${status}" - sleep 1 - cat ".${servicename}-cp-error.tmp" - rm ".${servicename}-cp-error.tmp" - exit $? -fi -rm -f "teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" -rm -rf "${rootdir}/teamspeak3-server_linux_${ts3arch}" diff --git a/functions/install_ts3db.sh b/functions/install_ts3db.sh deleted file mode 100644 index 61e2db7d4..000000000 --- a/functions/install_ts3db.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash -# LGSM fn_install_ts3_mariadb function -# Author: Daniel Gibbs -# Contributor: PhilPhonic -# Website: http://gameservermanagers.com -lgsm_version="271215" - -local modulename="Install" - -fn_install_ts3db_mariadb(){ - echo "" - echo "checking if libmariadb2 is installed" - echo "=================================" - sleep 1 - ldd ${filesdir}/libts3db_mariadb.so | grep "libmariadb.so.2 => not found" - if [ $? -eq 0 ]; then - echo "libmariadb2 not installed. Please install it first." - echo "exiting..." - exit - else - echo "libmariadb2 installed." - fi - echo "" - echo "Configuring ${gamename} Server for MariaDB/MySQL" - echo "=================================" - sleep 1 - read -p "Enter MariaDB hostname: " mariahostname - read -p "Enter MariaDB port: " mariaport - read -p "Enter MariaDB username: " mariausername - read -p "Enter MariaDB password: " mariapassword - read -p "Enter MariaDB database name: " mariadbname - echo "updating config." - echo "[config]" >> ${servercfgdir}/ts3db_mariadb.ini - echo "host='${mariahostname}'" >> ${servercfgdir}/ts3db_mariadb.ini - echo "port='${mariaport}'" >> ${servercfgdir}/ts3db_mariadb.ini - echo "username='${mariausername}'" >> ${servercfgdir}/ts3db_mariadb.ini - echo "password='${mariapassword}'" >> ${servercfgdir}/ts3db_mariadb.ini - echo "database='${mariadbname}'" >> ${servercfgdir}/ts3db_mariadb.ini - echo "socket=" >> ${servercfgdir}/ts3db_mariadb.ini - sed -i "s/dbplugin=ts3db_sqlite3/dbplugin=ts3db_mariadb/g" "${servercfgfullpath}" - sed -i "s/dbpluginparameter=/dbpluginparameter=ts3db_mariadb.ini/g" "${servercfgfullpath}" - sed -i "s/dbsqlcreatepath=create_sqlite\//dbsqlcreatepath=create_mariadb\//g" "${servercfgfullpath}" - echo "=================================" - sleep 1 -} - -if [ -z "${autoinstall}" ]; then - echo "" - while true; do - read -e -i "n" -p "Do you want to use MariaDB/MySQL instead of sqlite (Database Server including user and database already has to be set up!)? [y/N]" yn - case $yn in - [Yy]* ) fn_install_ts3db_mariadb && break;; - [Nn]* ) break;; - * ) echo "Please answer yes or no.";; - esac - done -else -fn_print_warning_nl "./${selfname} auto-install is uses sqlite. For MariaDB/MySQL use ./${selfname} install" -fi - -## Get privilege key -echo "" -echo "Getting privilege key" -echo "=================================" -sleep 1 -echo "IMPORANT! Save these details for later." -sleep 1 -cd "${executabledir}" -./ts3server_startscript.sh start inifile=ts3-server.ini -sleep 5 -./ts3server_startscript.sh stop diff --git a/functions/install_ut2k4_key.sh b/functions/install_ut2k4_key.sh deleted file mode 100644 index 53b603de1..000000000 --- a/functions/install_ut2k4_key.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -# LGSM install_ut2k4_key.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -local modulename="Install" - -echo "" -echo "Enter ${gamename} CD Key" -echo "=================================" -sleep 1 -echo "To get your server listed on the Master Server list" -echo "you must get a free CD key. Get a key here:" -echo "http://www.unrealtournament.com/ut2004server/cdkey.php" -echo "" -if [ -z "${autoinstall}" ]; then - echo "Once you have the key enter it below" - echo -n "KEY: " - read CODE - echo ""\""CDKey"\""="\""${CODE}"\""" > "${systemdir}/cdkey" - if [ -f "${systemdir}/cdkey" ]; then - fn_scriptlog "UT2K4 Server CD Key created" -else - echo "You can add your key using the following command" - echo "./${selfname} server-cd-key" -fi -echo "" \ No newline at end of file diff --git a/functions/logs.sh b/functions/logs.sh deleted file mode 100644 index 30de59ea7..000000000 --- a/functions/logs.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash -# LGSM logs.sh function -# Author: Daniel Gibbs -# Contributor: UltimateByte -# Website: http://gameservermanagers.com -lgsm_version="230216" - -# Description: Acts as a log rotater, removing old logs. - -local modulename="Log Manager" - -# Check if logfile variable and file exist, create logfile if it doesn't exist -if [ -n "${consolelog}" ]; then - if [ ! -e "${consolelog}" ]; then - touch "${consolelog}" - fi -fi - -# For games not displaying a console, and having logs into their game folder -if [ -n "${gamelogfile}" ]; then - if [ -n "$(find "${systemdir}" -name "gamelog*.log")" ]; then - fn_printinfo "Moving game logs to ${gamelogdir}" - fn_scriptlog "Moving game logs to ${gamelogdir}" - echo -en "\n" - sleep 1 - mv "${systemdir}"/gamelog*.log "${gamelogdir}" - fi -fi - -# Log manager will start the cleanup if it finds logs older than "${logdays}" -if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; then - fn_print_dots "Starting" - # Set addon logs directories - sourcemodlogdir="${systemdir}/addons/sourcemod/logs" - ulxlogdir="${systemdir}/data/ulx_logs" - darkrplogdir="${systemdir}/data/darkrp_logs" - legacyserverlogdir="${rootdir}/log/server" - # Setting up counting variables - scriptcount="0" ; consolecount="0" ; gamecount="0" ; srcdscount="0" ; smcount="0" ; ulxcount="0" ; darkrpcount="0" ; legacycount="0" - sleep 1 - fn_print_ok_nl "Starting" - fn_scriptlog "Starting" - fn_print_info_nl "Removing logs older than "${logdays}" days" - fn_scriptlog "Removing logs older than "${logdays}" days" - # Logging logfiles to be removed according to "${logdays}", counting and removing them - # Script logfiles - find "${scriptlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" - scriptcount=$(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) - find "${scriptlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; - # SRCDS and unreal logfiles - if [ "${engine}" == "unreal2" ]||[ "${engine}" == "source" ]; then - find "${gamelogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" - gamecount=$(find "${gamelogdir}"/ -type f -mtime +"${logdays}"|wc -l) - find "${gamelogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; - fi - # Console logfiles - if [ -n "${consolelog}" ]; then - find "${consolelogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" - consolecount=$(find "${consolelogdir}"/ -type f -mtime +"${logdays}"|wc -l) - find "${consolelogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; - fi - # Source addons logfiles - if [ "${engine}" == "source" ]; then - # SourceMod logfiles - if [ -d "${sourcemodlogdir}" ]; then - find "${sourcemodlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" - smcount=$(find "${sourcemodlogdir}"/ -type f -mtime +"${logdays}"|wc -l) - find "${sourcemodlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; - fi - # Garry's Mod logfiles - if [ "${gamename}" == "Garry's Mod" ]; then - # ULX logfiles - if [ -d "${ulxlogdir}" ]; then - find "${ulxlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" - ulxcount=$(find "${ulxlogdir}"/ -type f -mtime +"${logdays}"|wc -l) - find "${ulxlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; - fi - # DarkRP logfiles - if [ -d "${darkrplogdir}" ]; then - find "${darkrplogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" - darkrpcount=$(find "${darkrplogdir}"/ -type f -mtime +"${logdays}"|wc -l) - find "${darkrplogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; - fi - fi - fi - # Legacy support - if [ -d "${legacyserverlogdir}" ]; then - find "${legacyserverlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" - legacycount=$(find "${legacyserverlogdir}"/ -type f -mtime +"${logdays}"|wc -l) - find "${legacyserverlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; - # Remove folder if empty - if [ ! "$(ls -A "${legacyserverlogdir}")" ]; then - rm -rf "${legacyserverlogdir}" - fi - fi - - # Count total amount of files removed - count=$((${scriptcount} + ${consolecount} + ${gamecount} + ${srcdscount} + ${smcount} + ${ulxcount} + ${darkrpcount} + ${legacycount})) - # Job done - fn_print_ok_nl "Removed ${count} log files" - fn_scriptlog "Removed ${count} log files" -fi diff --git a/functions/monitor_gsquery.sh b/functions/monitor_gsquery.sh deleted file mode 100644 index 058351770..000000000 --- a/functions/monitor_gsquery.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash -# LGSM monitor_gsquery.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="270216" - -# Description: uses gsquery.py to query the server port. -# Detects if the server has frozen with the proccess still running. - -local modulename="Monitor" - -# Forces legecy servers to use gsquery as vat gsquery is not present in legecy -if [ -z "${gsquery}" ]; then - gsquery="yes" -fi - -if [ "${gsquery}" == "yes" ]; then - - # Downloads gsquery.py if missing - if [ ! -f "${functionsdir}/gsquery.py" ]; then - fn_fetch_file_github "functions" "gsquery.py" "${functionsdir}" "executecmd" "norun" "noforce" "nomd5" - fi - - info_config.sh - - if [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then - port=$((port + 1)) - elif [ "${engine}" == "spark" ]; then - port=$((port + 1)) - fi - - if [ -z "${queryport}" ]; then - port="${queryport}" - fi - - fn_print_info "Querying port: gsquery.py enabled" - fn_scriptlog "Querying port: gsquery.py enabled" - sleep 1 - - # Will query up to 4 times every 15 seconds. - # Servers changing map can return a failure. - # Will Wait up to 60 seconds to confirm server is down giving server time to change map. - totalseconds=0 - for queryattempt in {1..5}; do - fn_print_dots "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : " - fn_print_querying_eol - fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : QUERYING" - - gsquerycmd=$("${functionsdir}"/gsquery.py -a "${ip}" -p 1 -e "${engine}" 2>&1) - exitcode=$? - - sleep 1 - if [ "${exitcode}" == "0" ]; then - # Server OK - fn_print_ok "Querying port: ${ip}:${port} : ${queryattempt} : " - fn_print_ok_eol - fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : OK" - sleep 1 - exit - else - # Server failed query - fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : ${gsquerycmd}" - - if [ "${queryattempt}" == "5" ]; then - # Server failed query 4 times confirmed failure - fn_print_fail "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : " - fn_print_fail_eol_nl - fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : FAIL" - sleep 1 - - # Send email notification if enabled - if [ "${emailnotification}" == "on" ]; then - subject="${servicename} Monitor - Starting ${servername}" - failurereason="Failed to query ${servicename}: ${gsquerycmd}" - actiontaken="restarted ${servicename}" - email.sh - fi - fn_restart - break - fi - - # Seconds counter - for seconds in {1..15}; do - fn_print_fail "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : \e[0;31m${gsquerycmd}\e[0m" - totalseconds=$((totalseconds + 1)) - sleep 1 - if [ "${seconds}" == "15" ]; then - break - fi - done - fi - done -fi \ No newline at end of file diff --git a/functions/update_check.sh b/functions/update_check.sh deleted file mode 100644 index 579a84f4b..000000000 --- a/functions/update_check.sh +++ /dev/null @@ -1,326 +0,0 @@ -#!/bin/bash -# LGSM update_check.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="060216" - -# Description: Checks if a server update is available. - -local modulename="Update" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -### SteamCMD Update Checker ### - -fn_appmanifestinfo(){ - appmanifestfile=$(find "${filesdir}" -type f -name "appmanifest_${appid}.acf") - appmanifestfilewc=$(find "${filesdir}" -type f -name "appmanifest_${appid}.acf"|wc -l) -} - -fn_appmanifestcheck(){ -fn_appmanifestinfo -# Multiple or no matching appmanifest files may sometimes be available. -# This is an error is corrected below if required. -if [ "${appmanifestfilewc}" -ge "2" ]; then - sleep 1 - fn_print_warn "Multiple appmanifest_${appid}.acf files found" - fn_scriptlog "Warning! Multiple appmanifest_${appid}.acf files found" - sleep 2 - fn_print_dots "Removing x${appmanifestfilewc} appmanifest_${appid}.acf files" - sleep 1 - for appfile in ${appmanifestfile}; do - rm "${appfile}" - done - appmanifestfilewc1="${appmanifestfilewc}" - fn_appmanifestinfo - if [ "${appmanifestfilewc}" -ge "2" ]; then - fn_print_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" - fn_scriptlog "Failure! Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" - sleep 1 - echo "" - echo " Check user permissions" - for appfile in ${appmanifestfile}; do - echo " ${appfile}" - done - exit 1 - else - sleep 1 - fn_print_ok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" - fn_scriptlog "Success! Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" - sleep 1 - fn_print_info_nl "Forcing update to correct issue" - fn_scriptlog "Forcing update to correct issue" - sleep 1 - update_dl.sh - update_check.sh - fi -elif [ "${appmanifestfilewc}" -eq "0" ]; then - if [ "${forceupdate}" == "1" ]; then - fn_print_fail "Still no appmanifest_${appid}.acf found: Unable to update" - fn_scriptlog "Warning! Still no appmanifest_${appid}.acf found: Unable to update" - exit 1 - fi - forceupdate=1 - fn_print_warn "No appmanifest_${appid}.acf found" - fn_scriptlog "Warning! No appmanifest_${appid}.acf found" - sleep 2 - fn_print_info_nl "Forcing update to correct issue" - fn_scriptlog "Forcing update to correct issue" - sleep 1 - update_dl.sh - update_check.sh -fi -} - -fn_logupdaterequest(){ -# Checks for server update requests from server logs. -fn_print_dots "Checking for update: Server logs" -fn_scriptlog "Checking for update: Server logs" -sleep 1 -requestrestart=$(grep -Ec "MasterRequestRestart" "${consolelog}") -if [ "${requestrestart}" -ge "1" ]; then - fn_print_ok_nl "Checking for update: Server logs: Update requested" - sleep 1 - echo "" - echo -ne "Applying update.\r" - sleep 1 - echo -ne "Applying update..\r" - sleep 1 - echo -ne "Applying update...\r" - sleep 1 - echo -ne "\n" - tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") - unset updateonstart - if [ "${tmuxwc}" -eq 1 ]; then - command_stop.sh - update_dl.sh - command_start.sh - else - update_dl.sh - fi -else - fn_print_ok "Checking for update: Server logs: No update requested" - sleep 1 -fi -} - -fn_steamcmdcheck(){ -fn_appmanifestcheck -# Checks for server update from SteamCMD -fn_print_dots "Checking for update: SteamCMD" -fn_scriptlog "Checking for update: SteamCMD" -sleep 1 - -# Gets currentbuild -currentbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) - -# Removes appinfo.vdf as a fix for not always getting up to date version info from SteamCMD - -# Gets availablebuild info -cd "${rootdir}/steamcmd" -if [ -f "${HOME}/Steam/appcache/appinfo.vdf" ]; then - rm -f "${HOME}/Steam/appcache/appinfo.vdf" -fi -availablebuild=$(./steamcmd.sh +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +app_info_print "${appid}" +quit | grep -EA 1000 "^\s+\"branches\"$" | grep -EA 5 "^\s+\"public\"$" | grep -m 1 -EB 10 "^\s+}$" | grep -E "^\s+\"buildid\"\s+" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) -if [ -z "${availablebuild}" ]; then - fn_print_fail "Checking for update: SteamCMD" - fn_scriptlog "Failure! Checking for update: SteamCMD" - sleep 1 - fn_print_fail_nl "Checking for update: SteamCMD: Not returning version info" - fn_scriptlog "Failure! Checking for update: SteamCMD: Not returning version info" - exit 1 -else - fn_print_ok "Checking for update: SteamCMD" - fn_scriptlog "Success! Checking for update: SteamCMD" - sleep 1 -fi - -if [ "${currentbuild}" != "${availablebuild}" ]; then - echo -e "\n" - echo -e "Update available:" - sleep 1 - echo -e " Current build: \e[0;31m${currentbuild}\e[0;39m" - echo -e " Available build: \e[0;32m${availablebuild}\e[0;39m" - echo -e "" - echo -e " https://steamdb.info/app/${appid}/" - sleep 1 - echo "" - echo -en "Applying update.\r" - sleep 1 - echo -en "Applying update..\r" - sleep 1 - echo -en "Applying update...\r" - sleep 1 - echo -en "\n" - fn_scriptlog "Update available" - fn_scriptlog "Current build: ${currentbuild}" - fn_scriptlog "Available build: ${availablebuild}" - fn_scriptlog "${currentbuild} > ${availablebuild}" - - tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") - unset updateonstart - if [ "${tmuxwc}" -eq 1 ]; then - command_stop.sh - update_dl.sh - command_start.sh - else - update_dl.sh - fi -else - echo -e "\n" - echo -e "No update available:" - echo -e " Current version: \e[0;32m${currentbuild}\e[0;39m" - echo -e " Available version: \e[0;32m${availablebuild}\e[0;39m" - echo -e " https://steamdb.info/app/${appid}/" - echo -e "" - fn_print_ok_nl "No update available" - fn_scriptlog "Current build: ${currentbuild}" - fn_scriptlog "Available build: ${availablebuild}" -fi -} - -### END SteamCMD Update Checker ### - -fn_teamspeak3_check(){ -# Checks for server update from teamspeak.com using a mirror dl.4players.de -fn_print_dots "Checking for update: teamspeak.com" -fn_scriptlog "Checking for update: teamspeak.com" -sleep 1 - -# Gets currentbuild info -# Checks currentbuild info is available, if fails a server restart will be forced to generate logs -if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then - fn_print_fail "Checking for update: teamspeak.com" - sleep 1 - fn_print_fail_nl "Checking for update: teamspeak.com: No logs with server version found" - fn_scriptlog "Failure! Checking for update: teamspeak.com: No logs with server version found" - sleep 2 - fn_print_info_nl "Checking for update: teamspeak.com: Forcing server restart" - fn_scriptlog "Checking for update: teamspeak.com: Forcing server restart" - sleep 2 - command_stop.sh - command_start.sh - sleep 2 - # If still failing will exit - if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then - fn_print_fail_nl "Checking for update: teamspeak.com: Still No logs with server version found" - fn_scriptlog "Failure! Checking for update: teamspeak.com: Still No logs with server version found" - exit 1 - fi -fi -currentbuild=$(cat $(find ./* -name 'ts3server*_0.log' 2> /dev/null | sort | egrep -E -v '${rootdir}/.ts3version' | tail -1) | egrep -o 'TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}' | egrep -o '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') - -# Gets the teamspeak server architecture -info_distro.sh -if [ "${arch}" == "x86_64" ]; then - ts3arch="amd64" -elif [ "${arch}" == "i386" ]||[ "${arch}" == "i686" ]; then - ts3arch="x86" -else - echo "" - fn_print_failure "${arch} is an unsupported architecture" - exit 1 -fi - -# Gets availablebuild info - -# Grabs all version numbers but not in correct order -wget "http://dl.4players.de/ts/releases/?C=M;O=D" -q -O -| grep -i dir | egrep -o '.*\/<\/a>' | egrep -o '[0-9\.?]+'|uniq > .ts3_version_numbers_unsorted.tmp - -# Sort version numbers -cat .ts3_version_numbers_unsorted.tmp | sort -r --version-sort -o .ts3_version_numbers_sorted.tmp - -# Finds directory with most recent server version. -while read ts3_version_number; do - wget --spider -q "http://dl.4players.de/ts/releases/${ts3_version_number}/teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" - if [ $? -eq 0 ]; then - availablebuild="${ts3_version_number}" - # Break while-loop, if the latest release could be found - break - fi -done < .ts3_version_numbers_sorted.tmp - -# Tidy up -rm -f ".ts3_version_numbers_unsorted.tmp" -rm -f ".ts3_version_numbers_sorted.tmp" - -# Checks availablebuild info is available -if [ -z "${availablebuild}" ]; then - fn_print_fail "Checking for update: teamspeak.com" - fn_scriptlog "Checking for update: teamspeak.com" - sleep 1 - fn_print_fail "Checking for update: teamspeak.com: Not returning version info" - fn_scriptlog "Failure! Checking for update: teamspeak.com: Not returning version info" - sleep 2 - exit 1 -else - fn_print_ok "Checking for update: teamspeak.com" - fn_scriptlog "Success! Checking for update: teamspeak.com" - sleep 1 -fi - -# Removes dots so if can compare version numbers -currentbuilddigit=$(echo "${currentbuild}"|tr -cd '[:digit:]') -availablebuilddigit=$(echo "${availablebuild}"|tr -cd '[:digit:]') -if [ "${currentbuilddigit}" -ne "${availablebuilddigit}" ]; then - echo -e "\n" - echo -e "Update available:" - sleep 1 - echo -e " Current build: \e[0;31m${currentbuild} ${architecture}\e[0;39m" - echo -e " Available build: \e[0;32m${availablebuild} ${architecture}\e[0;39m" - echo -e "" - sleep 1 - echo "" - echo -en "Applying update.\r" - sleep 1 - echo -en "Applying update..\r" - sleep 1 - echo -en "Applying update...\r" - sleep 1 - echo -en "\n" - fn_scriptlog "Update available" - fn_scriptlog "Current build: ${currentbuild}" - fn_scriptlog "Available build: ${availablebuild}" - fn_scriptlog "${currentbuild} > ${availablebuild}" - unset updateonstart - info_ts3status.sh - if [ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then - update_dl.sh - command_start.sh - sleep 5 - command_stop.sh - else - command_stop.sh - update_dl.sh - command_start.sh - fi -else - echo -e "\n" - echo -e "No update available:" - echo -e " Current version: \e[0;32m${currentbuild}\e[0;39m" - echo -e " Available version: \e[0;32m${availablebuild}\e[0;39m" - echo -e "" - fn_print_ok_nl "No update available" - fn_scriptlog "Current build: ${currentbuild}" - fn_scriptlog "Available build: ${availablebuild}" -fi -} - -check.sh -fn_print_dots "Checking for update" -if [ "${gamename}" == "Teamspeak 3" ]; then - fn_teamspeak3_check -elif [ "${engine}" == "goldsource" ]||[ "${forceupdate}" == "1" ]; then - # Goldsource servers bypass checks as fn_steamcmdcheck does not work for appid 90 servers. - # forceupdate bypasses checks - tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") - if [ "${tmuxwc}" -eq 1 ]; then - command_stop.sh - update_dl.sh - command_start.sh - else - update_dl.sh - fi -else - fn_logupdaterequest - fn_steamcmdcheck -fi diff --git a/functions/update_dl.sh b/functions/update_dl.sh deleted file mode 100644 index f23bd2c64..000000000 --- a/functions/update_dl.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/bash -# LGSM update_dl.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="020216" - -# Description: Runs a server update. - -local modulename="Update" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -fn_steamcmd_dl(){ -cd "${rootdir}" -cd "steamcmd" - -# Detects if unbuffer command is available. -if [ $(command -v unbuffer) ]; then - unbuffer=unbuffer -fi - -if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" +quit| tee -a "${scriptlog}" -else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" +quit| tee -a "${scriptlog}" -fi - -fix.sh -} - -fn_teamspeak3_dl(){ -cd "${rootdir}" -echo -e "downloading teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2...\c" -fn_scriptlog "Downloading teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" -wget -N /dev/null http://dl.4players.de/ts/releases/${ts3_version_number}/teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2 2>&1 | grep -F HTTP | cut -c45-| uniq -sleep 1 -echo -e "extracting teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2...\c" -fn_scriptlog "Extracting teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" -tar -xf "teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" 2> "${scriptlogdir}/.${servicename}-tar-error.tmp" -local status=$? -if [ ${status} -eq 0 ]; then - echo "OK" -else - echo "FAIL - Exit status ${status}" - fn_scriptlog "Failed to extract - Exit status ${status}" - sleep 1 - cat "${scriptlogdir}/.${servicename}-tar-error.tmp" - cat "${scriptlogdir}/.${servicename}-tar-error.tmp" >> "${scriptlog}" - rm "${scriptlogdir}/.${servicename}-tar-error.tmp" - fn_scriptlog "Failure! Unable to update" - exit ${status} -fi -echo -e "copying to ${filesdir}...\c" -fn_scriptlog "Copying to ${filesdir}" -cp -R "${rootdir}/teamspeak3-server_linux_${ts3arch}/"* "${filesdir}" 2> "${scriptlogdir}/.${servicename}-cp-error.tmp" -local status=$? -if [ ${status} -eq 0 ]; then - echo "OK" -else - echo "FAIL - Exit status ${status}" - fn_scriptlog "Failed to copy - Exit status ${status}" - sleep 1 - cat "${scriptlogdir}/.${servicename}-cp-error.tmp" - cat "${scriptlogdir}/.${servicename}-cp-error.tmp" >> "${scriptlog}" - rm "${scriptlogdir}/.${servicename}-cp-error.tmp" - fn_scriptlog "Failure! Unable to update" - exit ${status} -fi -rm -f teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2 -rm -rf "${rootdir}/teamspeak3-server_linux_${ts3arch}" -} - -check.sh -info_config.sh -fn_print_dots "Updating ${servername}" -sleep 1 -fn_print_ok_nl "Updating ${servername}" -fn_scriptlog "Updating ${servername}" -sleep 1 -if [ "${gamename}" == "Teamspeak 3" ]; then - fn_teamspeak3_dl -else - fn_steamcmd_dl -fi diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 5fb446ddb..6ec515d00 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -636,7 +636,7 @@ fn_details_disk fn_details_gameserver fn_details_backup # Some game servers do not have parms. -if [ "${gamename}" != "Teamspeak 3" ]||[ "${engine}" != "avalanche" ]||[ "${engine}" != "dontstarve" ]||[ "${engine}" != "projectzomboid" ]; then +if [ "${gamename}" != "Teamspeak 3" ]&&[ "${engine}" != "avalanche" ]&&[ "${engine}" != "dontstarve" ]&&[ "${engine}" != "projectzomboid" ]; then fn_parms fn_details_commandlineparms fi diff --git a/lgsm/functions/monitor_gsquery.sh b/lgsm/functions/monitor_gsquery.sh index 058351770..7328ce724 100644 --- a/lgsm/functions/monitor_gsquery.sh +++ b/lgsm/functions/monitor_gsquery.sh @@ -18,7 +18,7 @@ if [ "${gsquery}" == "yes" ]; then # Downloads gsquery.py if missing if [ ! -f "${functionsdir}/gsquery.py" ]; then - fn_fetch_file_github "functions" "gsquery.py" "${functionsdir}" "executecmd" "norun" "noforce" "nomd5" + fn_fetch_file_github "lgsm/functions" "gsquery.py" "${functionsdir}" "executecmd" "norun" "noforce" "nomd5" fi info_config.sh From 703d3e59122d1e16216480d05492102fdb7cfbd0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 13 Mar 2016 01:01:35 +0000 Subject: [PATCH 132/434] added download for dabserver --- lgsm/functions/fix_glibc.sh | 42 +++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index b1ea50d4b..57edcea82 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -6,6 +6,48 @@ lgsm_version="020116" info_glibc.sh +# Blade Symphony +if [ "${gamename}" == "Blade Symphony" ]; then + : +# Dont Starve Together +elif [ "${gamename}" == "Don't Starve Together" ]; then + : +# Double Action: Boogaloo +elif [ "${gamename}" == "Double Action: Boogaloo" ]; then + fn_fetch_file_github "lgsm/lib/ubuntu12.04/i386" "libm.so.6" "${lgsmdir}/lib" "noexecutecmd" "norun" "noforce" "nomd5" + +# Fistful of Frags +elif [ "${gamename}" == "Fistful of Frags" ]; then + : +# Garry's Mod +elif [ "${gamename}" == "Garry's Mod" ]; then + : +# Insurgency +elif [ "${gamename}" == "Insurgency" ]; then + : +elif [ "${gamename}" == "Left 4 Dead" ]; then + : +# Natural Selection 2 +elif [ "${gamename}" == "Natural Selection 2" ]; then + : +# NS2: Combat +elif [ "${gamename}" == "NS2: Combat" ]; then + : +# No More Room in Hell +elif [ "${gamename}" == "No More Room in Hell" ]; then + : +# ARMA 3 +elif [ "${gamename}" == "ARMA 3" ]; then + : +# Just Cause 2 +elif [ "${gamename}" == "Just Cause 2" ]; then + : +# Serious Sam 3: BFE +elif [ "${gamename}" == "Serious Sam 3: BFE" ]; then + : +fi + + if [ "$(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1)" != "${glibc_required}" ]; then echo "Version $(ldd --version | sed -n '1s/.* //p') is lower than $glibc_required" if [ "${glibcfix}" == "yes" ]; then From c747136d1b6a4557386d3a524a93aa59e2e6efed Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 13 Mar 2016 01:04:41 +0000 Subject: [PATCH 133/434] Re adding functions for legacy --- functions/core_functions.sh | 454 ++++++++++++++++++++++++++++++++++ functions/fn_functions | 20 ++ functions/fn_getopt | 15 ++ functions/fn_update_functions | 22 ++ 4 files changed, 511 insertions(+) create mode 100644 functions/core_functions.sh create mode 100644 functions/fn_functions create mode 100644 functions/fn_getopt create mode 100644 functions/fn_update_functions diff --git a/functions/core_functions.sh b/functions/core_functions.sh new file mode 100644 index 000000000..8f59a57fb --- /dev/null +++ b/functions/core_functions.sh @@ -0,0 +1,454 @@ +#!/bin/bash +# LGSM core_functions.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="270216" + +# Description: Defines all functions to allow download and execution of functions using fn_fetch_function. +# This function is called first before any other function. Without this file other functions would not load. + +# Code/functions for legacy servers + +fn_functions(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fn_getopt(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +# fn_fetch_core_dl also placed here to allow legecy servers to still download core functions +if [ -z "${lgsmdir}" ]; then + lgsmdir="${rootdir}/lgsm" + functionsdir="${lgsmdir}/functions" +fi + +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then + if [ ! -d "${filedir}" ]; then + mkdir -p "${filedir}" + fi + echo -e " fetching ${filename}...\c" + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else + echo -e "\e[0;31mFAIL\e[0m\n" + echo "Curl is not installed!" + echo -e "" + exit 1 + fi + chmod +x "${filedir}/${filename}" +fi +source "${filedir}/${filename}" +} + + +# Core + +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +core_getopt.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +core_messages.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +core_dl.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +# Command + +command_console.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_debug.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_details.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_email_test.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_backup.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_monitor.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_start.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_stop.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_validate.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_install.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_fastdl.sh(){ +functionfile="${FUNCNAME}" +fn_runfunction +} + +command_ts3_server_pass.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fn_restart(){ +local modulename="Restarting" +info_config.sh +if [ -d "${scriptlogdir}" ]; then + fn_scriptlog "${servername}" +fi +command_stop.sh +command_start.sh +} + + +# Checks + +check.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_config.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_deps.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_ip.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_logs.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_root.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_steamcmd.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_system_dir.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +check_tmux.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# Compress + +compress_unreal2_maps.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +compress_ut99_maps.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# Dev + +command_dev_debug.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_dev_detect_deps.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# Fix + +fix.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_arma3.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_csgo.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_dst.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_ins.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_steamcmd.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_glibc.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_ro.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_kf.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_ut2k4.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# Info + +info_config.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +info_distro.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +info_glibc.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +info_ts3status.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# Email + +email.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +# Logs + +logs.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# Monitor + +monitor_gsquery.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +# Update + +update_check.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_update_functions.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +update_dl.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fn_update_functions.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + +# +## Installer functions +# + +fn_autoinstall(){ +autoinstall=1 +command_install.sh +} + +install_complete.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_config.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_gsquery.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_gslt.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_header.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_logs.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_retry.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_server_dir.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} +install_server_files.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_steamcmd.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_ts3.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_ts3db.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_ut2k4.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_dl_ut2k4.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +install_ut2k4_key.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fix_ut99.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +# Calls on-screen messages +core_messages.sh + +#Calls file downloader +core_dl.sh diff --git a/functions/fn_functions b/functions/fn_functions new file mode 100644 index 000000000..f6ea53f55 --- /dev/null +++ b/functions/fn_functions @@ -0,0 +1,20 @@ +#!/bin/bash +# LGSM core_functions.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +# Description: Redirect to new core_functions.sh + +core_functions.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_runfunction +} + +core_getopt.sh(){ +functionfile="${FUNCNAME}" +fn_runfunction +} + +core_functions.sh \ No newline at end of file diff --git a/functions/fn_getopt b/functions/fn_getopt new file mode 100644 index 000000000..8b52e1865 --- /dev/null +++ b/functions/fn_getopt @@ -0,0 +1,15 @@ +#!/bin/bash +# LGSM core_getopt.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="271215" + +# Description: Redirect to new core_getopt.sh + +core_getopt.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_runfunction +} + +core_getopt.sh \ No newline at end of file diff --git a/functions/fn_update_functions b/functions/fn_update_functions new file mode 100644 index 000000000..5fbb28975 --- /dev/null +++ b/functions/fn_update_functions @@ -0,0 +1,22 @@ +#!/bin/bash +# LGSM fn_update_functions.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="230116" + +# Description: LEGACY FUNCTION Deletes the functions dir to allow re-downloading of functions from GitHub. + +fn_print_dots "Updating functions" +fn_scriptlog "Updating functions" +sleep 1 +echo -ne "\n" +rm -rfv "${rootdir}/functions/"* +exitcode=$? +if [ "${exitcode}" == "0" ]; then + fn_print_ok "Updating functions" + fn_scriptlog "Success! Updating functions" +else + fn_print_fail "Updating functions" + fn_scriptlog "Failure! Updating functions" +fi +echo -ne "\n" \ No newline at end of file From 9bdb3f44d5f6ef02b77933447895b8974f87c1dd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 13 Mar 2016 01:07:59 +0000 Subject: [PATCH 134/434] added libdir --- functions/core_functions.sh | 1 + lgsm/functions/core_functions.sh | 1 + lgsm/functions/fix_glibc.sh | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/functions/core_functions.sh b/functions/core_functions.sh index 8f59a57fb..d4993d256 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -23,6 +23,7 @@ fn_fetch_function if [ -z "${lgsmdir}" ]; then lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" + libdir="${lgsmdir}/lib" fi fn_fetch_core_dl(){ diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 8f59a57fb..d4993d256 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -23,6 +23,7 @@ fn_fetch_function if [ -z "${lgsmdir}" ]; then lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" + libdir="${lgsmdir}/lib" fi fn_fetch_core_dl(){ diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index 57edcea82..7b6fef81d 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -52,7 +52,7 @@ if [ "$(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1)" != echo "Version $(ldd --version | sed -n '1s/.* //p') is lower than $glibc_required" if [ "${glibcfix}" == "yes" ]; then echo "applied glibc fix" - echo "export LD_LIBRARY_PATH=:"${lgsmdir}/lib/ubuntu12.04/i386"" + echo "export LD_LIBRARY_PATH=:"${libdir}" export LD_LIBRARY_PATH=:"${lgsmdir}/lib/ubuntu12.04/i386" else echo "no glibc fix available you need to upgrade bro!!" From f06f2fad24c944896f14c73f5da07292387bea0e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 13 Mar 2016 01:09:36 +0000 Subject: [PATCH 135/434] bug fix --- lgsm/functions/fix_glibc.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index 7b6fef81d..8b6a992bf 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -52,8 +52,8 @@ if [ "$(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1)" != echo "Version $(ldd --version | sed -n '1s/.* //p') is lower than $glibc_required" if [ "${glibcfix}" == "yes" ]; then echo "applied glibc fix" - echo "export LD_LIBRARY_PATH=:"${libdir}" - export LD_LIBRARY_PATH=:"${lgsmdir}/lib/ubuntu12.04/i386" + echo "export LD_LIBRARY_PATH=:${libdir}" + export LD_LIBRARY_PATH=:"${libdir}" else echo "no glibc fix available you need to upgrade bro!!" fi From a7f5af8c8581a54c72b5c0b7356f940689c75688 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 14 Mar 2016 21:53:57 +0000 Subject: [PATCH 136/434] new glibcfix --- lgsm/functions/fix_glibc.sh | 68 ++++++++++++++----------------------- 1 file changed, 25 insertions(+), 43 deletions(-) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index 8b6a992bf..77aa852de 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -4,58 +4,40 @@ # Website: http://gameservermanagers.com lgsm_version="020116" +# Description: Downloads required glibc files and applys teh glibc fix if required + info_glibc.sh -# Blade Symphony -if [ "${gamename}" == "Blade Symphony" ]; then - : -# Dont Starve Together -elif [ "${gamename}" == "Don't Starve Together" ]; then - : -# Double Action: Boogaloo -elif [ "${gamename}" == "Double Action: Boogaloo" ]; then - fn_fetch_file_github "lgsm/lib/ubuntu12.04/i386" "libm.so.6" "${lgsmdir}/lib" "noexecutecmd" "norun" "noforce" "nomd5" -# Fistful of Frags -elif [ "${gamename}" == "Fistful of Frags" ]; then - : -# Garry's Mod -elif [ "${gamename}" == "Garry's Mod" ]; then - : -# Insurgency -elif [ "${gamename}" == "Insurgency" ]; then - : -elif [ "${gamename}" == "Left 4 Dead" ]; then - : -# Natural Selection 2 -elif [ "${gamename}" == "Natural Selection 2" ]; then - : -# NS2: Combat -elif [ "${gamename}" == "NS2: Combat" ]; then - : -# No More Room in Hell -elif [ "${gamename}" == "No More Room in Hell" ]; then - : -# ARMA 3 -elif [ "${gamename}" == "ARMA 3" ]; then - : -# Just Cause 2 -elif [ "${gamename}" == "Just Cause 2" ]; then - : -# Serious Sam 3: BFE -elif [ "${gamename}" == "Serious Sam 3: BFE" ]; then - : -fi +local libstdc_servers_array=( "ARMA 3" "Blade Symphony" "Garry's Mod" "Just Cause 2" ) +for libstdc_server in "${libstdc_servers_array[@]}" +do + if [ "${gamename}" == "${libstdc_server}" ]; then + fn_fetch_file_github "lgsm/lib/ubuntu12.04/i386" "libstdc++.so.6" "${lgsmdir}/lib" "noexecutecmd" "norun" "noforce" "nomd5" + fi +done + +local libm_servers_array=( "Double Action: Boogaloo" "Fistful of Frags" "Insurgency" "Natural Selection 2" "NS2: Combat" "No More Room in Hell" ) +for libm_server in "${libm_servers_array[@]}" +do + if [ "${gamename}" == "${libm_server}" ]; then + fn_fetch_file_github "lgsm/lib/ubuntu12.04/i386" "libm.so.6" "${lgsmdir}/lib" "noexecutecmd" "norun" "noforce" "nomd5" + fi +done +glibc_version="$(ldd --version | sed -n '1s/.* //p')" if [ "$(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1)" != "${glibc_required}" ]; then - echo "Version $(ldd --version | sed -n '1s/.* //p') is lower than $glibc_required" if [ "${glibcfix}" == "yes" ]; then - echo "applied glibc fix" - echo "export LD_LIBRARY_PATH=:${libdir}" + fn_print_info_nl "Glibc fix: Using Glibc fix" + echo " * glibc required: $glibc_required" + echo " * glibc installed: $glibc_version" export LD_LIBRARY_PATH=:"${libdir}" else - echo "no glibc fix available you need to upgrade bro!!" + fn_print_warn_nl "Glibc fix: No Glibc fix available!" + echo " * glibc required: $glibc_required" + echo " * glibc installed: $glibc_version" + fn_print_infomation "The game server is unlikly to work. A distro upgrade is required" fi else echo "GLIBC is OK no fix required" From fe1c90f3afbce2a5f3258605ff5de64f81249ac3 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:07:11 +0100 Subject: [PATCH 137/434] New fetching system --- 7DaysToDie/sdtdserver | 74 +++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index 6a4bd3d39..1828f34a2 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -81,57 +81,63 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 core_getopt.sh - From 5005937f2d779393c48dc6a3af3162ade5a47e0a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:08:23 +0100 Subject: [PATCH 138/434] New fetching system --- ARKSurvivalEvolved/arkserver | 71 ++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 2304ef566..0fce5234e 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -77,55 +77,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 914b2d495a326928c33a6427e2879c5745516999 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:08:45 +0100 Subject: [PATCH 139/434] New fetching system --- Arma3/arma3server | 71 ++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/Arma3/arma3server b/Arma3/arma3server index ff296e3bc..daaf779ad 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -100,55 +100,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 6b0490c403bd6c3f9b62e7cd69f9f9539ce52dd4 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:09:04 +0100 Subject: [PATCH 140/434] New fetching system --- BlackMesa/bmdmserver | 71 ++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index d31b067fc..7561a3b7d 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -88,55 +88,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 73b2e860aeab2713fdeec3a5e0f608001c03a719 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:09:22 +0100 Subject: [PATCH 141/434] New fetching system --- BladeSymphony/bsserver | 71 +++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index 87f1ff2ee..5cc52d6ec 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 3bb27036acbb8031e240b95cdcf11bbef8fd2dda Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:23:47 +0100 Subject: [PATCH 142/434] New fetching system --- BrainBread2/bb2server | 73 ++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index df17a46f9..b0e4ba6b1 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="090116" +version="150316" #### Variables #### @@ -88,55 +88,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 90af7db737cab373a13c0c65d50b2c89dff70d53 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:23:49 +0100 Subject: [PATCH 143/434] New fetching system --- CodenameCURE/ccserver | 73 ++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index a80d57b2d..5d770df13 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 0f41353277d6c8316e30c0b8190e033a86f843bc Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:23:52 +0100 Subject: [PATCH 144/434] New fetching system --- CounterStrike/csserver | 73 +++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/CounterStrike/csserver b/CounterStrike/csserver index 4fa7104d8..b65b13cd3 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From da57ee44007d1cb67eaed3b6530e8f58a26e9ef2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:23:55 +0100 Subject: [PATCH 145/434] New fetching system --- CounterStrikeConditionZero/csczserver | 73 +++++++++++++++------------ 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index a6eca599c..0b01c5b00 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From c9b1de51a671b1305fd426a6052fe71ae096acbb Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:23:58 +0100 Subject: [PATCH 146/434] New fetching system --- CounterStrikeGlobalOffensive/csgoserver | 73 ++++++++++++++----------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 64c2b0993..550e27d69 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -106,55 +106,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 8404d922cc6282f2fd05b3e72bc12711db294182 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:24:03 +0100 Subject: [PATCH 147/434] New fetching system --- CounterStrikeSource/cssserver | 73 +++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index 3efde2766..e2f21f407 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From b8f210b8e994a0b93e67202b3344878f9f75ac2e Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:24:06 +0100 Subject: [PATCH 148/434] New fetching system --- DayOfDefeat/dodserver | 73 ++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index 88ea3b92a..3eb74a1cf 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 5300dec2c0b1136f1c81a84ca10f5b1f95a2dff7 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:24:09 +0100 Subject: [PATCH 149/434] New fetching system --- DayOfDefeatSource/dodsserver | 73 ++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 5d80d01b0..f1b71c23c 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From ab61d08c711cbe89b826565b045f7d5719ddfd3c Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:24:12 +0100 Subject: [PATCH 150/434] New fetching system --- DeathmatchClassic/dmcserver | 73 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index 0b9efa02a..708433aff 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 470003dcf0b5ec21180390c55d7197293262a20c Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:24:17 +0100 Subject: [PATCH 151/434] New fetching system --- DontStarveTogether/dstserver | 73 ++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index f6b0afe42..74a1761a4 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -81,55 +81,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 0e5feb8ec3a65a735e1aa8f19706d4ee59452736 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:24:20 +0100 Subject: [PATCH 152/434] New fetching system --- DoubleActionBoogaloo/dabserver | 73 +++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 1887682e9..5b55e7838 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 6b5455397cfbd5513d114bda2fd35d87c36be267 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:24:22 +0100 Subject: [PATCH 153/434] New fetching system --- FistfulOfFrags/fofserver | 73 ++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index eaa85694f..94f4e3fb3 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 7ccb5efbe4253eaf5dec6c0568c4ab43572283b7 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:24:26 +0100 Subject: [PATCH 154/434] New fetching system --- GarrysMod/gmodserver | 73 ++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index 4e62e63a5..8ae8c6a1f 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="190216" +version="150316" #### Variables #### @@ -95,55 +95,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 78b459272e04a4b64c07bee9aade55f523057fe2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:24:29 +0100 Subject: [PATCH 155/434] New fetching system --- GoldenEyeSource/gesserver | 76 +++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index f473dcc57..afe6a9f09 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -6,11 +6,10 @@ if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" - set -x fi -version="271215" +version="150316" #### Variables #### export MALLOC_CHECK_=0 @@ -85,56 +84,63 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From f9683ecc3a034d032ff8403453446f8a1960cedf Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:24:32 +0100 Subject: [PATCH 156/434] New fetching system --- HalfLife2Deathmatch/hl2dmserver | 73 ++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index 271a024ef..c76c6f79c 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 64cbd1abdb420c4453b3f0a88b7fafee7924fe48 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:24:35 +0100 Subject: [PATCH 157/434] New fetching system --- HalfLifeDeathmatch/hldmserver | 73 +++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index b74914da1..8bc4ad8ed 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -82,55 +82,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From d288668503e55f70aa4b47f0b10785b9cfc13c14 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:24:55 +0100 Subject: [PATCH 158/434] New fetching system --- HalfLifeDeathmatchSource/hldmsserver | 73 +++++++++++++++------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index 33b2d0723..3d6e8439e 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 00d24f56f82e6a340619d98dbe19380af22de0f5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:24:59 +0100 Subject: [PATCH 159/434] New fetching system --- Hurtworld/hwserver | 74 +++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index 3a019f6d5..fd340b888 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -96,57 +96,63 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo " ${curl}"|grep "curl:" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 core_getopt.sh - From 2c6cfd5cab1ebc68721ffa6d27c99520e5e1bd4f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:02 +0100 Subject: [PATCH 160/434] New fetching system --- Insurgency/insserver | 73 ++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/Insurgency/insserver b/Insurgency/insserver index 66e511149..7538729ff 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -85,55 +85,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From e088a49634fff0e9533822fe80004b1ddfc902e2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:05 +0100 Subject: [PATCH 161/434] New fetching system --- JustCause2/jc2server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JustCause2/jc2server b/JustCause2/jc2server index 2f037c799..8b27675a7 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="160316" +version="150316" #### Variables #### From 3dbd0a15e65a61b2b42ef8ca45072f76c654157d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:07 +0100 Subject: [PATCH 162/434] New fetching system --- KillingFloor/kfserver | 73 ++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index 2aa5af27b..5693cfafe 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -85,55 +85,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From df3671ebbccf7d1e263220a82c0a0bd461a1a357 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:09 +0100 Subject: [PATCH 163/434] New fetching system --- Left4Dead/l4dserver | 73 +++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index 519ab1379..f34edcc3b 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From c7d824a989d8c2d0d4bf5f1319b2230b2de25f1a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:12 +0100 Subject: [PATCH 164/434] New fetching system --- Left4Dead2/l4d2server | 73 ++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index 6c966cb6e..aaf08e225 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -82,55 +82,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 30954f7f3bf2b25cbf085bc69fdb1ae64603fe26 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:14 +0100 Subject: [PATCH 165/434] New fetching system --- Mumble/mumbleserver | 74 ++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index c0bfa4692..5d8d5e1dc 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -62,57 +62,63 @@ githubbranch="master" ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 core_getopt.sh - From 68899b334aff18393a22a5a27c3e963472e8ab04 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:17 +0100 Subject: [PATCH 166/434] New fetching system --- NS2Combat/ns2cserver | 73 ++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index a5683bf81..4f5428d00 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -88,55 +88,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From adeb231fc0240e873c6117f61248a69ad5dafffb Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:20 +0100 Subject: [PATCH 167/434] New fetching system --- NaturalSelection2/ns2server | 73 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index d53651b7f..9cfe4045c 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -88,55 +88,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From faf6849e8dbcee0f1b17bfd6bb7b9ae4390a5c67 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:23 +0100 Subject: [PATCH 168/434] New fetching system --- NoMoreRoomInHell/nmrihserver | 73 ++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index 26c836f2d..da4923b8f 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 1c54e492ae7e134ffae3e7e1945b03e28f93194a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:25 +0100 Subject: [PATCH 169/434] New fetching system --- OpposingForce/opforserver | 73 +++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index 61e9b4128..3222c50ed 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 8254dca8be82c9361727b4cb82ac40b7a078cff3 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:28 +0100 Subject: [PATCH 170/434] New fetching system --- PiratesVikingandKnightsII/pvkiiserver | 73 +++++++++++++++------------ 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index 5a4588753..8f8ab066f 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From caf5f15ae81eedb5d798ea3c126f73becbd9968e Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:31 +0100 Subject: [PATCH 171/434] New fetching system --- ProjectZomboid/pzserver | 73 ++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index 701827e96..26e3857b4 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -77,55 +77,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 480b6a66623dee1a094033488d30f07487938152 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:35 +0100 Subject: [PATCH 172/434] New fetching system --- QuakeLive/qlserver | 73 +++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index 3e8246d3d..eddbc8003 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="190216" +version="150316" #### Variables #### arch="x64" @@ -87,55 +87,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From c41ee057a63304244ca72ff5a8e8dea889f73cf9 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:37 +0100 Subject: [PATCH 173/434] New fetching system --- RedOrchestra/roserver | 73 ++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index 4e6424814..f0a85d7f6 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -81,55 +81,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 8d34416acd644a1e372591b87c2db9eb55c52dc7 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:40 +0100 Subject: [PATCH 174/434] New fetching system --- Ricochet/ricochetserver | 73 ++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index 555c1b39b..ad2ad6bb2 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 3b589c1b25dc877703169ba6f74bf74daca36129 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:42 +0100 Subject: [PATCH 175/434] New fetching system --- Rust/rustserver | 73 +++++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/Rust/rustserver b/Rust/rustserver index 8d98109f0..e18e917f2 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="230215" +version="150316" #### Variables #### @@ -103,55 +103,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo " ${curl}"|grep "curl:" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From d3fd2ed05474518248a46954a1f082bb14451256 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:44 +0100 Subject: [PATCH 176/434] New fetching system --- SeriousSam3BFE/ss3sserver | 73 +++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index 0ffefc5e8..ceda12d19 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="121215" +version="150316" #### Variables #### @@ -80,55 +80,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 5f8823054f0ce1f63182620368693322a12c1a38 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:46 +0100 Subject: [PATCH 177/434] New fetching system --- StarBound/sbserver | 73 +++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/StarBound/sbserver b/StarBound/sbserver index c8253a643..56f6285d3 100644 --- a/StarBound/sbserver +++ b/StarBound/sbserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -76,55 +76,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 122f23ae8ec32abbabe46d0f227c9548e8b8d95f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:49 +0100 Subject: [PATCH 178/434] New fetching system --- SvenCoop/svencoopserver | 75 ++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/SvenCoop/svencoopserver b/SvenCoop/svencoopserver index f4abfc4c5..a870b9bcc 100644 --- a/SvenCoop/svencoopserver +++ b/SvenCoop/svencoopserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -82,56 +82,63 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From 15995a619c40dd224c4e401c3ab581c1291ec319 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:51 +0100 Subject: [PATCH 179/434] New fetching system --- TeamFortress2/tf2server | 73 ++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index 984817ab0..ed9a23d5c 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -88,55 +88,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 0317a3c8232bfa3448e8bb8705b414afed9f50e2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:54 +0100 Subject: [PATCH 180/434] New fetching system --- TeamFortressClassic/tfcserver | 73 +++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index d1ee8b4c3..4a5c3b325 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -83,55 +83,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 1856839f923d02aec2906fbad7058da8598cb352 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:56 +0100 Subject: [PATCH 181/434] New fetching system --- TeamSpeak3/ts3server | 73 ++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index 311474c30..93c206ea6 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="251215" +version="150316" #### Variables #### @@ -60,55 +60,62 @@ githubbranch="master" ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From 4cd0122d16d5b8a5d4a861e6f7b30e642b151203 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:25:58 +0100 Subject: [PATCH 182/434] New fetching system --- Teeworlds/twserver | 73 +++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/Teeworlds/twserver b/Teeworlds/twserver index a051ebe9e..1fb104008 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -79,55 +79,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From da50685015b8ecb94aafe9875bf7b4de304b0382 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:26:01 +0100 Subject: [PATCH 183/434] New fetching system --- Terraria/terrariaserver | 73 ++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index f8088bd16..aac928e26 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -78,55 +78,62 @@ consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M- ##### Script ##### # Do not edit -fn_getgithubfile(){ -filename=$1 -exec=$2 -fileurl=${3:-$filename} -filepath="${rootdir}/${filename}" -filedir=$(dirname "${filepath}") -# If the function file is missing, then download -if [ ! -f "${filepath}" ]; then +# Fetches core_dl for file downloads +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then - mkdir "${filedir}" + mkdir -p "${filedir}" fi - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${fileurl}" echo -e " fetching ${filename}...\c" - if [ "$(command -v curl)" ]||[ "$(which curl >/dev/null 2>&1)" ]||[ -f "/usr/bin/curl" ]||[ -f "/bin/curl" ]; then - : - else + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" echo "Curl is not installed!" echo -e "" - exit - fi - curl=$(curl --fail -o "${filepath}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curl}" - echo -e "${githuburl}\n" - exit - else - echo -e "\e[0;32mOK\e[0m" - fi - if [ "${exec}" ]; then - chmod +x "${filepath}" + exit 1 fi + chmod +x "${filedir}/${filename}" fi -if [ "${exec}" ]; then - source "${filepath}" -fi +source "${filedir}/${filename}" } -fn_runfunction(){ - fn_getgithubfile "functions/${functionfile}" 1 +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } +core_dl.sh core_functions.sh getopt=$1 From a8d6d3f707fe6583c51c06dd34d53edaebb98739 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:26:04 +0100 Subject: [PATCH 184/434] New fetching system --- UnrealTournament2004/ut2k4server | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index 0cd432645..ffe97329e 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### @@ -132,4 +132,4 @@ core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From 70ea1175586bc5c2112898a0048d1c289b8022a2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:26:41 +0100 Subject: [PATCH 185/434] New fetching system --- UnrealTournament99/ut99server | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index c6bc5ef42..b5f6e591e 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="260216" +version="150316" #### Variables #### @@ -132,4 +132,4 @@ core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From be181942f3794964cbb8ea5c3f7ce46c0bf16414 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:27:15 +0100 Subject: [PATCH 186/434] New fetching system --- ARKSurvivalEvolved/arkserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 0fce5234e..f130941e4 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### From dad391915b3b36ec64a897308b69add878c65215 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:27:33 +0100 Subject: [PATCH 187/434] New fetching system --- Arma3/arma3server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Arma3/arma3server b/Arma3/arma3server index daaf779ad..2b10592a8 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### From d6d26172265254e4890dbe4e0cff26ea5e884124 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:27:49 +0100 Subject: [PATCH 188/434] New fetching system --- BlackMesa/bmdmserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index 7561a3b7d..f599a30d6 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### From 4c99456420115920796e38d2391b8fa6ffc054e4 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 01:28:04 +0100 Subject: [PATCH 189/434] New fetching system --- BladeSymphony/bsserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index 5cc52d6ec..64084d649 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="271215" +version="150316" #### Variables #### From b987bc91e912fea2b88418473c386fd5481e4ce6 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:04:26 +0100 Subject: [PATCH 190/434] New fetching system (LGSM & Functions dirs) --- ARKSurvivalEvolved/arkserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index f130941e4..7b58dd823 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -51,6 +51,8 @@ engine="unreal4" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/ShooterGame" executabledir="${systemdir}/Binaries/Linux" From 63f09e34803f81324534e0aa7b421b449c73b2c8 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:04:33 +0100 Subject: [PATCH 191/434] New fetching system (LGSM & Functions dirs) --- Arma3/arma3server | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Arma3/arma3server b/Arma3/arma3server index 2b10592a8..927a406c7 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -71,6 +71,8 @@ engine="realvirtuality" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" From c22772ecd534f2426f3136a050514c4d1235ea65 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:04:41 +0100 Subject: [PATCH 192/434] New fetching system (LGSM & Functions dirs) --- BlackMesa/bmdmserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index f599a30d6..1d8f3d8fb 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -62,6 +62,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/bms" executabledir="${filesdir}" From db169d70e3a999b6cfcf718cfeed25768b8525ec Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:04:47 +0100 Subject: [PATCH 193/434] New fetching system (LGSM & Functions dirs) --- BladeSymphony/bsserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index 64084d649..a6e284b84 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -57,6 +57,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/berimbau" executabledir="${filesdir}" From 64cc4a8dd4ca563cedcaf154056dfa892bb05cf4 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:04:50 +0100 Subject: [PATCH 194/434] New fetching system (LGSM & Functions dirs) --- BrainBread2/bb2server | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index b0e4ba6b1..7053f0cb1 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -62,6 +62,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/brainbread2" executabledir="${filesdir}" From b671a2ed3742e5b94660da41bcada77e9cd2df7a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:04:53 +0100 Subject: [PATCH 195/434] New fetching system (LGSM & Functions dirs) --- CodenameCURE/ccserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 5d770df13..bd99f374d 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -57,6 +57,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/cure" executabledir="${filesdir}" From a6d9b320205aff0df0fc0de49ba4993b4d6c8365 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:04:58 +0100 Subject: [PATCH 196/434] New fetching system (LGSM & Functions dirs) --- CounterStrike/csserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CounterStrike/csserver b/CounterStrike/csserver index b65b13cd3..e9006ac65 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -57,6 +57,8 @@ engine="goldsource" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/cstrike" executabledir="${filesdir}" From ad92ae3d4d1aec6a2c4e524cc664b76157549a33 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:11 +0100 Subject: [PATCH 197/434] New fetching system (LGSM & Functions dirs) --- CounterStrikeConditionZero/csczserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index 0b01c5b00..16230be9c 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -57,6 +57,8 @@ engine="goldsource" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/czero" executabledir="${filesdir}" From b364c86b4a331a42fc2f3f2ae0f15a015ec2be8d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:17 +0100 Subject: [PATCH 198/434] New fetching system (LGSM & Functions dirs) --- CounterStrikeGlobalOffensive/csgoserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 550e27d69..2eb8dac03 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -80,6 +80,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/csgo" executabledir="${filesdir}" From addd2f120d5950e66fed4acdb2766d5139f44ef3 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:20 +0100 Subject: [PATCH 199/434] New fetching system (LGSM & Functions dirs) --- CounterStrikeSource/cssserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index e2f21f407..03e7716c6 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -57,6 +57,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/cstrike" executabledir="${filesdir}" From fb98c1d82219c617e722b2f58d80b47968c2da29 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:23 +0100 Subject: [PATCH 200/434] New fetching system (LGSM & Functions dirs) --- DayOfDefeat/dodserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index 3eb74a1cf..55989c424 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -57,6 +57,8 @@ engine="goldsource" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/dod" executabledir="${filesdir}" From 3ec4c795fc415ebd97274d883d6eb863f9b8e1a1 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:26 +0100 Subject: [PATCH 201/434] New fetching system (LGSM & Functions dirs) --- DayOfDefeatSource/dodsserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index f1b71c23c..71cc51b41 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -57,6 +57,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/dod" executabledir="${filesdir}" From e2843c8fa42814ac1b567cb6977c5dd6a1dcb96a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:28 +0100 Subject: [PATCH 202/434] New fetching system (LGSM & Functions dirs) --- DeathmatchClassic/dmcserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index 708433aff..62951a357 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -57,6 +57,8 @@ engine="goldsource" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/dmc" executabledir="${filesdir}" From 0ea2a4b9e05aa5ccfa5661d4c494bb853ab8a1e0 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:31 +0100 Subject: [PATCH 203/434] New fetching system (LGSM & Functions dirs) --- DontStarveTogether/dstserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index 74a1761a4..d479d966b 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -55,6 +55,8 @@ engine="dontstarve" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}/bin" From 9f8e701d9912e20387f97c4b848a6a30e891cbd5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:33 +0100 Subject: [PATCH 204/434] New fetching system (LGSM & Functions dirs) --- DoubleActionBoogaloo/dabserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 5b55e7838..831451f96 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -57,6 +57,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/dab" executabledir="${filesdir}" From 522f8b135c9898629571b74fc7489d92d240d7d1 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:36 +0100 Subject: [PATCH 205/434] New fetching system (LGSM & Functions dirs) --- FistfulOfFrags/fofserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index 94f4e3fb3..298f57c76 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -57,6 +57,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/fof" executabledir="${filesdir}" From 395f2e0f92fd2882364629a04a5ce779e72e4b8a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:38 +0100 Subject: [PATCH 206/434] New fetching system (LGSM & Functions dirs) --- GarrysMod/gmodserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index 8ae8c6a1f..879cd1d01 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -68,6 +68,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/garrysmod" addonsdir="${systemdir}/addons" From 49b21c4837bdad3985113af193ddebbdce481faf Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:41 +0100 Subject: [PATCH 207/434] New fetching system (LGSM & Functions dirs) --- GoldenEyeSource/gesserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index afe6a9f09..c90e17b0f 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -58,6 +58,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/gesource" executabledir="${filesdir}" From 579060fb7015c4c1cddbe01e4d91d3023c41962a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:44 +0100 Subject: [PATCH 208/434] New fetching system (LGSM & Functions dirs) --- HalfLife2Deathmatch/hl2dmserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index c76c6f79c..e375010d1 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -57,6 +57,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/hl2mp" executabledir="${filesdir}" From 14ae5a5e72c8abefcc85c205604a4d7fe8751278 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:48 +0100 Subject: [PATCH 209/434] New fetching system (LGSM & Functions dirs) --- HalfLifeDeathmatch/hldmserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index 8bc4ad8ed..bf65048eb 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -56,6 +56,8 @@ engine="goldsource" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/valve" executabledir="${filesdir}" From 1e1b56bdcce7cae4626ed1aa20ea5521a19baab2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:54 +0100 Subject: [PATCH 210/434] New fetching system (LGSM & Functions dirs) --- HalfLifeDeathmatchSource/hldmsserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index 3d6e8439e..f6254c5a9 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -57,6 +57,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/hl1mp" executabledir="${filesdir}" From 267342eb6b054e67d685131796171c7cd7e59682 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:05:56 +0100 Subject: [PATCH 211/434] New fetching system (LGSM & Functions dirs) --- Hurtworld/hwserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index fd340b888..3bcf80f38 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -69,6 +69,8 @@ engine="unity3d" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname=$(basename $(readlink -f "${BASH_SOURCE[0]}")) lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" From cd6a3e09c3a35827e761fd087ff2078889044961 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:05 +0100 Subject: [PATCH 212/434] New fetching system (LGSM & Functions dirs) --- Insurgency/insserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Insurgency/insserver b/Insurgency/insserver index 7538729ff..d92d8fdc0 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -59,6 +59,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/insurgency" executabledir="${filesdir}" From e53d522db4ff2d9ae35b3da03ed1eea87f1ce8a7 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:08 +0100 Subject: [PATCH 213/434] New fetching system (LGSM & Functions dirs) --- KillingFloor/kfserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index 5693cfafe..43cc1d053 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -56,6 +56,8 @@ engine="unreal2" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/System" executabledir="${systemdir}" From 3e5facf709a5a2d12b16e204a4297bf5bfaebc9b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:11 +0100 Subject: [PATCH 214/434] New fetching system (LGSM & Functions dirs) --- Left4Dead/l4dserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index f34edcc3b..71382b270 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -57,6 +57,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/left4dead" executabledir="${filesdir}" From dd00bed661395cb41f40b8c4e72bf958042d8c94 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:14 +0100 Subject: [PATCH 215/434] New fetching system (LGSM & Functions dirs) --- Left4Dead2/l4d2server | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index aaf08e225..230a0bb63 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -56,6 +56,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/left4dead2" executabledir="${filesdir}" From adbf484f46e77fe8cf8a0c204d181103cb2f0324 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:16 +0100 Subject: [PATCH 216/434] New fetching system (LGSM & Functions dirs) --- Mumble/mumbleserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index 5d8d5e1dc..ca422673d 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -26,6 +26,8 @@ servicename="mumble-server" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" From 5e2b88a5b9d4d8ff3de66ed34a975c95d9f740db Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:19 +0100 Subject: [PATCH 217/434] New fetching system (LGSM & Functions dirs) --- NS2Combat/ns2cserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index 4f5428d00..df6a28386 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -66,6 +66,8 @@ engine="spark" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}/ia32" From 592526c7304aff555805620f70c2d05545bada6a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:21 +0100 Subject: [PATCH 218/434] New fetching system (LGSM & Functions dirs) --- NaturalSelection2/ns2server | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index 9cfe4045c..6fe81eee8 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -66,6 +66,8 @@ engine="spark" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" From da0f86a0d23505f6af47474bc103ec3f245d0b54 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:23 +0100 Subject: [PATCH 219/434] New fetching system (LGSM & Functions dirs) --- NoMoreRoomInHell/nmrihserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index da4923b8f..7a027a4ab 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -57,6 +57,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/nmrih" executabledir="${filesdir}" From 5ea81e9eefda4ed827ce6273ad5f75175ac84f51 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:25 +0100 Subject: [PATCH 220/434] New fetching system (LGSM & Functions dirs) --- OpposingForce/opforserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index 3222c50ed..8211e1212 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -57,6 +57,8 @@ engine="goldsource" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/gearbox" executabledir="${filesdir}" From 0c1795e5acc7d34add930170c1376fed8a5c8c9f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:28 +0100 Subject: [PATCH 221/434] New fetching system (LGSM & Functions dirs) --- PiratesVikingandKnightsII/pvkiiserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index 8f8ab066f..abc153a44 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -57,6 +57,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/pvkii" executabledir="${filesdir}" From c781d621e92144dac37c16d86f2257f19d4d2376 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:31 +0100 Subject: [PATCH 222/434] New fetching system (LGSM & Functions dirs) --- ProjectZomboid/pzserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index 26e3857b4..f4070a6f8 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -52,6 +52,8 @@ engine="projectzomboid" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" From 36a717a1750a75cc5d6c34cf550f502bb2edf85b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:33 +0100 Subject: [PATCH 223/434] New fetching system (LGSM & Functions dirs) --- QuakeLive/qlserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index eddbc8003..5ff2c73f5 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -60,6 +60,8 @@ engine="idtech3" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" From cf26442f05aad2e59d930558b47396f1a1bb9860 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:36 +0100 Subject: [PATCH 224/434] New fetching system (LGSM & Functions dirs) --- RedOrchestra/roserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index f0a85d7f6..75180f22d 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -52,6 +52,8 @@ appid="223250" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/system" executabledir="${systemdir}" From a906800fe6d6adfcdb8aab688456084bd370fc37 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:39 +0100 Subject: [PATCH 225/434] New fetching system (LGSM & Functions dirs) --- Ricochet/ricochetserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index ad2ad6bb2..edf1fd63d 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -57,6 +57,8 @@ engine="goldsource" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/ricochet" executabledir="${filesdir}" From 0453ab02823b4d502835209e2958ee8d68ade492 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:41 +0100 Subject: [PATCH 226/434] New fetching system (LGSM & Functions dirs) --- Rust/rustserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Rust/rustserver b/Rust/rustserver index e18e917f2..ce5c2b2f3 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -74,6 +74,8 @@ engine="unity3d" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname=$(basename $(readlink -f "${BASH_SOURCE[0]}")) lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" From 03a7bf3dbf46b65dead4bde265f222d191f9a355 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:44 +0100 Subject: [PATCH 227/434] New fetching system (LGSM & Functions dirs) --- SeriousSam3BFE/ss3sserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index ceda12d19..7e147f824 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -52,6 +52,8 @@ engine="seriousengine35" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/Bin" executable="./runSam3_DedicatedServer.sh" From 22ad083ccecc39ec0d88cf630f260cf76ace3bf2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:46 +0100 Subject: [PATCH 228/434] New fetching system (LGSM & Functions dirs) --- StarBound/sbserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/StarBound/sbserver b/StarBound/sbserver index 56f6285d3..171f6778c 100644 --- a/StarBound/sbserver +++ b/StarBound/sbserver @@ -51,6 +51,8 @@ engine="starbound" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}/linux64" From bb3c3487c6f1e252835bb8b43bb8a51007026a88 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:49 +0100 Subject: [PATCH 229/434] New fetching system (LGSM & Functions dirs) --- SvenCoop/svencoopserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SvenCoop/svencoopserver b/SvenCoop/svencoopserver index a870b9bcc..735414ccd 100644 --- a/SvenCoop/svencoopserver +++ b/SvenCoop/svencoopserver @@ -56,6 +56,8 @@ engine="goldsource" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/svencoop" executabledir="${filesdir}" From 70f021f356547e5133294dbd2489c16cd0d17e34 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:52 +0100 Subject: [PATCH 230/434] New fetching system (LGSM & Functions dirs) --- TeamFortress2/tf2server | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index ed9a23d5c..8a3ec65f3 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -62,6 +62,8 @@ engine="source" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/tf" executabledir="${filesdir}" From 58bfb1b85be9cb9ea105603bd3eb10a1789f0c92 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:54 +0100 Subject: [PATCH 231/434] New fetching system (LGSM & Functions dirs) --- TeamFortressClassic/tfcserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index 4a5c3b325..fd88681fa 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -57,6 +57,8 @@ engine="goldsource" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/tfc" executabledir="${filesdir}" From 1628f68c02dba61fbb3ead7cfa9f64658cad0b25 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:06:57 +0100 Subject: [PATCH 232/434] New fetching system (LGSM & Functions dirs) --- TeamSpeak3/ts3server | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index 93c206ea6..11d91a529 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -30,6 +30,8 @@ servicename="ts3-server" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" From 1d6bcfec430e132c23d3228f131620989d93d874 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:07:00 +0100 Subject: [PATCH 233/434] New fetching system (LGSM & Functions dirs) --- Teeworlds/twserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Teeworlds/twserver b/Teeworlds/twserver index 1fb104008..7d087ca37 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -52,6 +52,8 @@ engine="teeworlds" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" From 7ae777edede29fa1ab3645155d34caf2d471bd5a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 02:07:02 +0100 Subject: [PATCH 234/434] New fetching system (LGSM & Functions dirs) --- Terraria/terrariaserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index aac928e26..3e96560f5 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -52,6 +52,8 @@ engine="terraria" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" From 952cfa00102cf48d68429a306d5406b9b264f851 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 04:23:24 +0100 Subject: [PATCH 235/434] Rust Game/Query port is tcp&udp --- lgsm/functions/command_details.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 6ec515d00..2dbe9a21f 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -549,7 +549,7 @@ echo -e "netstat -atunp | grep Rust" echo -e "" { echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/Query\tINBOUND\t${port}\tudp" + echo -e "> Game/Query\tINBOUND\t${port}\ttcp/udp" echo -e "> RCON\tINBOUND\t${rconport}\ttcp" } | column -s $'\t' -t From 7f8c0dcfcf071cb4b528e66cfdc1d6aa26b01b66 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 06:53:06 +0100 Subject: [PATCH 236/434] Init permissions --- lgsm/functions/check_permissions.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 lgsm/functions/check_permissions.sh diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh new file mode 100644 index 000000000..c9dcfa61d --- /dev/null +++ b/lgsm/functions/check_permissions.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# LGSM check_permissions function +# Author: Daniel Gibbs +# Contributor: UltimateByte +# Website: http://gameservermanagers.com +lgsm_version="150316" + +# Description: Checks script, files and folders ownership and permissions. + +# Initializing useful variables +currentuser="$(sh -c 'whoami')" +scriptfullpath="${rootdir}/${selfname}" + +fn_check_ownership(){ +if [ "${currentuser}" != "$(stat -c %U ${scripfullpath})" ] || [ "${currentuser}" != "$(stat -c %G ${scripfullpath})" ]; then + fn_print_fail_nl "Permission denied" + exit 1 +fi +} + +fn_check_ownership From d5d31f21ef98ef688751ce197916a75cd6e751fd Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 06:55:06 +0100 Subject: [PATCH 237/434] added check_permissions.sh --- lgsm/functions/core_functions.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index d4993d256..613311a14 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -192,6 +192,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +check_permissions.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + check_root.sh(){ functionfile="${FUNCNAME}" fn_fetch_function From dd3b4500e52029125f97a2399ed6a38c0cf65bf8 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 06:57:50 +0100 Subject: [PATCH 238/434] added check_permissions.sh --- lgsm/functions/check.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 69f62f0ad..186f30859 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -11,6 +11,7 @@ lgsm_version="060316" # check.sh selects which checks to run by using arrays check_root.sh +check_permissions.sh if [ "${function_selfname}" != "command_install.sh" ] && [ "${function_selfname}" != "command_update_functions.sh" ]; then check_system_dir.sh @@ -64,4 +65,4 @@ do if [ "${allowed_command}" == "${function_selfname}" ]; then check_config.sh fi -done \ No newline at end of file +done From 81baf801592d58e7abe8b7ae775039f6dc9810a3 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 07:31:05 +0100 Subject: [PATCH 239/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index c9dcfa61d..d4f3a5423 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -10,12 +10,21 @@ lgsm_version="150316" # Initializing useful variables currentuser="$(sh -c 'whoami')" scriptfullpath="${rootdir}/${selfname}" +permissionerror="0" fn_check_ownership(){ -if [ "${currentuser}" != "$(stat -c %U ${scripfullpath})" ] || [ "${currentuser}" != "$(stat -c %G ${scripfullpath})" ]; then +if [ "${currentuser}" != "$(stat -c %U "${scriptfullpath}")" ] && [ "${currentuser}" != "$(stat -c %G "${scriptfullpath}")" ]; then + permissionerror="1" fn_print_fail_nl "Permission denied" + echo " * To check allowed user and group run ls -l ${selfname}" +fi +} + +fn_check_permissions_summary(){ +if [ "${permissionerror}" == "1" ]; then exit 1 fi } fn_check_ownership +fn_check_permissions_summary From 77dc1d29dd9b536197a680a50f857ac76233631c Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 07:38:29 +0100 Subject: [PATCH 240/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index d4f3a5423..09eae2f67 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -8,13 +8,14 @@ lgsm_version="150316" # Description: Checks script, files and folders ownership and permissions. # Initializing useful variables -currentuser="$(sh -c 'whoami')" +currentuser="$(whoami)" scriptfullpath="${rootdir}/${selfname}" permissionerror="0" fn_check_ownership(){ if [ "${currentuser}" != "$(stat -c %U "${scriptfullpath}")" ] && [ "${currentuser}" != "$(stat -c %G "${scriptfullpath}")" ]; then permissionerror="1" + fn_scriptlog "Attempted to run as ${currentuser}" fn_print_fail_nl "Permission denied" echo " * To check allowed user and group run ls -l ${selfname}" fi From 2e2158b47a27daac3ceab5ba6fd170f2eede1581 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 08:40:43 +0100 Subject: [PATCH 241/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 09eae2f67..f9ba9d7ba 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -15,12 +15,25 @@ permissionerror="0" fn_check_ownership(){ if [ "${currentuser}" != "$(stat -c %U "${scriptfullpath}")" ] && [ "${currentuser}" != "$(stat -c %G "${scriptfullpath}")" ]; then permissionerror="1" - fn_scriptlog "Attempted to run as ${currentuser}" fn_print_fail_nl "Permission denied" echo " * To check allowed user and group run ls -l ${selfname}" fi } +fn_check_permissions(){ +if [ -n "${functionsdir}" ]; then + for f in $(find "${functionsdir}" -name "*.sh"); do perm="$(stat -c %a "$f")"; + find "${functionsdir}" -name "*.sh" | while read filename; do perm="$(stat -c %a "${filename}")"; shortperm="$(echo ${perms:0:1})"; + if [ "${shortperm}" != "7" ]; then + permissionerror="1" + echo "Found permission error on $filename" + fn_print_warn_n1 "Warning, permission issues found in ${functionsdir}" + echo " * Easy fix : chmod -R 755 ${functionsdir}" + fi + done +fi +} + fn_check_permissions_summary(){ if [ "${permissionerror}" == "1" ]; then exit 1 @@ -28,4 +41,5 @@ fi } fn_check_ownership +fn_check_permissions fn_check_permissions_summary From 296a75f2243d99c37998d051b81aa607400ccc2a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 08:42:02 +0100 Subject: [PATCH 242/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index f9ba9d7ba..19689ab8b 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -22,8 +22,7 @@ fi fn_check_permissions(){ if [ -n "${functionsdir}" ]; then - for f in $(find "${functionsdir}" -name "*.sh"); do perm="$(stat -c %a "$f")"; - find "${functionsdir}" -name "*.sh" | while read filename; do perm="$(stat -c %a "${filename}")"; shortperm="$(echo ${perms:0:1})"; + find "${functionsdir}" -name "*.sh" | while read filename; do perm="$(stat -c %a "${filename}")"; shortperm="$(echo ${perms:0:1})"; if [ "${shortperm}" != "7" ]; then permissionerror="1" echo "Found permission error on $filename" From b7b2d83fea74d87e60d33603ce333a2403a8a20a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 08:44:11 +0100 Subject: [PATCH 243/434] fixes --- lgsm/functions/check_permissions.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 19689ab8b..e4eb7a247 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -22,11 +22,11 @@ fi fn_check_permissions(){ if [ -n "${functionsdir}" ]; then - find "${functionsdir}" -name "*.sh" | while read filename; do perm="$(stat -c %a "${filename}")"; shortperm="$(echo ${perms:0:1})"; + find "${functionsdir}" -name "*.sh" | while read filename; do perm="$(stat -c %a "${filename}")"; shortperm="$(echo ${perm:0:1})"; if [ "${shortperm}" != "7" ]; then permissionerror="1" echo "Found permission error on $filename" - fn_print_warn_n1 "Warning, permission issues found in ${functionsdir}" + fn_print_warn_nl "Warning, permission issues found in ${functionsdir}" echo " * Easy fix : chmod -R 755 ${functionsdir}" fi done From 8dd552891459b2fe84c0096ab69c25a8fc0e3e77 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 08:47:32 +0100 Subject: [PATCH 244/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index e4eb7a247..e293b1585 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -22,7 +22,7 @@ fi fn_check_permissions(){ if [ -n "${functionsdir}" ]; then - find "${functionsdir}" -name "*.sh" | while read filename; do perm="$(stat -c %a "${filename}")"; shortperm="$(echo ${perm:0:1})"; + find "${functionsdir}" -name "*.sh" | while read -r filename; do perm="$(stat -c %a "${filename}")"; shortperm="$(echo "${perm:0:1}")"; if [ "${shortperm}" != "7" ]; then permissionerror="1" echo "Found permission error on $filename" From ec3fd3ccf381f91ea24dd43daa875c1063ecfa56 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 08:51:07 +0100 Subject: [PATCH 245/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index e293b1585..8c0bac559 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_permissions function +# LGSM check_permissions.sh # Author: Daniel Gibbs # Contributor: UltimateByte # Website: http://gameservermanagers.com @@ -25,7 +25,6 @@ if [ -n "${functionsdir}" ]; then find "${functionsdir}" -name "*.sh" | while read -r filename; do perm="$(stat -c %a "${filename}")"; shortperm="$(echo "${perm:0:1}")"; if [ "${shortperm}" != "7" ]; then permissionerror="1" - echo "Found permission error on $filename" fn_print_warn_nl "Warning, permission issues found in ${functionsdir}" echo " * Easy fix : chmod -R 755 ${functionsdir}" fi From 9a86949cb860d8547660794ae648e74c395552de Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 09:13:35 +0100 Subject: [PATCH 246/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 8c0bac559..90b5536da 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -24,7 +24,6 @@ fn_check_permissions(){ if [ -n "${functionsdir}" ]; then find "${functionsdir}" -name "*.sh" | while read -r filename; do perm="$(stat -c %a "${filename}")"; shortperm="$(echo "${perm:0:1}")"; if [ "${shortperm}" != "7" ]; then - permissionerror="1" fn_print_warn_nl "Warning, permission issues found in ${functionsdir}" echo " * Easy fix : chmod -R 755 ${functionsdir}" fi From 7fde0933547ebf63204383aea3a7e85f3097418d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 10:05:44 +0100 Subject: [PATCH 247/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 90b5536da..274301112 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -22,7 +22,7 @@ fi fn_check_permissions(){ if [ -n "${functionsdir}" ]; then - find "${functionsdir}" -name "*.sh" | while read -r filename; do perm="$(stat -c %a "${filename}")"; shortperm="$(echo "${perm:0:1}")"; + find "${functionsdir}" -name "*.sh" | while read -r filename; do perm="$(stat -c %a "${filename}")"; shortperm="${perm:0:1}"; if [ "${shortperm}" != "7" ]; then fn_print_warn_nl "Warning, permission issues found in ${functionsdir}" echo " * Easy fix : chmod -R 755 ${functionsdir}" @@ -31,7 +31,7 @@ if [ -n "${functionsdir}" ]; then fi } -fn_check_permissions_summary(){ +fn_check_permissions_conclusion(){ if [ "${permissionerror}" == "1" ]; then exit 1 fi @@ -39,4 +39,4 @@ fi fn_check_ownership fn_check_permissions -fn_check_permissions_summary +fn_check_permissions_conclusion From 14b069dca43fa4d0cacc2cec311bba2a635fd8b1 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 10:32:51 +0100 Subject: [PATCH 248/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 274301112..8828a15d7 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -26,6 +26,7 @@ if [ -n "${functionsdir}" ]; then if [ "${shortperm}" != "7" ]; then fn_print_warn_nl "Warning, permission issues found in ${functionsdir}" echo " * Easy fix : chmod -R 755 ${functionsdir}" + echo " * To enable monitor run ./${selfname} start" fi done fi From 7da4415b8e481455c9718560712eeb17a02a26a8 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 11:13:25 +0100 Subject: [PATCH 249/434] Rework while --- lgsm/functions/check_permissions.sh | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 8828a15d7..51072f43d 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -22,13 +22,19 @@ fi fn_check_permissions(){ if [ -n "${functionsdir}" ]; then - find "${functionsdir}" -name "*.sh" | while read -r filename; do perm="$(stat -c %a "${filename}")"; shortperm="${perm:0:1}"; + while read -r filename + do + perm="$(stat -c %a "${filename}")" + shortperm="${perm:0:1}" if [ "${shortperm}" != "7" ]; then - fn_print_warn_nl "Warning, permission issues found in ${functionsdir}" - echo " * Easy fix : chmod -R 755 ${functionsdir}" - echo " * To enable monitor run ./${selfname} start" + permissionfailure="1" fi - done + done <<< "$(find "${functionsdir}" -name "*.sh")" + + if [ "${permissionfailure}" == "1" ]; then + fn_print_warn_nl "Warning, permission issues found in ${functionsdir}" + echo " * Easy fix : chmod -R 755 ${functionsdir}" + fi fi } From db6e788be36a268ece573bbb4656d1f9b194c59b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 11:20:02 +0100 Subject: [PATCH 250/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 51072f43d..07658e795 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -21,6 +21,7 @@ fi } fn_check_permissions(){ +permissionfailure="0" if [ -n "${functionsdir}" ]; then while read -r filename do From 70ba6ff85e062462143715950b040e902379fd17 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 11:24:38 +0100 Subject: [PATCH 251/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 07658e795..391e67080 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -10,11 +10,11 @@ lgsm_version="150316" # Initializing useful variables currentuser="$(whoami)" scriptfullpath="${rootdir}/${selfname}" -permissionerror="0" +conclusionpermissionerror="0" fn_check_ownership(){ if [ "${currentuser}" != "$(stat -c %U "${scriptfullpath}")" ] && [ "${currentuser}" != "$(stat -c %G "${scriptfullpath}")" ]; then - permissionerror="1" + conclusionpermissionerror="1" fn_print_fail_nl "Permission denied" echo " * To check allowed user and group run ls -l ${selfname}" fi @@ -24,23 +24,24 @@ fn_check_permissions(){ permissionfailure="0" if [ -n "${functionsdir}" ]; then while read -r filename - do - perm="$(stat -c %a "${filename}")" - shortperm="${perm:0:1}" - if [ "${shortperm}" != "7" ]; then - permissionfailure="1" - fi + do + perm="$(stat -c %a "${filename}")" + shortperm="${perm:0:1}" + if [ "${shortperm}" != "7" ]; then + permissionfailure="1" + conclusionpermissionerror="1" + fi done <<< "$(find "${functionsdir}" -name "*.sh")" if [ "${permissionfailure}" == "1" ]; then - fn_print_warn_nl "Warning, permission issues found in ${functionsdir}" + fn_print_warn_nl "Warning, permission issues found in functions." echo " * Easy fix : chmod -R 755 ${functionsdir}" fi fi } fn_check_permissions_conclusion(){ -if [ "${permissionerror}" == "1" ]; then +if [ "${conclusionpermissionerror}" == "1" ]; then exit 1 fi } From 0c1e56027641255a421afc1dd9f90039b581ce67 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 11:28:39 +0100 Subject: [PATCH 252/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 391e67080..0f576f227 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -34,7 +34,7 @@ if [ -n "${functionsdir}" ]; then done <<< "$(find "${functionsdir}" -name "*.sh")" if [ "${permissionfailure}" == "1" ]; then - fn_print_warn_nl "Warning, permission issues found in functions." + fn_print_fail_nl "Warning, permission issues found in functions." echo " * Easy fix : chmod -R 755 ${functionsdir}" fi fi From 70bc7babdd407ffbd4d6a5d5e48cb3906316b070 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 12:07:18 +0100 Subject: [PATCH 253/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 31 +++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 0f576f227..5e71388cf 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -17,25 +17,40 @@ if [ "${currentuser}" != "$(stat -c %U "${scriptfullpath}")" ] && [ "${currentus conclusionpermissionerror="1" fn_print_fail_nl "Permission denied" echo " * To check allowed user and group run ls -l ${selfname}" + exit 1 fi } fn_check_permissions(){ -permissionfailure="0" +# Checking permission on rootdir +if [ -n "${rootdir}" ]; then + rootdirperm="$(stat -c %a "${rootdir}")" + userrootdirperm="${rootdirperm:0:1}" + grouprootdirperm="${rootdirperm:1:1}" + if [ "${userrootdirperm}" != "7" ] && [ "${grouprootdirperm}" != "7" ]; then + fn_print_fail_nl "Permission issues found in root directory" + echo " * You might wanna run : chmod -R 755 \"${rootdir}\"" + conclusionpermissionerror="1" + fi +fi + +# Checking permissions on functions +funcpermfail="0" if [ -n "${functionsdir}" ]; then while read -r filename do - perm="$(stat -c %a "${filename}")" - shortperm="${perm:0:1}" - if [ "${shortperm}" != "7" ]; then - permissionfailure="1" + funcperm="$(stat -c %a "${filename}")" + userfuncdirperm="${funcperm:0:1}" + groupfuncdirperm="${duncperm:1:1}" + if [ "${userfuncdirperm}" != "7" ] && [ "${groupfuncdirperm}" != "7" ]; then + funcpermfail="1" conclusionpermissionerror="1" fi done <<< "$(find "${functionsdir}" -name "*.sh")" - if [ "${permissionfailure}" == "1" ]; then - fn_print_fail_nl "Warning, permission issues found in functions." - echo " * Easy fix : chmod -R 755 ${functionsdir}" + if [ "${funcpermfail}" == "1" ]; then + fn_print_fail_nl "Permission issues found in functions." + echo " * You might wanna run : chmod -R 755 \"${functionsdir}\"" fi fi } From 114ab020962484e55ec7a78d5e3fe34e14528593 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 12:29:32 +0100 Subject: [PATCH 254/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 5e71388cf..b26915582 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -7,34 +7,40 @@ lgsm_version="150316" # Description: Checks script, files and folders ownership and permissions. -# Initializing useful variables +# Useful variables currentuser="$(whoami)" scriptfullpath="${rootdir}/${selfname}" conclusionpermissionerror="0" fn_check_ownership(){ +# Check script ownership if [ "${currentuser}" != "$(stat -c %U "${scriptfullpath}")" ] && [ "${currentuser}" != "$(stat -c %G "${scriptfullpath}")" ]; then - conclusionpermissionerror="1" - fn_print_fail_nl "Permission denied" + fn_print_fail_nl "Oops ! Permission denied on ${selfname}" echo " * To check allowed user and group run ls -l ${selfname}" exit 1 fi +# Check rootdir ownership +if [ "${currentuser}" != "$(stat -c %U "${rootdir}")" ] && [ "${currentuser}" != "$(stat -c %G "${rootdir}")" ]; then + fn_print_fail_nl "Oops ! Permission denied on ${rootdir}" + echo " * To check allowed user and group run ls -l ${rootdir}" + exit 1 } fn_check_permissions(){ -# Checking permission on rootdir +# Check rootdir permissions if [ -n "${rootdir}" ]; then rootdirperm="$(stat -c %a "${rootdir}")" userrootdirperm="${rootdirperm:0:1}" grouprootdirperm="${rootdirperm:1:1}" if [ "${userrootdirperm}" != "7" ] && [ "${grouprootdirperm}" != "7" ]; then fn_print_fail_nl "Permission issues found in root directory" + echo " * Neither the user or group has full control of \"${rootdir}\"" echo " * You might wanna run : chmod -R 755 \"${rootdir}\"" conclusionpermissionerror="1" fi fi -# Checking permissions on functions +# Check functions permissions funcpermfail="0" if [ -n "${functionsdir}" ]; then while read -r filename @@ -50,12 +56,14 @@ if [ -n "${functionsdir}" ]; then if [ "${funcpermfail}" == "1" ]; then fn_print_fail_nl "Permission issues found in functions." + echo " * Neither the user or group has full control of at least some scripts in \"${functionsdir}\"" echo " * You might wanna run : chmod -R 755 \"${functionsdir}\"" fi fi } fn_check_permissions_conclusion(){ +# Exit if errors found if [ "${conclusionpermissionerror}" == "1" ]; then exit 1 fi From 30a85996cbdbdfa6fc741d4a5dceadb4f71ceaa4 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 12:33:24 +0100 Subject: [PATCH 255/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index b26915582..f8056b5a4 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -24,6 +24,7 @@ if [ "${currentuser}" != "$(stat -c %U "${rootdir}")" ] && [ "${currentuser}" != fn_print_fail_nl "Oops ! Permission denied on ${rootdir}" echo " * To check allowed user and group run ls -l ${rootdir}" exit 1 +fi } fn_check_permissions(){ @@ -47,7 +48,7 @@ if [ -n "${functionsdir}" ]; then do funcperm="$(stat -c %a "${filename}")" userfuncdirperm="${funcperm:0:1}" - groupfuncdirperm="${duncperm:1:1}" + groupfuncdirperm="${funcperm:1:1}" if [ "${userfuncdirperm}" != "7" ] && [ "${groupfuncdirperm}" != "7" ]; then funcpermfail="1" conclusionpermissionerror="1" From 5b74b57d1240cfd733955ec7305fa61cdc44c44a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 13:40:30 +0100 Subject: [PATCH 256/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index f8056b5a4..fb73d5121 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -8,23 +8,41 @@ lgsm_version="150316" # Description: Checks script, files and folders ownership and permissions. # Useful variables -currentuser="$(whoami)" scriptfullpath="${rootdir}/${selfname}" conclusionpermissionerror="0" fn_check_ownership(){ # Check script ownership -if [ "${currentuser}" != "$(stat -c %U "${scriptfullpath}")" ] && [ "${currentuser}" != "$(stat -c %G "${scriptfullpath}")" ]; then +if [ ! -U "${scriptfullpath}" ] && [ ! -G "${scriptfullpath}" ]; then fn_print_fail_nl "Oops ! Permission denied on ${selfname}" echo " * To check allowed user and group run ls -l ${selfname}" exit 1 fi + # Check rootdir ownership -if [ "${currentuser}" != "$(stat -c %U "${rootdir}")" ] && [ "${currentuser}" != "$(stat -c %G "${rootdir}")" ]; then +if [ ! -U "${rootdir}" ] && [ ! -G "${rootdir}" ]; then fn_print_fail_nl "Oops ! Permission denied on ${rootdir}" echo " * To check allowed user and group run ls -l ${rootdir}" exit 1 fi + +# Check functions ownership +funownfail="0" +if [ -n "${functionsdir}" ]; then + while read -r filename + do + if [ ! -U "${filename}" ] && [ ! -G "${filename}" ]; then + funownfail="0" + conclusionpermissionerror="1" + fi + done <<< "$(find "${functionsdir}" -name "*.sh")" + + if [ "${funownfail}" == "1" ]; then + fn_print_fail_nl "Permission issues found in functions." + echo " * Neither the user or group has full control of some scripts in \"${functionsdir}\"" + echo " * You might wanna run : chmod -R 770 \"${functionsdir}\"" + fi +fi } fn_check_permissions(){ @@ -36,7 +54,7 @@ if [ -n "${rootdir}" ]; then if [ "${userrootdirperm}" != "7" ] && [ "${grouprootdirperm}" != "7" ]; then fn_print_fail_nl "Permission issues found in root directory" echo " * Neither the user or group has full control of \"${rootdir}\"" - echo " * You might wanna run : chmod -R 755 \"${rootdir}\"" + echo " * You might wanna run : chmod -R 770 \"${rootdir}\"" conclusionpermissionerror="1" fi fi @@ -58,7 +76,7 @@ if [ -n "${functionsdir}" ]; then if [ "${funcpermfail}" == "1" ]; then fn_print_fail_nl "Permission issues found in functions." echo " * Neither the user or group has full control of at least some scripts in \"${functionsdir}\"" - echo " * You might wanna run : chmod -R 755 \"${functionsdir}\"" + echo " * You might wanna run : chmod -R 770 \"${functionsdir}\"" fi fi } From 62e504a7bc37f4a9d67865e0e4b28d019a73c4fc Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 14:20:12 +0100 Subject: [PATCH 257/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index fb73d5121..c70f112a9 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -13,14 +13,14 @@ conclusionpermissionerror="0" fn_check_ownership(){ # Check script ownership -if [ ! -U "${scriptfullpath}" ] && [ ! -G "${scriptfullpath}" ]; then +if [ ! -O "${scriptfullpath}" ] && [ ! -G "${scriptfullpath}" ]; then fn_print_fail_nl "Oops ! Permission denied on ${selfname}" echo " * To check allowed user and group run ls -l ${selfname}" exit 1 fi # Check rootdir ownership -if [ ! -U "${rootdir}" ] && [ ! -G "${rootdir}" ]; then +if [ ! -O "${rootdir}" ] && [ ! -G "${rootdir}" ]; then fn_print_fail_nl "Oops ! Permission denied on ${rootdir}" echo " * To check allowed user and group run ls -l ${rootdir}" exit 1 @@ -31,7 +31,7 @@ funownfail="0" if [ -n "${functionsdir}" ]; then while read -r filename do - if [ ! -U "${filename}" ] && [ ! -G "${filename}" ]; then + if [ ! -O "${filename}" ] && [ ! -G "${filename}" ]; then funownfail="0" conclusionpermissionerror="1" fi From 5a83979d20a9142bec5fb82df4461fb98a26bde9 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 14:35:01 +0100 Subject: [PATCH 258/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index c70f112a9..eaf6cfc2f 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -32,7 +32,7 @@ if [ -n "${functionsdir}" ]; then while read -r filename do if [ ! -O "${filename}" ] && [ ! -G "${filename}" ]; then - funownfail="0" + funownfail="1" conclusionpermissionerror="1" fi done <<< "$(find "${functionsdir}" -name "*.sh")" From c1c5d2e1fd30c1a3a1a78a0026bd16dae9b39998 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 15:35:44 +0100 Subject: [PATCH 259/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index eaf6cfc2f..a050fb15f 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -8,21 +8,25 @@ lgsm_version="150316" # Description: Checks script, files and folders ownership and permissions. # Useful variables +currentuser="$(whoami)" +currentgroups="$(groups)" scriptfullpath="${rootdir}/${selfname}" conclusionpermissionerror="0" fn_check_ownership(){ # Check script ownership if [ ! -O "${scriptfullpath}" ] && [ ! -G "${scriptfullpath}" ]; then - fn_print_fail_nl "Oops ! Permission denied on ${selfname}" - echo " * To check allowed user and group run ls -l ${selfname}" + fn_print_fail_nl "Oops ! Ownership issue..." + echo " * ${currentuser} or its group(s) - ${currentgroups} - does not own \"${selfname}\"" + echo " * To check the owner and allowed groups, run ls -l \"${selfname}\"" exit 1 fi # Check rootdir ownership if [ ! -O "${rootdir}" ] && [ ! -G "${rootdir}" ]; then - fn_print_fail_nl "Oops ! Permission denied on ${rootdir}" - echo " * To check allowed user and group run ls -l ${rootdir}" + fn_print_fail_nl "Oops ! Ownership issue..." + echo " * ${currentuser} or its group(s) - ${currentgroups} - does not own \"${rootdir}\"" + echo " * To check the owner and allowed groups, run ls -dl \"${rootdir}\"" exit 1 fi @@ -38,9 +42,9 @@ if [ -n "${functionsdir}" ]; then done <<< "$(find "${functionsdir}" -name "*.sh")" if [ "${funownfail}" == "1" ]; then - fn_print_fail_nl "Permission issues found in functions." - echo " * Neither the user or group has full control of some scripts in \"${functionsdir}\"" - echo " * You might wanna run : chmod -R 770 \"${functionsdir}\"" + fn_print_fail_nl "Oops ! Ownership issue..." + echo " * ${currentuser} or its group(s) - ${currentgroups} - does not own all scripts in \"${functionsdir}\"" + echo " * To check the owner and allowed groups, run ls -l \"${functionsdir}\"" fi fi } @@ -48,12 +52,14 @@ fi fn_check_permissions(){ # Check rootdir permissions if [ -n "${rootdir}" ]; then + # Get permission numbers on folder under the form 775 rootdirperm="$(stat -c %a "${rootdir}")" + # Grab the first and second digit for user and group permission userrootdirperm="${rootdirperm:0:1}" grouprootdirperm="${rootdirperm:1:1}" if [ "${userrootdirperm}" != "7" ] && [ "${grouprootdirperm}" != "7" ]; then - fn_print_fail_nl "Permission issues found in root directory" - echo " * Neither the user or group has full control of \"${rootdir}\"" + fn_print_fail_nl "Oops ! Permission issue..." + echo " * ${currentuser} or its group(s) - ${currentgroups} need full control of \"${rootdir}\"" echo " * You might wanna run : chmod -R 770 \"${rootdir}\"" conclusionpermissionerror="1" fi @@ -74,8 +80,8 @@ if [ -n "${functionsdir}" ]; then done <<< "$(find "${functionsdir}" -name "*.sh")" if [ "${funcpermfail}" == "1" ]; then - fn_print_fail_nl "Permission issues found in functions." - echo " * Neither the user or group has full control of at least some scripts in \"${functionsdir}\"" + fn_print_fail_nl "Oops ! Permission issue..." + echo " * ${currentuser} or its group(s) - ${currentgroups} need full control on scripts in \"${functionsdir}\"" echo " * You might wanna run : chmod -R 770 \"${functionsdir}\"" fi fi From 975cac1933a1ae458781fcc91578a0335271c13d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 16:24:13 +0100 Subject: [PATCH 260/434] Update check_permissions.sh --- lgsm/functions/check_permissions.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index a050fb15f..3d3e6d6bd 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -17,7 +17,7 @@ fn_check_ownership(){ # Check script ownership if [ ! -O "${scriptfullpath}" ] && [ ! -G "${scriptfullpath}" ]; then fn_print_fail_nl "Oops ! Ownership issue..." - echo " * ${currentuser} or its group(s) - ${currentgroups} - does not own \"${selfname}\"" + echo " * Current - ${currentuser} - user or its group(s) - ${currentgroups} - does not own \"${selfname}\"" echo " * To check the owner and allowed groups, run ls -l \"${selfname}\"" exit 1 fi @@ -25,7 +25,7 @@ fi # Check rootdir ownership if [ ! -O "${rootdir}" ] && [ ! -G "${rootdir}" ]; then fn_print_fail_nl "Oops ! Ownership issue..." - echo " * ${currentuser} or its group(s) - ${currentgroups} - does not own \"${rootdir}\"" + echo " * Current - ${currentuser} - user or its group(s) - ${currentgroups} - does not own \"${rootdir}\"" echo " * To check the owner and allowed groups, run ls -dl \"${rootdir}\"" exit 1 fi @@ -43,7 +43,7 @@ if [ -n "${functionsdir}" ]; then if [ "${funownfail}" == "1" ]; then fn_print_fail_nl "Oops ! Ownership issue..." - echo " * ${currentuser} or its group(s) - ${currentgroups} - does not own all scripts in \"${functionsdir}\"" + echo " * Current - ${currentuser} - user or its group(s) - ${currentgroups} - does not own all scripts in \"${functionsdir}\"" echo " * To check the owner and allowed groups, run ls -l \"${functionsdir}\"" fi fi @@ -59,7 +59,7 @@ if [ -n "${rootdir}" ]; then grouprootdirperm="${rootdirperm:1:1}" if [ "${userrootdirperm}" != "7" ] && [ "${grouprootdirperm}" != "7" ]; then fn_print_fail_nl "Oops ! Permission issue..." - echo " * ${currentuser} or its group(s) - ${currentgroups} need full control of \"${rootdir}\"" + echo " * Current - ${currentuser} - user or its group(s) - ${currentgroups} need full control of \"${rootdir}\"" echo " * You might wanna run : chmod -R 770 \"${rootdir}\"" conclusionpermissionerror="1" fi @@ -81,7 +81,7 @@ if [ -n "${functionsdir}" ]; then if [ "${funcpermfail}" == "1" ]; then fn_print_fail_nl "Oops ! Permission issue..." - echo " * ${currentuser} or its group(s) - ${currentgroups} need full control on scripts in \"${functionsdir}\"" + echo " *Current - ${currentuser} - user or its group(s) - ${currentgroups} need full control on scripts in \"${functionsdir}\"" echo " * You might wanna run : chmod -R 770 \"${functionsdir}\"" fi fi From ded47c3ea0bdc72cf06de0bec4ae428167f0638f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 16:36:36 +0100 Subject: [PATCH 261/434] Spacing --- lgsm/functions/check_permissions.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 3d3e6d6bd..189708e50 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -17,8 +17,8 @@ fn_check_ownership(){ # Check script ownership if [ ! -O "${scriptfullpath}" ] && [ ! -G "${scriptfullpath}" ]; then fn_print_fail_nl "Oops ! Ownership issue..." - echo " * Current - ${currentuser} - user or its group(s) - ${currentgroups} - does not own \"${selfname}\"" - echo " * To check the owner and allowed groups, run ls -l \"${selfname}\"" + echo " * Current - ${currentuser} - user or its group(s) - ${currentgroups} - does not own \"${selfname}\"" + echo " * To check the owner and allowed groups, run ls -l \"${selfname}\"" exit 1 fi @@ -26,7 +26,7 @@ fi if [ ! -O "${rootdir}" ] && [ ! -G "${rootdir}" ]; then fn_print_fail_nl "Oops ! Ownership issue..." echo " * Current - ${currentuser} - user or its group(s) - ${currentgroups} - does not own \"${rootdir}\"" - echo " * To check the owner and allowed groups, run ls -dl \"${rootdir}\"" + echo " * To check the owner and allowed groups, run ls -dl \"${rootdir}\"" exit 1 fi @@ -81,7 +81,7 @@ if [ -n "${functionsdir}" ]; then if [ "${funcpermfail}" == "1" ]; then fn_print_fail_nl "Oops ! Permission issue..." - echo " *Current - ${currentuser} - user or its group(s) - ${currentgroups} need full control on scripts in \"${functionsdir}\"" + echo " * Current - ${currentuser} - user or its group(s) - ${currentgroups} need full control on scripts in \"${functionsdir}\"" echo " * You might wanna run : chmod -R 770 \"${functionsdir}\"" fi fi From f648b25b1ed7ba22bc21179aa382a92c46913cec Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:11:47 +0100 Subject: [PATCH 262/434] Ability to disable console logs. --- lgsm/functions/command_start.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index e9fa5d0d0..b843a4ae9 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -116,9 +116,15 @@ elif [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -eq "18" ]; echo "Console logging disabled: Bug in tmux 1.8 breaks logging" >> "${consolelog}" echo "http://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" echo "Currently installed: $(tmux -V)" >> "${consolelog}" -else +# Console logging enable or not set +elif [ "${consolelogging}" == "on" ]||[ -z "${consolelogging}" ]; then touch "${consolelog}" tmux pipe-pane -o -t "${servicename}" "exec cat >> '${consolelog}'" +# Console logging disabled +elif [ "${consolelogging}" == "off" ]; then + touch "${consolelog}" + cat "Console logging disabled by user" >> "{consolelog}" + fn_scriptlog "Console logging disabled by user" fi sleep 1 tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") From d30b2d0ceb1c7d71c6d2bbb20d3e7d23786eaf6f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:56:53 +0100 Subject: [PATCH 263/434] Update sdtdserver --- 7DaysToDie/sdtdserver | 1 + 1 file changed, 1 insertion(+) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index 1828f34a2..b28e5465f 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -25,6 +25,7 @@ steampass="password" # Start Variables ip="0.0.0.0" updateonstart="off" +consolelogging="on" # http://7daystodie.gamepedia.com/Server fn_parms(){ From 6b66de64df79efee06daa1925be04873351a14bd Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:57:18 +0100 Subject: [PATCH 264/434] Update arkserver --- ARKSurvivalEvolved/arkserver | 1 + 1 file changed, 1 insertion(+) diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 7b58dd823..94e0a6963 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -25,6 +25,7 @@ steampass="" # Start Variables ip="0.0.0.0" updateonstart="off" +consolelogging="on" fn_parms(){ parms="TheIsland?listen" From d903da2a56fcf83a548a87cb0f002278edea2a05 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:58:09 +0100 Subject: [PATCH 265/434] Update arma3server --- Arma3/arma3server | 1 + 1 file changed, 1 insertion(+) diff --git a/Arma3/arma3server b/Arma3/arma3server index 927a406c7..760bc8378 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -27,6 +27,7 @@ steampass="password" ip="0.0.0.0" port="2302" updateonstart="off" +consolelogging="on" fn_parms(){ parms="-netlog -ip=${ip} -port=${port} -cfg=${networkcfgfullpath} -config=${servercfgfullpath} -mod=${mods} -servermod=${servermods} -bepath=${bepath} -autoinit -loadmissiontomemory" From 6725eec4ede838cf25c4b519bd898064c2891f7b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:58:24 +0100 Subject: [PATCH 266/434] Update bmdmserver --- BlackMesa/bmdmserver | 1 + 1 file changed, 1 insertion(+) diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index 1d8f3d8fb..3ac32ba67 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -30,6 +30,7 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # Optional: Game Server Login Token # GSLT can be used for running a public server. From dd82fbdaf1f327d419e9be940e0603544676eee6 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:58:38 +0100 Subject: [PATCH 267/434] Update bsserver --- BladeSymphony/bsserver | 1 + 1 file changed, 1 insertion(+) diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index a6e284b84..a187cef4f 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -30,6 +30,7 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ From 2eefc995495490445b0432fbf632068ef8b9ffa0 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:58:50 +0100 Subject: [PATCH 268/434] Update bb2server --- BrainBread2/bb2server | 1 + 1 file changed, 1 insertion(+) diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index 7053f0cb1..484ba8e97 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -30,6 +30,7 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # Optional: Game Server Login Token # GSLT can be used for running a public server. From 016abe909ad4f7120d6f886c2b3e23ce812864f6 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:59:00 +0100 Subject: [PATCH 269/434] Update ccserver --- CodenameCURE/ccserver | 1 + 1 file changed, 1 insertion(+) diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index bd99f374d..9380d65e2 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -30,6 +30,7 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ From 215c37444d19698f48eb9b2dafa366182e63e1b1 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:59:10 +0100 Subject: [PATCH 270/434] Update csserver --- CounterStrike/csserver | 1 + 1 file changed, 1 insertion(+) diff --git a/CounterStrike/csserver b/CounterStrike/csserver index e9006ac65..795dd3aae 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -29,6 +29,7 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ From 2232ae403e28b24df42c2a5cf5a0f499f6eff25c Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:59:19 +0100 Subject: [PATCH 271/434] Update csczserver --- CounterStrikeConditionZero/csczserver | 1 + 1 file changed, 1 insertion(+) diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index 16230be9c..a13140183 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -29,6 +29,7 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ From 766456d282f080e03393d376e52ee073c345db84 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:59:30 +0100 Subject: [PATCH 272/434] Update csgoserver --- CounterStrikeGlobalOffensive/csgoserver | 1 + 1 file changed, 1 insertion(+) diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 2eb8dac03..63bb25c41 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -41,6 +41,7 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # Required: Game Server Login Token # GSLT is required for running a public server. From 8688dfd8d7b2505052d2bafe2648c665717d0ac1 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:59:39 +0100 Subject: [PATCH 273/434] Update cssserver --- CounterStrikeSource/cssserver | 1 + 1 file changed, 1 insertion(+) diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index 03e7716c6..bf4b025d3 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -30,6 +30,7 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ From fe7f57db533f29349a7908b67972e820d7f0afcb Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:59:49 +0100 Subject: [PATCH 274/434] Update dodserver --- DayOfDefeat/dodserver | 1 + 1 file changed, 1 insertion(+) diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index 55989c424..a5fc7b867 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -29,6 +29,7 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ From 146396662865a680f3bb456f56b7b13f706fb264 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 17:59:58 +0100 Subject: [PATCH 275/434] Update dodsserver --- DayOfDefeatSource/dodsserver | 1 + 1 file changed, 1 insertion(+) diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 71cc51b41..359a11b96 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -30,6 +30,7 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ From f4430e20e9b64bc556548c34c0385f21deb2dc16 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:00:10 +0100 Subject: [PATCH 276/434] Update dmcserver --- DeathmatchClassic/dmcserver | 1 + 1 file changed, 1 insertion(+) diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index 62951a357..2b41bf0e1 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -29,6 +29,7 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ From 6ec9a7bfb14a5fd350a08801abb55f45145fe04d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:00:39 +0100 Subject: [PATCH 277/434] Update dstserver --- DontStarveTogether/dstserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index d479d966b..a0a45cba4 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -25,7 +25,7 @@ steampass="" # Start Variables ip="0.0.0.0" updateonstart="off" - +consolelogging="on" # Overworld: -conf_dir DST_Overworld # Cave: -conf_dir DST_Cave From e977c807924b120c1f010bdedea16047d4732990 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:00:54 +0100 Subject: [PATCH 278/434] Update dabserver --- DoubleActionBoogaloo/dabserver | 1 + 1 file changed, 1 insertion(+) diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 831451f96..71da6e088 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -30,6 +30,7 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ From 42f4a12ec13713c40c5b381e4f0c7e8889195fcc Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:01:04 +0100 Subject: [PATCH 279/434] Update fofserver --- FistfulOfFrags/fofserver | 1 + 1 file changed, 1 insertion(+) diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index 298f57c76..a583b9ab6 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -30,6 +30,7 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ From b4a377549084cdb4a05a5d618cc7785959b5a3ef Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:03:32 +0100 Subject: [PATCH 280/434] Update gmodserver --- GarrysMod/gmodserver | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index 879cd1d01..994a5bb67 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -35,7 +35,13 @@ port="27015" sourcetvport="27020" clientport="27005" ip="0.0.0.0" +tickrate="66" updateonstart="off" +consolelogging="on" + +# Custom Start Parameters +# Default +r_hunkalloclightmaps 0, fixes a start issue on maps with many lights +customparms="+r_hunkalloclightmaps 0" # Optional: Game Server Login Token # GSLT can be used for running a public server. @@ -44,7 +50,7 @@ gslt="" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ -parms="-game garrysmod -strictportbind -ip ${ip} -port ${port} +host_workshop_collection ${workshopcollectionid} -authkey ${workshopauth} +clientport ${clientport} +tv_port ${sourcetvport} +gamemode ${gamemode} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +parms="-game garrysmod -strictportbind -ip ${ip} -port ${port} -tickrate {tickrate} +host_workshop_collection ${workshopcollectionid} -authkey ${workshopauth} +clientport ${clientport} +tv_port ${sourcetvport} +gamemode ${gamemode} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers} ${customparms}" } #### Advanced Variables #### From 7da5c06907e3a77a579df7efb0d78ee27245d368 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:04:09 +0100 Subject: [PATCH 281/434] physiterations default is 4 --- GarrysMod/cfg/lgsm-default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GarrysMod/cfg/lgsm-default.cfg b/GarrysMod/cfg/lgsm-default.cfg index 2e61eb6a2..a1e2fd4d6 100644 --- a/GarrysMod/cfg/lgsm-default.cfg +++ b/GarrysMod/cfg/lgsm-default.cfg @@ -38,7 +38,7 @@ sv_allow_wait_command 0 sv_allow_voice_from_file 0 sv_turbophysics 0 sv_max_usercmd_future_ticks 12 -gmod_physiterations 2 +gmod_physiterations 4 sv_client_min_interp_ratio 1 sv_client_max_interp_ratio 2 think_limit 20 From 2f51bc2a1d9e06f9ff77e35139a5de0d197cf5d0 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:04:46 +0100 Subject: [PATCH 282/434] Update gesserver --- GoldenEyeSource/gesserver | 1 + 1 file changed, 1 insertion(+) diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index c90e17b0f..9ddc4526e 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -31,6 +31,7 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ From 7b80fe42e54452073c2c3d562dd3632463aedcb5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:04:55 +0100 Subject: [PATCH 283/434] Update hl2dmserver --- HalfLife2Deathmatch/hl2dmserver | 1 + 1 file changed, 1 insertion(+) diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index e375010d1..ea9d248e5 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -30,6 +30,7 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ From baab3bb4765c3d2451248babc5f655d06edecb41 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:05:04 +0100 Subject: [PATCH 284/434] Update hldmserver --- HalfLifeDeathmatch/hldmserver | 1 + 1 file changed, 1 insertion(+) diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index bf65048eb..8cafa3e6b 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -29,6 +29,7 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ From 0bb4be4630681ec99fe3822ada471df4e7d8c7cb Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:05:13 +0100 Subject: [PATCH 285/434] Update hldmsserver --- HalfLifeDeathmatchSource/hldmsserver | 1 + 1 file changed, 1 insertion(+) diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index f6254c5a9..108c5b7bb 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -30,6 +30,7 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ From 1d082295482f031775949cba7a9dbdef0934e53b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:06:22 +0100 Subject: [PATCH 286/434] Update hwserver --- Hurtworld/hwserver | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index 3bcf80f38..d7922dd8d 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -43,6 +43,9 @@ loadsave="" # Use unstable 64 bit server executable (O/1) x64mode="0" +# Other +consolelogging="on" + # http://hurtworld.wikia.com/wiki/Hosting_A_Server fn_parms(){ parms="-batchmode -nographics -exec \"host ${port} ${map} ${loadsave};queryport ${queryport};maxplayers ${maxplayers};servername ${servername};creativemode ${creativemode};${admins}\" -logfile \"${logfile}\" " From 418d3b890b506370ff2239a503ff23d515ba8db5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:14:45 +0100 Subject: [PATCH 287/434] Update insserver --- Insurgency/insserver | 1 + 1 file changed, 1 insertion(+) diff --git a/Insurgency/insserver b/Insurgency/insserver index d92d8fdc0..251861cf4 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -32,6 +32,7 @@ clientport="27005" ip="0.0.0.0" updateonstart="off" workshop="0" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ From c099ed6d2757cbfbb806ea2a88d40a3f691f118f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:15:03 +0100 Subject: [PATCH 288/434] Update jc2server --- JustCause2/jc2server | 1 + 1 file changed, 1 insertion(+) diff --git a/JustCause2/jc2server b/JustCause2/jc2server index 8b27675a7..d1c5d49fb 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -24,6 +24,7 @@ steampass="" # Start Variables updateonstart="off" +consolelogging="on" fn_parms(){ parms="" From 1568181205c537045bc1060b573c0a04bb7184b6 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:15:13 +0100 Subject: [PATCH 289/434] Update kfserver --- KillingFloor/kfserver | 1 + 1 file changed, 1 insertion(+) diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index 43cc1d053..44dfeeb6d 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -26,6 +26,7 @@ steampass="password" defaultmap="KF-BioticsLab.rom" ip="0.0.0.0" updateonstart="off" +consolelogging="on" fn_parms(){ parms="server ${defaultmap}?game=KFmod.KFGameType?VACSecured=true -nohomedir ini=${servercfg} log=${gamelog}" From 99fd57aa09282588c23c8634e4e34a3a9e20ec49 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:15:23 +0100 Subject: [PATCH 290/434] Update l4dserver --- Left4Dead/l4dserver | 1 + 1 file changed, 1 insertion(+) diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index 71382b270..a4a65fef8 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -30,6 +30,7 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ From 7418a2dd02a9237e19a5d39a9f9d865c953b8f62 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:15:32 +0100 Subject: [PATCH 291/434] Update l4d2server --- Left4Dead2/l4d2server | 1 + 1 file changed, 1 insertion(+) diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index 230a0bb63..22afa51da 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -29,6 +29,7 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" +consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ From f4e70059201cdb9ce81185c6352f6eeb1baa66e3 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:15:51 +0100 Subject: [PATCH 292/434] Update mumbleserver --- Mumble/mumbleserver | 1 + 1 file changed, 1 insertion(+) diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index ca422673d..0939a40b1 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -21,6 +21,7 @@ email="email@example.com" # Server Details gamename="Mumble" servicename="mumble-server" +consolelogging="on" # Directories rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" From 5a8739e3e957e77188d16bef4d57231b73e84f6f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:16:24 +0100 Subject: [PATCH 293/434] Update ns2cserver --- NS2Combat/ns2cserver | 1 + 1 file changed, 1 insertion(+) diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index df6a28386..dab5e6e62 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -79,6 +79,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 30fed21785675ff337fadcb2d8fec07dea380c5d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:17:00 +0100 Subject: [PATCH 294/434] Update ns2server --- NaturalSelection2/ns2server | 1 + 1 file changed, 1 insertion(+) diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index 6fe81eee8..09bfab35a 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -79,6 +79,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 7323d5c911d75472beaf2f0c76e830e833771ce2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:17:13 +0100 Subject: [PATCH 295/434] Update nmrihserver --- NoMoreRoomInHell/nmrihserver | 1 + 1 file changed, 1 insertion(+) diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index 7a027a4ab..d0f14383a 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -74,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From ddbf9c79f4020cd6ce83249e8d5ef81f602dfa22 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:17:30 +0100 Subject: [PATCH 296/434] Update opforserver --- OpposingForce/opforserver | 1 + 1 file changed, 1 insertion(+) diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index 8211e1212..828ef5e50 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -74,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From cd7adaa5355cb07601ef656ad1f38bb52aa84789 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:17:43 +0100 Subject: [PATCH 297/434] Update pvkiiserver --- PiratesVikingandKnightsII/pvkiiserver | 1 + 1 file changed, 1 insertion(+) diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index abc153a44..635a8eedd 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -74,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 70b6339fa989f7be167efb0378fbb4356581e90e Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:18:05 +0100 Subject: [PATCH 298/434] Update pzserver --- ProjectZomboid/pzserver | 1 + 1 file changed, 1 insertion(+) diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index f4070a6f8..842318759 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -68,6 +68,7 @@ logdays="7" gamelogdir="${HOME}/Zomboid/Logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From e3bc648f5d7e48ef673bd07e95de8c59a6efd771 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:18:48 +0100 Subject: [PATCH 299/434] Update qlserver --- QuakeLive/qlserver | 1 + 1 file changed, 1 insertion(+) diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index 5ff2c73f5..358626f67 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -77,6 +77,7 @@ logdays="7" gamelogdir="${rootdir}/log/server" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" gamelog="${gamelogdir}/${servicename}-game.log" scriptlog="${scriptlogdir}/${servicename}-script.log" From f828c7c5c650c530318fbd2bca169ba380ee8630 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:19:06 +0100 Subject: [PATCH 300/434] Update roserver --- RedOrchestra/roserver | 1 + 1 file changed, 1 insertion(+) diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index 75180f22d..7aa33a3d6 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -70,6 +70,7 @@ logdays="7" gamelogdir="${rootdir}/log/server" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" gamelog="${gamelogdir}/${servicename}-game.log" scriptlog="${scriptlogdir}/${servicename}-script.log" From 92299fd0f7eedb23bf0a29e3bb3e568254044290 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:19:20 +0100 Subject: [PATCH 301/434] Update ricochetserver --- Ricochet/ricochetserver | 1 + 1 file changed, 1 insertion(+) diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index edf1fd63d..605b2018b 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -74,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 90aa85636300b0c78a5c5195ed58e5c440bca029 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:19:35 +0100 Subject: [PATCH 302/434] Update rustserver --- Rust/rustserver | 1 + 1 file changed, 1 insertion(+) diff --git a/Rust/rustserver b/Rust/rustserver index ce5c2b2f3..ec3a4ee9c 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -92,6 +92,7 @@ logdays="7" gamelogdir="${rootdir}/log/server" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" gamelog="${gamelogdir}/${servicename}-game.log" scriptlog="${scriptlogdir}/${servicename}-script.log" From f812f74fdc1a7ae457cb08fca3ce415ce37e11ac Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:19:48 +0100 Subject: [PATCH 303/434] Update ss3sserver --- SeriousSam3BFE/ss3sserver | 1 + 1 file changed, 1 insertion(+) diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index 7e147f824..44e48a0a7 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -69,6 +69,7 @@ logdays="7" gamelogdir="${rootdir}/log/server" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" gamelog="${gamelogdir}/${servicename}-game.log" scriptlog="${scriptlogdir}/${servicename}-script.log" From ef09329b62cf0e0cfd55abce8b268df195e46b3d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:20:00 +0100 Subject: [PATCH 304/434] Update sbserver --- StarBound/sbserver | 1 + 1 file changed, 1 insertion(+) diff --git a/StarBound/sbserver b/StarBound/sbserver index 171f6778c..84525d4a4 100644 --- a/StarBound/sbserver +++ b/StarBound/sbserver @@ -67,6 +67,7 @@ logdays="7" gamelogdir="${filesdir}/giraffe_storage" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 53fc00e5d44090cb496854c70606ef0d22529d2e Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:20:14 +0100 Subject: [PATCH 305/434] Update svencoopserver --- SvenCoop/svencoopserver | 1 + 1 file changed, 1 insertion(+) diff --git a/SvenCoop/svencoopserver b/SvenCoop/svencoopserver index 735414ccd..d5cf4dff9 100644 --- a/SvenCoop/svencoopserver +++ b/SvenCoop/svencoopserver @@ -73,6 +73,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 497c6fd41b93a2be644874030767050bb822bcaa Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:20:28 +0100 Subject: [PATCH 306/434] Update tf2server --- TeamFortress2/tf2server | 1 + 1 file changed, 1 insertion(+) diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index 8a3ec65f3..e54f8668a 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -79,6 +79,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From ea5e203797d43ed2a0ef9d0cd083f496b8d4e021 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:20:45 +0100 Subject: [PATCH 307/434] Update tfcserver --- TeamFortressClassic/tfcserver | 1 + 1 file changed, 1 insertion(+) diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index fd88681fa..e9790fff0 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -74,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 24dd34498af6026ec2c78eefd2f1e98fc29db2d3 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:21:14 +0100 Subject: [PATCH 308/434] Update twserver --- Teeworlds/twserver | 1 + 1 file changed, 1 insertion(+) diff --git a/Teeworlds/twserver b/Teeworlds/twserver index 7d087ca37..e04f47816 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -69,6 +69,7 @@ logdays="7" gamelogdir="${rootdir}/log/server" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" gamelog="${gamelogdir}/${servicename}-game.log" scriptlog="${scriptlogdir}/${servicename}-script.log" From 8830eda980ea50199065e355db7d5d1a8cf3cccf Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:21:31 +0100 Subject: [PATCH 309/434] Update terrariaserver --- Terraria/terrariaserver | 1 + 1 file changed, 1 insertion(+) diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index 3e96560f5..6734f7413 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -69,6 +69,7 @@ logdays="7" #gamelogdir="" # Terraria Doesn't Have a Server Log scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 7716581234c428593ecf3b5095d78cc024c62c09 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:21:42 +0100 Subject: [PATCH 310/434] Update ut2k4server --- UnrealTournament2004/ut2k4server | 1 + 1 file changed, 1 insertion(+) diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index ffe97329e..0dfe460d3 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -53,6 +53,7 @@ logdays="7" gamelogdir="${rootdir}/log/server" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" gamelog="${gamelogdir}/${servicename}-game.log" scriptlog="${scriptlogdir}/${servicename}-script.log" From 4ea1b6cbe85c8567608df56c36c42928ea987056 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:21:58 +0100 Subject: [PATCH 311/434] Update ut99server --- UnrealTournament99/ut99server | 1 + 1 file changed, 1 insertion(+) diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index b5f6e591e..94aa01386 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -62,6 +62,7 @@ logdays="7" gamelogdir="${systemdir}/Logs/" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 14af0ab14943bc2f2f2d14f984a541aa017dee0b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:26:16 +0100 Subject: [PATCH 312/434] Update sdtdserver --- 7DaysToDie/sdtdserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index b28e5465f..feb5ed918 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -25,7 +25,6 @@ steampass="password" # Start Variables ip="0.0.0.0" updateonstart="off" -consolelogging="on" # http://7daystodie.gamepedia.com/Server fn_parms(){ @@ -70,6 +69,7 @@ logdays="7" gamelogdir="${rootdir}/log/server" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" gamelog="${gamelogdir}/${servicename}-game.log" scriptlog="${scriptlogdir}/${servicename}-script.log" From 4257f56f90b55a90d37986edc4c5bff50c0268db Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:26:28 +0100 Subject: [PATCH 313/434] Update arkserver --- ARKSurvivalEvolved/arkserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 94e0a6963..0e6fd3f96 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -25,7 +25,6 @@ steampass="" # Start Variables ip="0.0.0.0" updateonstart="off" -consolelogging="on" fn_parms(){ parms="TheIsland?listen" @@ -69,6 +68,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 6fefef53b1d1e0575bf08d29a12c031e17bd2fdc Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:26:55 +0100 Subject: [PATCH 314/434] Update arma3server --- Arma3/arma3server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Arma3/arma3server b/Arma3/arma3server index 760bc8378..379ee8066 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -27,7 +27,6 @@ steampass="password" ip="0.0.0.0" port="2302" updateonstart="off" -consolelogging="on" fn_parms(){ parms="-netlog -ip=${ip} -port=${port} -cfg=${networkcfgfullpath} -config=${servercfgfullpath} -mod=${mods} -servermod=${servermods} -bepath=${bepath} -autoinit -loadmissiontomemory" @@ -92,6 +91,7 @@ logdays="7" #gamelogdir="" # No server logs available scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 6036e917971cd9310e71f90ff00ed645e375ac93 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:27:11 +0100 Subject: [PATCH 315/434] Update bmdmserver --- BlackMesa/bmdmserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index 3ac32ba67..cf8efb1a5 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -30,7 +30,6 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # Optional: Game Server Login Token # GSLT can be used for running a public server. @@ -80,6 +79,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 09a9e5b72e93c168e73e97a0e9eff9ba5595e9f0 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:27:27 +0100 Subject: [PATCH 316/434] Update bsserver --- BladeSymphony/bsserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index a187cef4f..879c5d765 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -30,7 +30,6 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 3173052dea8322238291b886ad49fa63646770bb Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:27:41 +0100 Subject: [PATCH 317/434] Update bb2server --- BrainBread2/bb2server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index 484ba8e97..321c27d49 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -30,7 +30,6 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # Optional: Game Server Login Token # GSLT can be used for running a public server. @@ -80,6 +79,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From f103dcee51d1ab1df8b913b36c8fdd730d36999b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:27:52 +0100 Subject: [PATCH 318/434] Update ccserver --- CodenameCURE/ccserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 9380d65e2..55632e467 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -30,7 +30,6 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 636f3786b1c4fa3aa761686fbbdd5e8a47e57686 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:28:05 +0100 Subject: [PATCH 319/434] Update csserver --- CounterStrike/csserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CounterStrike/csserver b/CounterStrike/csserver index 795dd3aae..80c9ea796 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -29,7 +29,6 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 9c978a626b710d34082e37784d8085b96171f55f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:28:17 +0100 Subject: [PATCH 320/434] Update csczserver --- CounterStrikeConditionZero/csczserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index a13140183..cabcdda5a 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -29,7 +29,6 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 76923e9cb47c238ad667068fb26046f8c0363041 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:28:34 +0100 Subject: [PATCH 321/434] Update csgoserver --- CounterStrikeGlobalOffensive/csgoserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 63bb25c41..d2ba2c507 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -41,7 +41,6 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # Required: Game Server Login Token # GSLT is required for running a public server. @@ -98,6 +97,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 5719cdca94ea8c146384421afb4d838bbffc7de9 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:28:49 +0100 Subject: [PATCH 322/434] Update cssserver --- CounterStrikeSource/cssserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index bf4b025d3..40dacf097 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -30,7 +30,6 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From d39103603bd9e97d5e3234c1ebc72499af0fb507 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:29:00 +0100 Subject: [PATCH 323/434] Update dodserver --- DayOfDefeat/dodserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index a5fc7b867..6fc30e14c 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -29,7 +29,6 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From af4ffbe66ff8e3489cac3aba6e33a06d7e453afe Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:29:17 +0100 Subject: [PATCH 324/434] Update dodsserver --- DayOfDefeatSource/dodsserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 359a11b96..025937d76 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -30,7 +30,6 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From d33c360b6424d4f79836217ebc5e8c2583d264c0 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:29:31 +0100 Subject: [PATCH 325/434] Update dmcserver --- DeathmatchClassic/dmcserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index 2b41bf0e1..6f18aac51 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -29,7 +29,6 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 2e35624c603fc301706af157f20de631145892cb Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:29:48 +0100 Subject: [PATCH 326/434] Update dstserver --- DontStarveTogether/dstserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index a0a45cba4..e7a754670 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -25,7 +25,6 @@ steampass="" # Start Variables ip="0.0.0.0" updateonstart="off" -consolelogging="on" # Overworld: -conf_dir DST_Overworld # Cave: -conf_dir DST_Cave @@ -72,6 +71,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From fd1b7368dabada29e621ac0e3e08b7d8b0d93bfc Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:31:23 +0100 Subject: [PATCH 327/434] Update dabserver --- DoubleActionBoogaloo/dabserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 71da6e088..cdc3ca7c9 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -30,7 +30,6 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From d4a5a45bae246bf38f2a032ad848ba8c842dba94 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:31:32 +0100 Subject: [PATCH 328/434] Update fofserver --- FistfulOfFrags/fofserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index a583b9ab6..d0a9c7372 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -30,7 +30,6 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From dc41c01be30f30d1c960050c8527e44b6777f406 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:31:48 +0100 Subject: [PATCH 329/434] Update gmodserver --- GarrysMod/gmodserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index 994a5bb67..bc4fca209 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -37,7 +37,6 @@ clientport="27005" ip="0.0.0.0" tickrate="66" updateonstart="off" -consolelogging="on" # Custom Start Parameters # Default +r_hunkalloclightmaps 0, fixes a start issue on maps with many lights @@ -92,6 +91,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 902e916764011fdc79d7b96ca20a19dd60dbdf39 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:32:00 +0100 Subject: [PATCH 330/434] Update gesserver --- GoldenEyeSource/gesserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index 9ddc4526e..7649b6ec0 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -31,7 +31,6 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ @@ -76,6 +75,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From db11ec600474035f20f078523484053bff143482 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:32:14 +0100 Subject: [PATCH 331/434] Update hl2dmserver --- HalfLife2Deathmatch/hl2dmserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index ea9d248e5..3b45b537d 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -30,7 +30,6 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 020bccdf0d0920af4fc31139dd590c01e261524f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:32:29 +0100 Subject: [PATCH 332/434] Update hldmserver --- HalfLifeDeathmatch/hldmserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index 8cafa3e6b..bbb418522 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -29,7 +29,6 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ @@ -74,6 +73,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 966a4c19328ab8944131d00f08478206b7b5b079 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:32:40 +0100 Subject: [PATCH 333/434] Update hldmsserver --- HalfLifeDeathmatchSource/hldmsserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index 108c5b7bb..83a9684b4 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -30,7 +30,6 @@ sourcetvport="27020" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From ee6cf5a05495d33598fe53fbedd7fa09ff1b6f33 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:33:20 +0100 Subject: [PATCH 334/434] Update hwserver --- Hurtworld/hwserver | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index d7922dd8d..b828f53d7 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -43,8 +43,6 @@ loadsave="" # Use unstable 64 bit server executable (O/1) x64mode="0" -# Other -consolelogging="on" # http://hurtworld.wikia.com/wiki/Hosting_A_Server fn_parms(){ @@ -89,6 +87,7 @@ logdays="7" gamelogdir="${rootdir}/log/server" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" gamelog="${gamelogdir}/${servicename}-game.log" scriptlog="${scriptlogdir}/${servicename}-script.log" From b68c3c06c03653d6548cda18cf28cd898e6bb032 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:33:33 +0100 Subject: [PATCH 335/434] Update insserver --- Insurgency/insserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Insurgency/insserver b/Insurgency/insserver index 251861cf4..9afc9c821 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -32,7 +32,6 @@ clientport="27005" ip="0.0.0.0" updateonstart="off" workshop="0" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ @@ -77,6 +76,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 5808c82ddd03849fc8f89b7881bd08db613e24a5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:34:04 +0100 Subject: [PATCH 336/434] Update jc2server --- JustCause2/jc2server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JustCause2/jc2server b/JustCause2/jc2server index d1c5d49fb..bd75e35fb 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -24,7 +24,6 @@ steampass="" # Start Variables updateonstart="off" -consolelogging="on" fn_parms(){ parms="" @@ -69,6 +68,7 @@ logdays="7" #gamelogdir="" # No server logs available scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 9c872d2f6803c82fe6771f059f80a20cf0850335 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:34:16 +0100 Subject: [PATCH 337/434] Update kfserver --- KillingFloor/kfserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index 44dfeeb6d..ae9f31854 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -26,7 +26,6 @@ steampass="password" defaultmap="KF-BioticsLab.rom" ip="0.0.0.0" updateonstart="off" -consolelogging="on" fn_parms(){ parms="server ${defaultmap}?game=KFmod.KFGameType?VACSecured=true -nohomedir ini=${servercfg} log=${gamelog}" @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${rootdir}/log/server" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" gamelog="${gamelogdir}/${servicename}-game.log" scriptlog="${scriptlogdir}/${servicename}-script.log" From 32ba4bca05bae81754093319639e3fddf2c89206 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:34:27 +0100 Subject: [PATCH 338/434] Update l4dserver --- Left4Dead/l4dserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index a4a65fef8..7ca5641a3 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -30,7 +30,6 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ @@ -75,6 +74,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 80759caf1d47f62a2eb9fdc7da71ff6ea2360dbe Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:34:38 +0100 Subject: [PATCH 339/434] Update l4d2server --- Left4Dead2/l4d2server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index 22afa51da..31a897818 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -29,7 +29,6 @@ port="27015" clientport="27005" ip="0.0.0.0" updateonstart="off" -consolelogging="on" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ @@ -74,6 +73,7 @@ logdays="7" gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From e248346bfbf781798882c39d9b71fb892c0b5a81 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 15 Mar 2016 18:35:01 +0100 Subject: [PATCH 340/434] Update mumbleserver --- Mumble/mumbleserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index 0939a40b1..53b0064d0 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -21,7 +21,6 @@ email="email@example.com" # Server Details gamename="Mumble" servicename="mumble-server" -consolelogging="on" # Directories rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" @@ -43,6 +42,7 @@ logdays="7" logdir="${rootdir}/log" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" +consolelogging="on" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" From 89c4c98325428dd71c950ae771f3e1ad9fe38a96 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 16:30:01 +0000 Subject: [PATCH 341/434] Compatibility for legacy scripts --- functions/core_functions.sh | 433 +--------------------------------- functions/fn_functions | 22 +- functions/fn_getopt | 30 ++- functions/fn_update_functions | 54 +++-- 4 files changed, 87 insertions(+), 452 deletions(-) diff --git a/functions/core_functions.sh b/functions/core_functions.sh index d4993d256..c0b87e0ce 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -2,75 +2,16 @@ # LGSM core_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="270216" +lgsm_version="271215" -# Description: Defines all functions to allow download and execution of functions using fn_fetch_function. -# This function is called first before any other function. Without this file other functions would not load. +# Description: Redirect to new core_functions.sh -# Code/functions for legacy servers - -fn_functions(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fn_getopt(){ +core_functions(){ +# Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_fetch_function -} - -# fn_fetch_core_dl also placed here to allow legecy servers to still download core functions -if [ -z "${lgsmdir}" ]; then - lgsmdir="${rootdir}/lgsm" - functionsdir="${lgsmdir}/functions" - libdir="${lgsmdir}/lib" -fi - -fn_fetch_core_dl(){ -github_file_url_dir="lgsm/functions" -github_file_url_name="${functionfile}" -filedir="${functionsdir}" -filename="${github_file_url_name}" -githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" -# If the file is missing, then download -if [ ! -f "${filedir}/${filename}" ]; then - if [ ! -d "${filedir}" ]; then - mkdir -p "${filedir}" - fi - echo -e " fetching ${filename}...\c" - # Check curl exists and use available path - curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" - for curlcmd in ${curlpaths} - do - if [ -x "${curlcmd}" ]; then - break - fi - done - # If curl exists download file - if [ "$(basename ${curlcmd})" == "curl" ]; then - curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curlfetch}" - echo -e "${githuburl}\n" - exit 1 - else - echo -e "\e[0;32mOK\e[0m" - fi - else - echo -e "\e[0;31mFAIL\e[0m\n" - echo "Curl is not installed!" - echo -e "" - exit 1 - fi - chmod +x "${filedir}/${filename}" -fi -source "${filedir}/${filename}" +fn_fetch_core_dl } - -# Core - core_dl.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" @@ -87,369 +28,9 @@ functionfile="${FUNCNAME}" fn_fetch_core_dl } -core_dl.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_core_dl -} - -# Command - -command_console.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_debug.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_details.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_email_test.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_backup.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_monitor.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_start.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_stop.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_validate.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_install.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_fastdl.sh(){ -functionfile="${FUNCNAME}" -fn_runfunction -} - -command_ts3_server_pass.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fn_restart(){ -local modulename="Restarting" -info_config.sh -if [ -d "${scriptlogdir}" ]; then - fn_scriptlog "${servername}" -fi -command_stop.sh -command_start.sh -} - - -# Checks - -check.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_config.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_deps.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_ip.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_logs.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_root.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_steamcmd.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_system_dir.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -check_tmux.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# Compress - -compress_unreal2_maps.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -compress_ut99_maps.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# Dev - -command_dev_debug.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -command_dev_detect_deps.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# Fix - -fix.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_arma3.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_csgo.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_dst.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_ins.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_steamcmd.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_glibc.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_ro.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_kf.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_ut2k4.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# Info - -info_config.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -info_distro.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -info_glibc.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -info_ts3status.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# Email - -email.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -# Logs - -logs.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# Monitor - -monitor_gsquery.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -# Update - -update_check.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - command_update_functions.sh(){ functionfile="${FUNCNAME}" -fn_fetch_function -} - -update_dl.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fn_update_functions.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - - -# -## Installer functions -# - -fn_autoinstall(){ -autoinstall=1 -command_install.sh -} - -install_complete.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_config.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_gsquery.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_gslt.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_header.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_logs.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_retry.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_server_dir.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} -install_server_files.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_steamcmd.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_ts3.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_ts3db.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_ut2k4.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_dl_ut2k4.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -install_ut2k4_key.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fix_ut99.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function +fn_fetch_core_dl } -# Calls on-screen messages -core_messages.sh - -#Calls file downloader -core_dl.sh +core_functions.sh \ No newline at end of file diff --git a/functions/fn_functions b/functions/fn_functions index f6ea53f55..c0b87e0ce 100644 --- a/functions/fn_functions +++ b/functions/fn_functions @@ -6,15 +6,31 @@ lgsm_version="271215" # Description: Redirect to new core_functions.sh -core_functions.sh(){ +core_functions(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl +} + +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_getopt.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl +} + +core_messages.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +command_update_functions.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl } core_functions.sh \ No newline at end of file diff --git a/functions/fn_getopt b/functions/fn_getopt index 8b52e1865..89a298870 100644 --- a/functions/fn_getopt +++ b/functions/fn_getopt @@ -1,15 +1,37 @@ #!/bin/bash -# LGSM core_getopt.sh function +# LGSM core_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com lgsm_version="271215" -# Description: Redirect to new core_getopt.sh +# Description: Redirect to new core_functions.sh -core_getopt.sh(){ +core_functions(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +core_dl.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl +} + +core_getopt.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +core_messages.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +command_update_functions.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl } +core_functions.sh core_getopt.sh \ No newline at end of file diff --git a/functions/fn_update_functions b/functions/fn_update_functions index 5fbb28975..342ca8351 100644 --- a/functions/fn_update_functions +++ b/functions/fn_update_functions @@ -1,22 +1,38 @@ #!/bin/bash -# LGSM fn_update_functions.sh function +# LGSM core_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="230116" - -# Description: LEGACY FUNCTION Deletes the functions dir to allow re-downloading of functions from GitHub. - -fn_print_dots "Updating functions" -fn_scriptlog "Updating functions" -sleep 1 -echo -ne "\n" -rm -rfv "${rootdir}/functions/"* -exitcode=$? -if [ "${exitcode}" == "0" ]; then - fn_print_ok "Updating functions" - fn_scriptlog "Success! Updating functions" -else - fn_print_fail "Updating functions" - fn_scriptlog "Failure! Updating functions" -fi -echo -ne "\n" \ No newline at end of file +lgsm_version="271215" + +# Description: Redirect to new core_functions.sh + +core_functions(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +core_dl.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +core_getopt.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +core_messages.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +command_update_functions.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +core_functions.sh +command_update_functions.sh + From f3261d3ad9bde9f98721638b0ab3c76d8dbacb76 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 16:35:38 +0000 Subject: [PATCH 342/434] added .sh --- functions/core_functions.sh | 2 +- functions/fn_functions | 2 +- functions/fn_getopt | 2 +- functions/fn_update_functions | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/functions/core_functions.sh b/functions/core_functions.sh index c0b87e0ce..8962efd04 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -6,7 +6,7 @@ lgsm_version="271215" # Description: Redirect to new core_functions.sh -core_functions(){ +core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" fn_fetch_core_dl diff --git a/functions/fn_functions b/functions/fn_functions index c0b87e0ce..8962efd04 100644 --- a/functions/fn_functions +++ b/functions/fn_functions @@ -6,7 +6,7 @@ lgsm_version="271215" # Description: Redirect to new core_functions.sh -core_functions(){ +core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" fn_fetch_core_dl diff --git a/functions/fn_getopt b/functions/fn_getopt index 89a298870..6c0ab922e 100644 --- a/functions/fn_getopt +++ b/functions/fn_getopt @@ -6,7 +6,7 @@ lgsm_version="271215" # Description: Redirect to new core_functions.sh -core_functions(){ +core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" fn_fetch_core_dl diff --git a/functions/fn_update_functions b/functions/fn_update_functions index 342ca8351..6370a3de9 100644 --- a/functions/fn_update_functions +++ b/functions/fn_update_functions @@ -6,7 +6,7 @@ lgsm_version="271215" # Description: Redirect to new core_functions.sh -core_functions(){ +core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" fn_fetch_core_dl From bb46d57a86fc90f66d4e00af32f671cd1967a69b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 18:42:48 +0000 Subject: [PATCH 343/434] corrected function name --- functions/core_functions.sh | 10 +++++----- functions/fn_functions | 10 +++++----- functions/fn_getopt | 10 +++++----- functions/fn_update_functions | 10 +++++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/functions/core_functions.sh b/functions/core_functions.sh index 8962efd04..45bc375df 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -9,28 +9,28 @@ lgsm_version="271215" core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_dl.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_getopt.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_messages.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } command_update_functions.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_functions.sh \ No newline at end of file diff --git a/functions/fn_functions b/functions/fn_functions index 8962efd04..45bc375df 100644 --- a/functions/fn_functions +++ b/functions/fn_functions @@ -9,28 +9,28 @@ lgsm_version="271215" core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_dl.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_getopt.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_messages.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } command_update_functions.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_functions.sh \ No newline at end of file diff --git a/functions/fn_getopt b/functions/fn_getopt index 6c0ab922e..67e7dc4a2 100644 --- a/functions/fn_getopt +++ b/functions/fn_getopt @@ -9,28 +9,28 @@ lgsm_version="271215" core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_dl.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_getopt.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_messages.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } command_update_functions.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_functions.sh diff --git a/functions/fn_update_functions b/functions/fn_update_functions index 6370a3de9..dab701c9b 100644 --- a/functions/fn_update_functions +++ b/functions/fn_update_functions @@ -9,28 +9,28 @@ lgsm_version="271215" core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_dl.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_getopt.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_messages.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } command_update_functions.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_runfunction } core_functions.sh From 93c9f83b2a3363f7ddd1c5ef5c4d558cf09db557 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 18:56:36 +0000 Subject: [PATCH 344/434] Improving backwards compatibility --- functions/core_functions.sh | 73 +++++++++++++++++++++++++------------ functions/core_getopt.sh | 15 ++++++++ functions/fn_getopt | 31 ++-------------- 3 files changed, 69 insertions(+), 50 deletions(-) create mode 100644 functions/core_getopt.sh diff --git a/functions/core_functions.sh b/functions/core_functions.sh index 45bc375df..81500398a 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -2,35 +2,62 @@ # LGSM core_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="180316" -# Description: Redirect to new core_functions.sh +# Description: Redirect to new location for core_functions.sh -core_functions.sh(){ -# Functions are defined in core_functions.sh. -functionfile="${FUNCNAME}" -fn_runfunction -} +# fn_fetch_core_dl also placed here to allow legecy servers to still download core functions +if [ -z "${lgsmdir}" ]; then + lgsmdir="${rootdir}/lgsm" + functionsdir="${lgsmdir}/functions" + libdir="${lgsmdir}/lib" +fi -core_dl.sh(){ -# Functions are defined in core_functions.sh. -functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then + if [ ! -d "${filedir}" ]; then + mkdir -p "${filedir}" + fi + echo -e " fetching ${filename}...\c" + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else + echo -e "\e[0;31mFAIL\e[0m\n" + echo "Curl is not installed!" + echo -e "" + exit 1 + fi + chmod +x "${filedir}/${filename}" +fi +source "${filedir}/${filename}" } -core_getopt.sh(){ -functionfile="${FUNCNAME}" -fn_runfunction -} - -core_messages.sh(){ -functionfile="${FUNCNAME}" -fn_runfunction -} - -command_update_functions.sh(){ +core_functions.sh(){ functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } core_functions.sh \ No newline at end of file diff --git a/functions/core_getopt.sh b/functions/core_getopt.sh new file mode 100644 index 000000000..aa487b0a2 --- /dev/null +++ b/functions/core_getopt.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# LGSM core_getopt function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="180316" + +# Description: Redirect to new location for core_getopt.sh + +core_getopt.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + +core_getopt.sh \ No newline at end of file diff --git a/functions/fn_getopt b/functions/fn_getopt index 67e7dc4a2..73d3b530d 100644 --- a/functions/fn_getopt +++ b/functions/fn_getopt @@ -1,37 +1,14 @@ #!/bin/bash -# LGSM core_functions.sh function +# LGSM fn_getopt function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="180316" -# Description: Redirect to new core_functions.sh - -core_functions.sh(){ -# Functions are defined in core_functions.sh. -functionfile="${FUNCNAME}" -fn_runfunction -} - -core_dl.sh(){ -# Functions are defined in core_functions.sh. -functionfile="${FUNCNAME}" -fn_runfunction -} +# Description: Redirect to new core_getopt.sh core_getopt.sh(){ functionfile="${FUNCNAME}" -fn_runfunction -} - -core_messages.sh(){ -functionfile="${FUNCNAME}" -fn_runfunction -} - -command_update_functions.sh(){ -functionfile="${FUNCNAME}" -fn_runfunction +fn_fetch_core_dl } -core_functions.sh core_getopt.sh \ No newline at end of file From 89a68e03a7891680d1deab748fd41184c668c046 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 19:05:41 +0000 Subject: [PATCH 345/434] Added extra protections against incorrect rm --- functions/command_update_functions.sh | 40 ++++++++++++++++++++++ lgsm/functions/command_update_functions.sh | 19 +++++----- 2 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 functions/command_update_functions.sh diff --git a/functions/command_update_functions.sh b/functions/command_update_functions.sh new file mode 100644 index 000000000..a23cf58a1 --- /dev/null +++ b/functions/command_update_functions.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# LGSM update_functions.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="270216" + +# Description: Deletes the functions dir to allow re-downloading of functions from GitHub. + +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +check.sh +fn_print_dots "Updating functions" +fn_scriptlog "Updating functions" +sleep 1 +echo -ne "\n" + + + +# Removed legecy functions dir +if [ -n "${rootdir}" ]; then + if [ -d "${rootdir}/functions/" ]; then + rm -rfv "${rootdir}/functions/" + exitcode=$? + fi +fi + +if [ -n "${functionsdir}" ]; then + if [ -d "${functionsdir}" ]; then + rm -rfv "${functionsdir}/"* + exitcode=$? + fi +fi + +if [ "${exitcode}" == "0" ]; then + fn_print_ok "Updating functions" + fn_scriptlog "Success! Updating functions" +else + fn_print_fail "Updating functions" + fn_scriptlog "Failure! Updating functions" +fi +echo -ne "\n" \ No newline at end of file diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 9c0ac4b90..a23cf58a1 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -13,18 +13,21 @@ fn_scriptlog "Updating functions" sleep 1 echo -ne "\n" + + # Removed legecy functions dir -if [ -d "${rootdir}/functions/" ]; then - rm -rfv "${rootdir}/functions/" - exitcode=$? +if [ -n "${rootdir}" ]; then + if [ -d "${rootdir}/functions/" ]; then + rm -rfv "${rootdir}/functions/" + exitcode=$? + fi fi if [ -n "${functionsdir}" ]; then - rm -rfv "${functionsdir}/"* - exitcode=$? -else - fn_print_fail "Updating functions" - fn_scriptlog "Failure! Updating functions" + if [ -d "${functionsdir}" ]; then + rm -rfv "${functionsdir}/"* + exitcode=$? + fi fi if [ "${exitcode}" == "0" ]; then From 211b7889f9d76ae2949db5039f7fdde5bf63867f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 19:06:22 +0000 Subject: [PATCH 346/434] Improvements to backward compatibility --- functions/fn_functions | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/functions/fn_functions b/functions/fn_functions index 45bc375df..abea6d258 100644 --- a/functions/fn_functions +++ b/functions/fn_functions @@ -1,8 +1,8 @@ #!/bin/bash -# LGSM core_functions.sh function +# LGSM fn_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="180316" # Description: Redirect to new core_functions.sh @@ -12,25 +12,4 @@ functionfile="${FUNCNAME}" fn_runfunction } -core_dl.sh(){ -# Functions are defined in core_functions.sh. -functionfile="${FUNCNAME}" -fn_runfunction -} - -core_getopt.sh(){ -functionfile="${FUNCNAME}" -fn_runfunction -} - -core_messages.sh(){ -functionfile="${FUNCNAME}" -fn_runfunction -} - -command_update_functions.sh(){ -functionfile="${FUNCNAME}" -fn_runfunction -} - core_functions.sh \ No newline at end of file From 1669d06f5ba6e42341ce09c80703549bb30288cd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 19:09:23 +0000 Subject: [PATCH 347/434] corrected line endings --- functions/core_getopt.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/functions/core_getopt.sh b/functions/core_getopt.sh index aa487b0a2..d728aeb33 100644 --- a/functions/core_getopt.sh +++ b/functions/core_getopt.sh @@ -7,7 +7,6 @@ lgsm_version="180316" # Description: Redirect to new location for core_getopt.sh core_getopt.sh(){ -# Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" fn_fetch_core_dl } From 8c9a3d03a2ce9b86e0928faaea944b3c4d2da639 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 19:10:03 +0000 Subject: [PATCH 348/434] line endings --- functions/core_getopt.sh | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/functions/core_getopt.sh b/functions/core_getopt.sh index d728aeb33..80bf47a14 100644 --- a/functions/core_getopt.sh +++ b/functions/core_getopt.sh @@ -1,14 +1,14 @@ -#!/bin/bash -# LGSM core_getopt function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="180316" - -# Description: Redirect to new location for core_getopt.sh - -core_getopt.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_core_dl -} - +#!/bin/bash +# LGSM core_getopt function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="180316" + +# Description: Redirect to new location for core_getopt.sh + +core_getopt.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + core_getopt.sh \ No newline at end of file From d94b5293298e3aa771558b0539bbafdb4165bf78 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 19:17:29 +0000 Subject: [PATCH 349/434] minor change --- functions/command_update_functions.sh | 4 +--- functions/core_functions.sh | 2 +- functions/core_getopt.sh | 4 ++-- functions/fn_functions | 4 ++-- functions/fn_getopt | 4 ++-- functions/fn_update_functions | 27 ++-------------------- lgsm/functions/command_update_functions.sh | 4 +--- 7 files changed, 11 insertions(+), 38 deletions(-) diff --git a/functions/command_update_functions.sh b/functions/command_update_functions.sh index a23cf58a1..5e9671594 100644 --- a/functions/command_update_functions.sh +++ b/functions/command_update_functions.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM update_functions.sh function +# LGSM command_update_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com lgsm_version="270216" @@ -13,8 +13,6 @@ fn_scriptlog "Updating functions" sleep 1 echo -ne "\n" - - # Removed legecy functions dir if [ -n "${rootdir}" ]; then if [ -d "${rootdir}/functions/" ]; then diff --git a/functions/core_functions.sh b/functions/core_functions.sh index 81500398a..d2e389f56 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -4,7 +4,7 @@ # Website: http://gameservermanagers.com lgsm_version="180316" -# Description: Redirect to new location for core_functions.sh +# Description: REDIRECT FUNCTION to new location for core_functions.sh # fn_fetch_core_dl also placed here to allow legecy servers to still download core functions if [ -z "${lgsmdir}" ]; then diff --git a/functions/core_getopt.sh b/functions/core_getopt.sh index 80bf47a14..b3e0b4c33 100644 --- a/functions/core_getopt.sh +++ b/functions/core_getopt.sh @@ -1,10 +1,10 @@ #!/bin/bash -# LGSM core_getopt function +# LGSM core_getopt.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com lgsm_version="180316" -# Description: Redirect to new location for core_getopt.sh +# Description: REDIRECT FUNCTION to new location for core_getopt.sh core_getopt.sh(){ functionfile="${FUNCNAME}" diff --git a/functions/fn_functions b/functions/fn_functions index abea6d258..0acb04b17 100644 --- a/functions/fn_functions +++ b/functions/fn_functions @@ -1,10 +1,10 @@ #!/bin/bash -# LGSM fn_functions.sh function +# LGSM fn_functions function # Author: Daniel Gibbs # Website: http://gameservermanagers.com lgsm_version="180316" -# Description: Redirect to new core_functions.sh +# Description: REDIRECT FUNCTION to new core_functions.sh core_functions.sh(){ # Functions are defined in core_functions.sh. diff --git a/functions/fn_getopt b/functions/fn_getopt index 73d3b530d..3323d7f75 100644 --- a/functions/fn_getopt +++ b/functions/fn_getopt @@ -1,10 +1,10 @@ #!/bin/bash -# LGSM fn_getopt function +# LGSM fn_getopt.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com lgsm_version="180316" -# Description: Redirect to new core_getopt.sh +# Description: REDIRECT FUNCTION to new core_getopt.sh core_getopt.sh(){ functionfile="${FUNCNAME}" diff --git a/functions/fn_update_functions b/functions/fn_update_functions index dab701c9b..ee19979c5 100644 --- a/functions/fn_update_functions +++ b/functions/fn_update_functions @@ -1,38 +1,15 @@ #!/bin/bash -# LGSM core_functions.sh function +# LGSM fn_update_functions function # Author: Daniel Gibbs # Website: http://gameservermanagers.com lgsm_version="271215" -# Description: Redirect to new core_functions.sh - -core_functions.sh(){ -# Functions are defined in core_functions.sh. -functionfile="${FUNCNAME}" -fn_runfunction -} - -core_dl.sh(){ -# Functions are defined in core_functions.sh. -functionfile="${FUNCNAME}" -fn_runfunction -} - -core_getopt.sh(){ -functionfile="${FUNCNAME}" -fn_runfunction -} - -core_messages.sh(){ -functionfile="${FUNCNAME}" -fn_runfunction -} +# Description: REDIRECT FUNCTION to new command_update_functions.sh command_update_functions.sh(){ functionfile="${FUNCNAME}" fn_runfunction } -core_functions.sh command_update_functions.sh diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index a23cf58a1..5e9671594 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM update_functions.sh function +# LGSM command_update_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com lgsm_version="270216" @@ -13,8 +13,6 @@ fn_scriptlog "Updating functions" sleep 1 echo -ne "\n" - - # Removed legecy functions dir if [ -n "${rootdir}" ]; then if [ -d "${rootdir}/functions/" ]; then From c15fea5f7887cff6e9c18aabb25d451ae5d2777a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 19:45:45 +0000 Subject: [PATCH 350/434] check_glibc on install check glibc will check in install if the server can run with glibc version installed or if glibc fix will get the server to run. Should this not be possible it will ber ecommendedto upgrade the server --- lgsm/functions/check_glibc.sh | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 lgsm/functions/check_glibc.sh diff --git a/lgsm/functions/check_glibc.sh b/lgsm/functions/check_glibc.sh new file mode 100644 index 000000000..3647f4705 --- /dev/null +++ b/lgsm/functions/check_glibc.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# LGSM check_glibc.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="020116" + +# Description: Checks if server has correct glibc or has a fix available. + +info_glibc.sh + +glibc_version="$(ldd --version | sed -n '1s/.* //p')" +if [ "$(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1)" != "${glibc_required}" ]; then + if [ "${glibcfix}" != "yes" ]; then + fn_print_warn_nl "Glibc fix: No Glibc fix available!" + echo -en "\n" + echo " * glibc required: $glibc_required" + echo " * glibc installed: $glibc_version" + echo -en "\n" + fn_print_infomation "The game server will probably not work. A distro upgrade is required!" + sleep 5 + fi + echo -en "\n" +fi \ No newline at end of file From cf1bf992a0088968485d98c8c45eae17296c8632 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 19:45:53 +0000 Subject: [PATCH 351/434] added check glibc --- lgsm/functions/check.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 186f30859..d62b479dc 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -17,6 +17,10 @@ if [ "${function_selfname}" != "command_install.sh" ] && [ "${function_selfname} check_system_dir.sh fi +if [ "${function_selfname}" -= "command_install.sh" ]; then + check_glibc.sh +fi + local allowed_commands_array=( command_backup.sh command_console.sh command_debug.sh command_details.sh command_unreal2_maps.sh command_ut99_maps.sh command_monitor.sh command_start.sh command_stop.sh update_check.sh command_validate.sh command_update_functions.sh command_email_test.sh ) for allowed_command in "${allowed_commands_array[@]}" do From 3a2d4e14533541ef9f94e1129fd565eeaeaf5430 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 19:46:07 +0000 Subject: [PATCH 352/434] minor changes --- lgsm/functions/fix_glibc.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index 77aa852de..826f74b9c 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -25,7 +25,6 @@ do fi done - glibc_version="$(ldd --version | sed -n '1s/.* //p')" if [ "$(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1)" != "${glibc_required}" ]; then if [ "${glibcfix}" == "yes" ]; then @@ -35,10 +34,13 @@ if [ "$(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1)" != export LD_LIBRARY_PATH=:"${libdir}" else fn_print_warn_nl "Glibc fix: No Glibc fix available!" + echo -en "\n" echo " * glibc required: $glibc_required" echo " * glibc installed: $glibc_version" - fn_print_infomation "The game server is unlikly to work. A distro upgrade is required" - fi + echo -en "\n" + fn_print_infomation "The game server will probably not work. A distro upgrade is required!" + fi + echo -en "\n" else echo "GLIBC is OK no fix required" fi \ No newline at end of file From f2fe7d78893afdc4784b50ac3907a5cc29c929b1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 19:46:51 +0000 Subject: [PATCH 353/434] bug --- lgsm/functions/check.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index d62b479dc..aa9ab63ab 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -17,7 +17,7 @@ if [ "${function_selfname}" != "command_install.sh" ] && [ "${function_selfname} check_system_dir.sh fi -if [ "${function_selfname}" -= "command_install.sh" ]; then +if [ "${function_selfname}" == "command_install.sh" ]; then check_glibc.sh fi From 3930d98a85618df764d8a3757fbbcf39ca7b90e7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 19:52:47 +0000 Subject: [PATCH 354/434] added check glibc removed code for legacy --- lgsm/functions/core_functions.sh | 68 +++----------------------------- 1 file changed, 6 insertions(+), 62 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 613311a14..266333993 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -7,68 +7,6 @@ lgsm_version="270216" # Description: Defines all functions to allow download and execution of functions using fn_fetch_function. # This function is called first before any other function. Without this file other functions would not load. -# Code/functions for legacy servers - -fn_functions(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fn_getopt(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -# fn_fetch_core_dl also placed here to allow legecy servers to still download core functions -if [ -z "${lgsmdir}" ]; then - lgsmdir="${rootdir}/lgsm" - functionsdir="${lgsmdir}/functions" - libdir="${lgsmdir}/lib" -fi - -fn_fetch_core_dl(){ -github_file_url_dir="lgsm/functions" -github_file_url_name="${functionfile}" -filedir="${functionsdir}" -filename="${github_file_url_name}" -githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" -# If the file is missing, then download -if [ ! -f "${filedir}/${filename}" ]; then - if [ ! -d "${filedir}" ]; then - mkdir -p "${filedir}" - fi - echo -e " fetching ${filename}...\c" - # Check curl exists and use available path - curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" - for curlcmd in ${curlpaths} - do - if [ -x "${curlcmd}" ]; then - break - fi - done - # If curl exists download file - if [ "$(basename ${curlcmd})" == "curl" ]; then - curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curlfetch}" - echo -e "${githuburl}\n" - exit 1 - else - echo -e "\e[0;32mOK\e[0m" - fi - else - echo -e "\e[0;31mFAIL\e[0m\n" - echo "Curl is not installed!" - echo -e "" - exit 1 - fi - chmod +x "${filedir}/${filename}" -fi -source "${filedir}/${filename}" -} - - # Core core_dl.sh(){ @@ -182,6 +120,12 @@ functionfile="${FUNCNAME}" fn_fetch_function } +check_glibc.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + + check_ip.sh(){ functionfile="${FUNCNAME}" fn_fetch_function From 2aee8dafc418091971c99d82321e6205b8d36d94 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 19:55:47 +0000 Subject: [PATCH 355/434] added legacy code back in --- lgsm/functions/core_functions.sh | 63 +++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 266333993..7240cfc12 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -7,6 +7,68 @@ lgsm_version="270216" # Description: Defines all functions to allow download and execution of functions using fn_fetch_function. # This function is called first before any other function. Without this file other functions would not load. +# Code/functions for legacy servers + +fn_functions(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +fn_getopt(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +# fn_fetch_core_dl also placed here to allow legecy servers to still download core functions +if [ -z "${lgsmdir}" ]; then + lgsmdir="${rootdir}/lgsm" + functionsdir="${lgsmdir}/functions" + libdir="${lgsmdir}/lib" +fi + +fn_fetch_core_dl(){ +github_file_url_dir="lgsm/functions" +github_file_url_name="${functionfile}" +filedir="${functionsdir}" +filename="${github_file_url_name}" +githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" +# If the file is missing, then download +if [ ! -f "${filedir}/${filename}" ]; then + if [ ! -d "${filedir}" ]; then + mkdir -p "${filedir}" + fi + echo -e " fetching ${filename}...\c" + # Check curl exists and use available path + curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)" + for curlcmd in ${curlpaths} + do + if [ -x "${curlcmd}" ]; then + break + fi + done + # If curl exists download file + if [ "$(basename ${curlcmd})" == "curl" ]; then + curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) + if [ $? -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo "${curlfetch}" + echo -e "${githuburl}\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else + echo -e "\e[0;31mFAIL\e[0m\n" + echo "Curl is not installed!" + echo -e "" + exit 1 + fi + chmod +x "${filedir}/${filename}" +fi +source "${filedir}/${filename}" +} + + # Core core_dl.sh(){ @@ -125,7 +187,6 @@ functionfile="${FUNCNAME}" fn_fetch_function } - check_ip.sh(){ functionfile="${FUNCNAME}" fn_fetch_function From d32a6defb88291bc8e02fbf8f329e84ee74eb28c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 20:03:42 +0000 Subject: [PATCH 356/434] glibc fix is no longer required on install --- lgsm/functions/fix.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index f10f44f6c..a57484305 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -47,7 +47,6 @@ fi # Fixes that are run on install only. if [ "${function_selfname}" == "command_install.sh" ]; then - fix_glibc.sh if [ "${gamename}" == "Killing Floor" ]; then echo "" echo "Applying ${gamename} Server Fixes" From 341db2e034b84628894f3fe1b6d0294e18fffd1d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 18 Mar 2016 20:30:07 +0000 Subject: [PATCH 357/434] added 2nd mime for gzip --- lgsm/functions/core_dl.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index d6d841637..4db131df2 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -54,7 +54,7 @@ echo -ne "extracting ${filename}..." fn_scriptlog "extracting download" mime=$(file -b --mime-type "${filedir}/${filename}") -if [ "${mime}" == "application/gzip" ]; then +if [ "${mime}" == "application/gzip" ]||[ "${mime}" == "application/x-gzip" ]; then tarcmd=$(tar -zxf "${filedir}/${filename}" -C "${extractdir}") elif [ "${mime}" == "application/x-bzip2" ]; then tarcmd=$(tar -jxf "${filedir}/${filename}" -C "${extractdir}") From 4e6c61c29ff84602a28a5be01ce2d5c11e992d80 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 22 Apr 2016 22:39:29 +0100 Subject: [PATCH 358/434] Glibc checking should work correctly --- lgsm/functions/fix_glibc.sh | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index 826f74b9c..5af92d4b7 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -2,13 +2,12 @@ # LGSM fix_glibc.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="020116" +lgsm_version="220416" # Description: Downloads required glibc files and applys teh glibc fix if required info_glibc.sh - local libstdc_servers_array=( "ARMA 3" "Blade Symphony" "Garry's Mod" "Just Cause 2" ) for libstdc_server in "${libstdc_servers_array[@]}" do @@ -25,22 +24,20 @@ do fi done -glibc_version="$(ldd --version | sed -n '1s/.* //p')" -if [ "$(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1)" != "${glibc_required}" ]; then +glibc_version="$(ldd --version | sed 's/.* //;q')" +if [ "$(printf '%s\n'${glibc_required}'\n' ${glibc_version} | sort -V | head -n 1)" != "${glibc_required}" ]; then if [ "${glibcfix}" == "yes" ]; then fn_print_info_nl "Glibc fix: Using Glibc fix" - echo " * glibc required: $glibc_required" - echo " * glibc installed: $glibc_version" + echo " * glibc required: ${glibc_required}" + echo " * glibc installed: ${glibc_version}" export LD_LIBRARY_PATH=:"${libdir}" else fn_print_warn_nl "Glibc fix: No Glibc fix available!" echo -en "\n" - echo " * glibc required: $glibc_required" - echo " * glibc installed: $glibc_version" + echo " * glibc required: ${glibc_required}" + echo " * glibc installed: ${glibc_version}" echo -en "\n" fn_print_infomation "The game server will probably not work. A distro upgrade is required!" fi echo -en "\n" -else - echo "GLIBC is OK no fix required" fi \ No newline at end of file From 12b85ec64dacac0b9e63ab002ee6c5695760b235 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 22 Apr 2016 22:53:08 +0100 Subject: [PATCH 359/434] Fixed not detecting config dir --- NS2Combat/ns2cserver | 9 +++++---- NaturalSelection2/ns2server | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index dab5e6e62..9d1eada32 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="220416" #### Variables #### @@ -32,8 +32,6 @@ servername="NS2C Server" webadminuser="admin" webadminpass="admin" webadminport="8080" -configpath="server1" -modstorage="server1/Workshop" mods="" password="" # Add the following line to the parms if you want a private server. Ensuring @@ -42,7 +40,7 @@ password="" # http://wiki.unknownworlds.com/ns2/Dedicated_Server fn_parms(){ -parms="-name \"${servername}\" -port ${port} -webadmin -webdomain ${ip} -webuser ${webadminuser} -webpassword \"${webadminpass}\" -webport ${webadminport} -map ${defaultmap} -limit ${maxplayers} -config_path \"${rootdir}/${configpath}\" -modstorage \"${rootdir}/${modstorage}\" -mods \"${mods}\"" +parms="-name \"${servername}\" -port ${port} -webadmin -webdomain ${ip} -webuser ${webadminuser} -webpassword \"${webadminpass}\" -webport ${webadminport} -map ${defaultmap} -limit ${maxplayers} -config_path \"${servercfgdir}\" -modstorage \"${modstoragedir}\" -mods \"${mods}\"" } #### Advanced Variables #### @@ -72,6 +70,9 @@ filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}/ia32" executable="./ns2combatserver_linux32" +servercfgdir="${rootdir}/server1" +servercfgfullpath="${servercfgdir}" +modstoragedir="${servercfgdir}/Workshop" backupdir="${rootdir}/backups" # Logging diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index 09bfab35a..206a652f8 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="220416" #### Variables #### @@ -32,8 +32,6 @@ servername="NS2 Server" webadminuser="admin" webadminpass="admin" webadminport="8080" -configpath="server1" -modstorage="server1/Workshop" mods="" password="" # Add the following line to the parms if you want a private server. Ensuring @@ -42,7 +40,7 @@ password="" # http://wiki.unknownworlds.com/ns2/Dedicated_Server fn_parms(){ -parms="-name \"${servername}\" -port ${port} -webadmin -webdomain ${ip} -webuser ${webadminuser} -webpassword \"${webadminpass}\" -webport ${webadminport} -map ${defaultmap} -limit ${maxplayers} -config_path \"${rootdir}/${configpath}\" -modstorage \"${rootdir}/${modstorage}\" -mods \"${mods}\"" +parms="-name \"${servername}\" -port ${port} -webadmin -webdomain ${ip} -webuser ${webadminuser} -webpassword \"${webadminpass}\" -webport ${webadminport} -map ${defaultmap} -limit ${maxplayers} -config_path \"${servercfgdir}\" -modstorage \"${modstoragedir}\" -mods \"${mods}\"" } #### Advanced Variables #### @@ -72,6 +70,9 @@ filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" executable="./server_linux32" +servercfgdir="${rootdir}/server1" +servercfgfullpath="${servercfgdir}" +modstoragedir="${servercfgdir}/Workshop" backupdir="${rootdir}/backups" # Logging From 2df93dd891be70e2a8141766c6e23995917de8c8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 24 Apr 2016 23:35:19 +0100 Subject: [PATCH 360/434] Resolved issue #776 --- lgsm/functions/email.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/email.sh b/lgsm/functions/email.sh index 174ed3ff6..06f9607d3 100644 --- a/lgsm/functions/email.sh +++ b/lgsm/functions/email.sh @@ -2,7 +2,7 @@ # LGSM email.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="020216" +lgsm_version="240416" # Description: Sends email notification if monitor picks up a failure. @@ -11,7 +11,9 @@ fn_print_dots "Sending notification to ${email}" info_distro.sh info_config.sh check_ip.sh -fn_parms +if [ $(type -t fn_parms;echo $?) == 0 ]; then + fn_parms +fi { echo -e "========================================\n${servicename} details\n========================================" echo -e "Service name: ${servicename}" From 95c555e68f9f6f98966d5c90c03d44fa2a5eae0d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 1 May 2016 20:56:04 +0100 Subject: [PATCH 361/434] Optimised info gathering Optimised the method for gathering and displaying info grabed from config files. There will be a new file specifically for parms --- lgsm/functions/info_config.sh | 995 +++++++--------------------------- 1 file changed, 210 insertions(+), 785 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index d9d5d4dfb..f1938c514 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -12,857 +12,282 @@ lgsm_version="010316" # tr -d '=\"; ' remove selected charectors =\"; # grep -v "foo" filter out lines that contain foo -## Just Cause 2 -if [ "${engine}" == "avalanche" ]; then +unavailable="\e[0;31mUNAVAILABLE\e[0m" +zero="\e[0;31m0\e[0m" - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "Name" "${servercfgfullpath}" | sed 's/Name//g' | tr -d '=", \n') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi +fn_info_config_avalanche(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + slots="${zero}" + port="${zero}" else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # ip - if [ -f "${servercfgfullpath}" ]; then - # check if the ip exists in the config file. Failing this will fall back to the default. - configipcheck=$(grep "BindIP" "${servercfgfullpath}" | sed 's/BindIP//g' | tr -d '=", \n') - fi - if [ -n "${configipcheck}" ]; then - ip=$(grep "BindIP" "${servercfgfullpath}" | sed 's/BindIP//g' | tr -d '=", \n') - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "Name" "${servercfgfullpath}" | sed 's/Name//g' | tr -d '=", \n') serverpassword=$(grep "Password" "${servercfgfullpath}" | sed 's/Password//g' | tr -d '=", \n') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then slots=$(grep "MaxPlayers" "${servercfgfullpath}" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then port=$(grep "BindPort" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - -## Dont Starve Together -elif [ "${engine}" == "dontstarve" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "default_server_name = " "${servercfgfullpath}" | sed 's/default_server_name = //g') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi + + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + slots=${slots:-"0"} + port=${port:-"0"} + + # check if the ip exists in the config file. Failing this will fall back to the default. + ipconfigcheck=$(grep "BindIP" "${servercfgfullpath}" | sed 's/BindIP//g' | tr -d '=", \n') + if [ -n "${ipconfigcheck}" ]; then + ip="${ipconfigcheck}" + fi + fi +} + +fn_info_config_dontstarve(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + slots="${zero}" + gamemode="${unavailable}" + tickrate="${zero}" + port="${zero}" else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "default_server_name = " "${servercfgfullpath}" | sed 's/default_server_name = //g') serverpassword=$(grep "server_password = " "${servercfgfullpath}" | grep -v "#" | sed 's/server_password = //g') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then slots=$(grep "max_players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # game mode - if [ -f "${servercfgfullpath}" ]; then gamemode=$(grep "game_mode = " "${servercfgfullpath}" | grep -v "#" | sed 's/game_mode = //g') - if [ ! -n "${gamemode}" ]; then - gamemode="NOT SET" - fi - else - gamemode="\e[0;31mUNAVAILABLE\e[0m" - fi - - # tickrate - if [ -f "${servercfgfullpath}" ]; then tickrate=$(grep "tick_rate" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - if [ ! -n "${tickrate}" ]; then - tickrate="NOT SET" - fi - else - tickrate="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then port=$(grep "server_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - -## Project Zomboid -elif [ "${engine}" == "projectzomboid" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "PublicName=" "${servercfgfullpath}" | sed 's/PublicName=//g' | tr -d '=", \n') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi + + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + slots=${slots:-"0"} + gamemode=${gamemode:-"NOT SET"} + tickrate=${tickrate:-"0"} + port=${port:-"0"} + fi +} + +fn_info_config_projectzomboid(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + slots="${zero}" + port="${zero}" else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "PublicName=" "${servercfgfullpath}" | sed 's/PublicName=//g' | tr -d '=", \n') slots=$(grep "MaxPlayers=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then port=$(grep "DefaultPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') + + # Not Set + servername=${servername:-"NOT SET"} + slots=${slots:-"0"} + port=${port:-"0"} fi - if [ ! -n "${port}" ]; then - port="0" - fi - - -# Quake Live -elif [ "${engine}" == "idtech3" ]; then +} - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "set sv_hostname " "${servercfgfullpath}" | sed 's/set sv_hostname //g' | tr -d '=\"; ') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi +fn_info_config_idtech3(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + slots="${zero}" else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then - + servername=$(grep "set sv_hostname " "${servercfgfullpath}" | sed 's/set sv_hostname //g' | tr -d '=\"; ') serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/set g_password//g' | tr -d '=\"; '| cut -f1 -d "/") - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # rcon password - rconpassword="${rconpassword}" - if [ -f "${servercfgfullpath}" ]; then - if [ ! -n "${rconpassword}" ]; then - rconpassword="NOT SET" - fi - else - rconpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then slots=$(grep "set sv_maxClients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - port="${gameport}" - if [ ! -n "${port}" ]; then - port="0" + + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + slots=${slots:-"0"} fi +} - # rcon port - if [ ! -n "${rconport}" ]; then - rconport="0" - fi - - # Stats port - if [ ! -n "${statsport}" ]; then - statsport="0" - fi - -# ARMA 3 -elif [ "${engine}" == "realvirtuality" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "hostname" "${servercfgfullpath}" | grep -v "//" | sed -e 's/\//g' | tr -d '=\"; ') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi +fn_info_config_realvirtuality(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + adminpassword="${unavailable}" + serverpassword="${unavailable}" + slots="${zero}" else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # admin password - if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "hostname" "${servercfgfullpath}" | grep -v "//" | sed -e 's/\//g' | tr -d '=\"; ') adminpassword=$(grep "passwordAdmin" "${servercfgfullpath}" | grep -v "//" | sed -e 's/\passwordAdmin//g' | tr -d '=\"; ') - if [ ! -n "${adminpassword}" ]; then - adminpassword="NOT SET" - fi - else - adminpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then serverpassword=$(grep "password =" "${servercfgfullpath}" | grep -v "//" | sed -e 's/\password//g' | tr -d '=\"; ') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then slots=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi + + # Not Set + servername=${servername:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + slots=${slots:-"0"} + fi +} + +fn_info_config_seriousengine35(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + rconpassword="${unavailable}" + gamemode="${unavailable}" + slots="${zero}" + port="${zero}" else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ "${port}" != "" ]; then - port=${port} - fi - if [ ! -n "${port}" ]; then - port="0" - fi - - # query port - if [ "${port}" != "" ]; then - queryport=$((port + 1)) - fi - if [ ! -n "${queryport}" ]; then - queryport="0" - fi - - # master port - if [ "${port}" != "" ]; then - masterport=$((port + 2)) - fi - if [ ! -n "${masterport}" ]; then - masterport="0" - fi - -# Serious Sam -elif [ "${engine}" == "seriousengine35" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then servername=$(grep "prj_strMultiplayerSessionName" "${servercfgfullpath}" | sed 's/prj_strMultiplayerSessionName = //g' | tr -d '=\"; ') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # rcon password - if [ -f "${servercfgfullpath}" ]; then rconpassword=$(grep "rcts_strAdminPassword" "${servercfgfullpath}" | sed 's/rcts_strAdminPassword = //g' | tr -d '=\"; ') - if [ ! -n "${rconpassword}" ]; then - rconpassword="NOT SET" - fi - else - rconpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then - slots=$(grep "gam_ctMaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # game mode - if [ -f "${servercfgfullpath}" ]; then gamemode=$(grep "gam_idGameMode" "${servercfgfullpath}" | grep -v "#" | sed 's/gam_idGameMode//g' | tr -d '=\"; ') - if [ ! -n "${gamemode}" ]; then - gamemode="NOT SET" - fi - else - gamemode="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then + slots=$(grep "gam_ctMaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') port=$(grep "prj_uwPort" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - - # query port - if [ -f "${servercfgfullpath}" ]; then - queryport=$((port + 1)) - fi - if [ ! -n "${queryport}" ]; then - queryport="0" - fi - -# Source Engine Games -elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "hostname" "${servercfgfullpath}" | sed 's/hostname //g' | sed 's/"//g') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi + + # Not Set + servername=${servername:-"NOT SET"} + rconpassword=${rconpassword:-"NOT SET"} + gamemode=${gamemode:-"NOT SET"} + slots=${slots:-"0"} + port=${port:-"0"} + fi +} + +fn_info_config_source(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + rconpassword="${unavailable}" else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then + servername=$(grep "hostname" "${servercfgfullpath}" | sed 's/hostname //g' | sed 's/"//g') serverpassword=$(grep "sv_password" "${servercfgfullpath}" | sed 's/sv_password //g' | sed 's/"//g') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # rcon password - if [ -f "${servercfgfullpath}" ]; then rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed 's/rcon_password //g' | sed 's/"//g') - if [ ! -n "${rconpassword}" ]; then - rconpassword="NOT SET" - fi - else - rconpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - -# Spark (NS2: Combat) -elif [ "${engine}" == "spark" ]; then - - # query port - if [ -f "${servercfgfullpath}" ]; then - queryport=$((port + 1)) - fi - if [ ! -n "${queryport}" ]; then - queryport="0" + + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + rconpassword=${rconpassword:-"NOT SET"} fi +} -# Teamspeak 3 -elif [ "${gamename}" == "Teamspeak 3" ]; then - - # ip - if [ -f "${servercfgfullpath}" ]; then +fn_info_config_teamspeak3(){ + if [ ! -f "${servercfgfullpath}" ]; then + dbplugin="${unavailable}" + port="9987" + queryport="10011" + fileport="30033" + else # check if the ip exists in the config file. Failing this will fall back to the default. - configipcheck=$(grep "voice_ip=" "${servercfgfullpath}" | sed 's/\voice_ip=//g') - fi - if [ -n "${configipcheck}" ]; then - ip=$(grep "voice_ip=" "${servercfgfullpath}" | sed 's/\voice_ip=//g') - fi - - # dbplugin - if [ -f "${servercfgfullpath}" ]; then - dbplugin=$(grep "dbplugin=" "${servercfgfullpath}" | sed 's/\dbplugin=//g') - if [ ! -n "${dbplugin}" ]; then - dbplugin="NOT SET" + ipconfigcheck=$(grep "voice_ip=" "${servercfgfullpath}" | sed 's/\voice_ip=//g') + if [ -n "${ipconfigcheck}" ]; then + ip="${ipconfigcheck}" fi - else - dbplugin="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then + dbplugin=$(grep "dbplugin=" "${servercfgfullpath}" | sed 's/\dbplugin=//g') port=$(grep "default_voice_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="9987" - fi - - # query port - if [ -f "${servercfgfullpath}" ]; then queryport=$(grep "query_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${queryport}" ]; then - queryport="10011" - fi - - # file port - if [ -f "${servercfgfullpath}" ]; then fileport=$(grep "filetransfer_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${fileport}" ]; then - fileport="30033" - fi -# Teeworlds -elif [ "${engine}" == "teeworlds" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "sv_name" "${servercfgfullpath}" | sed 's/sv_name //g' | sed 's/"//g') - if [ ! -n "${servername}" ]; then - servername="unnamed server" - fi - else - servername="unnamed server" + # Not Set + port=${port:-"9987"} + queryport=${queryport:-"10011"} + fileport=${fileport:-"30033"} fi +} - # server password - if [ -f "${servercfgfullpath}" ]; then +fn_info_config_teeworlds(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="unnamed server" + serverpassword="${unavailable}" + rconpassword="${unavailable}" + port="8303" + slots="12" + else + servername=$(grep "sv_name" "${servercfgfullpath}" | sed 's/sv_name //g' | sed 's/"//g') serverpassword=$(grep "password " "${servercfgfullpath}" | awk '!/sv_rcon_password/'| sed 's/password //g' | tr -d '=\"; ') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # rcon password - if [ -f "${servercfgfullpath}" ]; then rconpassword=$(grep "sv_rcon_password" "${servercfgfullpath}" | sed 's/sv_rcon_password //g' | tr -d '=\"; ') - if [ ! -n "${rconpassword}" ]; then - rconpassword="NOT SET" - fi - else - rconpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then port=$(grep "sv_port" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="8303" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then slots=$(grep "sv_max_clients" "${servercfgfullpath}" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="12" - fi - else - slots="12" - fi - -# Terraria -elif [ "${engine}" == "terraria" ]; then - - # port - if [ -f "${servercfgfullpath}" ]; then - port=$(grep "port=" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - -# 7 Day To Die (unity3d) -elif [ "${gamename}" == "7 Days To Die" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "ServerName" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then - serverpassword=$(grep "ServerPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # webadmin enabled - if [ -f "${servercfgfullpath}" ]; then - webadminenabled=$(grep "ControlPanelEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${webadminenabled}" ]; then - webadminenabled="NOT SET" - fi - else - webadminenabled="\e[0;31mUNAVAILABLE\e[0m" - fi - - # webadmin port - if [ -f "${servercfgfullpath}" ]; then - webadminport=$(grep "ControlPanelPort" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${webadminport}" ]; then - webadminport="0" - fi - - # webadmin enabled - if [ -f "${servercfgfullpath}" ]; then - webadminenabled=$(grep "ControlPanelEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${webadminenabled}" ]; then - webadminenabled="NOT SET" - fi - else - webadminenabled="\e[0;31mUNAVAILABLE\e[0m" - fi - - # webadmin password - if [ -f "${servercfgfullpath}" ]; then - webadminpass=$(grep "ControlPanelPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${webadminpass}" ]; then - webadminpass="NOT SET" - fi - else - webadminpass="\e[0;31mUNAVAILABLE\e[0m" - fi - - # telnet enabled - if [ -f "${servercfgfullpath}" ]; then - telnetenabled=$(grep "TelnetEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${telnetenabled}" ]; then - telnetenabled="NOT SET" - fi - else - telnetenabled="\e[0;31mUNAVAILABLE\e[0m" - fi - - # telnet port - if [ -f "${servercfgfullpath}" ]; then - telnetport=$(grep "TelnetPort" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${telnetport}" ]; then - telnetport="0" - fi - - # telnet password - if [ -f "${servercfgfullpath}" ]; then - telnetpass=$(grep "TelnetPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${telnetpass}" ]; then - telnetpass="NOT SET" - fi - else - telnetpass="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then - slots=$(grep "ServerMaxPlayerCount" "${servercfgfullpath}" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # game mode - if [ -f "${servercfgfullpath}" ]; then - gamemode=$(grep "GameMode" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${gamemode}" ]; then - gamemode="NOT SET" - fi - else - gamemode="\e[0;31mUNAVAILABLE\e[0m" - fi - - # game world - if [ -f "${servercfgfullpath}" ]; then - gameworld=$(grep "GameWorld" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - if [ ! -n "${gameworld}" ]; then - gameworld="NOT SET" - fi - else - gameworld="\e[0;31mUNAVAILABLE\e[0m" - fi + + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + rconpassword=${rconpassword:-"NOT SET"} + port=${port:-"8303"} + slots=${slots:-"12"} + fi +} - # port - if [ -f "${servercfgfullpath}" ]; then - port=$(grep "sv_port" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then +fn_info_config_terraria(){ + if [ ! -f "${servercfgfullpath}" ]; then port="0" - fi - - # query port - if [ -f "${servercfgfullpath}" ]; then - queryport=$((port + 1)) - fi - if [ ! -n "${queryport}" ]; then - queryport="0" - fi - -# Hurtworld (unity3d) -elif [ "${gamename}" == "Hurtworld" ]; then - - # server name - if [ -n "${servername}" ]; then - servername="${servername}" - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - # not available yet - - # slots - if [ -n "${maxplayers}" ]; then - slots="${maxplayers}" - else - slots="NOT SET" - fi - - # game world - if [ -n "${map}" ]; then - gameworld="${map}" - else - gameworld="NO MAP SET" - fi + else + port=$(grep "port=" "${servercfgfullpath}" | tr -cd '[:digit:]') - # port - if [ -n "${port}" ]; then - port="${port}" - else - port="0" + # Not Set + port=${port:-"0"} fi +} - # query port - if [ -n "${queryport}" ]; then - queryport="${queryport}" +fn_info_config_unreal(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + adminpassword="${unavailable}" + port="${zero}" + gsqueryport="${zero}" + webadminenabled="${unavailable}" + webadminport="${zero}" + webadminuser="${unavailable}" + webadminpass="${unavailable}" else - queryport="0" - fi - -# Unreal Tournament -elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then servername=$(grep "ServerName=" "${servercfgfullpath}" | sed 's/ServerName=//g') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" - fi - - # server password - if [ -f "${servercfgfullpath}" ]; then serverpassword=$(grep "GamePassword=" "${servercfgfullpath}" | sed 's/GamePassword=//g') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # admin password - if [ -f "${servercfgfullpath}" ]; then adminpassword=$(grep "AdminPassword=" "${servercfgfullpath}" | sed 's/AdminPassword=//g') - if [ ! -n "${adminpassword}" ]; then - adminpassword="NOT SET" - fi - else - adminpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then port=$(grep "Port=" "${servercfgfullpath}" | grep -v "Master" | grep -v "LAN" | grep -v "Proxy" | grep -v "Listen" | tr -d '\r' | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - - # query port - if [ -f "${servercfgfullpath}" ]; then - queryport=$((port + 1)) - fi - if [ ! -n "${queryport}" ]; then - queryport="0" - fi - - # gamespy query port - if [ -f "${servercfgfullpath}" ]; then gsqueryport=$(grep "OldQueryPortNumber=" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]') - fi - if [ ! -n "${gsqueryport}" ]; then - gsqueryport="0" - fi - - # query port - if [ -f "${servercfgfullpath}" ]; then - udplinkport=$((port + 2)) - fi - if [ ! -n "${udplinkport}" ]; then - udplinkport="0" - fi - - # webadmin enabled - if [ -f "${servercfgfullpath}" ]; then webadminenabled=$(grep "bEnabled=" "${servercfgfullpath}" | sed 's/bEnabled=//g' | tr -d '\r') - if [ ! -n "${webadminenabled}" ]; then - webadminenabled="NOT SET" - fi - else - webadminenabled="\e[0;31mUNAVAILABLE\e[0m" - fi - - # webadmin port - if [ -f "${servercfgfullpath}" ]; then webadminport=$(grep "ListenPort=" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]') - fi - if [ ! -n "${webadminport}" ]; then - webadminport="0" - fi - - if [ "${engine}" == "unreal" ]; then - - # webadmin user - if [ -f "${servercfgfullpath}" ]; then + if [ "${engine}" == "unreal" ]; then webadminuser=$(grep "AdminUsername=" "${servercfgfullpath}" | sed 's/\AdminUsername=//g') - if [ ! -n "${webadminuser}" ]; then - webadminuser="NOT SET" - fi - else - webadminuser="\e[0;31mUNAVAILABLE\e[0m" - fi - - # webadmin password - if [ -f "${servercfgfullpath}" ]; then webadminpass=$(grep "UTServerAdmin.UTServerAdmin" "${servercfgfullpath}" -A 2 | grep "AdminPassword=" | sed 's/\AdminPassword=//g') - if [ ! -n "${webadminpass}" ]; then - webadminpass="NOT SET" - fi else - webadminpass="\e[0;31mUNAVAILABLE\e[0m" - fi - - else - - # webadmin user - if [ -f "${servercfgfullpath}" ]; then webadminuser=$(grep "AdminName=" "${servercfgfullpath}" | sed 's/\AdminName=//g') - if [ ! -n "${webadminuser}" ]; then - webadminuser="NOT SET" - fi - else - webadminuser="\e[0;31mUNAVAILABLE\e[0m" - fi - - # webadmin password - if [ -f "${servercfgfullpath}" ]; then webadminpass=$(grep "AdminPassword=" "${servercfgfullpath}" | sed 's/\AdminPassword=//g') - if [ ! -n "${webadminpass}" ]; then - webadminpass="NOT SET" - fi - else - webadminpass="\e[0;31mUNAVAILABLE\e[0m" fi - fi - -# ARK: Survivaial Evolved -elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then - - # server name - if [ -f "${servercfgfullpath}" ]; then - servername=$(grep "SessionName=" "${servercfgfullpath}" | sed 's/SessionName=//g') - if [ ! -n "${servername}" ]; then - servername="NOT SET" - fi - else - servername="\e[0;31mUNAVAILABLE\e[0m" + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + port=${port:-"0"} + gsqueryport=${gsqueryport:-"NOT SET"} + webadminenabled=${webadminenabled:-"NOT SET"} + webadminport=${webadminport:-"NOT SET"} + webadminuser=${webadminuser:-"NOT SET"} + webadminpass=${webadminpass:-"NOT SET"} fi +} - # server password - if [ -f "${servercfgfullpath}" ]; then - serverpassword=$(grep "ServerPassword=" "${servercfgfullpath}" | sed 's/ServerPassword=//g') - if [ ! -n "${serverpassword}" ]; then - serverpassword="NOT SET" - fi - else - serverpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # admin password - if [ -f "${servercfgfullpath}" ]; then - adminpassword=$(grep "ServerAdminPassword=" "${servercfgfullpath}" | sed 's/ServerAdminPassword=//g') - if [ ! -n "${adminpassword}" ]; then - adminpassword="NOT SET" - fi - else - adminpassword="\e[0;31mUNAVAILABLE\e[0m" - fi - - # slots - if [ -f "${servercfgfullpath}" ]; then - slots=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]') - if [ ! -n "${slots}" ]; then - slots="NOT SET" - fi - else - slots="\e[0;31mUNAVAILABLE\e[0m" - fi - - # port - if [ -f "${servercfgfullpath}" ]; then - port=$(grep "Port=" "${servercfgfullpath}" | grep -v "RCONPort=" | grep -v "QueryPort=" | tr -cd '[:digit:]') - fi - if [ ! -n "${port}" ]; then - port="0" - fi - - # rcon port - if [ -f "${servercfgfullpath}" ]; then - rconport=$(grep "RCONPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${rconport}" ]; then - rconport="0" - fi - - # query port - if [ -f "${servercfgfullpath}" ]; then - queryport=$(grep "QueryPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') - fi - if [ ! -n "${queryport}" ]; then - queryport="0" - fi - -fi +## Just Cause 2 +if [ "${engine}" == "avalanche" ]; then + fn_info_config_avalanche +## Dont Starve Together +elif [ "${engine}" == "dontstarve" ]; then + fn_info_config_dontstarve +## Project Zomboid +elif [ "${engine}" == "projectzomboid" ]; then + fn_info_config_projectzomboid +# Quake Love +elif [ "${engine}" == "idtech3" ]; then + fn_info_config_idtech3 +# ARMA 3 +elif [ "${engine}" == "realvirtuality" ]; then + fn_info_config_realvirtuality +# Serious Sam +elif [ "${engine}" == "seriousengine35" ]; then + fn_info_config_seriousengine35 +# Source Engine Games +elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then + fn_info_config_source +elif [ "${gamename}" == "Teamspeak 3" ]; then + fn_info_config_teamspeak3 +# Teeworlds +elif [ "${engine}" == "teeworlds" ]; then + fn_info_config_teeworlds +elif [ "${engine}" == "terraria" ]; then + fn_info_config_terraria +# Unreal/Unreal 2 engine +elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then + fn_info_config_unreal +fi \ No newline at end of file From 3710e3914206cdea64b711b609c5050d1cb40ef5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 5 May 2016 23:20:57 +0100 Subject: [PATCH 362/434] added info_distro.sh fix arch not detected --- lgsm/functions/check_deps.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 56c8c711c..5e523a521 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -2,7 +2,7 @@ # LGSM check_deps.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="060316" +lgsm_version="050516" # Description: Checks that the requires dependencies are installed for LGSM. @@ -112,13 +112,14 @@ fn_check_loop(){ fn_found_missing_deps } +info_distro.sh + if [ "${function_selfname}" == "command_install.sh" ]; then echo "" echo "Checking Dependecies" echo "=================================" fi - # Check will only run if using apt-get or yum if [ -n "$(command -v dpkg-query)" ]; then # Generate array of missing deps From 430a648f507ca0c3ab1bcbbe64101f69a56d17f7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 5 May 2016 23:21:09 +0100 Subject: [PATCH 363/434] added info_parms.sh --- lgsm/functions/core_functions.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 7240cfc12..77a3cffb7 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -2,7 +2,7 @@ # LGSM core_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="270216" +lgsm_version="020516" # Description: Defines all functions to allow download and execution of functions using fn_fetch_function. # This function is called first before any other function. Without this file other functions would not load. @@ -319,6 +319,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +info_parms.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + info_ts3status.sh(){ functionfile="${FUNCNAME}" fn_fetch_function From 65f180533c29c98a08feac34fed40597874130eb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 5 May 2016 23:24:59 +0100 Subject: [PATCH 364/434] Initial commit Very broken --- lgsm/functions/info_parms.sh | 175 +++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 lgsm/functions/info_parms.sh diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh new file mode 100644 index 000000000..d8a6ec26c --- /dev/null +++ b/lgsm/functions/info_parms.sh @@ -0,0 +1,175 @@ +#!/bin/bash +# LGSM info_parms.sh function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="010316" + +# Description: Gets specific details server parameters. + +## Examples of filtering to get info from config files +# sed 's/foo//g' - remove foo +# tr -cd '[:digit:]' leave only digits +# tr -d '=\"; ' remove selected charectors =\"; +# grep -v "foo" filter out lines that contain foo + +unavailable="\e[0;31mUNAVAILABLE\e[0m" +zero="\e[0;31m0\e[0m" + + +fn_info_config_idtech3(){ + # Not Set + gameport=${gameport:-"NOT SET"} + rconport=${rconport:-"0"} + rconpassword=${rconpassword:-"NOT SET"} + statsport=${statsport:-"0"} + statspassword=${statspassword:-"NOT SET"} + mappool=${mappool:-"NOT SET"} + rconpassword=${rconpassword:-"NOT SET"} +} + +fn_info_config_realvirtuality(){ + # Not Set + port=${rconport:-"0"} +} + +fn_info_config_seriousengine35(){ + +} + +fn_info_config_source(){ + defaultmap=${defaultmap:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + clientport=${clientport:-"0"} +} + +fn_info_config_teamspeak3(){ + if [ ! -f "${servercfgfullpath}" ]; then + dbplugin="${unavailable}" + port="9987" + queryport="10011" + fileport="30033" + else + # check if the ip exists in the config file. Failing this will fall back to the default. + ipconfigcheck=$(grep "voice_ip=" "${servercfgfullpath}" | sed 's/\voice_ip=//g') + if [ -n "${ipconfigcheck}" ]; then + ip="${ipconfigcheck}" + fi + dbplugin=$(grep "dbplugin=" "${servercfgfullpath}" | sed 's/\dbplugin=//g') + port=$(grep "default_voice_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport=$(grep "query_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') + fileport=$(grep "filetransfer_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') + + # Not Set + port=${port:-"9987"} + queryport=${queryport:-"10011"} + fileport=${fileport:-"30033"} + fi +} + +fn_info_config_teeworlds(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="unnamed server" + serverpassword="${unavailable}" + rconpassword="${unavailable}" + port="8303" + slots="12" + else + servername=$(grep "sv_name" "${servercfgfullpath}" | sed 's/sv_name //g' | sed 's/"//g') + serverpassword=$(grep "password " "${servercfgfullpath}" | awk '!/sv_rcon_password/'| sed 's/password //g' | tr -d '=\"; ') + rconpassword=$(grep "sv_rcon_password" "${servercfgfullpath}" | sed 's/sv_rcon_password //g' | tr -d '=\"; ') + port=$(grep "sv_port" "${servercfgfullpath}" | tr -cd '[:digit:]') + slots=$(grep "sv_max_clients" "${servercfgfullpath}" | tr -cd '[:digit:]') + + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + rconpassword=${rconpassword:-"NOT SET"} + port=${port:-"8303"} + slots=${slots:-"12"} + fi +} + +fn_info_config_terraria(){ + if [ ! -f "${servercfgfullpath}" ]; then + port="0" + else + port=$(grep "port=" "${servercfgfullpath}" | tr -cd '[:digit:]') + + # Not Set + port=${port:-"0"} + fi +} + +fn_info_config_unreal(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + adminpassword="${unavailable}" + port="${zero}" + gsqueryport="${zero}" + webadminenabled="${unavailable}" + webadminport="${zero}" + webadminuser="${unavailable}" + webadminpass="${unavailable}" + else + servername=$(grep "ServerName=" "${servercfgfullpath}" | sed 's/ServerName=//g') + serverpassword=$(grep "GamePassword=" "${servercfgfullpath}" | sed 's/GamePassword=//g') + adminpassword=$(grep "AdminPassword=" "${servercfgfullpath}" | sed 's/AdminPassword=//g') + port=$(grep "Port=" "${servercfgfullpath}" | grep -v "Master" | grep -v "LAN" | grep -v "Proxy" | grep -v "Listen" | tr -d '\r' | tr -cd '[:digit:]') + gsqueryport=$(grep "OldQueryPortNumber=" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]') + webadminenabled=$(grep "bEnabled=" "${servercfgfullpath}" | sed 's/bEnabled=//g' | tr -d '\r') + webadminport=$(grep "ListenPort=" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]') + if [ "${engine}" == "unreal" ]; then + webadminuser=$(grep "AdminUsername=" "${servercfgfullpath}" | sed 's/\AdminUsername=//g') + webadminpass=$(grep "UTServerAdmin.UTServerAdmin" "${servercfgfullpath}" -A 2 | grep "AdminPassword=" | sed 's/\AdminPassword=//g') + else + webadminuser=$(grep "AdminName=" "${servercfgfullpath}" | sed 's/\AdminName=//g') + webadminpass=$(grep "AdminPassword=" "${servercfgfullpath}" | sed 's/\AdminPassword=//g') + fi + + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} + port=${port:-"0"} + gsqueryport=${gsqueryport:-"NOT SET"} + webadminenabled=${webadminenabled:-"NOT SET"} + webadminport=${webadminport:-"NOT SET"} + webadminuser=${webadminuser:-"NOT SET"} + webadminpass=${webadminpass:-"NOT SET"} + fi +} + +## Just Cause 2 +if [ "${engine}" == "avalanche" ]; then + fn_info_config_avalanche +## Dont Starve Together +elif [ "${engine}" == "dontstarve" ]; then + fn_info_config_dontstarve +## Project Zomboid +elif [ "${engine}" == "projectzomboid" ]; then + fn_info_config_projectzomboid +# Quake Love +elif [ "${engine}" == "idtech3" ]; then + fn_info_config_idtech3 +# ARMA 3 +elif [ "${engine}" == "realvirtuality" ]; then + fn_info_config_realvirtuality +# Serious Sam +elif [ "${engine}" == "seriousengine35" ]; then + fn_info_config_seriousengine35 +# Source Engine Games +elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then + fn_info_config_source +elif [ "${gamename}" == "Teamspeak 3" ]; then + fn_info_config_teamspeak3 +# Teeworlds +elif [ "${engine}" == "teeworlds" ]; then + fn_info_config_teeworlds +elif [ "${engine}" == "terraria" ]; then + fn_info_config_terraria +# Unreal/Unreal 2 engine +elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then + fn_info_config_unreal +fi \ No newline at end of file From 3ee675e9803d17ab809b5141fa4f742e5cb21221 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 May 2016 17:37:31 +0100 Subject: [PATCH 365/434] improved info gathering style consistency --- lgsm/functions/info_config.sh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index f1938c514..8e14f7da8 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -91,7 +91,7 @@ fn_info_config_idtech3(){ slots="${zero}" else servername=$(grep "set sv_hostname " "${servercfgfullpath}" | sed 's/set sv_hostname //g' | tr -d '=\"; ') - serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/set g_password//g' | tr -d '=\"; '| cut -f1 -d "/") + serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed 's/set g_password//g' | tr -d '=\"; '| cut -f1 -d "/") slots=$(grep "set sv_maxClients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') # Not Set @@ -108,9 +108,9 @@ fn_info_config_realvirtuality(){ serverpassword="${unavailable}" slots="${zero}" else - servername=$(grep "hostname" "${servercfgfullpath}" | grep -v "//" | sed -e 's/\//g' | tr -d '=\"; ') - adminpassword=$(grep "passwordAdmin" "${servercfgfullpath}" | grep -v "//" | sed -e 's/\passwordAdmin//g' | tr -d '=\"; ') - serverpassword=$(grep "password =" "${servercfgfullpath}" | grep -v "//" | sed -e 's/\password//g' | tr -d '=\"; ') + servername=$(grep "hostname" "${servercfgfullpath}" | grep -v "//" | sed 's/\//g' | tr -d '=\"; ') + adminpassword=$(grep "passwordAdmin" "${servercfgfullpath}" | grep -v "//" | sed 's/\passwordAdmin//g' | tr -d '=\"; ') + serverpassword=$(grep "password =" "${servercfgfullpath}" | grep -v "//" | sed 's/\password//g' | tr -d '=\"; ') slots=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') # Not Set @@ -169,11 +169,11 @@ fn_info_config_teamspeak3(){ fileport="30033" else # check if the ip exists in the config file. Failing this will fall back to the default. - ipconfigcheck=$(grep "voice_ip=" "${servercfgfullpath}" | sed 's/\voice_ip=//g') + ipconfigcheck=$(grep "voice_ip=" "${servercfgfullpath}" | sed 's/voice_ip=//g') if [ -n "${ipconfigcheck}" ]; then ip="${ipconfigcheck}" fi - dbplugin=$(grep "dbplugin=" "${servercfgfullpath}" | sed 's/\dbplugin=//g') + dbplugin=$(grep "dbplugin=" "${servercfgfullpath}" | sed 's/dbplugin=//g') port=$(grep "default_voice_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') queryport=$(grep "query_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') fileport=$(grep "filetransfer_port=" "${servercfgfullpath}" | tr -cd '[:digit:]') @@ -239,11 +239,11 @@ fn_info_config_unreal(){ webadminenabled=$(grep "bEnabled=" "${servercfgfullpath}" | sed 's/bEnabled=//g' | tr -d '\r') webadminport=$(grep "ListenPort=" "${servercfgfullpath}" | tr -d '\r' | tr -cd '[:digit:]') if [ "${engine}" == "unreal" ]; then - webadminuser=$(grep "AdminUsername=" "${servercfgfullpath}" | sed 's/\AdminUsername=//g') - webadminpass=$(grep "UTServerAdmin.UTServerAdmin" "${servercfgfullpath}" -A 2 | grep "AdminPassword=" | sed 's/\AdminPassword=//g') + webadminuser=$(grep "AdminUsername=" "${servercfgfullpath}" | sed 's/AdminUsername=//g') + webadminpass=$(grep "UTServerAdmin.UTServerAdmin" "${servercfgfullpath}" -A 2 | grep "AdminPassword=" | sed 's/AdminPassword=//g') else - webadminuser=$(grep "AdminName=" "${servercfgfullpath}" | sed 's/\AdminName=//g') - webadminpass=$(grep "AdminPassword=" "${servercfgfullpath}" | sed 's/\AdminPassword=//g') + webadminuser=$(grep "AdminName=" "${servercfgfullpath}" | sed 's/AdminName=//g') + webadminpass="${adminpassword}" fi # Not Set @@ -251,9 +251,9 @@ fn_info_config_unreal(){ serverpassword=${serverpassword:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} port=${port:-"0"} - gsqueryport=${gsqueryport:-"NOT SET"} + gsqueryport=${gsqueryport:-"0"} webadminenabled=${webadminenabled:-"NOT SET"} - webadminport=${webadminport:-"NOT SET"} + webadminport=${webadminport:-"0"} webadminuser=${webadminuser:-"NOT SET"} webadminpass=${webadminpass:-"NOT SET"} fi From 3bbfb0dbe5942150063dc73c2dbe0311b2865c2f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 May 2016 17:45:06 +0100 Subject: [PATCH 366/434] Getting server status is now consistent Both tmux and ts3 status gathering are the same/ Now call a file called check_status.sh this returns the server status as 0 or 1 --- lgsm/functions/check.sh | 10 +- lgsm/functions/check_status.sh | 22 ++ lgsm/functions/command_backup.sh | 6 +- lgsm/functions/command_console.sh | 6 +- lgsm/functions/command_details.sh | 300 ++++++++++-------- lgsm/functions/command_monitor.sh | 17 +- lgsm/functions/command_start.sh | 231 +++++++------- lgsm/functions/command_validate.sh | 5 +- lgsm/functions/core_functions.sh | 7 +- lgsm/functions/update_check.sh | 491 +++++++++++++++-------------- 10 files changed, 578 insertions(+), 517 deletions(-) create mode 100644 lgsm/functions/check_status.sh diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index aa9ab63ab..93d1f119a 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -2,7 +2,7 @@ # LGSM fn_check function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="060316" +lgsm_version="060516" # Description: Overall function for managing checks. # Runs checks that will either halt on or fix an issue. @@ -70,3 +70,11 @@ do check_config.sh fi done + +local allowed_commands_array=( command_details.sh command_monitor.sh command_start.sh command_stop.sh command_ts3_server_pass.sh update_check.sh command_details.sh command_validate.sh ) +for allowed_command in "${allowed_commands_array[@]}" +do + if [ "${allowed_command}" == "${function_selfname}" ]; then + check_status.sh + fi +done diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh new file mode 100644 index 000000000..d0f88b080 --- /dev/null +++ b/lgsm/functions/check_status.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# LGSM check_status function +# Author: Daniel Gibbs +# Website: http://gameservermanagers.com +lgsm_version="060516" + +# Description: Checks the proccess status of the server. Either online or offline. + +if [ "${gamename}" == "Teamspeak 3" ]; then + # 1: Server is running + # 0: Server seems to have died + # 0: No server running (ts3server.pid is missing) + status=$(./ts3server_startscript.sh status servercfgfullpathfile=${servercfgfullpath}) + if [ "${status}" == "Server is running" ]; then + status=1 + else + status=0 + ts3error=$(./ts3server_startscript.sh status servercfgfullpathfile=${servercfgfullpath}) + fi +else + status=$(tmux list-sessions 2>&1 | awk '{print $1}' | grep -Ec "^${servicename}:") +fi diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 68746c1c5..d2426029c 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -2,7 +2,7 @@ # LGSM command_backup.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="190316" +lgsm_version="060516" # Description: Creates a .tar.gz file in the backup directory. @@ -24,8 +24,8 @@ while true; do esac done echo "" -tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") -if [ "${tmuxwc}" -eq 1 ]; then +check_status.sh +if [ "${status}" != "0" ]; then echo "" fn_printwarningnl "${servicename} is currently running." sleep 1 diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index f7f2c1323..3a67be820 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -2,7 +2,7 @@ # LGSM command_console.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="060516" # Description: Gives access to the server tmux console. @@ -27,8 +27,8 @@ esac done fn_print_dots "Starting" sleep 1 -tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") -if [ "${tmuxwc}" -eq 1 ]; then +check_status.sh +if [ "${status}" != "0" ]; then fn_print_ok_nl "Starting" fn_scriptlog "accessed" sleep 1 diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 88c4286fe..c601769e1 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -2,7 +2,7 @@ # LGSM command_details.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="230216" +lgsm_version="060516" # Description: Displays server infomation. @@ -12,174 +12,206 @@ function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" # This applies to all engines fn_details_os(){ -echo -e "" -echo -e "\e[93mDistro Details\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mDistro:\t\e[0m${os}" - echo -e "\e[34mArch:\t\e[0m${arch}" - echo -e "\e[34mKernel:\t\e[0m${kernel}" - echo -e "\e[34mHostname:\t\e[0m$HOSTNAME" - echo -e "\e[34mtmux:\t\e[0m${tmuxv}" - echo -e "\e[34mGLIBC:\t\e[0m${glibcv}" -} | column -s $'\t' -t + # + # Distro Details + # ===================================== + # Distro: Ubuntu 14.04.4 LTS + # Arch: x86_64 + # Kernel: 3.13.0-79-generic + # Hostname: hostname + # tmux: tmux 1.8 + # GLIBC: 2.19 + + echo -e "" + echo -e "\e[93mDistro Details\e[0m" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + { + echo -e "\e[34mDistro:\t\e[0m${os}" + echo -e "\e[34mArch:\t\e[0m${arch}" + echo -e "\e[34mKernel:\t\e[0m${kernel}" + echo -e "\e[34mHostname:\t\e[0m$HOSTNAME" + echo -e "\e[34mtmux:\t\e[0m${tmuxv}" + echo -e "\e[34mGLIBC:\t\e[0m${glibcv}" + } | column -s $'\t' -t } fn_details_performance(){ -echo -e "" -echo -e "\e[93mPerformance\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mUptime:\t\e[0m${days}d, ${hours}h, ${minutes}m" - echo -e "\e[34mAvg Load:\t\e[0m${load}" -} | column -s $'\t' -t -echo -e "" -{ - echo -e "\e[34mMem:\t\e[34mtotal\t used\t free\e[0m" - echo -e "\e[34mPhysical:\t\e[0m${physmemtotal}\t${physmemused}\t${physmemfree}\e[0m" - echo -e "\e[34mSwap:\t\e[0m${swaptotal}\t${swapused}\t${swapfree}\e[0m" -} | column -s $'\t' -t + # + # Performance + # ===================================== + # Uptime: 55d, 3h, 38m + # Avg Load: 1.00, 1.01, 0.78 + # + # Mem: total used free + # Physical: 741M 656M 85M + # Swap: 0B 0B 0B + + echo -e "" + echo -e "\e[93mPerformance\e[0m" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + { + echo -e "\e[34mUptime:\t\e[0m${days}d, ${hours}h, ${minutes}m" + echo -e "\e[34mAvg Load:\t\e[0m${load}" + } | column -s $'\t' -t + echo -e "" + { + echo -e "\e[34mMem:\t\e[34mtotal\t used\t free\e[0m" + echo -e "\e[34mPhysical:\t\e[0m${physmemtotal}\t${physmemused}\t${physmemfree}\e[0m" + echo -e "\e[34mSwap:\t\e[0m${swaptotal}\t${swapused}\t${swapfree}\e[0m" + } | column -s $'\t' -t } fn_details_disk(){ -echo -e "" -echo -e "\e[93mStorage\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mFilesystem:\t\e[0m${filesystem}" - echo -e "\e[34mTotal:\t\e[0m${totalspace}" - echo -e "\e[34mUsed:\t\e[0m${usedspace}" - echo -e "\e[34mAvailable:\t\e[0m${availspace}" - echo -e "\e[34mServerfiles:\t\e[0m${filesdirdu}" - if [ -d "${backupdir}" ]; then - echo -e "\e[34mBackups:\t\e[0m${backupdirdu}" - fi -} | column -s $'\t' -t + # + # Storage + # ===================================== + # Filesystem: /dev/disk/by-uuid/320c8edd-a2ce-4a23-8c9d-e00a7af2d6ff + # Total: 15G + # Used: 8.4G + # Available: 5.7G + # Serverfiles: 961M + + echo -e "" + echo -e "\e[93mStorage\e[0m" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + { + echo -e "\e[34mFilesystem:\t\e[0m${filesystem}" + echo -e "\e[34mTotal:\t\e[0m${totalspace}" + echo -e "\e[34mUsed:\t\e[0m${usedspace}" + echo -e "\e[34mAvailable:\t\e[0m${availspace}" + echo -e "\e[34mServerfiles:\t\e[0m${filesdirdu}" + if [ -d "${backupdir}" ]; then + echo -e "\e[34mBackups:\t\e[0m${backupdirdu}" + fi + } | column -s $'\t' -t } fn_details_gameserver(){ -echo -e "" + # + # Quake Live Server Details + # ===================================== + # Server name: ql-server + # Server IP: 1.2.3.4:27960 + # RCON password: CHANGE_ME + # Server password: NOT SET + # Slots: 16 + # Status: OFFLINE -## server details -echo -e "\e[92m${gamename} Server Details\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - # server name - echo -e "\e[34mServer name:\t\e[0m${servername}" + echo -e "" + echo -e "\e[92m${gamename} Server Details\e[0m" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + { + # Server name + echo -e "\e[34mServer name:\t\e[0m${servername}" - # server ip - echo -e "\e[34mServer IP:\t\e[0m${ip}:${port}" + # Server ip + echo -e "\e[34mServer IP:\t\e[0m${ip}:${port}" - # rcon password - if [ -n "${rconpassword}" ]; then - echo -e "\e[34mRCON password:\t\e[0m${rconpassword}" - fi + # Server password + if [ -n "${serverpassword}" ]; then + echo -e "\e[34mServer password:\t\e[0m${serverpassword}" + fi - # server password - if [ -n "${serverpassword}" ]; then - echo -e "\e[34mServer password:\t\e[0m${serverpassword}" - fi + # RCON password + if [ -n "${rconpassword}" ]; then + echo -e "\e[34mRCON password:\t\e[0m${rconpassword}" + fi - # admin password - if [ -n "${adminpassword}" ]; then - echo -e "\e[34mAdmin password:\t\e[0m${adminpassword}" - fi + # Admin password + if [ -n "${adminpassword}" ]; then + echo -e "\e[34mAdmin password:\t\e[0m${adminpassword}" + fi - # slots - if [ -n "${slots}" ]; then - echo -e "\e[34mSlots:\t\e[0m${slots}" - fi + # Stats password (Quake Live) + if [ -n "${statspassword}" ]; then + echo -e "\e[34mStats password:\t\e[0m${statspassword}" + fi - # game mode - if [ -n "${gamemode}" ]; then - echo -e "\e[34mGame mode:\t\e[0m${gamemode}" - fi + # Slots + if [ -n "${slots}" ]; then + echo -e "\e[34mSlots:\t\e[0m${slots}" + fi - # game world - if [ -n "${gameworld}" ]; then - echo -e "\e[34mGame world:\t\e[0m${gameworld}" - fi + # Game mode + if [ -n "${gamemode}" ]; then + echo -e "\e[34mGame mode:\t\e[0m${gamemode}" + fi - # tick rate - if [ -n "${tickrate}" ]; then - echo -e "\e[34mTick rate:\t\e[0m${tickrate}" - fi + # Game world + if [ -n "${gameworld}" ]; then + echo -e "\e[34mGame world:\t\e[0m${gameworld}" + fi - # online status - if [ "${gamename}" == "Teamspeak 3" ]; then - info_ts3status.sh - if [ "${ts3status}" = "Server seems to have died" ]||[ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then - echo -e "\e[34mStatus:\t\e[0;31mOFFLINE\e[0m" - else - echo -e "\e[34mStatus:\t\e[0;32mONLINE\e[0m" + # Tick rate + if [ -n "${tickrate}" ]; then + echo -e "\e[34mTick rate:\t\e[0m${tickrate}" fi - else - pid=$(tmux list-sessions 2>&1 | awk '{print $1}' | grep -Ec "^${servicename}:") - if [ "${pid}" == "0" ]; then + + # teamspeak dbplugin + if [ -n "${dbplugin}" ]; then + echo -e "\e[34mdbplugin:\t\e[0m${dbplugin}" + fi + + # online status + if [ "${status}" == "0" ]; then echo -e "\e[34mStatus:\t\e[0;31mOFFLINE\e[0m" else echo -e "\e[34mStatus:\t\e[0;32mONLINE\e[0m" fi - fi - - # teamspeak dbplugin - if [ -n "${dbplugin}" ]; then - echo -e "\e[34mdbplugin:\t\e[0m${dbplugin}" - fi -} | column -s $'\t' -t -echo -e "" - -## script details -echo -e "\e[92m${selfname} Script Details\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - # service name - echo -e "\e[34mService name:\t\e[0m${servicename}" + } | column -s $'\t' -t + echo -e "" - # script version - if [ -n "${version}" ]; then - echo -e "\e[34m${selfname} version:\t\e[0m${version}" - fi + ## script details + echo -e "\e[92m${selfname} Script Details\e[0m" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + { + # service name + echo -e "\e[34mService name:\t\e[0m${servicename}" - # script user - echo -e "\e[34mUser:\t\e[0m$(whoami)" + # script version + if [ -n "${version}" ]; then + echo -e "\e[34m${selfname} version:\t\e[0m${version}" + fi - # GLIBC required - if [ -n "${glibcrequired}" ] && [ "${glibcrequired}" != "UNKNOWN" ]; then - if [ "$(ldd --version | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" -lt "$(echo "${glibcrequired}" | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" ]; then - if [ "${glibcfix}" == "yes" ]; then - echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired} \e[0m(\e[0;32mUsing GLIBC fix\e[0m)" + # script user + echo -e "\e[34mUser:\t\e[0m$(whoami)" + + # GLIBC required + if [ -n "${glibcrequired}" ] && [ "${glibcrequired}" != "UNKNOWN" ]; then + if [ "$(ldd --version | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" -lt "$(echo "${glibcrequired}" | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" ]; then + if [ "${glibcfix}" == "yes" ]; then + echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired} \e[0m(\e[0;32mUsing GLIBC fix\e[0m)" + else + echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired}\e[0m(\e[0;32mGLIBC version too old\e[0m)" + fi else - echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired}\e[0m(\e[0;32mGLIBC version too old\e[0m)" + echo -e "\e[34mGLIBC required:\t\e[0;32m${glibcrequired}\e[0m" fi - else - echo -e "\e[34mGLIBC required:\t\e[0;32m${glibcrequired}\e[0m" fi - fi - # email notification - if [ -n "${emailnotification}" ]; then - echo -e "\e[34mEmail notification:\t\e[0m${emailnotification}" - fi + # email notification + if [ -n "${emailnotification}" ]; then + echo -e "\e[34mEmail notification:\t\e[0m${emailnotification}" + fi - # update on start - if [ -n "${updateonstart}" ]; then - echo -e "\e[34mUpdate on start:\t\e[0m${updateonstart}" - fi + # update on start + if [ -n "${updateonstart}" ]; then + echo -e "\e[34mUpdate on start:\t\e[0m${updateonstart}" + fi - # script location - echo -e "\e[34mLocation:\t\e[0m${rootdir}" + # script location + echo -e "\e[34mLocation:\t\e[0m${rootdir}" - # config file location - if [ -n "${servercfgfullpath}" ]; then - echo -e "\e[34mConfig file:\t\e[0m${servercfgfullpath}" - fi + # config file location + if [ -n "${servercfgfullpath}" ]; then + echo -e "\e[34mConfig file:\t\e[0m${servercfgfullpath}" + fi - # network config file location (ARMA 3) - if [ -n "${networkcfgfullpath}" ]; then - echo -e "\e[34mNetwork config file:\t\e[0m${networkcfgfullpath}" - fi -} | column -s $'\t' -t + # network config file location (ARMA 3) + if [ -n "${networkcfgfullpath}" ]; then + echo -e "\e[34mNetwork config file:\t\e[0m${networkcfgfullpath}" + fi + } | column -s $'\t' -t } fn_details_backup(){ diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 066d0dbdf..3a7d9f468 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -2,7 +2,7 @@ # LGSM command_monitor.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="060516" # Description: Monitors server by checking for running proccesses # then passes to monitor_gsquery.sh. @@ -22,8 +22,7 @@ fn_monitor_check_lockfile(){ fn_monitor_check_update(){ # Monitor will not check if update is running. - updatecheck=$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l) - if [ "${updatecheck}" >= "1" ]; then + if [ "$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l)" >= "1" ]; then fn_print_info_nl "SteamCMD is currently checking for updates" fn_scriptlog "SteamCMD is currently checking for updates" sleep 1 @@ -49,17 +48,16 @@ fn_monitor_email_notification(){ } fn_monitor_teamspeak3(){ - info_ts3status.sh - if [ "${ts3status}" = "Server is running" ]; then + if [ "${status}" != "0" ]; then fn_print_ok "Checking session: " fn_print_ok_eol_nl fn_scriptlog "Checking session: OK" exit else - fn_print_fail "Checking session: ${ts3status}: " + fn_print_fail "Checking session: ${ts3error}: " fn_print_fail_eol_nl - fn_scriptlog "Checking session: ${ts3status}: FAIL" - failurereason="${ts3status}" + fn_scriptlog "Checking session: ${ts3error}: FAIL" + failurereason="${ts3error}" fn_monitor_email_notification fi fn_scriptlog "Monitor is starting ${servername}" @@ -69,8 +67,7 @@ fn_monitor_teamspeak3(){ fn_monitor_tmux(){ # checks that tmux session is running - tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") - if [ "${tmuxwc}" == "1" ]; then + if [ "${status}" != "0" ]; then fn_print_ok "Checking session: OK" fn_print_ok_eol_nl fn_scriptlog "Checking session: OK" diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index ff8bd9648..5b274f32f 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -2,7 +2,7 @@ # LGSM command_start.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="070116" +lgsm_version="060516" # Description: Starts the server. @@ -10,16 +10,6 @@ local modulename="Starting" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_start_teamspeak3(){ - check.sh - info_ts3status.sh - - if [ "${ts3status}" != "Server is running" ]; then - # Will check for updates is updateonstart is yes - if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateonstart}" == "on" ]; then - update_check.sh - fi - fi - if [ ! -e "${servercfgfullpath}" ]; then fn_print_warn_nl "${servercfgfullpath} is missing" fn_scriptlog "${servercfgfullpath} is missing" @@ -35,13 +25,11 @@ fn_start_teamspeak3(){ touch "${servercfgfullpath}" fi - logs.sh - fn_print_dots "${servername}" fn_scriptlog "${servername}" sleep 1 - - if [ "${ts3status}" == "Server is running" ]; then + check_status.sh + if [ "${status}" != "0" ]; then fn_print_info_nl "${servername} is already running" fn_scriptlog "${servername} is already running" exit @@ -57,8 +45,8 @@ fn_start_teamspeak3(){ ./ts3server_startscript.sh start inifile="${servercfgfullpath}" > /dev/null 2>&1 fi sleep 1 - info_ts3status.sh - if [ "${ts3status}" = "Server seems to have died" ]||[ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then + check_status.sh + if [ "${status}" == "0" ]; then fn_print_fail_nl "Unable to start ${servername}" fn_scriptlog "Unable to start ${servername}" echo -e " Check log files: ${rootdir}/log" @@ -70,117 +58,126 @@ fn_start_teamspeak3(){ } fn_start_tmux(){ -check.sh -fix.sh -info_config.sh -fn_parms -logs.sh + fn_print_dots "${servername}" + fn_scriptlog "${servername}" + sleep 1 -tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") -# Will check for updates if updateonstart is yes -if [ "${tmuxwc}" -eq 0 ]; then - if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateonstart}" == "on" ]; then - update_check.sh + # Log rotation + check_status.sh + if [ "${status}" == "0" ]; then + fn_scriptlog "Rotating log files" + if [ "${engine}" == "unreal2" ]; then + mv "${gamelog}" "${gamelogdate}" + fi + mv "${scriptlog}" "${scriptlogdate}" + mv "${consolelog}" "${consolelogdate}" fi -fi - -fn_print_dots "${servername}" -fn_scriptlog "${servername}" -sleep 1 -if [ "${tmuxwc}" -eq 0 ]; then - fn_scriptlog "Rotating log files" - if [ "${engine}" == "unreal2" ]; then - mv "${gamelog}" "${gamelogdate}" + # If server is already running exit + check_status.sh + if [ "${status}" != "0" ]; then + fn_print_info_nl "${servername} is already running" + fn_scriptlog "${servername} is already running" + exit fi - mv "${scriptlog}" "${scriptlogdate}" - mv "${consolelog}" "${consolelogdate}" -fi - -if [ "${tmuxwc}" -eq 1 ]; then - fn_print_info_nl "${servername} is already running" - fn_scriptlog "${servername} is already running" - 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 not supported in tmux versions < 1.6 -if [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -lt "16" ]; then - echo "Console logging disabled: Tmux => 1.6 required" >> "${consolelog}" - echo "http://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" - echo "Currently installed: $(tmux -V)" >> "${consolelog}" -elif [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -eq "18" ]; then - echo "Console logging disabled: Bug in tmux 1.8 breaks logging" >> "${consolelog}" - echo "http://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" - echo "Currently installed: $(tmux -V)" >> "${consolelog}" -# Console logging enable or not set -elif [ "${consolelogging}" == "on" ]||[ -z "${consolelogging}" ]; then - touch "${consolelog}" - tmux pipe-pane -o -t "${servicename}" "exec cat >> '${consolelog}'" -# Console logging disabled -elif [ "${consolelogging}" == "off" ]; then - touch "${consolelog}" - cat "Console logging disabled by user" >> "{consolelog}" - fn_scriptlog "Console logging disabled by user" -fi -sleep 1 -tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") -# If the server fails to start -if [ "${tmuxwc}" -eq 0 ]; then - fn_print_fail_nl "Unable to start ${servername}" - fn_scriptlog "Unable to start ${servername}" + # 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 not supported in tmux versions < 1.6 + if [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -lt "16" ]; then + echo "Console logging disabled: Tmux => 1.6 required" >> "${consolelog}" + echo "http://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" + echo "Currently installed: $(tmux -V)" >> "${consolelog}" + + # Console logging disabled: Bug in tmux 1.8 breaks logging + elif [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -eq "18" ]; then + echo "Console logging disabled: Bug in tmux 1.8 breaks logging" >> "${consolelog}" + echo "http://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" + echo "Currently installed: $(tmux -V)" >> "${consolelog}" + + # Console logging enable or not set + elif [ "${consolelogging}" == "on" ]||[ -z "${consolelogging}" ]; then + touch "${consolelog}" + tmux pipe-pane -o -t "${servicename}" "exec cat >> '${consolelog}'" + + # Console logging disabled + elif [ "${consolelogging}" == "off" ]; then + touch "${consolelog}" + cat "Console logging disabled by user" >> "{consolelog}" + fn_scriptlog "Console logging disabled by user" + fi sleep 1 - if [ -s "${scriptlogdir}/.${servicename}-tmux-error.tmp" ]; then - fn_print_fail_nl "Unable to start ${servername}: Tmux error:" - fn_scriptlog "Tmux error" - echo "" - echo "Command" - echo "=================================" - echo "tmux new-session -d -s \"${servicename}\" \"${executable} ${parms}\"" | tee -a "${scriptlog}" - echo "" - echo "Error" - echo "=================================" - cat "${scriptlogdir}/.${servicename}-tmux-error.tmp" | tee -a "${scriptlog}" - - # Detected error http://gameservermanagers.com/issues - if [ $(grep -c "Operation not permitted" "${scriptlogdir}/.${servicename}-tmux-error.tmp") ]; then - echo "" - echo "Fix" - echo "=================================" - if [ ! $(grep "tty:" /etc/group|grep "$(whoami)") ]; then - echo "$(whoami) is not part of the tty group." - fn_scriptlog "$(whoami) is not part of the tty group." - group=$(grep tty /etc/group) - echo "" - echo " ${group}" - fn_scriptlog "${group}" - echo "" - echo "Run the following command with root privileges." - echo "" - echo " usermod -G tty $(whoami)" - echo "" - echo "http://gameservermanagers.com/tmux-op-perm" - fn_scriptlog "http://gameservermanagers.com/tmux-op-perm" - else - echo "No known fix currently. Please log an issue." - fn_scriptlog "No known fix currently. Please log an issue." - echo "http://gameservermanagers.com/issues" - fn_scriptlog "http://gameservermanagers.com/issues" + + # If the server fails to start + check_status.sh + if [ "${status}" == "0" ]; then + fn_print_fail_nl "Unable to start ${servername}" + fn_scriptlog "Unable to start ${servername}" + sleep 1 + if [ -s "${scriptlogdir}/.${servicename}-tmux-error.tmp" ]; then + fn_print_fail_nl "Unable to start ${servername}: Tmux error:" + fn_scriptlog "Tmux error" + echo "" + echo "Command" + echo "=================================" + echo "tmux new-session -d -s \"${servicename}\" \"${executable} ${parms}\"" | tee -a "${scriptlog}" + echo "" + echo "Error" + echo "=================================" + cat "${scriptlogdir}/.${servicename}-tmux-error.tmp" | tee -a "${scriptlog}" + + # Detected error http://gameservermanagers.com/issues + if [ $(grep -c "Operation not permitted" "${scriptlogdir}/.${servicename}-tmux-error.tmp") ]; then + echo "" + echo "Fix" + echo "=================================" + if [ ! $(grep "tty:" /etc/group|grep "$(whoami)") ]; then + echo "$(whoami) is not part of the tty group." + fn_scriptlog "$(whoami) is not part of the tty group." + group=$(grep tty /etc/group) + echo "" + echo " ${group}" + fn_scriptlog "${group}" + echo "" + echo "Run the following command with root privileges." + echo "" + echo " usermod -G tty $(whoami)" + echo "" + echo "http://gameservermanagers.com/tmux-op-perm" + fn_scriptlog "http://gameservermanagers.com/tmux-op-perm" + else + echo "No known fix currently. Please log an issue." + fn_scriptlog "No known fix currently. Please log an issue." + echo "http://gameservermanagers.com/issues" + fn_scriptlog "http://gameservermanagers.com/issues" + fi fi fi + exit 1 + else + fn_print_ok "${servername}" + fn_scriptlog "Started ${servername}" fi -exit 1 -else - fn_print_ok "${servername}" - fn_scriptlog "Started ${servername}" -fi -rm "${scriptlogdir}/.${servicename}-tmux-error.tmp" -echo -en "\n" + rm "${scriptlogdir}/.${servicename}-tmux-error.tmp" + echo -en "\n" } +check.sh +fix.sh +info_config.sh +fn_parms +logs.sh + +# Will check for updates is updateonstart is yes +if [ "${status}" == "0" ]; then + if [ "${updateonstart}" == "yes" ]||[ "${updateonstart}" == "1" ]||[ "${updateonstart}" == "on" ]; then + update_check.sh + fi +fi + if [ "${gamename}" == "Teamspeak 3" ]; then fn_start_teamspeak3 else diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index f4c46c071..4e658ccf5 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -36,9 +36,8 @@ fix.sh fn_scriptlog "Checking complete" } -check.sh -tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") -if [ "${tmuxwc}" -eq 1 ]; then +check_status.sh +if [ "${status}" != "0" ]; then command_stop.sh fn_validation command_start.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 77a3cffb7..266a831a9 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -2,7 +2,7 @@ # LGSM core_functions.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="020516" +lgsm_version="060516" # Description: Defines all functions to allow download and execution of functions using fn_fetch_function. # This function is called first before any other function. Without this file other functions would not load. @@ -207,6 +207,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +check_status.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + check_steamcmd.sh(){ functionfile="${FUNCNAME}" fn_fetch_function diff --git a/lgsm/functions/update_check.sh b/lgsm/functions/update_check.sh index 579a84f4b..e09eb54f2 100644 --- a/lgsm/functions/update_check.sh +++ b/lgsm/functions/update_check.sh @@ -2,7 +2,7 @@ # LGSM update_check.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="060216" +lgsm_version="060516" # Description: Checks if a server update is available. @@ -17,292 +17,294 @@ fn_appmanifestinfo(){ } fn_appmanifestcheck(){ -fn_appmanifestinfo -# Multiple or no matching appmanifest files may sometimes be available. -# This is an error is corrected below if required. -if [ "${appmanifestfilewc}" -ge "2" ]; then - sleep 1 - fn_print_warn "Multiple appmanifest_${appid}.acf files found" - fn_scriptlog "Warning! Multiple appmanifest_${appid}.acf files found" - sleep 2 - fn_print_dots "Removing x${appmanifestfilewc} appmanifest_${appid}.acf files" - sleep 1 - for appfile in ${appmanifestfile}; do - rm "${appfile}" - done - appmanifestfilewc1="${appmanifestfilewc}" fn_appmanifestinfo + # Multiple or no matching appmanifest files may sometimes be available. + # This is an error is corrected below if required. if [ "${appmanifestfilewc}" -ge "2" ]; then - fn_print_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" - fn_scriptlog "Failure! Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" sleep 1 - echo "" - echo " Check user permissions" + fn_print_warn "Multiple appmanifest_${appid}.acf files found" + fn_scriptlog "Warning! Multiple appmanifest_${appid}.acf files found" + sleep 2 + fn_print_dots "Removing x${appmanifestfilewc} appmanifest_${appid}.acf files" + sleep 1 for appfile in ${appmanifestfile}; do - echo " ${appfile}" + rm "${appfile}" done - exit 1 - else - sleep 1 - fn_print_ok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" - fn_scriptlog "Success! Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" - sleep 1 + appmanifestfilewc1="${appmanifestfilewc}" + fn_appmanifestinfo + if [ "${appmanifestfilewc}" -ge "2" ]; then + fn_print_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" + fn_scriptlog "Failure! Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files" + sleep 1 + echo "" + echo " Check user permissions" + for appfile in ${appmanifestfile}; do + echo " ${appfile}" + done + exit 1 + else + sleep 1 + fn_print_ok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" + fn_scriptlog "Success! Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files" + sleep 1 + fn_print_info_nl "Forcing update to correct issue" + fn_scriptlog "Forcing update to correct issue" + sleep 1 + update_dl.sh + update_check.sh + fi + elif [ "${appmanifestfilewc}" -eq "0" ]; then + if [ "${forceupdate}" == "1" ]; then + fn_print_fail "Still no appmanifest_${appid}.acf found: Unable to update" + fn_scriptlog "Warning! Still no appmanifest_${appid}.acf found: Unable to update" + exit 1 + fi + forceupdate=1 + fn_print_warn "No appmanifest_${appid}.acf found" + fn_scriptlog "Warning! No appmanifest_${appid}.acf found" + sleep 2 fn_print_info_nl "Forcing update to correct issue" fn_scriptlog "Forcing update to correct issue" sleep 1 update_dl.sh update_check.sh fi -elif [ "${appmanifestfilewc}" -eq "0" ]; then - if [ "${forceupdate}" == "1" ]; then - fn_print_fail "Still no appmanifest_${appid}.acf found: Unable to update" - fn_scriptlog "Warning! Still no appmanifest_${appid}.acf found: Unable to update" - exit 1 - fi - forceupdate=1 - fn_print_warn "No appmanifest_${appid}.acf found" - fn_scriptlog "Warning! No appmanifest_${appid}.acf found" - sleep 2 - fn_print_info_nl "Forcing update to correct issue" - fn_scriptlog "Forcing update to correct issue" - sleep 1 - update_dl.sh - update_check.sh -fi } fn_logupdaterequest(){ -# Checks for server update requests from server logs. -fn_print_dots "Checking for update: Server logs" -fn_scriptlog "Checking for update: Server logs" -sleep 1 -requestrestart=$(grep -Ec "MasterRequestRestart" "${consolelog}") -if [ "${requestrestart}" -ge "1" ]; then - fn_print_ok_nl "Checking for update: Server logs: Update requested" - sleep 1 - echo "" - echo -ne "Applying update.\r" + # Checks for server update requests from server logs. + fn_print_dots "Checking for update: Server logs" + fn_scriptlog "Checking for update: Server logs" sleep 1 - echo -ne "Applying update..\r" - sleep 1 - echo -ne "Applying update...\r" - sleep 1 - echo -ne "\n" - tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") - unset updateonstart - if [ "${tmuxwc}" -eq 1 ]; then - command_stop.sh - update_dl.sh - command_start.sh + requestrestart=$(grep -Ec "MasterRequestRestart" "${consolelog}") + if [ "${requestrestart}" -ge "1" ]; then + fn_print_ok_nl "Checking for update: Server logs: Update requested" + sleep 1 + echo "" + echo -ne "Applying update.\r" + sleep 1 + echo -ne "Applying update..\r" + sleep 1 + echo -ne "Applying update...\r" + sleep 1 + echo -ne "\n" + + unset updateonstart + check_status.sh + if [ "${status}" != "0" ]; then + command_stop.sh + update_dl.sh + command_start.sh + else + update_dl.sh + fi else - update_dl.sh + fn_print_ok "Checking for update: Server logs: No update requested" + sleep 1 fi -else - fn_print_ok "Checking for update: Server logs: No update requested" - sleep 1 -fi } fn_steamcmdcheck(){ -fn_appmanifestcheck -# Checks for server update from SteamCMD -fn_print_dots "Checking for update: SteamCMD" -fn_scriptlog "Checking for update: SteamCMD" -sleep 1 + fn_appmanifestcheck + # Checks for server update from SteamCMD + fn_print_dots "Checking for update: SteamCMD" + fn_scriptlog "Checking for update: SteamCMD" + sleep 1 -# Gets currentbuild -currentbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) + # Gets currentbuild + currentbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) -# Removes appinfo.vdf as a fix for not always getting up to date version info from SteamCMD + # Removes appinfo.vdf as a fix for not always getting up to date version info from SteamCMD -# Gets availablebuild info -cd "${rootdir}/steamcmd" -if [ -f "${HOME}/Steam/appcache/appinfo.vdf" ]; then - rm -f "${HOME}/Steam/appcache/appinfo.vdf" -fi -availablebuild=$(./steamcmd.sh +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +app_info_print "${appid}" +quit | grep -EA 1000 "^\s+\"branches\"$" | grep -EA 5 "^\s+\"public\"$" | grep -m 1 -EB 10 "^\s+}$" | grep -E "^\s+\"buildid\"\s+" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) -if [ -z "${availablebuild}" ]; then - fn_print_fail "Checking for update: SteamCMD" - fn_scriptlog "Failure! Checking for update: SteamCMD" - sleep 1 - fn_print_fail_nl "Checking for update: SteamCMD: Not returning version info" - fn_scriptlog "Failure! Checking for update: SteamCMD: Not returning version info" - exit 1 -else - fn_print_ok "Checking for update: SteamCMD" - fn_scriptlog "Success! Checking for update: SteamCMD" - sleep 1 -fi + # Gets availablebuild info + cd "${rootdir}/steamcmd" + if [ -f "${HOME}/Steam/appcache/appinfo.vdf" ]; then + rm -f "${HOME}/Steam/appcache/appinfo.vdf" + fi + availablebuild=$(./steamcmd.sh +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +app_info_print "${appid}" +quit | grep -EA 1000 "^\s+\"branches\"$" | grep -EA 5 "^\s+\"public\"$" | grep -m 1 -EB 10 "^\s+}$" | grep -E "^\s+\"buildid\"\s+" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) + if [ -z "${availablebuild}" ]; then + fn_print_fail "Checking for update: SteamCMD" + fn_scriptlog "Failure! Checking for update: SteamCMD" + sleep 1 + fn_print_fail_nl "Checking for update: SteamCMD: Not returning version info" + fn_scriptlog "Failure! Checking for update: SteamCMD: Not returning version info" + exit 1 + else + fn_print_ok "Checking for update: SteamCMD" + fn_scriptlog "Success! Checking for update: SteamCMD" + sleep 1 + fi -if [ "${currentbuild}" != "${availablebuild}" ]; then - echo -e "\n" - echo -e "Update available:" - sleep 1 - echo -e " Current build: \e[0;31m${currentbuild}\e[0;39m" - echo -e " Available build: \e[0;32m${availablebuild}\e[0;39m" - echo -e "" - echo -e " https://steamdb.info/app/${appid}/" - sleep 1 - echo "" - echo -en "Applying update.\r" - sleep 1 - echo -en "Applying update..\r" - sleep 1 - echo -en "Applying update...\r" - sleep 1 - echo -en "\n" - fn_scriptlog "Update available" - fn_scriptlog "Current build: ${currentbuild}" - fn_scriptlog "Available build: ${availablebuild}" - fn_scriptlog "${currentbuild} > ${availablebuild}" + if [ "${currentbuild}" != "${availablebuild}" ]; then + echo -e "\n" + echo -e "Update available:" + sleep 1 + echo -e " Current build: \e[0;31m${currentbuild}\e[0;39m" + echo -e " Available build: \e[0;32m${availablebuild}\e[0;39m" + echo -e "" + echo -e " https://steamdb.info/app/${appid}/" + sleep 1 + echo "" + echo -en "Applying update.\r" + sleep 1 + echo -en "Applying update..\r" + sleep 1 + echo -en "Applying update...\r" + sleep 1 + echo -en "\n" + fn_scriptlog "Update available" + fn_scriptlog "Current build: ${currentbuild}" + fn_scriptlog "Available build: ${availablebuild}" + fn_scriptlog "${currentbuild} > ${availablebuild}" - tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") - unset updateonstart - if [ "${tmuxwc}" -eq 1 ]; then - command_stop.sh - update_dl.sh - command_start.sh + unset updateonstart + info_status.sh + if [ "${status}" != "0" ]; then + command_stop.sh + update_dl.sh + command_start.sh + else + update_dl.sh + fi else - update_dl.sh + echo -e "\n" + echo -e "No update available:" + echo -e " Current version: \e[0;32m${currentbuild}\e[0;39m" + echo -e " Available version: \e[0;32m${availablebuild}\e[0;39m" + echo -e " https://steamdb.info/app/${appid}/" + echo -e "" + fn_print_ok_nl "No update available" + fn_scriptlog "Current build: ${currentbuild}" + fn_scriptlog "Available build: ${availablebuild}" fi -else - echo -e "\n" - echo -e "No update available:" - echo -e " Current version: \e[0;32m${currentbuild}\e[0;39m" - echo -e " Available version: \e[0;32m${availablebuild}\e[0;39m" - echo -e " https://steamdb.info/app/${appid}/" - echo -e "" - fn_print_ok_nl "No update available" - fn_scriptlog "Current build: ${currentbuild}" - fn_scriptlog "Available build: ${availablebuild}" -fi } ### END SteamCMD Update Checker ### fn_teamspeak3_check(){ -# Checks for server update from teamspeak.com using a mirror dl.4players.de -fn_print_dots "Checking for update: teamspeak.com" -fn_scriptlog "Checking for update: teamspeak.com" -sleep 1 - -# Gets currentbuild info -# Checks currentbuild info is available, if fails a server restart will be forced to generate logs -if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then - fn_print_fail "Checking for update: teamspeak.com" + # Checks for server update from teamspeak.com using a mirror dl.4players.de + fn_print_dots "Checking for update: teamspeak.com" + fn_scriptlog "Checking for update: teamspeak.com" sleep 1 - fn_print_fail_nl "Checking for update: teamspeak.com: No logs with server version found" - fn_scriptlog "Failure! Checking for update: teamspeak.com: No logs with server version found" - sleep 2 - fn_print_info_nl "Checking for update: teamspeak.com: Forcing server restart" - fn_scriptlog "Checking for update: teamspeak.com: Forcing server restart" - sleep 2 - command_stop.sh - command_start.sh - sleep 2 - # If still failing will exit + + # Gets currentbuild info + # Checks currentbuild info is available, if fails a server restart will be forced to generate logs if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then - fn_print_fail_nl "Checking for update: teamspeak.com: Still No logs with server version found" - fn_scriptlog "Failure! Checking for update: teamspeak.com: Still No logs with server version found" - exit 1 + fn_print_fail "Checking for update: teamspeak.com" + sleep 1 + fn_print_fail_nl "Checking for update: teamspeak.com: No logs with server version found" + fn_scriptlog "Failure! Checking for update: teamspeak.com: No logs with server version found" + sleep 2 + fn_print_info_nl "Checking for update: teamspeak.com: Forcing server restart" + fn_scriptlog "Checking for update: teamspeak.com: Forcing server restart" + sleep 2 + command_stop.sh + command_start.sh + sleep 2 + # If still failing will exit + if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then + fn_print_fail_nl "Checking for update: teamspeak.com: Still No logs with server version found" + fn_scriptlog "Failure! Checking for update: teamspeak.com: Still No logs with server version found" + exit 1 + fi fi -fi -currentbuild=$(cat $(find ./* -name 'ts3server*_0.log' 2> /dev/null | sort | egrep -E -v '${rootdir}/.ts3version' | tail -1) | egrep -o 'TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}' | egrep -o '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') + currentbuild=$(cat $(find ./* -name 'ts3server*_0.log' 2> /dev/null | sort | egrep -E -v '${rootdir}/.ts3version' | tail -1) | egrep -o 'TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}' | egrep -o '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') -# Gets the teamspeak server architecture -info_distro.sh -if [ "${arch}" == "x86_64" ]; then - ts3arch="amd64" -elif [ "${arch}" == "i386" ]||[ "${arch}" == "i686" ]; then - ts3arch="x86" -else - echo "" - fn_print_failure "${arch} is an unsupported architecture" - exit 1 -fi - -# Gets availablebuild info + # Gets the teamspeak server architecture + info_distro.sh + if [ "${arch}" == "x86_64" ]; then + ts3arch="amd64" + elif [ "${arch}" == "i386" ]||[ "${arch}" == "i686" ]; then + ts3arch="x86" + else + echo "" + fn_print_failure "${arch} is an unsupported architecture" + exit 1 + fi + + # Gets availablebuild info -# Grabs all version numbers but not in correct order -wget "http://dl.4players.de/ts/releases/?C=M;O=D" -q -O -| grep -i dir | egrep -o '.*\/<\/a>' | egrep -o '[0-9\.?]+'|uniq > .ts3_version_numbers_unsorted.tmp + # Grabs all version numbers but not in correct order + wget "http://dl.4players.de/ts/releases/?C=M;O=D" -q -O -| grep -i dir | egrep -o '.*\/<\/a>' | egrep -o '[0-9\.?]+'|uniq > .ts3_version_numbers_unsorted.tmp -# Sort version numbers -cat .ts3_version_numbers_unsorted.tmp | sort -r --version-sort -o .ts3_version_numbers_sorted.tmp + # Sort version numbers + cat .ts3_version_numbers_unsorted.tmp | sort -r --version-sort -o .ts3_version_numbers_sorted.tmp -# Finds directory with most recent server version. -while read ts3_version_number; do - wget --spider -q "http://dl.4players.de/ts/releases/${ts3_version_number}/teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" - if [ $? -eq 0 ]; then - availablebuild="${ts3_version_number}" - # Break while-loop, if the latest release could be found - break - fi -done < .ts3_version_numbers_sorted.tmp + # Finds directory with most recent server version. + while read ts3_version_number; do + wget --spider -q "http://dl.4players.de/ts/releases/${ts3_version_number}/teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" + if [ $? -eq 0 ]; then + availablebuild="${ts3_version_number}" + # Break while-loop, if the latest release could be found + break + fi + done < .ts3_version_numbers_sorted.tmp -# Tidy up -rm -f ".ts3_version_numbers_unsorted.tmp" -rm -f ".ts3_version_numbers_sorted.tmp" + # Tidy up + rm -f ".ts3_version_numbers_unsorted.tmp" + rm -f ".ts3_version_numbers_sorted.tmp" -# Checks availablebuild info is available -if [ -z "${availablebuild}" ]; then - fn_print_fail "Checking for update: teamspeak.com" - fn_scriptlog "Checking for update: teamspeak.com" - sleep 1 - fn_print_fail "Checking for update: teamspeak.com: Not returning version info" - fn_scriptlog "Failure! Checking for update: teamspeak.com: Not returning version info" - sleep 2 - exit 1 -else - fn_print_ok "Checking for update: teamspeak.com" - fn_scriptlog "Success! Checking for update: teamspeak.com" - sleep 1 -fi + # Checks availablebuild info is available + if [ -z "${availablebuild}" ]; then + fn_print_fail "Checking for update: teamspeak.com" + fn_scriptlog "Checking for update: teamspeak.com" + sleep 1 + fn_print_fail "Checking for update: teamspeak.com: Not returning version info" + fn_scriptlog "Failure! Checking for update: teamspeak.com: Not returning version info" + sleep 2 + exit 1 + else + fn_print_ok "Checking for update: teamspeak.com" + fn_scriptlog "Success! Checking for update: teamspeak.com" + sleep 1 + fi -# Removes dots so if can compare version numbers -currentbuilddigit=$(echo "${currentbuild}"|tr -cd '[:digit:]') -availablebuilddigit=$(echo "${availablebuild}"|tr -cd '[:digit:]') -if [ "${currentbuilddigit}" -ne "${availablebuilddigit}" ]; then - echo -e "\n" - echo -e "Update available:" - sleep 1 - echo -e " Current build: \e[0;31m${currentbuild} ${architecture}\e[0;39m" - echo -e " Available build: \e[0;32m${availablebuild} ${architecture}\e[0;39m" - echo -e "" - sleep 1 - echo "" - echo -en "Applying update.\r" - sleep 1 - echo -en "Applying update..\r" - sleep 1 - echo -en "Applying update...\r" - sleep 1 - echo -en "\n" - fn_scriptlog "Update available" - fn_scriptlog "Current build: ${currentbuild}" - fn_scriptlog "Available build: ${availablebuild}" - fn_scriptlog "${currentbuild} > ${availablebuild}" - unset updateonstart - info_ts3status.sh - if [ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then - update_dl.sh - command_start.sh - sleep 5 - command_stop.sh + # Removes dots so if can compare version numbers + currentbuilddigit=$(echo "${currentbuild}"|tr -cd '[:digit:]') + availablebuilddigit=$(echo "${availablebuild}"|tr -cd '[:digit:]') + if [ "${currentbuilddigit}" -ne "${availablebuilddigit}" ]; then + echo -e "\n" + echo -e "Update available:" + sleep 1 + echo -e " Current build: \e[0;31m${currentbuild} ${architecture}\e[0;39m" + echo -e " Available build: \e[0;32m${availablebuild} ${architecture}\e[0;39m" + echo -e "" + sleep 1 + echo "" + echo -en "Applying update.\r" + sleep 1 + echo -en "Applying update..\r" + sleep 1 + echo -en "Applying update...\r" + sleep 1 + echo -en "\n" + fn_scriptlog "Update available" + fn_scriptlog "Current build: ${currentbuild}" + fn_scriptlog "Available build: ${availablebuild}" + fn_scriptlog "${currentbuild} > ${availablebuild}" + + unset updateonstart + check_status.sh + if [ "${status}" == "0" ]; then + update_dl.sh + command_start.sh + sleep 5 + command_stop.sh + else + command_stop.sh + update_dl.sh + command_start.sh + fi else - command_stop.sh - update_dl.sh - command_start.sh + echo -e "\n" + echo -e "No update available:" + echo -e " Current version: \e[0;32m${currentbuild}\e[0;39m" + echo -e " Available version: \e[0;32m${availablebuild}\e[0;39m" + echo -e "" + fn_print_ok_nl "No update available" + fn_scriptlog "Current build: ${currentbuild}" + fn_scriptlog "Available build: ${availablebuild}" fi -else - echo -e "\n" - echo -e "No update available:" - echo -e " Current version: \e[0;32m${currentbuild}\e[0;39m" - echo -e " Available version: \e[0;32m${availablebuild}\e[0;39m" - echo -e "" - fn_print_ok_nl "No update available" - fn_scriptlog "Current build: ${currentbuild}" - fn_scriptlog "Available build: ${availablebuild}" -fi } check.sh @@ -312,8 +314,7 @@ if [ "${gamename}" == "Teamspeak 3" ]; then elif [ "${engine}" == "goldsource" ]||[ "${forceupdate}" == "1" ]; then # Goldsource servers bypass checks as fn_steamcmdcheck does not work for appid 90 servers. # forceupdate bypasses checks - tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -Ec "^${servicename}:") - if [ "${tmuxwc}" -eq 1 ]; then + if [ "${status}" != "0" ]; then command_stop.sh update_dl.sh command_start.sh From 61cea10bf3b6e5e3fe16816da223f54971cffc34 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 May 2016 17:46:00 +0100 Subject: [PATCH 367/434] Fixed gameport now listed as port --- QuakeLive/qlserver | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index 358626f67..f4e19c1e6 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -9,10 +9,9 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="060516" #### Variables #### -arch="x64" # Notification Email # (on|off) @@ -24,10 +23,11 @@ steamuser="anonymous" steampass="" # Start Variables -gameport="27960" +arch="x64" # x64 or x86 +port="27960" rconport="28960" rconpassword="CHANGE_ME" -statsport="${gameport}" +statsport="${port}" statspassword="CHANGE_ME" mappool='mappool.txt' ip="0.0.0.0" @@ -36,7 +36,7 @@ updateonstart="off" # Install/Config Guide : https://steamcommunity.com/sharedfiles/filedetails/?id=542966946 # Console Commands : http://www.regurge.at/ql/ fn_parms(){ - parms="+set net_strict 1 +set net_ip ${ip} +set net_port ${gameport} +set fs_homepath ${filesdir}/${gameport} +set zmq_rcon_enable 1 +set zmq_rcon_port ${rconport} +set zmq_rcon_password ${rconpassword} +set zmq_stats_enable 1 +set zmq_stats_password ${statspassword} +set zmq_stats_port ${statsport} +set sv_mapPoolFile ${mappool} +exec ${servercfg} " + parms="+set net_strict 1 +set net_ip ${ip} +set net_port ${port} +set fs_homepath ${filesdir}/${gameport} +set zmq_rcon_enable 1 +set zmq_rcon_port ${rconport} +set zmq_rcon_password ${rconpassword} +set zmq_stats_enable 1 +set zmq_stats_password ${statspassword} +set zmq_stats_port ${statsport} +set sv_mapPoolFile ${mappool} +exec ${servercfg}" } #### Advanced Variables #### @@ -65,7 +65,7 @@ functionsdir="${lgsmdir}/functions" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" -executable=$([ "$arch" == 'x64' ] && echo "./run_server_x64.sh" || echo "./run_server_x86.sh") +executable=$([ "${arch}" == 'x64' ] && echo "./run_server_x64.sh" || echo "./run_server_x86.sh") servercfg="${servicename}.cfg" servercfgdir="${filesdir}/baseq3" servercfgfullpath="${servercfgdir}/${servercfg}" From 5764b6ea9a9565cfa7d1d7426090fb03b5db1cfa Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 May 2016 18:11:36 +0100 Subject: [PATCH 368/434] moved fn_parms --- lgsm/functions/command_start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 5b274f32f..3637f5ef2 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -58,6 +58,7 @@ fn_start_teamspeak3(){ } fn_start_tmux(){ + fn_parms fn_print_dots "${servername}" fn_scriptlog "${servername}" sleep 1 @@ -168,7 +169,6 @@ fn_start_tmux(){ check.sh fix.sh info_config.sh -fn_parms logs.sh # Will check for updates is updateonstart is yes From 999ba07fa1fa31a3910987e2428b90911b1016ce Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 May 2016 18:13:01 +0100 Subject: [PATCH 369/434] Added execdir --- lgsm/functions/check_status.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh index d0f88b080..dc9edc01a 100644 --- a/lgsm/functions/check_status.sh +++ b/lgsm/functions/check_status.sh @@ -10,7 +10,7 @@ if [ "${gamename}" == "Teamspeak 3" ]; then # 1: Server is running # 0: Server seems to have died # 0: No server running (ts3server.pid is missing) - status=$(./ts3server_startscript.sh status servercfgfullpathfile=${servercfgfullpath}) + status=$(${executabledir}/ts3server_startscript.sh status servercfgfullpathfile=${servercfgfullpath}) if [ "${status}" == "Server is running" ]; then status=1 else From 8bd29c5e4bec092c69918af68c39cbe11ff3138b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 May 2016 18:13:09 +0100 Subject: [PATCH 370/434] date --- lgsm/functions/command_validate.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 4e658ccf5..4445c549b 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -2,7 +2,7 @@ # LGSM command_validate.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="271215" +lgsm_version="060516" # Description: Runs a server validation. From 435f6baf51bc4cea9cb9402e9f22f59f1e382cc2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 May 2016 18:18:24 +0100 Subject: [PATCH 371/434] ts3error=status --- lgsm/functions/check_status.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh index dc9edc01a..768aded0f 100644 --- a/lgsm/functions/check_status.sh +++ b/lgsm/functions/check_status.sh @@ -14,8 +14,8 @@ if [ "${gamename}" == "Teamspeak 3" ]; then if [ "${status}" == "Server is running" ]; then status=1 else + ts3error="${status}" status=0 - ts3error=$(./ts3server_startscript.sh status servercfgfullpathfile=${servercfgfullpath}) fi else status=$(tmux list-sessions 2>&1 | awk '{print $1}' | grep -Ec "^${servicename}:") From 012915f892a0a42380aae4e24f2070cc72baa460 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 May 2016 18:19:23 +0100 Subject: [PATCH 372/434] excluded ts3server from glibc checks --- lgsm/functions/fix.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index a57484305..af8a29175 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -42,7 +42,10 @@ if [ "${function_selfname}" != "command_install.sh" ]; then elif [ "${gamename}" == "ARMA 3" ]; then fix_arma3.sh fi - fix_glibc.sh + + if [ "${gamename}" != "Teamspeak 3" ]; then + fix_glibc.sh + fi fi # Fixes that are run on install only. From 5904bb2fb10bb17d01d546dba7a86e09a6c3e2b5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 May 2016 18:39:20 +0100 Subject: [PATCH 373/434] depricated --- lgsm/functions/info_ts3status.sh | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 lgsm/functions/info_ts3status.sh diff --git a/lgsm/functions/info_ts3status.sh b/lgsm/functions/info_ts3status.sh deleted file mode 100644 index c08f95f1d..000000000 --- a/lgsm/functions/info_ts3status.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -# LGSM info_ts3status.sh function -# Author: Daniel Gibbs -# Website: http://gameservermanagers.com -lgsm_version="271215" - -# Checks the status of Teamspeak 3. - -cd "${executabledir}" -ts3status=$(./ts3server_startscript.sh status servercfgfullpathfile=${servercfgfullpath}) From 020c0f62cbc1adcdb20a8578e90714ce7fb96680 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 May 2016 18:39:32 +0100 Subject: [PATCH 374/434] renamed 2 variables --- lgsm/functions/check_glibc.sh | 8 +++--- lgsm/functions/command_details.sh | 23 +++++++++++++---- lgsm/functions/fix_glibc.sh | 12 ++++----- lgsm/functions/info_glibc.sh | 42 +++++++++++++++---------------- 4 files changed, 49 insertions(+), 36 deletions(-) diff --git a/lgsm/functions/check_glibc.sh b/lgsm/functions/check_glibc.sh index 3647f4705..3461c3dee 100644 --- a/lgsm/functions/check_glibc.sh +++ b/lgsm/functions/check_glibc.sh @@ -8,13 +8,13 @@ lgsm_version="020116" info_glibc.sh -glibc_version="$(ldd --version | sed -n '1s/.* //p')" -if [ "$(printf '%s\n$glibc_required\n' $glibc_version | sort -V | head -n 1)" != "${glibc_required}" ]; then +glibcversion="$(ldd --version | sed -n '1s/.* //p')" +if [ "$(printf '%s\n$glibcrequired\n' $glibcversion | sort -V | head -n 1)" != "${glibcrequired}" ]; then if [ "${glibcfix}" != "yes" ]; then fn_print_warn_nl "Glibc fix: No Glibc fix available!" echo -en "\n" - echo " * glibc required: $glibc_required" - echo " * glibc installed: $glibc_version" + echo " * glibc required: $glibcrequired" + echo " * glibc installed: $glibcversion" echo -en "\n" fn_print_infomation "The game server will probably not work. A distro upgrade is required!" sleep 5 diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index c601769e1..fab978943 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -160,24 +160,36 @@ fn_details_gameserver(){ fi } | column -s $'\t' -t echo -e "" +} - ## script details +fn_details_script(){ + # + # qlserver Script Details + # ===================================== + # Service name: ql-server + # qlserver version: 150316 + # User: lgsm + # Email notification: off + # Update on start: off + # Location: /home/lgsm/qlserver + # Config file: /home/lgsm/qlserver/serverfiles/baseq3/ql-server.cfg + echo -e "\e[92m${selfname} Script Details\e[0m" printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = { - # service name + # Service name echo -e "\e[34mService name:\t\e[0m${servicename}" - # script version + # Script version if [ -n "${version}" ]; then echo -e "\e[34m${selfname} version:\t\e[0m${version}" fi - # script user + # User echo -e "\e[34mUser:\t\e[0m$(whoami)" # GLIBC required - if [ -n "${glibcrequired}" ] && [ "${glibcrequired}" != "UNKNOWN" ]; then + if [ -n "${glibcrequired}" ]; then if [ "$(ldd --version | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" -lt "$(echo "${glibcrequired}" | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" ]; then if [ "${glibcfix}" == "yes" ]; then echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired} \e[0m(\e[0;32mUsing GLIBC fix\e[0m)" @@ -666,6 +678,7 @@ fn_details_os fn_details_performance fn_details_disk fn_details_gameserver +fn_details_script fn_details_backup # Some game servers do not have parms. if [ "${gamename}" != "Teamspeak 3" ]&&[ "${engine}" != "avalanche" ]&&[ "${engine}" != "dontstarve" ]&&[ "${engine}" != "projectzomboid" ]; then diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index 5af92d4b7..12823c3b0 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -24,18 +24,18 @@ do fi done -glibc_version="$(ldd --version | sed 's/.* //;q')" -if [ "$(printf '%s\n'${glibc_required}'\n' ${glibc_version} | sort -V | head -n 1)" != "${glibc_required}" ]; then +glibcversion="$(ldd --version | sed 's/.* //;q')" +if [ "$(printf '%s\n'${glibcrequired}'\n' ${glibcversion} | sort -V | head -n 1)" != "${glibcrequired}" ]; then if [ "${glibcfix}" == "yes" ]; then fn_print_info_nl "Glibc fix: Using Glibc fix" - echo " * glibc required: ${glibc_required}" - echo " * glibc installed: ${glibc_version}" + echo " * glibc required: ${glibcrequired}" + echo " * glibc installed: ${glibcversion}" export LD_LIBRARY_PATH=:"${libdir}" else fn_print_warn_nl "Glibc fix: No Glibc fix available!" echo -en "\n" - echo " * glibc required: ${glibc_required}" - echo " * glibc installed: ${glibc_version}" + echo " * glibc required: ${glibcrequired}" + echo " * glibc installed: ${glibcversion}" echo -en "\n" fn_print_infomation "The game server will probably not work. A distro upgrade is required!" fi diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 8b7b38cd4..46c45d904 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -7,65 +7,65 @@ lgsm_version="260216" # Description: stores details on servers Glibc requirements. if [ "${gamename}" == "Blade Symphony" ]; then - glibc_required="2.15" + glibcrequired="2.15" glibcfix="yes" elif [ "${gamename}" == "BrainBread 2" ]; then - glibc_required="2.17" + glibcrequired="2.17" elif [ "${gamename}" == "Double Action: Boogaloo" ]; then - glibc_required="2.15" + glibcrequired="2.15" glibcfix="yes" elif [ "${gamename}" == "Fistful of Frags" ]; then - glibc_required="2.15" + glibcrequired="2.15" glibcfix="yes" elif [ "${gamename}" == "Garry's Mod" ]; then - glibc_required="2.15" + glibcrequired="2.15" glibcfix="yes" elif [ "${gamename}" == "Insurgency" ]; then - glibc_required="2.15" + glibcrequired="2.15" glibcfix="yes" elif [ "${gamename}" == "No More Room in Hell" ]; then - glibc_required="2.15" + glibcrequired="2.15" glibcfix="yes" elif [ "${gamename}" == "Quake Live" ]; then - glibc_required="2.15" + glibcrequired="2.15" glibcfix="no" elif [ "${engine}" == "avalanche" ]; then - glibc_required="2.13" + glibcrequired="2.13" glibcfix="yes" elif [ "${engine}" == "dontstarve" ]; then - glibc_required="2.15" + glibcrequired="2.15" glibcfix="no" elif [ "${engine}" == "projectzomboid" ]; then - glibc_required="2.15" + glibcrequired="2.15" glibcfix="yesno" elif [ "${engine}" == "realvirtuality" ]; then - glibc_required="2.13" + glibcrequired="2.13" glibcfix="yes" elif [ "${engine}" == "seriousengine35" ]; then - glibc_required="2.13" + glibcrequired="2.13" glibcfix="yes" elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then - glibc_required="2.3.6" + glibcrequired="2.3.6" glibcfix="no" elif [ "${engine}" == "spark" ]; then - glibc_required="2.15" + glibcrequired="2.15" glibcfix="yes" elif [ "${engine}" == "starbound" ]; then - glibc_required="2.12" + glibcrequired="2.12" glibcfix="no" elif [ "${engine}" == "unreal" ]; then - glibc_required="2.1" + glibcrequired="2.1" glibcfix="no" elif [ "${engine}" == "unreal2" ]; then - glibc_required="2.4" + glibcrequired="2.4" glibcfix="no" elif [ "${engine}" == "unreal4" ]; then - glibc_required="2.14" + glibcrequired="2.14" glibcfix="no" elif [ "${engine}" == "unity3d" ]; then - glibc_required="2.15" + glibcrequired="2.15" glibcfix="no" else - glibc_required="UNKNOWN" + glibcrequired="UNKNOWN" glibcfix="no" fi From b15d757c1b4c7b77626e71aa8dcce302713fc9cf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 May 2016 18:57:05 +0100 Subject: [PATCH 375/434] fn_print_info_nl --- lgsm/functions/command_backup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index d2426029c..f8156479d 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -12,7 +12,7 @@ function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')" echo "" -fn_printinfonl "A total of $(du -sh "${rootdir}" --exclude="${backupdir}" | awk '{print $1}') will be compressed into the following backup:" +fn_print_info_nl "A total of $(du -sh "${rootdir}" --exclude="${backupdir}" | awk '{print $1}') will be compressed into the following backup:" echo "${backupdir}/${backupname}.tar.gz" echo "" while true; do From 03169f1fb0d879d8b395ab0d8e2720f4906ea27d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 May 2016 19:10:50 +0100 Subject: [PATCH 376/434] corrected messages --- lgsm/functions/command_backup.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index f8156479d..563b80bf3 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -27,7 +27,7 @@ echo "" check_status.sh if [ "${status}" != "0" ]; then echo "" - fn_printwarningnl "${servicename} is currently running." + fn_print_warning_nl "${servicename} is currently running." sleep 1 while true; do read -p "Stop ${servicename} while running the backup? [y/N]" yn @@ -39,13 +39,13 @@ if [ "${status}" != "0" ]; then done fi fn_scriptlog "Started backup" -fn_printdots "Backup in progress, please wait..." +fn_print_dots "Backup in progress, please wait..." sleep 2 if [ ! -d "${backupdir}" ]; then mkdir "${backupdir}" fi tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "backups" ./* -fn_printoknl "Backup created: ${backupname}.tar.gz is $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}') size" +fn_print_ok_nl "Backup created: ${backupname}.tar.gz is $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}') size" fn_scriptlog "Complete, Backup created: ${backupdir}/${backupname}.tar.gz is $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}') size" sleep 1 echo "" \ No newline at end of file From c0e2891b15d3e99fba6fa1b123831592e7d09961 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 8 May 2016 17:41:57 +0100 Subject: [PATCH 377/434] Optimised details function --- lgsm/functions/command_details.sh | 662 ++++++++++++------------------ 1 file changed, 273 insertions(+), 389 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index fab978943..24abefece 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -2,7 +2,7 @@ # LGSM command_details.sh function # Author: Daniel Gibbs # Website: http://gameservermanagers.com -lgsm_version="060516" +lgsm_version="080516" # Description: Displays server infomation. @@ -147,12 +147,12 @@ fn_details_gameserver(){ echo -e "\e[34mTick rate:\t\e[0m${tickrate}" fi - # teamspeak dbplugin + # Teamspeak dbplugin if [ -n "${dbplugin}" ]; then echo -e "\e[34mdbplugin:\t\e[0m${dbplugin}" fi - # online status + # Online status if [ "${status}" == "0" ]; then echo -e "\e[34mStatus:\t\e[0;31mOFFLINE\e[0m" else @@ -189,37 +189,37 @@ fn_details_script(){ echo -e "\e[34mUser:\t\e[0m$(whoami)" # GLIBC required + glibcrequired="UNKNOWN" if [ -n "${glibcrequired}" ]; then - if [ "$(ldd --version | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" -lt "$(echo "${glibcrequired}" | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" ]; then + if [ "${glibcrequired}" == "UNKNOWN" ]; then + echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired}" + elif [ "$(ldd --version | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" -lt "$(echo "${glibcrequired}" | sed -n '1 p' | tr -cd '[:digit:]' | tail -c 3)" ]; then if [ "${glibcfix}" == "yes" ]; then echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired} \e[0m(\e[0;32mUsing GLIBC fix\e[0m)" else echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired}\e[0m(\e[0;32mGLIBC version too old\e[0m)" fi + else echo -e "\e[34mGLIBC required:\t\e[0;32m${glibcrequired}\e[0m" fi fi - # email notification - if [ -n "${emailnotification}" ]; then - echo -e "\e[34mEmail notification:\t\e[0m${emailnotification}" - fi + # Email notification + echo -e "\e[34mEmail notification:\t\e[0m${emailnotification}" - # update on start - if [ -n "${updateonstart}" ]; then - echo -e "\e[34mUpdate on start:\t\e[0m${updateonstart}" - fi + # Update on start + echo -e "\e[34mUpdate on start:\t\e[0m${updateonstart}" - # script location + # Script location echo -e "\e[34mLocation:\t\e[0m${rootdir}" - # config file location + # Config file location if [ -n "${servercfgfullpath}" ]; then echo -e "\e[34mConfig file:\t\e[0m${servercfgfullpath}" fi - # network config file location (ARMA 3) + # Network config file location (ARMA 3) if [ -n "${networkcfgfullpath}" ]; then echo -e "\e[34mNetwork config file:\t\e[0m${networkcfgfullpath}" fi @@ -227,445 +227,325 @@ fn_details_script(){ } fn_details_backup(){ -echo -e "" -echo -e "\e[92mBackups\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -if [ ! -d "${backupdir}" ]||[ "${backupcount}" == "0" ]; then - echo -e "No Backups created" -else - { - echo -e "\e[34mNo. of backups:\t\e[0m${backupcount}" - echo -e "\e[34mLatest backup:\e[0m" - echo -e "\e[34m date:\t\e[0m${lastbackupdate}" - echo -e "\e[34m file:\t\e[0m${lastbackup}" - echo -e "\e[34m size:\t\e[0m${lastbackupsize}" - } | column -s $'\t' -t -fi + # + # Backups + # ===================================== + # No. of backups: 1 + # Latest backup: + # date: Fri May 6 18:34:19 UTC 2016 + # file: /home/lgsm/qlserver/backups/ql-server-2016-05-06-183239.tar.gz + # size: 945M + + echo -e "" + echo -e "\e[92mBackups\e[0m" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + if [ ! -d "${backupdir}" ]||[ "${backupcount}" == "0" ]; then + echo -e "No Backups created" + else + { + echo -e "\e[34mNo. of backups:\t\e[0m${backupcount}" + echo -e "\e[34mLatest backup:\e[0m" + echo -e "\e[34m date:\t\e[0m${lastbackupdate}" + echo -e "\e[34m file:\t\e[0m${lastbackup}" + echo -e "\e[34m size:\t\e[0m${lastbackupsize}" + } | column -s $'\t' -t + fi } fn_details_commandlineparms(){ -echo -e "" -echo -e "\e[92mCommand-line Parameters\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "${executable} ${parms}" + # + # Command-line Parameters + # ===================================== + # ./run_server_x86.sh +set net_strict 1 + + echo -e "" + echo -e "\e[92mCommand-line Parameters\e[0m" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + echo -e "${executable} ${parms}" +} + +fn_details_ports(){ + # Ports + # ===================================== + # Change ports by editing the parameters in: + # /home/lgsm/qlserver/serverfiles/baseq3/ql-server.cfg + + echo -e "" + echo -e "\e[92mPorts\e[0m" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + echo -e "Change ports by editing the parameters in:" + + parmslocation="\e[0;31mUNKNOWN\e[0m" + local ports_edit_array=( "avalanche" "dontstarve" "projectzomboid" "idtech3" "realvirtuality" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "Teamspeak 3" "7 Days To Die" ) + for port_edit in "${ports_edit_array[@]}" + do + if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then + parmslocation="${servercfgfullpath}" + fi + done + + local ports_edit_array=( "starbound" "spark" "source" "goldsource" "Rust" "Hurtworld" ) + for port_edit in "${ports_edit_array[@]}" + do + if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then + parmslocation="${selfname}" + fi + done + echo -e "${parmslocation}" + echo -e "" + echo -e "Useful port diagnostic command:" } fn_details_statusbottom(){ -echo -e "" -if [ "${gamename}" == "Teamspeak 3" ]; then - if [ "${ts3status}" = "Server seems to have died" ]||[ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then - echo -e "\e[34mStatus: \e[0;31mOFFLINE\e[0m" - else - echo -e "\e[34mStatus: \e[0;32mONLINE\e[0m" - fi -else - pid=$(tmux list-sessions 2>&1 | awk '{print $1}' | grep -Ec "^${servicename}:") - if [ "${pid}" == "0" ]; then - echo -e "\e[34mStatus: \e[0;31mOFFLINE\e[0m" + echo -e "" + if [ "${status}" == "0" ]; then + echo -e "\e[34mStatus:\t\e[0;31mOFFLINE\e[0m" else - echo -e "\e[34mStatus: \e[0;32mONLINE\e[0m" + echo -e "\e[34mStatus:\t\e[0;32mONLINE\e[0m" fi -fi -echo -e "" + echo -e "" } # Engine Specific details fn_details_avalanche(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep Jcmp-Server" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom + echo -e "netstat -atunp | grep Jcmp-Server" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + } | column -s $'\t' -t + } fn_details_dontstarve(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep dontstarve" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom + echo -e "netstat -atunp | grep dontstarve" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + } | column -s $'\t' -t } fn_details_projectzomboid(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep java" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom + echo -e "netstat -atunp | grep java" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + } | column -s $'\t' -t } fn_details_realvirtuality(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep arma3server" -echo -e "" -if [ -z "${port}" ]||[ -z "${queryport}" ]||[ -z "${masterport}" ]; then - echo -e "\e[0;31mERROR!\e[0m Missing/commented ports in ${servercfg}." + echo -e "netstat -atunp | grep arma3server" echo -e "" -fi -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> Steam: Query\tINBOUND\t${queryport}\tudp" - echo -e "> Steam: Master traffic\tINBOUND\t${masterport}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom + if [ -z "${port}" ]||[ -z "${queryport}" ]||[ -z "${masterport}" ]; then + echo -e "\e[0;31mERROR!\e[0m Missing/commented ports in ${servercfg}." + echo -e "" + fi + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Steam: Query\tINBOUND\t${queryport}\tudp" + echo -e "> Steam: Master traffic\tINBOUND\t${masterport}\tudp" + } | column -s $'\t' -t } fn_details_idtech3(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep qzeroded" -echo -e "" -if [ -z "${port}" ]||[ -z "${rconport}" ]||[ -z "${statsport}" ]; then - echo -e "\e[0;31mERROR!\e[0m Missing/commented ports in ${servercfg}." + echo -e "netstat -atunp | grep qzeroded" echo -e "" -fi -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - echo -e "> Rcon\tINBOUND\t${rconport}\tudp" - echo -e "> Stats\tINBOUND\t${statsport}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom + if [ -z "${port}" ]||[ -z "${rconport}" ]||[ -z "${statsport}" ]; then + echo -e "\e[0;31mERROR!\e[0m Missing/commented ports in ${servercfg}." + echo -e "" + fi + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Rcon\tINBOUND\t${rconport}\tudp" + echo -e "> Stats\tINBOUND\t${statsport}\tudp" + } | column -s $'\t' -t } fn_details_seriousengine35(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep Sam3_Dedicate" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/RCON\tINBOUND\t${port}\ttcp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom + echo -e "netstat -atunp | grep Sam3_Dedicate" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/RCON\tINBOUND\t${port}\ttcp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + } | column -s $'\t' -t } fn_details_source(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the command-line" -echo -e "parameters in ${selfname}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep srcds_linux" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/RCON\tINBOUND\t${port}\ttcp/udp" - if [ -n "${sourcetvport}" ]; then - echo -e "> SourceTV\tINBOUND\t${sourcetvport}\tudp" - fi - echo -e "< Client\tOUTBOUND\t${clientport}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom + echo -e "netstat -atunp | grep srcds_linux" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/RCON\tINBOUND\t${port}\ttcp/udp" + if [ -n "${sourcetvport}" ]; then + echo -e "> SourceTV\tINBOUND\t${sourcetvport}\tudp" + fi + echo -e "< Client\tOUTBOUND\t${clientport}\tudp" + } | column -s $'\t' -t } fn_details_spark(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the command-line" -echo -e "parameters in ${selfname}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep server_linux3" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/RCON\tINBOUND\t${port}\tudp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" - echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" -} | column -s $'\t' -t -echo -e "" -echo -e "\e[92m${servername} WebAdmin\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}/index.html" - echo -e "\e[34mWebAdmin username:\t\e[0m${webadminuser}" - echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}" -} | column -s $'\t' -t - -fn_details_statusbottom + echo -e "netstat -atunp | grep server_linux3" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/RCON\tINBOUND\t${port}\tudp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" + } | column -s $'\t' -t + echo -e "" + echo -e "\e[92m${servername} WebAdmin\e[0m" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + { + echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}/index.html" + echo -e "\e[34mWebAdmin username:\t\e[0m${webadminuser}" + echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}" + } | column -s $'\t' -t } fn_details_starbound(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the command-line" -echo -e "parameters in ${selfname}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep starbound" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\ttcp" - echo -e "> Query\tINBOUND\t${queryport}\ttcp" - echo -e "> Rcon\tINBOUND\t${rconport}\ttcp" -} | column -s $'\t' -t - -fn_details_statusbottom - + echo -e "netstat -atunp | grep starbound" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\ttcp" + echo -e "> Query\tINBOUND\t${queryport}\ttcp" + echo -e "> Rcon\tINBOUND\t${rconport}\ttcp" + } | column -s $'\t' -t } fn_details_teamspeak3(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep ts3server" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Voice\tINBOUND\t${port}\tudp" - echo -e "> ServerQuery\tINBOUND\t${queryport}\ttcp" - echo -e "> File transfer\tINBOUND\t${fileport}\ttcp" -} | column -s $'\t' -t - -fn_details_statusbottom + echo -e "netstat -atunp | grep ts3server" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Voice\tINBOUND\t${port}\tudp" + echo -e "> ServerQuery\tINBOUND\t${queryport}\ttcp" + echo -e "> File transfer\tINBOUND\t${fileport}\ttcp" + } | column -s $'\t' -t } fn_details_teeworlds(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the command-line" -echo -e "parameters in ${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep teeworlds_srv" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\ttcp" -} | column -s $'\t' -t - -fn_details_statusbottom + echo -e "netstat -atunp | grep teeworlds_srv" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\ttcp" + } | column -s $'\t' -t } -fn_details_terraria(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the command-line" -echo -e "parameters in ${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep terraia" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\ttcp" - echo -e "> Query\tINBOUND\t${queryport}\ttcp" - echo -e "> Rcon\tINBOUND\t${rconport}\ttcp" -} | column -s $'\t' -t - -fn_details_statusbottom + fn_details_terraria(){ + echo -e "netstat -atunp | grep terraia" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\ttcp" + echo -e "> Query\tINBOUND\t${queryport}\ttcp" + echo -e "> Rcon\tINBOUND\t${rconport}\ttcp" + } | column -s $'\t' -t } fn_details_sdtd(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep 7DaysToDie" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/RCON\tINBOUND\t${port}\tudp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" - echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" - echo -e "> Telnet\tINBOUND\t${telnetport}\ttcp" -} | column -s $'\t' -t -echo -e "" -echo -e "\e[92m${servername} WebAdmin\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mWebAdmin enabled:\t\e[0m${webadminenabled}" - echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}" - echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}" -} | column -s $'\t' -t -echo -e "" -echo -e "\e[92m${servername} Telnet\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mTelnet enabled:\t\e[0m${telnetenabled}" - echo -e "\e[34mTelnet address:\t\e[0m${ip} ${telnetport}" - echo -e "\e[34mTelnet password:\t\e[0m${telnetpass}" -} | column -s $'\t' -t - -fn_details_statusbottom + echo -e "netstat -atunp | grep 7DaysToDie" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/RCON\tINBOUND\t${port}\tudp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp" + echo -e "> Telnet\tINBOUND\t${telnetport}\ttcp" + } | column -s $'\t' -t + echo -e "" + echo -e "\e[92m${servername} WebAdmin\e[0m" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + { + echo -e "\e[34mWebAdmin enabled:\t\e[0m${webadminenabled}" + echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}" + echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}" + } | column -s $'\t' -t + echo -e "" + echo -e "\e[92m${servername} Telnet\e[0m" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + { + echo -e "\e[34mTelnet enabled:\t\e[0m${telnetenabled}" + echo -e "\e[34mTelnet address:\t\e[0m${ip} ${telnetport}" + echo -e "\e[34mTelnet password:\t\e[0m${telnetpass}" + } | column -s $'\t' -t } fn_details_hurtworld(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "hwserver script" -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep Hurtworld" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/RCON\tINBOUND\t${port}\tudp" - echo -e "> Query\tINBOUND\t${queryport}\tudp" - -} | column -s $'\t' -t -echo -e "" - -fn_details_statusbottom + echo -e "netstat -atunp | grep Hurtworld" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/RCON\tINBOUND\t${port}\tudp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + } | column -s $'\t' -t } fn_details_rust(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "rustserver script" -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep Rust" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/Query\tINBOUND\t${port}\ttcp/udp" - echo -e "> RCON\tINBOUND\t${rconport}\ttcp" - -} | column -s $'\t' -t -echo -e "" - -fn_details_statusbottom + echo -e "netstat -atunp | grep Rust" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/Query\tINBOUND\t${port}\ttcp/udp" + echo -e "> RCON\tINBOUND\t${rconport}\ttcp" + } | column -s $'\t' -t } fn_details_unreal(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep ucc-bin" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL\tINI VARIABLE" - echo -e "> Game\tINBOUND\t${port}\tudp\tPort=${port}" - echo -e "> Query\tINBOUND\t${queryport}\tudp" - if [ "${engine}" == "unreal" ]; then - echo -e "< UdpLink Port (random)\tOUTBOUND\t${udplinkport}+\tudp" - fi - if [ "${engine}" != "unreal" ] && [ "${appid}" != "223250" ]; then - echo -e "> GameSpy query\tINBOUND\t${gsqueryport}\tudp\tOldQueryPortNumber=${gsqueryport}" - fi - if [ "${appid}" == "215360" ]; then - echo -e "< Master server\tOUTBOUND\t28852\ttcp/udp" - else - echo -e "< Master server\tOUTBOUND\t28900/28902\ttcp/udp" - fi - if [ "${appid}" ]; then - if [ "${appid}" == "223250" ]; then - echo -e "< Steam\tOUTBOUND\t20610\tudp" + echo -e "netstat -atunp | grep ucc-bin" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL\tINI VARIABLE" + echo -e "> Game\tINBOUND\t${port}\tudp\tPort=${port}" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + if [ "${engine}" == "unreal" ]; then + echo -e "< UdpLink Port (random)\tOUTBOUND\t${udplinkport}+\tudp" + fi + if [ "${engine}" != "unreal" ] && [ "${appid}" != "223250" ]; then + echo -e "> GameSpy query\tINBOUND\t${gsqueryport}\tudp\tOldQueryPortNumber=${gsqueryport}" + fi + if [ "${appid}" == "215360" ]; then + echo -e "< Master server\tOUTBOUND\t28852\ttcp/udp" else - echo -e "< Steam\tOUTBOUND\t20660\tudp" + echo -e "< Master server\tOUTBOUND\t28900/28902\ttcp/udp" fi - fi - echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" -} | column -s $'\t' -t -echo -e "" -echo -e "\e[92m${servername} WebAdmin\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -{ - echo -e "\e[34mWebAdmin enabled:\t\e[0m${webadminenabled}" - echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}" - echo -e "\e[34mWebAdmin username:\t\e[0m${webadminuser}" - echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}" -} | column -s $'\t' -t - -fn_details_statusbottom + if [ "${appid}" ]; then + if [ "${appid}" == "223250" ]; then + echo -e "< Steam\tOUTBOUND\t20610\tudp" + else + echo -e "< Steam\tOUTBOUND\t20660\tudp" + fi + fi + echo -e "> WebAdmin\tINBOUND\t${webadminport}\ttcp\tListenPort=${webadminport}" + } | column -s $'\t' -t + echo -e "" + echo -e "\e[92m${servername} WebAdmin\e[0m" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + { + echo -e "\e[34mWebAdmin enabled:\t\e[0m${webadminenabled}" + echo -e "\e[34mWebAdmin url:\t\e[0mhttp://${ip}:${webadminport}" + echo -e "\e[34mWebAdmin username:\t\e[0m${webadminuser}" + echo -e "\e[34mWebAdmin password:\t\e[0m${webadminpass}" + } | column -s $'\t' -t } fn_details_ark(){ -echo -e "" -echo -e "\e[92mPorts\e[0m" -printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = -echo -e "Change ports by editing the parameters in" -echo -e "${servercfgfullpath}." -echo -e "" -echo -e "Useful port diagnostic command:" -echo -e "netstat -atunp | grep ShooterGame" -echo -e "" -{ - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL\tINI VARIABLE" - echo -e "> Game\tINBOUND\t${port}\tudp\tPort=${port}" - echo -e "> Query\tINBOUND\t${queryport}\tudp" -} | column -s $'\t' -t - -fn_details_statusbottom + echo -e "netstat -atunp | grep ShooterGame" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL\tINI VARIABLE" + echo -e "> Game\tINBOUND\t${port}\tudp\tPort=${port}" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + } | column -s $'\t' -t } @@ -674,6 +554,7 @@ check.sh info_config.sh info_distro.sh info_glibc.sh +info_parms.sh fn_details_os fn_details_performance fn_details_disk @@ -685,12 +566,13 @@ if [ "${gamename}" != "Teamspeak 3" ]&&[ "${engine}" != "avalanche" ]&&[ "${engi fn_parms fn_details_commandlineparms fi +fn_details_ports # Display details depending on game or engine. if [ "${engine}" == "avalanche" ]; then fn_details_avalanche elif [ "${engine}" == "dontstarve" ]; then - fn_details_dontstarve + fn_details_dontstarve elif [ "${engine}" == "projectzomboid" ]; then fn_details_projectzomboid elif [ "${engine}" == "idtech3" ]; then @@ -724,3 +606,5 @@ elif [ "${gamename}" == "Rust" ]; then else fn_print_error_nl "Unable to detect server engine." fi + +fn_details_statusbottom \ No newline at end of file From 17dbb340620fae9c989dae79a3e8d58c9ddcaa00 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 8 May 2016 17:43:28 +0100 Subject: [PATCH 378/434] minor bug fix --- lgsm/functions/command_details.sh | 1 - lgsm/functions/info_parms.sh | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 24abefece..284d6fc6e 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -315,7 +315,6 @@ fn_details_avalanche(){ echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" echo -e "> Game\tINBOUND\t${port}\tudp" } | column -s $'\t' -t - } fn_details_dontstarve(){ diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index d8a6ec26c..ebb8ef764 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -32,10 +32,6 @@ fn_info_config_realvirtuality(){ port=${rconport:-"0"} } -fn_info_config_seriousengine35(){ - -} - fn_info_config_source(){ defaultmap=${defaultmap:-"NOT SET"} maxplayers=${maxplayers:-"0"} From c057c9bf483c8b294ecd09cfef1bc6944a34895f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 8 May 2016 17:46:04 +0100 Subject: [PATCH 379/434] removed test code --- lgsm/functions/command_details.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 284d6fc6e..7bce97ac0 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -189,7 +189,6 @@ fn_details_script(){ echo -e "\e[34mUser:\t\e[0m$(whoami)" # GLIBC required - glibcrequired="UNKNOWN" if [ -n "${glibcrequired}" ]; then if [ "${glibcrequired}" == "UNKNOWN" ]; then echo -e "\e[34mGLIBC required:\t\e[0;31m${glibcrequired}" From ea34b9a5cd35ef968871ed3be037dcf22f2b41f6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 8 May 2016 17:49:20 +0100 Subject: [PATCH 380/434] Corrected port name --- QuakeLive/qlserver | 2 +- lgsm/functions/info_parms.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index f4e19c1e6..835e1ed0f 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -36,7 +36,7 @@ updateonstart="off" # Install/Config Guide : https://steamcommunity.com/sharedfiles/filedetails/?id=542966946 # Console Commands : http://www.regurge.at/ql/ fn_parms(){ - parms="+set net_strict 1 +set net_ip ${ip} +set net_port ${port} +set fs_homepath ${filesdir}/${gameport} +set zmq_rcon_enable 1 +set zmq_rcon_port ${rconport} +set zmq_rcon_password ${rconpassword} +set zmq_stats_enable 1 +set zmq_stats_password ${statspassword} +set zmq_stats_port ${statsport} +set sv_mapPoolFile ${mappool} +exec ${servercfg}" + parms="+set net_strict 1 +set net_ip ${ip} +set net_port ${port} +set fs_homepath ${filesdir}/${port} +set zmq_rcon_enable 1 +set zmq_rcon_port ${rconport} +set zmq_rcon_password ${rconpassword} +set zmq_stats_enable 1 +set zmq_stats_password ${statspassword} +set zmq_stats_port ${statsport} +set sv_mapPoolFile ${mappool} +exec ${servercfg}" } #### Advanced Variables #### diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index ebb8ef764..8c1b476e7 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -18,7 +18,7 @@ zero="\e[0;31m0\e[0m" fn_info_config_idtech3(){ # Not Set - gameport=${gameport:-"NOT SET"} + port=${port:-"NOT SET"} rconport=${rconport:-"0"} rconpassword=${rconpassword:-"NOT SET"} statsport=${statsport:-"0"} @@ -146,7 +146,7 @@ elif [ "${engine}" == "dontstarve" ]; then ## Project Zomboid elif [ "${engine}" == "projectzomboid" ]; then fn_info_config_projectzomboid -# Quake Love +# Quake Live elif [ "${engine}" == "idtech3" ]; then fn_info_config_idtech3 # ARMA 3 From 65bc10074c4c3eb90e4724a7da59d2549e510b38 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 8 May 2016 18:17:34 +0100 Subject: [PATCH 381/434] Changed http to https on LGSM links --- 7DaysToDie/sdtdserver | 2 +- ARKSurvivalEvolved/arkserver | 2 +- Arma3/arma3server | 2 +- BlackMesa/bmdmserver | 4 ++-- BladeSymphony/bsserver | 2 +- BrainBread2/bb2server | 4 ++-- CodenameCURE/ccserver | 2 +- CounterStrike/csserver | 2 +- CounterStrikeConditionZero/csczserver | 2 +- CounterStrikeGlobalOffensive/csgoserver | 4 ++-- CounterStrikeSource/cssserver | 2 +- DayOfDefeat/dodserver | 2 +- DayOfDefeatSource/dodsserver | 2 +- DeathmatchClassic/dmcserver | 2 +- DontStarveTogether/dstserver | 2 +- DoubleActionBoogaloo/dabserver | 2 +- FistfulOfFrags/fofserver | 2 +- GarrysMod/gmodserver | 4 ++-- GoldenEyeSource/gesserver | 2 +- HalfLife2Deathmatch/hl2dmserver | 2 +- HalfLifeDeathmatch/hldmserver | 2 +- HalfLifeDeathmatchSource/hldmsserver | 2 +- Hurtworld/hwserver | 2 +- Insurgency/insserver | 2 +- JustCause2/jc2server | 2 +- KillingFloor/kfserver | 2 +- Left4Dead/l4dserver | 2 +- Left4Dead2/l4d2server | 2 +- Mumble/mumbleserver | 2 +- NS2Combat/ns2cserver | 2 +- NaturalSelection2/ns2server | 2 +- NoMoreRoomInHell/nmrihserver | 2 +- OpposingForce/opforserver | 2 +- PiratesVikingandKnightsII/pvkiiserver | 2 +- ProjectZomboid/pzserver | 2 +- QuakeLive/qlserver | 2 +- README.md | 6 +++--- RedOrchestra/roserver | 2 +- Ricochet/ricochetserver | 2 +- Rust/cfg/lgsm-default.cfg | 2 +- Rust/rustserver | 2 +- SeriousSam3BFE/ss3sserver | 2 +- StarBound/sbserver | 2 +- SvenCoop/svencoopserver | 2 +- TeamFortress2/tf2server | 4 ++-- TeamFortressClassic/tfcserver | 2 +- TeamSpeak3/ts3server | 2 +- Teeworlds/twserver | 2 +- Terraria/terrariaserver | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament99/ut99server | 2 +- functions/command_update_functions.sh | 2 +- functions/core_functions.sh | 2 +- functions/core_getopt.sh | 2 +- functions/fn_functions | 2 +- functions/fn_getopt | 2 +- functions/fn_update_functions | 2 +- lgsm/functions/check.sh | 2 +- lgsm/functions/check_config.sh | 2 +- lgsm/functions/check_deps.sh | 2 +- lgsm/functions/check_glibc.sh | 2 +- lgsm/functions/check_ip.sh | 4 ++-- lgsm/functions/check_logs.sh | 2 +- lgsm/functions/check_permissions.sh | 2 +- lgsm/functions/check_root.sh | 2 +- lgsm/functions/check_status.sh | 2 +- lgsm/functions/check_steamcmd.sh | 2 +- lgsm/functions/check_system_dir.sh | 2 +- lgsm/functions/check_tmux.sh | 4 ++-- lgsm/functions/command_backup.sh | 2 +- lgsm/functions/command_console.sh | 2 +- lgsm/functions/command_debug.sh | 2 +- lgsm/functions/command_details.sh | 2 +- lgsm/functions/command_dev_debug.sh | 2 +- lgsm/functions/command_dev_detect_deps.sh | 2 +- lgsm/functions/command_email_test.sh | 2 +- lgsm/functions/command_fastdl.sh | 2 +- lgsm/functions/command_install.sh | 2 +- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/command_start.sh | 16 ++++++++-------- lgsm/functions/command_stop.sh | 2 +- lgsm/functions/command_ts3_server_pass.sh | 2 +- lgsm/functions/command_update_functions.sh | 2 +- lgsm/functions/command_validate.sh | 2 +- lgsm/functions/compress_unreal2_maps.sh | 2 +- lgsm/functions/compress_ut99_maps.sh | 2 +- lgsm/functions/core_dl.sh | 2 +- lgsm/functions/core_functions.sh | 2 +- lgsm/functions/core_getopt.sh | 16 ++++++++-------- lgsm/functions/core_messages.sh | 2 +- lgsm/functions/email.sh | 2 +- lgsm/functions/fix.sh | 2 +- lgsm/functions/fix_arma3.sh | 2 +- lgsm/functions/fix_csgo.sh | 2 +- lgsm/functions/fix_dst.sh | 2 +- lgsm/functions/fix_glibc.sh | 2 +- lgsm/functions/fix_ins.sh | 2 +- lgsm/functions/fix_kf.sh | 2 +- lgsm/functions/fix_ro.sh | 2 +- lgsm/functions/fix_steamcmd.sh | 2 +- lgsm/functions/fix_ut2k4.sh | 2 +- lgsm/functions/fix_ut99.sh | 2 +- lgsm/functions/fn_functions | 2 +- lgsm/functions/fn_getopt | 2 +- lgsm/functions/fn_update_functions | 2 +- lgsm/functions/gsquery.py | 2 +- lgsm/functions/info_config.sh | 2 +- lgsm/functions/info_distro.sh | 2 +- lgsm/functions/info_glibc.sh | 2 +- lgsm/functions/info_parms.sh | 2 +- lgsm/functions/install_complete.sh | 4 ++-- lgsm/functions/install_config.sh | 2 +- lgsm/functions/install_gslt.sh | 6 +++--- lgsm/functions/install_gsquery.sh | 4 ++-- lgsm/functions/install_header.sh | 4 ++-- lgsm/functions/install_logs.sh | 2 +- lgsm/functions/install_retry.sh | 2 +- lgsm/functions/install_server_dir.sh | 2 +- lgsm/functions/install_server_files.sh | 6 +++--- lgsm/functions/install_steamcmd.sh | 2 +- lgsm/functions/install_ts3.sh | 2 +- lgsm/functions/install_ts3db.sh | 2 +- lgsm/functions/install_ut2k4_key.sh | 2 +- lgsm/functions/logs.sh | 2 +- lgsm/functions/monitor_gsquery.sh | 2 +- lgsm/functions/update_check.sh | 2 +- lgsm/functions/update_dl.sh | 2 +- tests/tests_jc2server.sh | 4 ++-- tests/tests_ts3server.sh | 4 ++-- 129 files changed, 161 insertions(+), 161 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index feb5ed918..116eb9ce6 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -2,7 +2,7 @@ # 7 Days To Die # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 0e6fd3f96..90d262694 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -2,7 +2,7 @@ # ARK: Survivial Evolved # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/Arma3/arma3server b/Arma3/arma3server index 379ee8066..7215de44d 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -3,7 +3,7 @@ # Server Management Script # Author: Daniel Gibbs # Contributor: Scarsz -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index cf8efb1a5..6d8ffbc2e 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -2,7 +2,7 @@ # Black Mesa: Deathmatch # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" @@ -33,7 +33,7 @@ updateonstart="off" # Optional: Game Server Login Token # GSLT can be used for running a public server. -# More info: http://gameservermanagers.com/gslt +# More info: https://gameservermanagers.com/gslt gslt="" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index 879c5d765..87c48e89c 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -2,7 +2,7 @@ # Blade Symphony # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index 321c27d49..2afc3fe32 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -2,7 +2,7 @@ # BrainBread 2 # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" @@ -33,7 +33,7 @@ updateonstart="off" # Optional: Game Server Login Token # GSLT can be used for running a public server. -# More info: http://gameservermanagers.com/gslt +# More info: https://gameservermanagers.com/gslt gslt="" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 55632e467..7b4b0dde6 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -2,7 +2,7 @@ # Codename CURE # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/CounterStrike/csserver b/CounterStrike/csserver index 80c9ea796..55b9d4b35 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -2,7 +2,7 @@ # Counter Strike # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index cabcdda5a..9f0df0574 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -2,7 +2,7 @@ # Counter Strike: Condition Zero # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index d2ba2c507..3e1b51874 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -2,7 +2,7 @@ # Counter Strike: Global Offensive # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" @@ -44,7 +44,7 @@ updateonstart="off" # Required: Game Server Login Token # GSLT is required for running a public server. -# More info: http://gameservermanagers.com/gslt +# More info: https://gameservermanagers.com/gslt gslt="" # Optional: Workshop Parameters diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index 40dacf097..7ab14251b 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -2,7 +2,7 @@ # Counter Strike: Source # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index 6fc30e14c..20444a2de 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -2,7 +2,7 @@ # Day of Defeat # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 025937d76..8a13ced73 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -2,7 +2,7 @@ # Day of Defeat: Source # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index 6f18aac51..49e204d51 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -2,7 +2,7 @@ # Deathmatch Classic # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index e7a754670..eaa7b4cf7 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -2,7 +2,7 @@ # Dont Starve Together # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index cdc3ca7c9..24f2dafdc 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -2,7 +2,7 @@ # Double Action: Boogaloo # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index d0a9c7372..ff1a02a24 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -2,7 +2,7 @@ # Fistful Of Frags # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index bc4fca209..212072989 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -2,7 +2,7 @@ # Garry's Mod # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" @@ -44,7 +44,7 @@ customparms="+r_hunkalloclightmaps 0" # Optional: Game Server Login Token # GSLT can be used for running a public server. -# More info: http://gameservermanagers.com/gslt +# More info: https://gameservermanagers.com/gslt gslt="" # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index 7649b6ec0..cbc710bc7 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -2,7 +2,7 @@ # GoldenEye: Source # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index 3b45b537d..b67986749 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -2,7 +2,7 @@ # Half Life 2: Deathmatch # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index bbb418522..55f5fd749 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -2,7 +2,7 @@ # Half Life: Deathmatch # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index 83a9684b4..9db71678c 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -2,7 +2,7 @@ # Half-Life Deathmatch: Source # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index b828f53d7..47be057d8 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -3,7 +3,7 @@ # Server Management Script # Author: Daniel Gibbs, # Contributor: UltimateByte -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/Insurgency/insserver b/Insurgency/insserver index 9afc9c821..4803e65dd 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -2,7 +2,7 @@ # Insurgency # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/JustCause2/jc2server b/JustCause2/jc2server index bd75e35fb..102370f0f 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -2,7 +2,7 @@ # Just Cause 2 # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index ae9f31854..9ce398a66 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -2,7 +2,7 @@ # Killing Floor # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index 7ca5641a3..a02794d06 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -3,7 +3,7 @@ # Server Management Script # Author: Daniel Gibbs # Contributor: Summit Singh Thakur -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index 31a897818..20add85dd 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -2,7 +2,7 @@ # Left 4 Dead 2 # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index 53b0064d0..e7302f9be 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -2,7 +2,7 @@ # Mumble # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index 9d1eada32..f0f9df415 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -2,7 +2,7 @@ # NS2: Combat # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index 206a652f8..9c6906d6b 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -2,7 +2,7 @@ # Natural Selection 2 # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index d0f14383a..c8de59f28 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -2,7 +2,7 @@ # No More Room in Hell # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index 828ef5e50..5f00c4e1c 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -2,7 +2,7 @@ # Half-Life: Opposing Force # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index 635a8eedd..42ab9aac3 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -2,7 +2,7 @@ # No More Room in Hell # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index 842318759..7ab280674 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -3,7 +3,7 @@ # Server Management Script # Author: Daniel Gibbs # Contributions: Bryce Van Dyk (SingingTree) -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index 835e1ed0f..c65da408a 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -2,7 +2,7 @@ # Quake Live # Server Management Script # Author: Daniel Gibbs -# Website: http://gameservermanagers.com +# Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" diff --git a/README.md b/README.md index 6b7056b55..c4c61df3a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

Linux Game Server Managers_

-linux Game Server Managers +linux Game Server Managers [![Build Status](https://travis-ci.org/dgibbs64/linuxgsm.svg?branch=master)](https://travis-ci.org/dgibbs64/linuxgsm) [![Under Development](https://badge.waffle.io/dgibbs64/linuxgsm.svg?label=Under%20Development&title=Under%20Development)](http://waffle.io/dgibbs64/linuxgsm) @@ -38,11 +38,11 @@ All FAQ can be found here.

Donate

If you want to donate to the project you can via PayPal, Flattr or Gratipay. I have had a may kind people show their support by sending me a donation. Any donations you send help cover my server costs and buy me a drink. Cheers!

Useful Links

diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index 84d00b6f8..a9e1f2afd 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -13,11 +13,18 @@ version="150316" #### Variables #### -# Notification Email +# Notification Alerts # (on|off) -emailnotification="off" + +# Email +emailalert="off" email="email@example.com" +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert"off" +pushbullettoken="accesstoken" + # Steam login steamuser="username" steampass="password" diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index 067065811..b1173fd90 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -13,11 +13,18 @@ version="150316" #### Variables #### -# Notification Email +# Notification Alerts # (on|off) -emailnotification="off" + +# Email +emailalert="off" email="email@example.com" +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert"off" +pushbullettoken="accesstoken" + # Steam login steamuser="anonymous" steampass="" diff --git a/Rust/rustserver b/Rust/rustserver index b3a972c1d..119fb9115 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -14,11 +14,18 @@ version="150316" #### Variables #### -# Notification Email +# Notification Alerts # (on|off) -emailnotification="off" + +# Email +emailalert="off" email="email@example.com" +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert"off" +pushbullettoken="accesstoken" + # Steam login (not required) steamuser="anonymous" steampass="" diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index 60bcc0230..8905df1b2 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -13,11 +13,18 @@ version="150316" #### Variables #### -# Notification Email +# Notification Alerts # (on|off) -emailnotification="off" + +# Email +emailalert="off" email="email@example.com" +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert"off" +pushbullettoken="accesstoken" + # Steam login steamuser="anonymous" steampass="" diff --git a/StarBound/sbserver b/StarBound/sbserver index 881d6c5fc..9fa5e639a 100644 --- a/StarBound/sbserver +++ b/StarBound/sbserver @@ -13,11 +13,18 @@ version="150316" #### Variables #### -# Notification Email +# Notification Alerts # (on|off) -emailnotification="off" + +# Email +emailalert="off" email="email@example.com" +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert"off" +pushbullettoken="accesstoken" + # Steam login steamuser="username" steampass="password" diff --git a/SvenCoop/svencoopserver b/SvenCoop/svencoopserver index 9d2ceb2f9..6daa9d75d 100644 --- a/SvenCoop/svencoopserver +++ b/SvenCoop/svencoopserver @@ -13,11 +13,18 @@ version="150316" #### Variables #### -# Notification Email +# Notification Alerts # (on|off) -emailnotification="off" + +# Email +emailalert="off" email="email@example.com" +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert"off" +pushbullettoken="accesstoken" + # Steam login steamuser="anonymous" steampass="" diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index 671942f71..4f8d0d6df 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -13,11 +13,18 @@ version="150316" #### Variables #### -# Notification Email +# Notification Alerts # (on|off) -emailnotification="off" + +# Email +emailalert="off" email="email@example.com" +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert"off" +pushbullettoken="accesstoken" + # Steam login steamuser="anonymous" steampass="" diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index fbcbe3227..0093b7721 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -13,11 +13,18 @@ version="150316" #### Variables #### -# Notification Email +# Notification Alerts # (on|off) -emailnotification="off" + +# Email +emailalert="off" email="email@example.com" +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert"off" +pushbullettoken="accesstoken" + # Steam login steamuser="anonymous" steampass="" diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index 835113f78..b60066782 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -13,11 +13,18 @@ version="150316" #### Variables #### -# Notification Email +# Notification Alerts # (on|off) -emailnotification="off" + +# Email +emailalert="off" email="email@example.com" +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert"off" +pushbullettoken="accesstoken" + # Start Variables updateonstart="off" diff --git a/Teeworlds/twserver b/Teeworlds/twserver index 19a766260..aa45d1376 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -14,11 +14,18 @@ version="150316" #### Variables #### -# Notification Email +# Notification Alerts # (on|off) -emailnotification="off" + +# Email +emailalert="off" email="email@example.com" +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert"off" +pushbullettoken="accesstoken" + # Steam login steamuser="username" steampass="password" diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index 7e1b35db2..32151b0ab 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -14,11 +14,18 @@ version="150316" #### Variables #### -# Notification Email +# Notification Alerts # (on|off) -emailnotification="off" + +# Email +emailalert="off" email="email@example.com" +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert"off" +pushbullettoken="accesstoken" + # Steam login steamuser="username" steampass="password" diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index f0d1efc29..9a3362bf7 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -13,11 +13,18 @@ version="150316" #### Variables #### -# Notification Email +# Notification Alerts # (on|off) -emailnotification="off" + +# Email +emailalert="off" email="email@example.com" +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert"off" +pushbullettoken="accesstoken" + # Start Variables defaultmap="DM-Rankin" ip="0.0.0.0" diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index 890f028c6..4c8e50635 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -13,11 +13,18 @@ version="150316" #### Variables #### -# Notification Email +# Notification Alerts # (on|off) -emailnotification="off" + +# Email +emailalert="off" email="email@example.com" +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert"off" +pushbullettoken="accesstoken" + # Start Variables defaultmap="DM-Deck16][" ip="0.0.0.0" diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh new file mode 100644 index 000000000..e904933c8 --- /dev/null +++ b/lgsm/functions/alert.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# LGSM alert.sh function +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +lgsm_version="140516" + +# Description: Overall function for managing alerts. + +if [ "${emailalert}" == "on" ]||[ -n "${email}" ]; then + alert_email.sh +fi + +if [ "${pushbulletalert}" == "on" ]||[ -n "${pushbullettoken}" ]; then + alert_pushbullet.sh +fi \ No newline at end of file diff --git a/lgsm/functions/comms_email.sh b/lgsm/functions/alert_email.sh similarity index 89% rename from lgsm/functions/comms_email.sh rename to lgsm/functions/alert_email.sh index 30601eb4f..4d84a65a7 100644 --- a/lgsm/functions/comms_email.sh +++ b/lgsm/functions/alert_email.sh @@ -4,17 +4,17 @@ # Website: https://gameservermanagers.com lgsm_version="140516" -# Description: Sends email notification if monitor picks up a failure. +# Description: Sends email alert if monitor picks up a failure. -local modulename="Email" +local modulename="Alert" fn_details_email(){ # - # Failure reason: Testing bb2-server email notification + # Failure reason: Testing bb2-server email alert # Action Taken: Sent test email...hello is this thing on? - echo -e "${commsbody}" >> "${emaillog}" + echo -e "${alertbody}" >> "${emaillog}" } @@ -168,7 +168,7 @@ fn_details_gameserver(){ } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${emaillog}" } -fn_comms_email_template_logs(){ +fn_alert_email_template_logs(){ { echo -e "" echo -e "${servicename} Logs" @@ -214,7 +214,7 @@ fn_comms_email_template_logs(){ } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${emaillog}" } -fn_print_dots "Sending notification to ${email}" +fn_print_dots "Sending alert to ${email}" info_distro.sh info_config.sh info_glibc.sh @@ -229,13 +229,13 @@ fn_details_os fn_details_performance fn_details_disk fn_details_gameserver -fn_comms_email_template_logs -mail -s "${commssubject}" "${email}" < "${emaillog}" +fn_alert_email_template_logs +mail -s "${alertsubject}" "${email}" < "${emaillog}" exitcode=$? if [ "${exitcode}" == "0" ]; then - fn_print_ok_nl "Sending notification to ${email}" - fn_scriptlog "Success! Sending notification to ${email}" + fn_print_ok_nl "Sending alert to ${email}" + fn_scriptlog "Success! Sending alert to ${email}" else - fn_print_fail_nl "Sending notification to ${email}" - fn_scriptlog "Failure! Sending notification to ${email}" + fn_print_fail_nl "Sending alert to ${email}" + fn_scriptlog "Failure! Sending alert to ${email}" fi \ No newline at end of file diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh new file mode 100644 index 000000000..f47ad7e30 --- /dev/null +++ b/lgsm/functions/alert_pushbullet.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# LGSM alert_pushbullet.sh function +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +lgsm_version="140516" + +# Description: alerts using pushbullet. + +local modulename="Alert" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +curl -u """${pushbullettoken}"":" -d type="note" -d body="${alertbody}" -d title="${alertsubject}" 'https://api.pushbullet.com/v2/pushes' >/dev/null 2>&1 +fn_print_ok_nl "Sent Pushbullet alert" +fn_scriptlog "Sent Pushbullet alert" diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 8f9de49f8..49498d2ff 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -38,8 +38,8 @@ fn_deps_detector(){ } fn_deps_email(){ - # Adds postfix to required dependencies if email notification is enabled - if [ "${emailnotification}" == "on" ]; then + # Adds postfix to required dependencies if email alert is enabled + if [ "${emailalert}" == "on" ]; then if [ -f /usr/bin/mailx ]; then if [ -d /etc/exim4 ]; then array_deps_required+=( exim4 ) diff --git a/lgsm/functions/command_comms_check.sh b/lgsm/functions/command_comms_check.sh deleted file mode 100644 index 1d401d948..000000000 --- a/lgsm/functions/command_comms_check.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -# LGSM command_email_test.sh function -# Author: Daniel Gibbs -# Website: https://gameservermanagers.com -lgsm_version="140516" - -# Description: Sends a test email notification. - -local modulename="Comms" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -check.sh -info_config.sh -if [ "${emailnotification}" = "on" ]||[ "${pushbulletnotification}" = "on" ]; then - fn_scriptlog "Sending Comms Check" - commssubject="LGSM - Comms Check - ${servername}" - commsbody="LGSM testing comms, how you read?" - comms.sh -else - fn_print_fail_nl "Notifications not enabled" - fn_scriptlog "Notifications not enabled" -fi \ No newline at end of file diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 6ae55f7e1..9fe4ac6bf 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -169,7 +169,7 @@ fn_details_script(){ # Service name: ql-server # qlserver version: 150316 # User: lgsm - # Email notification: off + # Email alert: off # Update on start: off # Location: /home/lgsm/qlserver # Config file: /home/lgsm/qlserver/serverfiles/baseq3/ql-server.cfg @@ -205,8 +205,8 @@ fn_details_script(){ fi fi - # Email notification - echo -e "\e[34mEmail notification:\t\e[0m${emailnotification}" + # Email alert + echo -e "\e[34mEmail alert:\t\e[0m${emailalert}" # Update on start echo -e "\e[34mUpdate on start:\t\e[0m${updateonstart}" diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index cb7c51d25..b86a6047d 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -37,12 +37,12 @@ fn_monitor_msg_checking(){ sleep 1 } -fn_monitor_email_notification(){ +fn_monitor_email_alert(){ # Email will be sent if enabled - if [ "${emailnotification}" = "on" ]; then - commssubject="LGSM - Restarted - ${servername}" - commsbody="${servicename} process not running" - comms.sh + if [ "${emailalert}" = "on" ]; then + alertsubject="LGSM - Restarted - ${servername}" + alertbody="${servicename} process not running" + alert.sh fi } @@ -57,7 +57,7 @@ fn_monitor_teamspeak3(){ fn_print_fail_eol_nl fn_scriptlog "Checking session: ${ts3error}: FAIL" failurereason="${ts3error}" - fn_monitor_email_notification + fn_monitor_email_alert fi fn_scriptlog "Monitor is starting ${servername}" sleep 1 @@ -83,7 +83,7 @@ fn_monitor_tmux(){ fn_print_fail "Checking session: " fn_print_fail_eol_nl fn_scriptlog "Checking session: FAIL" - fn_monitor_email_notification + fn_monitor_email_alert fn_scriptlog "Monitor is starting ${servername}" sleep 1 command_start.sh diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh new file mode 100644 index 000000000..81f8be423 --- /dev/null +++ b/lgsm/functions/command_test_alert.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# LGSM command_email_test.sh function +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +lgsm_version="140516" + +# Description: Sends a test email alert. + +local modulename="Alert" +function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +check.sh +info_config.sh +if [ "${emailalert}" = "on" ]||[ "${pushbulletalert}" = "on" ]; then + fn_scriptlog "Sending alert Check" + alertsubject="LGSM - alert Check - ${servername}" + alertbody="LGSM testing alert, how you read?" + alert.sh +else + fn_print_fail_nl "alerts not enabled" + fn_scriptlog "alerts not enabled" +fi \ No newline at end of file diff --git a/lgsm/functions/comms.sh b/lgsm/functions/comms.sh deleted file mode 100644 index 1d5a9a091..000000000 --- a/lgsm/functions/comms.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# LGSM comms.sh function -# Author: Daniel Gibbs -# Website: https://gameservermanagers.com -lgsm_version="140516" - -# Description: Overall function for managing notifications. - -if [ "${emailnotification}" == "on" ]||[ -n "${email}" ]; then - comms_email.sh -fi - -if [ "${pushbulletnotification}" == "on" ]||[ -n "${pushbullettoken}" ]; then - comms_pushbullet.sh -fi \ No newline at end of file diff --git a/lgsm/functions/comms_pushbullet.sh b/lgsm/functions/comms_pushbullet.sh deleted file mode 100644 index def5717e9..000000000 --- a/lgsm/functions/comms_pushbullet.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -# LGSM comms_pushbullet.sh function -# Author: Daniel Gibbs -# Website: https://gameservermanagers.com -lgsm_version="140516" - -# Description: Notifications using pushbullet. - -local modulename="Comms" -function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -curl -u """${pushbullettoken}"":" -d type="note" -d body="${commsbody}" -d title="${commssubject}" 'https://api.pushbullet.com/v2/pushes' >/dev/null 2>&1 -fn_print_ok_nl "Sent Pushbullet notification" -fn_scriptlog "Sent Pushbullet notification" diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index e46fe897f..c7d4451bc 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -111,7 +111,7 @@ functionfile="${FUNCNAME}" fn_fetch_function } -command_comms_check.sh(){ +command_test_alert.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } @@ -332,19 +332,19 @@ fn_fetch_function } -# Comms +# Alert -comms.sh(){ +alert.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } -comms_email.sh(){ +alert_email.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } -comms_pushbullet.sh(){ +alert_pushbullet.sh(){ functionfile="${FUNCNAME}" fn_fetch_function } diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index f4bb7e9a6..c38df7e99 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -25,8 +25,8 @@ case "$getopt" in command_validate.sh;; m|monitor) command_monitor.sh;; - et|comms-check) - command_comms_check.sh;; + ct|test-alert) + command_test_alert.sh;; dt|details) command_details.sh;; b|backup) @@ -58,7 +58,7 @@ case "$getopt" in echo -e "\e[34mupdate-functions\t\e[0muf |Removes all functions so latest can be downloaded." echo -e "\e[34mvalidate\t\e[0mv |Validate server files with SteamCMD." echo -e "\e[34mmonitor\t\e[0mm |Checks that the server is running." - echo -e "\e[34mcomms-check\t\e[0met |Sends test notification." + echo -e "\e[34mtest-alert\t\e[0mta |Sends test alert." echo -e "\e[34mdetails\t\e[0mdt |Displays useful infomation about the server." echo -e "\e[34mbackup\t\e[0mb |Create archive of the server." echo -e "\e[34mconsole\t\e[0mc |Console allows you to access the live view of a server." @@ -84,8 +84,8 @@ case "$getopt" in command_update_functions.sh;; m|monitor) command_monitor.sh;; - et|comms-check) - command_comms_check.sh;; + et|test-alert) + command_test_alert.sh;; dt|details) command_details.sh;; b|backup) @@ -113,7 +113,7 @@ case "$getopt" in echo -e "\e[34mupdate\t\e[0mu |Checks and applies updates from SteamCMD." echo -e "\e[34mupdate-functions\t\e[0muf |Removes all functions so latest can be downloaded." echo -e "\e[34mmonitor\t\e[0mm |Checks that the server is running." - echo -e "\e[34mcomms-check\t\e[0met |Sends test notification." + echo -e "\e[34mtest-alert\t\e[0mta |Sends test alert." echo -e "\e[34mdetails\t\e[0mdt |Displays useful infomation about the server." echo -e "\e[34mchange-password\t\e[0mpw |Changes TS3 serveradmin password." echo -e "\e[34mbackup\t\e[0mb |Create archive of the server." @@ -136,8 +136,8 @@ case "$getopt" in command_update_functions.sh;; m|monitor) command_monitor.sh;; - et|comms-check) - command_comms_check.sh;; + et|test-alert) + command_test_alert.sh;; b|backup) command_backup.sh;; dev|dev-debug) @@ -160,7 +160,7 @@ case "$getopt" in echo -e "\e[34mrestart\t\e[0mr |Restart the server." echo -e "\e[34mupdate-functions\t\e[0muf |Removes all functions so latest can be downloaded." echo -e "\e[34mmonitor\t\e[0mm |Checks that the server is running." - echo -e "\e[34mcomms-check\t\e[0met |Sends test notification." + echo -e "\e[34mtest-alert\t\e[0mta |Sends test alert." echo -e "\e[34mbackup\t\e[0mb |Create archive of the server." echo -e "\e[34mconsole\t\e[0mc |Console allows you to access the live view of a server." echo -e "\e[34mdebug\t\e[0md |See the output of the server directly to your terminal." @@ -188,8 +188,8 @@ case "$getopt" in command_validate.sh;; m|monitor) command_monitor.sh;; - et|comms-check) - command_comms_check.sh;; + et|test-alert) + command_test_alert.sh;; dt|details) command_details.sh;; b|backup) @@ -223,7 +223,7 @@ case "$getopt" in echo -e "\e[34mupdate-functions\t\e[0muf |Removes all functions so latest can be downloaded." echo -e "\e[34mvalidate\t\e[0mv |Validate server files with SteamCMD." echo -e "\e[34mmonitor\t\e[0mm |Checks that the server is running." - echo -e "\e[34mcomms-check\t\e[0met |Sends test notification." + echo -e "\e[34mtest-alert\t\e[0mta |Sends test alert." echo -e "\e[34mdetails\t\e[0mdt |Displays useful infomation about the server." echo -e "\e[34mbackup\t\e[0mb |Create archive of the server." echo -e "\e[34mconsole\t\e[0mc |Console allows you to access the live view of a server." @@ -248,8 +248,8 @@ case "$getopt" in command_update_functions.sh;; m|monitor) command_monitor.sh;; - et|comms-check) - command_comms_check.sh;; + et|test-alert) + command_test_alert.sh;; dt|details) command_details.sh;; b|backup) @@ -280,7 +280,7 @@ case "$getopt" in echo -e "\e[34mrestart\t\e[0mr |Restart the server." echo -e "\e[34mupdate-functions\t\e[0muf |Removes all functions so latest can be downloaded." echo -e "\e[34mmonitor\t\e[0mm |Checks that the server is running." - echo -e "\e[34mcomms-check\t\e[0met |Sends test notification." + echo -e "\e[34mtest-alert\t\e[0mta |Sends test alert." echo -e "\e[34mdetails\t\e[0mdt |Displays useful infomation about the server." echo -e "\e[34mbackup\t\e[0mb |Create archive of the server." echo -e "\e[34mconsole\t\e[0mc |Console allows you to access the live view of a server." @@ -313,8 +313,8 @@ case "$getopt" in command_validate.sh;; m|monitor) command_monitor.sh;; - et|comms-check) - command_comms_check.sh;; + et|test-alert) + command_test_alert.sh;; dt|details) command_details.sh;; b|backup) @@ -348,7 +348,7 @@ case "$getopt" in echo -e "\e[34mupdate-functions\t\e[0muf |Removes all functions so latest can be downloaded." echo -e "\e[34mvalidate\t\e[0mv |Validate server files with SteamCMD." echo -e "\e[34mmonitor\t\e[0mm |Checks that the server is running." - echo -e "\e[34mcomms-check\t\e[0met |Sends test notification." + echo -e "\e[34mtest-alert\t\e[0mta |Sends test alert." echo -e "\e[34mdetails\t\e[0mdt |Displays useful infomation about the server." echo -e "\e[34mbackup\t\e[0mb |Create archive of the server." echo -e "\e[34mconsole\t\e[0mc |Console allows you to access the live view of a server." @@ -374,8 +374,8 @@ case "$getopt" in command_update_functions.sh;; m|monitor) command_monitor.sh;; - et|comms-check) - command_comms_check.sh;; + et|test-alert) + command_test_alert.sh;; dt|details) command_details.sh;; b|backup) @@ -408,7 +408,7 @@ case "$getopt" in echo -e "\e[34mrestart\t\e[0mr |Restart the server." echo -e "\e[34mupdate-functions\t\e[0muf |Removes all functions so latest can be downloaded." echo -e "\e[34mmonitor\t\e[0mm |Checks that the server is running." - echo -e "\e[34mcomms-check\t\e[0met |Sends test notification." + echo -e "\e[34mtest-alert\t\e[0mta |Sends test alert." echo -e "\e[34mdetails\t\e[0mdt |Displays useful infomation about the server." echo -e "\e[34mbackup\t\e[0mb |Create archive of the server." echo -e "\e[34mconsole\t\e[0mc |Console allows you to access the live view of a server." diff --git a/lgsm/functions/monitor_gsquery.sh b/lgsm/functions/monitor_gsquery.sh index aae83f782..20c7dc3ce 100644 --- a/lgsm/functions/monitor_gsquery.sh +++ b/lgsm/functions/monitor_gsquery.sh @@ -68,12 +68,12 @@ if [ "${gsquery}" == "yes" ]; then fn_scriptlog "Querying port: ${ip}:${port} : ${queryattempt} : FAIL" sleep 1 - # Send notification if enabled - if [ "${emailnotification}" == "on" ]; then + # Send alert if enabled + if [ "${emailalert}" == "on" ]; then subject="${servicename} Monitor - Starting ${servername}" failurereason="Failed to query ${servicename}: ${gsquerycmd}" actiontaken="restarted ${servicename}" - comms.sh + alert.sh fi fn_restart break diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index d578b22f4..eac77ae7c 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -7,10 +7,10 @@ version="271215" #### Variables #### -# Notification Email +# Alert Email # (on|off) -emailnotification="on" -email="me@danielgibbs.co.uk" +emailalert="off" +email="" # Steam login steamuser="anonymous" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 382a9f9be..e9604c7d9 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -7,10 +7,10 @@ version="071115" #### Variables #### -# Notification Email +# Alert Email # (on|off) -emailnotification="on" -email="me@danielgibbs.co.uk" +emailalert="off" +email="" # Start Variables updateonstart="off" From fdd4a72b896a1145b540c8ad6821da67f0a4d002 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 18 May 2016 20:14:37 +0100 Subject: [PATCH 426/434] Backward compatibility --- lgsm/functions/alert.sh | 2 +- lgsm/functions/alert_email.sh | 10 +++++----- lgsm/functions/command_test_alert.sh | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index e904933c8..c871394a2 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -6,7 +6,7 @@ lgsm_version="140516" # Description: Overall function for managing alerts. -if [ "${emailalert}" == "on" ]||[ -n "${email}" ]; then +if [ "${emailnotification}" == "on" ]||[ "${emailalert}" == "on" ]&&[ -n "${email}" ]; then alert_email.sh fi diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index 4d84a65a7..8c3d99be9 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -39,7 +39,7 @@ fn_details_os(){ echo -e "Hostname: $HOSTNAME" echo -e "tmux: ${tmuxv}" echo -e "GLIBC: ${glibcversion}" - } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${emaillog}" + } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${emaillog}" > /dev/null 2>&1 } fn_details_performance(){ @@ -63,7 +63,7 @@ fn_details_performance(){ echo -e "Mem: total used free" echo -e "Physical: ${physmemtotal} ${physmemused} ${physmemfree}" echo -e "Swap: ${swaptotal} ${swapused} ${swapfree}" - } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${emaillog}" + } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${emaillog}" > /dev/null 2>&1 } fn_details_disk(){ @@ -88,7 +88,7 @@ fn_details_disk(){ if [ -d "${backupdir}" ]; then echo -e "Backups: ${backupdirdu}" fi - } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${emaillog}" + } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${emaillog}" > /dev/null 2>&1 } @@ -165,7 +165,7 @@ fn_details_gameserver(){ else echo -e "Status: ONLINE" fi - } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${emaillog}" + } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${emaillog}" > /dev/null 2>&1 } fn_alert_email_template_logs(){ @@ -211,7 +211,7 @@ fn_alert_email_template_logs(){ echo "" fi - } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${emaillog}" + } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${emaillog}" > /dev/null 2>&1 } fn_print_dots "Sending alert to ${email}" diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 81f8be423..4b5e69de4 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -13,7 +13,7 @@ check.sh info_config.sh if [ "${emailalert}" = "on" ]||[ "${pushbulletalert}" = "on" ]; then fn_scriptlog "Sending alert Check" - alertsubject="LGSM - alert Check - ${servername}" + alertsubject="LGSM - Alert Check - ${servername}" alertbody="LGSM testing alert, how you read?" alert.sh else From e1aa07f3e0b94bb49c049efa77ce4b806559ebdb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 18 May 2016 20:15:34 +0100 Subject: [PATCH 427/434] corrected ta --- lgsm/functions/core_getopt.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index c38df7e99..f3434663e 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -25,7 +25,7 @@ case "$getopt" in command_validate.sh;; m|monitor) command_monitor.sh;; - ct|test-alert) + ta|test-alert) command_test_alert.sh;; dt|details) command_details.sh;; From 745dcc0a42c651789fa7038e9b225b755dd2f46d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 18 May 2016 20:39:28 +0100 Subject: [PATCH 428/434] alert messages being migrated to alert.sh --- lgsm/functions/alert.sh | 48 +++++++++++++++++++++++++++- lgsm/functions/command_monitor.sh | 3 +- lgsm/functions/command_test_alert.sh | 4 +-- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index c871394a2..6bfc8bda3 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -6,10 +6,56 @@ lgsm_version="140516" # Description: Overall function for managing alerts. +fn_alert_test(){ + fn_scriptlog "Sending test alert" + alertsubject="LGSM - Alert Check - ${servername}" + alertbody="LGSM test alert, how you read?" +} + +fn_alert_restart(){ + fn_scriptlog "Sending restart alert: ${executable} process not running" + alertsubject="LGSM - Restarted - ${servername}" + alertbody="${servicename} ${executable} process not running" +} + +fn_alert_queryrestart(){ + fn_scriptlog "Sending restart alert: ${gsquerycmd}" + alertsubject="LGSM - Restarted - ${servername}" + alertbody="Failed to Query: ${gsquerycmd}" +} + +fn_alert_update(){ + fn_scriptlog "Sending update alert" + alertsubject="LGSM - Updated - ${servername}" + alertbody="Recieved update: 154789" +} + +if [ "${alert}" == "restart" ]; then + fn_alert_restart +if [ "${alert}" == "queryrestart" ]; then + fn_alert_queryrestart +elif [ "${alert}" == "update" ]; then + fn_alert_update +elif [ "${alert}" == "test" ]; then + fn_alert_test +fi + if [ "${emailnotification}" == "on" ]||[ "${emailalert}" == "on" ]&&[ -n "${email}" ]; then alert_email.sh +elif [ "${emailnotification}" != "on" ]||[ "${emailalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then + fn_print_fail_nl "Alerts not enabled" + fn_scriptlog "Email alerts not enabled" +elif [ -z "${email}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then + fn_print_fail_nl "Email no set" + fn_scriptlog "Email no set" fi -if [ "${pushbulletalert}" == "on" ]||[ -n "${pushbullettoken}" ]; then +if [ "${pushbulletalert}" == "on" ]&&[ -n "${pushbullettoken}" ]; then alert_pushbullet.sh +elif [ "${pushbulletalert}" != "on" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then + fn_print_fail_nl "Pushbullet alerts not enabled" + fn_scriptlog "Pushbullet alerts not enabled" +elif [ -z "${pushbullettoken}" ]&&[ "${function_selfname}" == "command_test_alert.sh" ]; then + fn_print_fail_nl "Pushbullet token not set" + fn_scriptlog "Pushbullet token not set" fi \ No newline at end of file diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index b86a6047d..917b544b7 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -57,7 +57,8 @@ fn_monitor_teamspeak3(){ fn_print_fail_eol_nl fn_scriptlog "Checking session: ${ts3error}: FAIL" failurereason="${ts3error}" - fn_monitor_email_alert + alert="restart" + alert.sh fi fn_scriptlog "Monitor is starting ${servername}" sleep 1 diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 4b5e69de4..253ab07d3 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -12,9 +12,7 @@ function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh info_config.sh if [ "${emailalert}" = "on" ]||[ "${pushbulletalert}" = "on" ]; then - fn_scriptlog "Sending alert Check" - alertsubject="LGSM - Alert Check - ${servername}" - alertbody="LGSM testing alert, how you read?" + alert="test" alert.sh else fn_print_fail_nl "alerts not enabled" From 45c2ef38162af62d4a65917c98aef109b761e5c0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 18 May 2016 20:45:22 +0100 Subject: [PATCH 429/434] bug --- lgsm/functions/alert.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 6bfc8bda3..397ffdf7f 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -32,7 +32,7 @@ fn_alert_update(){ if [ "${alert}" == "restart" ]; then fn_alert_restart -if [ "${alert}" == "queryrestart" ]; then +elif [ "${alert}" == "queryrestart" ]; then fn_alert_queryrestart elif [ "${alert}" == "update" ]; then fn_alert_update From 21fd930b3db1731d7c161156c88d8e361c40872a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 18 May 2016 20:45:51 +0100 Subject: [PATCH 430/434] updates --- lgsm/functions/command_monitor.sh | 3 ++- lgsm/functions/command_test_alert.sh | 4 +--- lgsm/functions/monitor_gsquery.sh | 5 ++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 917b544b7..64d11cf62 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -84,7 +84,8 @@ fn_monitor_tmux(){ fn_print_fail "Checking session: " fn_print_fail_eol_nl fn_scriptlog "Checking session: FAIL" - fn_monitor_email_alert + alert="restart" + alert.sh fn_scriptlog "Monitor is starting ${servername}" sleep 1 command_start.sh diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 253ab07d3..33cb25ea1 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -11,10 +11,8 @@ function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh info_config.sh -if [ "${emailalert}" = "on" ]||[ "${pushbulletalert}" = "on" ]; then - alert="test" +alert="test" alert.sh -else fn_print_fail_nl "alerts not enabled" fn_scriptlog "alerts not enabled" fi \ No newline at end of file diff --git a/lgsm/functions/monitor_gsquery.sh b/lgsm/functions/monitor_gsquery.sh index 20c7dc3ce..240b0ca0f 100644 --- a/lgsm/functions/monitor_gsquery.sh +++ b/lgsm/functions/monitor_gsquery.sh @@ -70,9 +70,8 @@ if [ "${gsquery}" == "yes" ]; then # Send alert if enabled if [ "${emailalert}" == "on" ]; then - subject="${servicename} Monitor - Starting ${servername}" - failurereason="Failed to query ${servicename}: ${gsquerycmd}" - actiontaken="restarted ${servicename}" + + alert="queryrestart" alert.sh fi fn_restart From 021df3d9ec408e95aa76c574f8fbca8a3d076759 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 21 May 2016 20:38:29 +0100 Subject: [PATCH 431/434] adding in error checking --- lgsm/functions/alert_pushbullet.sh | 15 ++++++++++++--- lgsm/functions/command_test_alert.sh | 5 +---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh index f47ad7e30..c4a7b9924 100644 --- a/lgsm/functions/alert_pushbullet.sh +++ b/lgsm/functions/alert_pushbullet.sh @@ -8,7 +8,16 @@ lgsm_version="140516" local modulename="Alert" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +fn_print_dots "Sending Pushbullet alert" +sleep 1 + +pushbulletsend=$(curl --silent -u """${pushbullettoken}"":" -d type="note" -d body="${alertbody}" -d title="${alertsubject}" 'https://api.pushbullet.com/v2/pushes'|grep -o invalid_access_token|uniq) + +if [ "${pushbulletsend}" == "invalid_access_token" ]; then + fn_print_fail_nl "Sending Pushbullet alert: invalid_access_token" + fn_scriptlog "Failure! Sending Pushbullet alert: invalid_access_token" +else + fn_print_ok_nl "Sending Pushbullet alert" + fn_scriptlog "Complete! Sent Pushbullet alert" +fi -curl -u """${pushbullettoken}"":" -d type="note" -d body="${alertbody}" -d title="${alertsubject}" 'https://api.pushbullet.com/v2/pushes' >/dev/null 2>&1 -fn_print_ok_nl "Sent Pushbullet alert" -fn_scriptlog "Sent Pushbullet alert" diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 33cb25ea1..3861a6e52 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -12,7 +12,4 @@ function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh info_config.sh alert="test" - alert.sh - fn_print_fail_nl "alerts not enabled" - fn_scriptlog "alerts not enabled" -fi \ No newline at end of file +alert.sh From eddc0a8018d46f9d9c6c1f00eba90aa293f686d5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 21 May 2016 20:38:47 +0100 Subject: [PATCH 432/434] space --- lgsm/functions/alert_pushbullet.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh index c4a7b9924..1e34732f3 100644 --- a/lgsm/functions/alert_pushbullet.sh +++ b/lgsm/functions/alert_pushbullet.sh @@ -19,5 +19,4 @@ if [ "${pushbulletsend}" == "invalid_access_token" ]; then else fn_print_ok_nl "Sending Pushbullet alert" fn_scriptlog "Complete! Sent Pushbullet alert" -fi - +fi \ No newline at end of file From f0872c9ea6fa3ea9575da62ce74d10f46ef217fc Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 21 May 2016 20:56:26 +0100 Subject: [PATCH 433/434] Update alert --- lgsm/functions/alert.sh | 8 ++++---- lgsm/functions/command_monitor.sh | 9 --------- lgsm/functions/monitor_gsquery.sh | 7 ++----- lgsm/functions/update_check.sh | 6 ++++++ 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 397ffdf7f..6de4741b3 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -18,7 +18,7 @@ fn_alert_restart(){ alertbody="${servicename} ${executable} process not running" } -fn_alert_queryrestart(){ +fn_alert_restart_query(){ fn_scriptlog "Sending restart alert: ${gsquerycmd}" alertsubject="LGSM - Restarted - ${servername}" alertbody="Failed to Query: ${gsquerycmd}" @@ -27,13 +27,13 @@ fn_alert_queryrestart(){ fn_alert_update(){ fn_scriptlog "Sending update alert" alertsubject="LGSM - Updated - ${servername}" - alertbody="Recieved update: 154789" + alertbody="${servicename} Recieved update" } if [ "${alert}" == "restart" ]; then fn_alert_restart -elif [ "${alert}" == "queryrestart" ]; then - fn_alert_queryrestart +elif [ "${alert}" == "restartquery" ]; then + fn_alert_restart_query elif [ "${alert}" == "update" ]; then fn_alert_update elif [ "${alert}" == "test" ]; then diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 64d11cf62..31297f644 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -37,15 +37,6 @@ fn_monitor_msg_checking(){ sleep 1 } -fn_monitor_email_alert(){ - # Email will be sent if enabled - if [ "${emailalert}" = "on" ]; then - alertsubject="LGSM - Restarted - ${servername}" - alertbody="${servicename} process not running" - alert.sh - fi -} - fn_monitor_teamspeak3(){ if [ "${status}" != "0" ]; then fn_print_ok "Checking session: " diff --git a/lgsm/functions/monitor_gsquery.sh b/lgsm/functions/monitor_gsquery.sh index 240b0ca0f..971881c0c 100644 --- a/lgsm/functions/monitor_gsquery.sh +++ b/lgsm/functions/monitor_gsquery.sh @@ -69,11 +69,8 @@ if [ "${gsquery}" == "yes" ]; then sleep 1 # Send alert if enabled - if [ "${emailalert}" == "on" ]; then - - alert="queryrestart" - alert.sh - fi + alert="restartquery" + alert.sh fn_restart break fi diff --git a/lgsm/functions/update_check.sh b/lgsm/functions/update_check.sh index d39d8d688..527c0bed0 100644 --- a/lgsm/functions/update_check.sh +++ b/lgsm/functions/update_check.sh @@ -98,6 +98,8 @@ fn_logupdaterequest(){ else update_dl.sh fi + alert="update" + alert.sh else fn_print_ok "Checking for update: Server logs: No update requested" sleep 1 @@ -175,6 +177,8 @@ fn_steamcmdcheck(){ else update_dl.sh fi + alert="update" + alert.sh else echo -e "\n" echo -e "No update available:" @@ -304,6 +308,8 @@ fn_teamspeak3_check(){ update_dl.sh command_start.sh fi + alert="update" + alert.sh else echo -e "\n" echo -e "No update available:" From bf03a08f0621ff58e9880f120369ed2a772dcb05 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 21 May 2016 22:50:56 +0100 Subject: [PATCH 434/434] Version 210516 --- 7DaysToDie/sdtdserver | 2 +- ARKSurvivalEvolved/arkserver | 2 +- Arma3/arma3server | 2 +- BlackMesa/bmdmserver | 2 +- BladeSymphony/bsserver | 2 +- BrainBread2/bb2server | 2 +- CodenameCURE/ccserver | 2 +- CounterStrike/csserver | 2 +- CounterStrikeConditionZero/csczserver | 2 +- CounterStrikeGlobalOffensive/csgoserver | 2 +- CounterStrikeSource/cssserver | 2 +- DayOfDefeat/dodserver | 2 +- DayOfDefeatSource/dodsserver | 2 +- DeathmatchClassic/dmcserver | 2 +- DoubleActionBoogaloo/dabserver | 2 +- FistfulOfFrags/fofserver | 2 +- GarrysMod/gmodserver | 2 +- GoldenEyeSource/gesserver | 2 +- HalfLife2Deathmatch/hl2dmserver | 2 +- HalfLifeDeathmatch/hldmserver | 2 +- HalfLifeDeathmatchSource/hldmsserver | 2 +- Hurtworld/hwserver | 2 +- Insurgency/insserver | 2 +- JustCause2/jc2server | 2 +- KillingFloor/kfserver | 2 +- Left4Dead/l4dserver | 2 +- Left4Dead2/l4d2server | 2 +- Mumble/mumbleserver | 2 +- NoMoreRoomInHell/nmrihserver | 2 +- OpposingForce/opforserver | 2 +- PiratesVikingandKnightsII/pvkiiserver | 2 +- ProjectZomboid/pzserver | 2 +- RedOrchestra/roserver | 2 +- Ricochet/ricochetserver | 2 +- Rust/rustserver | 2 +- SeriousSam3BFE/ss3sserver | 2 +- StarBound/sbserver | 2 +- SvenCoop/svencoopserver | 2 +- TeamFortress2/tf2server | 2 +- TeamFortressClassic/tfcserver | 2 +- TeamSpeak3/ts3server | 2 +- Teeworlds/twserver | 2 +- Terraria/terrariaserver | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament99/ut99server | 2 +- functions/command_update_functions.sh | 2 +- functions/core_functions.sh | 2 +- functions/core_getopt.sh | 2 +- functions/fn_functions | 2 +- functions/fn_getopt | 2 +- functions/fn_update_functions | 2 +- lgsm/functions/alert.sh | 2 +- lgsm/functions/alert_email.sh | 2 +- lgsm/functions/alert_pushbullet.sh | 2 +- lgsm/functions/check.sh | 2 +- lgsm/functions/check_config.sh | 2 +- lgsm/functions/check_deps.sh | 2 +- lgsm/functions/check_glibc.sh | 2 +- lgsm/functions/check_ip.sh | 2 +- lgsm/functions/check_logs.sh | 2 +- lgsm/functions/check_permissions.sh | 2 +- lgsm/functions/check_root.sh | 2 +- lgsm/functions/check_status.sh | 2 +- lgsm/functions/check_steamcmd.sh | 2 +- lgsm/functions/check_system_dir.sh | 2 +- lgsm/functions/check_tmux.sh | 2 +- lgsm/functions/command_backup.sh | 2 +- lgsm/functions/command_console.sh | 2 +- lgsm/functions/command_debug.sh | 2 +- lgsm/functions/command_details.sh | 2 +- lgsm/functions/command_dev_debug.sh | 2 +- lgsm/functions/command_dev_detect_deps.sh | 2 +- lgsm/functions/command_install.sh | 2 +- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/command_start.sh | 2 +- lgsm/functions/command_stop.sh | 2 +- lgsm/functions/command_test_alert.sh | 2 +- lgsm/functions/command_ts3_server_pass.sh | 2 +- lgsm/functions/command_update_functions.sh | 2 +- lgsm/functions/command_validate.sh | 2 +- lgsm/functions/compress_unreal2_maps.sh | 2 +- lgsm/functions/compress_ut99_maps.sh | 2 +- lgsm/functions/core_dl.sh | 2 +- lgsm/functions/core_functions.sh | 2 +- lgsm/functions/core_getopt.sh | 2 +- lgsm/functions/core_messages.sh | 2 +- lgsm/functions/fix.sh | 2 +- lgsm/functions/fix_arma3.sh | 2 +- lgsm/functions/fix_csgo.sh | 2 +- lgsm/functions/fix_dst.sh | 2 +- lgsm/functions/fix_glibc.sh | 2 +- lgsm/functions/fix_ins.sh | 2 +- lgsm/functions/fix_kf.sh | 2 +- lgsm/functions/fix_ro.sh | 2 +- lgsm/functions/fix_steamcmd.sh | 2 +- lgsm/functions/fix_ut2k4.sh | 2 +- lgsm/functions/fix_ut99.sh | 2 +- lgsm/functions/fn_functions | 2 +- lgsm/functions/fn_getopt | 2 +- lgsm/functions/fn_update_functions | 2 +- lgsm/functions/info_config.sh | 2 +- lgsm/functions/info_distro.sh | 2 +- lgsm/functions/info_glibc.sh | 2 +- lgsm/functions/info_parms.sh | 2 +- lgsm/functions/install_complete.sh | 2 +- lgsm/functions/install_config.sh | 2 +- lgsm/functions/install_gslt.sh | 2 +- lgsm/functions/install_gsquery.sh | 2 +- lgsm/functions/install_header.sh | 2 +- lgsm/functions/install_logs.sh | 2 +- lgsm/functions/install_retry.sh | 2 +- lgsm/functions/install_server_dir.sh | 2 +- lgsm/functions/install_server_files.sh | 2 +- lgsm/functions/install_steamcmd.sh | 2 +- lgsm/functions/install_ts3.sh | 2 +- lgsm/functions/install_ts3db.sh | 2 +- lgsm/functions/install_ut2k4_key.sh | 2 +- lgsm/functions/logs.sh | 2 +- lgsm/functions/monitor_gsquery.sh | 2 +- lgsm/functions/update_check.sh | 2 +- lgsm/functions/update_dl.sh | 2 +- 121 files changed, 121 insertions(+), 121 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index 82b8d91b4..8e04aea42 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 17e3e5d78..30f34b568 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/Arma3/arma3server b/Arma3/arma3server index a13da2112..cf720bb0e 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index 1a2041f85..48ae9673e 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index aecefd762..4dc07246f 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index ac24012fd..2aa450534 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 8fe4042fd..ab8ab009f 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/CounterStrike/csserver b/CounterStrike/csserver index 84b161835..04cc4aa6c 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index e2cfa1d5d..e0cbc3d21 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 74755e92b..f2662d5c6 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index 59f0bcc47..814e1cf71 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index 1a4ad7f93..6612fb477 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index a169281d0..d4d2d05f0 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index c4555e9eb..ecee9ab39 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 1277563ed..05f624dbe 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index 259464c7a..668f65810 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index 53d8b1628..ea4c85292 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index 90339be94..778c69a43 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### export MALLOC_CHECK_=0 diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index b7c08dd6a..b3cd29604 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index d60aa3693..ab75a9efe 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index 864549967..40dc54266 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index e46a9a94b..4c93d73e2 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/Insurgency/insserver b/Insurgency/insserver index 5edc7c55e..7f337536e 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/JustCause2/jc2server b/JustCause2/jc2server index c0222fccf..5db3b0a10 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index 9fbee8f44..5380e71d8 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index 67d4b1024..d70fce9f3 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index ef4710ab3..12a29437f 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index e64580c14..11a531f6a 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index 1f0a3ce7a..878bf985e 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index 1da4dc2ce..9be4d6573 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index 05956597e..85ac0c1ff 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index c8c3ae07a..9bf5284cd 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index a9e1f2afd..cccaa7aeb 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index b1173fd90..e59d5c777 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/Rust/rustserver b/Rust/rustserver index 119fb9115..23666b39c 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index 8905df1b2..cad500dc1 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/StarBound/sbserver b/StarBound/sbserver index 9fa5e639a..3837c6213 100644 --- a/StarBound/sbserver +++ b/StarBound/sbserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/SvenCoop/svencoopserver b/SvenCoop/svencoopserver index 6daa9d75d..f58719276 100644 --- a/SvenCoop/svencoopserver +++ b/SvenCoop/svencoopserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index 4f8d0d6df..3a13f4a37 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index 0093b7721..fa05c0a1d 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index b60066782..7cf1c88ca 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/Teeworlds/twserver b/Teeworlds/twserver index aa45d1376..1cfc86b53 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index 32151b0ab..51bc754b0 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -10,7 +10,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index 9a3362bf7..fcdabc3c6 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index 4c8e50635..00055db8e 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -9,7 +9,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="150316" +version="210516" #### Variables #### diff --git a/functions/command_update_functions.sh b/functions/command_update_functions.sh index 65867df9a..ba7674448 100644 --- a/functions/command_update_functions.sh +++ b/functions/command_update_functions.sh @@ -2,7 +2,7 @@ # LGSM command_update_functions.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="270216" +lgsm_version="210516" # Description: Deletes the functions dir to allow re-downloading of functions from GitHub. diff --git a/functions/core_functions.sh b/functions/core_functions.sh index 49eb5e017..821cd4563 100644 --- a/functions/core_functions.sh +++ b/functions/core_functions.sh @@ -2,7 +2,7 @@ # LGSM core_functions.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="180316" +lgsm_version="210516" # Description: REDIRECT FUNCTION to new location for core_functions.sh diff --git a/functions/core_getopt.sh b/functions/core_getopt.sh index 641dce7f1..f6032fae6 100644 --- a/functions/core_getopt.sh +++ b/functions/core_getopt.sh @@ -2,7 +2,7 @@ # LGSM core_getopt.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="180316" +lgsm_version="210516" # Description: REDIRECT FUNCTION to new location for core_getopt.sh diff --git a/functions/fn_functions b/functions/fn_functions index a3ddfc373..2ae012923 100644 --- a/functions/fn_functions +++ b/functions/fn_functions @@ -2,7 +2,7 @@ # LGSM fn_functions function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="180316" +lgsm_version="210516" # Description: REDIRECT FUNCTION to new core_functions.sh diff --git a/functions/fn_getopt b/functions/fn_getopt index d84434ce9..0b0e3713d 100644 --- a/functions/fn_getopt +++ b/functions/fn_getopt @@ -2,7 +2,7 @@ # LGSM fn_getopt.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="180316" +lgsm_version="210516" # Description: REDIRECT FUNCTION to new core_getopt.sh diff --git a/functions/fn_update_functions b/functions/fn_update_functions index 53f0988de..5513d5d20 100644 --- a/functions/fn_update_functions +++ b/functions/fn_update_functions @@ -2,7 +2,7 @@ # LGSM fn_update_functions function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" # Description: REDIRECT FUNCTION to new command_update_functions.sh diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 6de4741b3..60833fd62 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -2,7 +2,7 @@ # LGSM alert.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="140516" +lgsm_version="210516" # Description: Overall function for managing alerts. diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index 8c3d99be9..c3f56b5ef 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -2,7 +2,7 @@ # LGSM email.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="140516" +lgsm_version="210516" # Description: Sends email alert if monitor picks up a failure. diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh index 1e34732f3..1ab99093b 100644 --- a/lgsm/functions/alert_pushbullet.sh +++ b/lgsm/functions/alert_pushbullet.sh @@ -2,7 +2,7 @@ # LGSM alert_pushbullet.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="140516" +lgsm_version="210516" # Description: alerts using pushbullet. diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 3c4855dc0..316e6b3f3 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -2,7 +2,7 @@ # LGSM fn_check function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="060516" +lgsm_version="210516" # Description: Overall function for managing checks. # Runs checks that will either halt on or fix an issue. diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh index 8cc41a8a9..eebb14714 100644 --- a/lgsm/functions/check_config.sh +++ b/lgsm/functions/check_config.sh @@ -2,7 +2,7 @@ # LGSM check_config.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="060116" +lgsm_version="210516" # Description: If server config missing warn user. diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 49498d2ff..df4b49b4d 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -2,7 +2,7 @@ # LGSM check_deps.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="050516" +lgsm_version="210516" # Description: Checks that the requires dependencies are installed for LGSM. diff --git a/lgsm/functions/check_glibc.sh b/lgsm/functions/check_glibc.sh index dff253596..65462d035 100644 --- a/lgsm/functions/check_glibc.sh +++ b/lgsm/functions/check_glibc.sh @@ -2,7 +2,7 @@ # LGSM check_glibc.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="020116" +lgsm_version="210516" # Description: Checks if server has correct glibc or has a fix available. diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index da6b35665..514949522 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -2,7 +2,7 @@ # LGSM check_ip.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" # Description: Automatically identifies the server interface IP. # If multiple interfaces are detected the user will need to manualy set using ip="0.0.0.0". diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh index 4d604cdd2..0ab22fb3b 100644 --- a/lgsm/functions/check_logs.sh +++ b/lgsm/functions/check_logs.sh @@ -2,7 +2,7 @@ # LGSM check_logs.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" # Description: Checks that log files exist on server start diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index c9225c863..38aaf3da4 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -3,7 +3,7 @@ # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com -lgsm_version="150316" +lgsm_version="210516" # Description: Checks script, files and folders ownership and permissions. diff --git a/lgsm/functions/check_root.sh b/lgsm/functions/check_root.sh index e464088f3..914069d5c 100644 --- a/lgsm/functions/check_root.sh +++ b/lgsm/functions/check_root.sh @@ -2,7 +2,7 @@ # LGSM check_root.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="060316" +lgsm_version="210516" if [ $(whoami) = "root" ]; then fn_print_fail_nl "Do NOT run this script as root!" diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh index 3d8a590fa..7eb35ba7b 100644 --- a/lgsm/functions/check_status.sh +++ b/lgsm/functions/check_status.sh @@ -2,7 +2,7 @@ # LGSM check_status function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="060516" +lgsm_version="210516" # Description: Checks the proccess status of the server. Either online or offline. diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 28592b9b0..f8ee2439f 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -2,7 +2,7 @@ # LGSM check_steamcmd.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="160316" +lgsm_version="210516" # Description: Checks SteamCMD is installed and correct. diff --git a/lgsm/functions/check_system_dir.sh b/lgsm/functions/check_system_dir.sh index 22933fa79..18a0d8019 100644 --- a/lgsm/functions/check_system_dir.sh +++ b/lgsm/functions/check_system_dir.sh @@ -2,7 +2,7 @@ # LGSM check_system_dir.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" if [ ! -d "${systemdir}" ]; then fn_print_fail_nl "Cannot access ${systemdir}: No such directory" diff --git a/lgsm/functions/check_tmux.sh b/lgsm/functions/check_tmux.sh index d61604a6f..a2287e375 100644 --- a/lgsm/functions/check_tmux.sh +++ b/lgsm/functions/check_tmux.sh @@ -2,7 +2,7 @@ # LGSM check_tmux.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" # Checks if tmux is installed as too many users do not RTFM or know how to use Google. diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 748c986b2..f5c517129 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -2,7 +2,7 @@ # LGSM command_backup.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="060516" +lgsm_version="210516" # Description: Creates a .tar.gz file in the backup directory. diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index ef9f54962..966b886b5 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -2,7 +2,7 @@ # LGSM command_console.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="060516" +lgsm_version="210516" # Description: Gives access to the server tmux console. diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 348d74bb0..4710050f2 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -2,7 +2,7 @@ # LGSM command_debug.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" # Description: Runs the server without tmux. Runs direct from the terminal. diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 9fe4ac6bf..f15380490 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -2,7 +2,7 @@ # LGSM command_details.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="080516" +lgsm_version="210516" # Description: Displays server infomation. diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh index 2c945bbea..625201df0 100644 --- a/lgsm/functions/command_dev_debug.sh +++ b/lgsm/functions/command_dev_debug.sh @@ -2,7 +2,7 @@ # LGSM dev_debug.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="281215" +lgsm_version="210516" # Description: Dev only: enables debuging log to be saved to dev-debug.log. diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index fd2d54bc1..88c28d5fd 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -2,7 +2,7 @@ # LGSM fn_dep_detect function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" # Description: Detects dependencies the server binary requires. diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index e63742133..fb8e7ac1f 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -2,7 +2,7 @@ # LGSM fn_install function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="260216" +lgsm_version="210516" # Description: Overall function for the installer. diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 31297f644..58b6c90d1 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -2,7 +2,7 @@ # LGSM command_monitor.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="060516" +lgsm_version="210516" # Description: Monitors server by checking for running proccesses # then passes to monitor_gsquery.sh. diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 26dec454e..cd34e3f62 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -2,7 +2,7 @@ # LGSM command_start.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="060516" +lgsm_version="210516" # Description: Starts the server. diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 1f941eb36..232bf9f1e 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -2,7 +2,7 @@ # LGSM command_stop.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" # Description: Stops the server. diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 3861a6e52..339cfeec8 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -2,7 +2,7 @@ # LGSM command_email_test.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="140516" +lgsm_version="210516" # Description: Sends a test email alert. diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index 38280eeb2..982bc53ba 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -3,7 +3,7 @@ # Author: Daniel Gibbs # Contributor : UltimateByte # Website: https://gameservermanagers.com -lgsm_version="080116" +lgsm_version="210516" # Description: Changes TS3 serveradmin password diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 65867df9a..ba7674448 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -2,7 +2,7 @@ # LGSM command_update_functions.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="270216" +lgsm_version="210516" # Description: Deletes the functions dir to allow re-downloading of functions from GitHub. diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 10e3bfa5d..9c03e0e56 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -2,7 +2,7 @@ # LGSM command_validate.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="060516" +lgsm_version="210516" # Description: Runs a server validation. diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index 40b4aa3ca..1952dbcad 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -2,7 +2,7 @@ # LGSM compress_unreal2_maps.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh index d04b32853..bb5f78630 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -2,7 +2,7 @@ # LGSM compress_ut99_maps.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="301215" +lgsm_version="210516" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index c135c0701..a75d2de96 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -2,7 +2,7 @@ # LGSM core_dl.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="050216" +lgsm_version="210516" # Description: Deals with all downloads for LGSM. diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index c7d4451bc..562bed461 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -2,7 +2,7 @@ # LGSM core_functions.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="140516" +lgsm_version="210516" # Description: Defines all functions to allow download and execution of functions using fn_fetch_function. # This function is called first before any other function. Without this file other functions would not load. diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index f3434663e..d3282cb44 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -2,7 +2,7 @@ # LGSM core_getopt.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="070116" +lgsm_version="210516" # Description: getopt arguments. diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 8d567fa02..523d1c4b2 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -2,7 +2,7 @@ # LGSM fn_messages function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="380216" +lgsm_version="210516" # Description: Defines on-screen messages such as [ OK ] and how script logs look. diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index bfedeb1b4..b862e8278 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -2,7 +2,7 @@ # LGSM fix.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="010316" +lgsm_version="210516" # Description: Overall function for managing fixes. # Runs functions that will fix an issue. diff --git a/lgsm/functions/fix_arma3.sh b/lgsm/functions/fix_arma3.sh index 6c1eb5cd9..49f4e830e 100644 --- a/lgsm/functions/fix_arma3.sh +++ b/lgsm/functions/fix_arma3.sh @@ -2,7 +2,7 @@ # LGSM fix_arma3.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="301215" +lgsm_version="210516" # Fixes: server not always creating steam_appid.txt file. if [ ! -d "${rootdir}/.local/share/Arma\ 3" ]; then diff --git a/lgsm/functions/fix_csgo.sh b/lgsm/functions/fix_csgo.sh index 39f14218d..0f8a4b8fb 100644 --- a/lgsm/functions/fix_csgo.sh +++ b/lgsm/functions/fix_csgo.sh @@ -2,7 +2,7 @@ # LGSM fix_csgo.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="010316" +lgsm_version="210516" # Description: Resolves various issues with csgo. diff --git a/lgsm/functions/fix_dst.sh b/lgsm/functions/fix_dst.sh index c1179ea38..1106b58e0 100644 --- a/lgsm/functions/fix_dst.sh +++ b/lgsm/functions/fix_dst.sh @@ -2,7 +2,7 @@ # LGSM fix_dst.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="010316" +lgsm_version="210516" # Description: Resolves various issues with Dont Starve together. diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index 7fcbccc1f..e5ae37ff6 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -2,7 +2,7 @@ # LGSM fix_glibc.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="220416" +lgsm_version="210516" # Description: Downloads required glibc files and applys teh glibc fix if required diff --git a/lgsm/functions/fix_ins.sh b/lgsm/functions/fix_ins.sh index abdfd0876..5264b5c4e 100644 --- a/lgsm/functions/fix_ins.sh +++ b/lgsm/functions/fix_ins.sh @@ -2,7 +2,7 @@ # LGSM fix_ins.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="291215" +lgsm_version="210516" # Description: Resolves various issues with Insurgency. diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh index 19aad68b2..7b5547851 100644 --- a/lgsm/functions/fix_kf.sh +++ b/lgsm/functions/fix_kf.sh @@ -2,7 +2,7 @@ # LGSM fix_kf.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" echo "Applying WebAdmin ROOst.css fix." echo "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13" diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh index 31044227e..7e3115f8b 100644 --- a/lgsm/functions/fix_ro.sh +++ b/lgsm/functions/fix_ro.sh @@ -2,7 +2,7 @@ # LGSM fix_ro.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="010316" +lgsm_version="210516" # Description: Resolves various issues with red orchestra. diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index a43aa1115..736c648f0 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -2,7 +2,7 @@ # LGSM fix_steamcmd.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="010316" +lgsm_version="210516" # Description: fixes various issues related to steamCMD. diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index e633c0188..a0f07ac26 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -2,7 +2,7 @@ # LGSM fix_ut2k4.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="010316" +lgsm_version="210516" # Description: Resolves various issues with unreal tournament 2004. diff --git a/lgsm/functions/fix_ut99.sh b/lgsm/functions/fix_ut99.sh index 45d6ec777..58644c03d 100644 --- a/lgsm/functions/fix_ut99.sh +++ b/lgsm/functions/fix_ut99.sh @@ -2,7 +2,7 @@ # LGSM fix_ut99.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" echo "${servercfgfullpath}" echo "enabling UdpServerUplink." { diff --git a/lgsm/functions/fn_functions b/lgsm/functions/fn_functions index f9c62aa46..8e1e6c941 100644 --- a/lgsm/functions/fn_functions +++ b/lgsm/functions/fn_functions @@ -2,7 +2,7 @@ # LGSM core_functions.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" # Description: Redirect to new core_functions.sh diff --git a/lgsm/functions/fn_getopt b/lgsm/functions/fn_getopt index 5cc3c9e20..a9c766583 100644 --- a/lgsm/functions/fn_getopt +++ b/lgsm/functions/fn_getopt @@ -2,7 +2,7 @@ # LGSM core_getopt.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" # Description: Redirect to new core_getopt.sh diff --git a/lgsm/functions/fn_update_functions b/lgsm/functions/fn_update_functions index 3f130d3a0..79bfe3cb6 100644 --- a/lgsm/functions/fn_update_functions +++ b/lgsm/functions/fn_update_functions @@ -2,7 +2,7 @@ # LGSM fn_update_functions.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="230116" +lgsm_version="210516" # Description: LEGACY FUNCTION Deletes the functions dir to allow re-downloading of functions from GitHub. diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 3144a9aa9..257f06f16 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -2,7 +2,7 @@ # LGSM info_config.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="010316" +lgsm_version="210516" # Description: Gets specific details from config files. diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index f2f914726..81b434f1b 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -2,7 +2,7 @@ # LGSM info_distro.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" # Description: Variables providing useful info on the Operating System such as disk and performace info. # Used for command_details.sh, command_debug.sh and email.sh. diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 982acf005..f70086d61 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -2,7 +2,7 @@ # LGSM info_glibc.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="130516" +lgsm_version="210516" # Description: stores details on servers Glibc requirements. diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 99c51369c..df70e14f7 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -2,7 +2,7 @@ # LGSM info_parms.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="010316" +lgsm_version="210516" # Description: Gets specific details server parameters. diff --git a/lgsm/functions/install_complete.sh b/lgsm/functions/install_complete.sh index c04296b64..f4b885a15 100644 --- a/lgsm/functions/install_complete.sh +++ b/lgsm/functions/install_complete.sh @@ -2,7 +2,7 @@ # LGSM install_complete.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" local modulename="Install" diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index e1e7ee5d7..e6a298e05 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -2,7 +2,7 @@ # LGSM install_config.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="220216" +lgsm_version="210516" local modulename="Install" diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh index f09ee7020..96cb21459 100644 --- a/lgsm/functions/install_gslt.sh +++ b/lgsm/functions/install_gslt.sh @@ -2,7 +2,7 @@ # LGSM install_gslt.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="270216" +lgsm_version="210516" # Description: Configures GSLT. diff --git a/lgsm/functions/install_gsquery.sh b/lgsm/functions/install_gsquery.sh index c615ead74..2edb28e94 100644 --- a/lgsm/functions/install_gsquery.sh +++ b/lgsm/functions/install_gsquery.sh @@ -2,7 +2,7 @@ # LGSM install_gsquery.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="190216" +lgsm_version="210516" fn_dlgsquery(){ cd "${rootdir}" diff --git a/lgsm/functions/install_header.sh b/lgsm/functions/install_header.sh index 13cb7a96e..96c56a209 100644 --- a/lgsm/functions/install_header.sh +++ b/lgsm/functions/install_header.sh @@ -2,7 +2,7 @@ # LGSM install_header.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="190216" +lgsm_version="210516" local modulename="Install" diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 1cfe9ac7c..5ce29635e 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -2,7 +2,7 @@ # LGSM install_logs.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="270216" +lgsm_version="210516" local modulename="Install" diff --git a/lgsm/functions/install_retry.sh b/lgsm/functions/install_retry.sh index fcd837d98..80df1a6ba 100644 --- a/lgsm/functions/install_retry.sh +++ b/lgsm/functions/install_retry.sh @@ -2,7 +2,7 @@ # LGSM install_retry.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" local modulename="Install" diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index c6a6523f2..ccf629fc8 100644 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -2,7 +2,7 @@ # LGSM install_serverdir.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" local modulename="Install" diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index cf31e355c..ba25c57a6 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -2,7 +2,7 @@ # LGSM install_server_files.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="270216" +lgsm_version="210516" local modulename="Install" diff --git a/lgsm/functions/install_steamcmd.sh b/lgsm/functions/install_steamcmd.sh index 34bd0bc2d..7c733d289 100644 --- a/lgsm/functions/install_steamcmd.sh +++ b/lgsm/functions/install_steamcmd.sh @@ -2,7 +2,7 @@ # LGSM install_steamcmd.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" # Description: Downloads SteamCMD on install. diff --git a/lgsm/functions/install_ts3.sh b/lgsm/functions/install_ts3.sh index 4313e7792..44d2b4231 100644 --- a/lgsm/functions/install_ts3.sh +++ b/lgsm/functions/install_ts3.sh @@ -2,7 +2,7 @@ # LGSM install_ts3.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" local modulename="Install" diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index acfa247d3..07b2dd539 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -3,7 +3,7 @@ # Author: Daniel Gibbs # Contributor: PhilPhonic # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" local modulename="Install" diff --git a/lgsm/functions/install_ut2k4_key.sh b/lgsm/functions/install_ut2k4_key.sh index a0f32dd2a..af71c2993 100644 --- a/lgsm/functions/install_ut2k4_key.sh +++ b/lgsm/functions/install_ut2k4_key.sh @@ -2,7 +2,7 @@ # LGSM install_ut2k4_key.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="271215" +lgsm_version="210516" local modulename="Install" diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index c4694ff01..4ce5774f1 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -3,7 +3,7 @@ # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com -lgsm_version="230216" +lgsm_version="210516" # Description: Acts as a log rotater, removing old logs. diff --git a/lgsm/functions/monitor_gsquery.sh b/lgsm/functions/monitor_gsquery.sh index 971881c0c..747b6dd45 100644 --- a/lgsm/functions/monitor_gsquery.sh +++ b/lgsm/functions/monitor_gsquery.sh @@ -2,7 +2,7 @@ # LGSM monitor_gsquery.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="270216" +lgsm_version="210516" # Description: uses gsquery.py to query the server port. # Detects if the server has frozen with the proccess still running. diff --git a/lgsm/functions/update_check.sh b/lgsm/functions/update_check.sh index 527c0bed0..6647524d1 100644 --- a/lgsm/functions/update_check.sh +++ b/lgsm/functions/update_check.sh @@ -2,7 +2,7 @@ # LGSM update_check.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="060516" +lgsm_version="210516" # Description: Checks if a server update is available. diff --git a/lgsm/functions/update_dl.sh b/lgsm/functions/update_dl.sh index 1ccd3e8d5..ee1cc361c 100644 --- a/lgsm/functions/update_dl.sh +++ b/lgsm/functions/update_dl.sh @@ -2,7 +2,7 @@ # LGSM update_dl.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -lgsm_version="020216" +lgsm_version="210516" # Description: Runs a server update.

F%+@5J{AYb(w8_BO^8e7QDOrs8Z{3Ym$wPf4_Q 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�E^{Bp_*KNr!av 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