From e40365d45a21ecbf305037c8245b92d3d6dfb80f Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Wed, 12 Oct 2016 02:43:20 -0400 Subject: [PATCH 0001/1895] adding San Andreas Multiplayer --- SanAndreasMultiplayer/sampserver | 143 +++++++++++++++++++++++++ lgsm/functions/command_install.sh | 2 +- lgsm/functions/install_server_files.sh | 2 + 3 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 SanAndreasMultiplayer/sampserver diff --git a/SanAndreasMultiplayer/sampserver b/SanAndreasMultiplayer/sampserver new file mode 100644 index 000000000..99753333f --- /dev/null +++ b/SanAndreasMultiplayer/sampserver @@ -0,0 +1,143 @@ +#!/bin/bash +# San Andreas Multiplayer +# Server Management Script +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="210516" + +#### Variables #### + +# Notification Alerts +# (on|off) + +# Email +emailalert="off" +email="email@example.com" +#emailfrom="email@example.com" + +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert="off" +pushbullettoken="accesstoken" + +# Start Variables +ip="0.0.0.0" + +fn_parms(){ +parms=" " +} + +#### 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="samp" + +# Server Details +servicename="samp-server" +gamename="San Andreas Multiplayer" +engine="RenderWare" + +# Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" +systemdir="${filesdir}" +executabledir="${systemdir}" +executable="samp03svr" +servercfg="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" +backupdir="${rootdir}/backups" + +# Logging +logdays="7" +gamelogdir="${filesdir}/Logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +consolelogging="on" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" + +##### Script ##### +# Do not edit + +# 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 -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_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_fetch_core_dl +} + +core_dl.sh +core_functions.sh + +getopt=$1 +core_getopt.sh diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index bcfe36fd2..75c44bc67 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -18,7 +18,7 @@ check_deps.sh if [ "${gamename}" == "Unreal Tournament 2004" ]; then install_server_files.sh install_ut2k4_key.sh -elif [ "${gamename}" == "Unreal Tournament 3" ]||[ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Enemy Territory" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament" ]||[ "${gamename}" == "TeamSpeak 3" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Mumble" ]; then +elif [ "${gamename}" == "Unreal Tournament 3" ]||[ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Enemy Territory" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament" ]||[ "${gamename}" == "TeamSpeak 3" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Mumble" ]|[ "${gamename}" == "San Andreas Multiplayer" ]; then installer=1 install_server_files.sh elif [ -n "${appid}" ]; then diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index e1b140bb8..4961deb85 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -23,6 +23,8 @@ fn_install_server_files(){ fileurl="http://files.gameservermanagers.com/UnrealTournament/UnrealTournament-Server-XAN-3045522-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3045522-Linux.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="553fed5645a9fc623e92563049bf79f6" elif [ "${gamename}" == "GoldenEye: Source" ]; then fileurl="http://files.gameservermanagers.com/GoldenEyeSource/GoldenEye_Source_v5.0.1_full_server_linux.tar.bz2"; filedir="${tmpdir}"; filename="GoldenEye_Source_v5.0.1_server_full_Linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="ea227a150300abe346e757380325f84c" + elif [ "${gamename}" == "San Andresas Multiplayer" ]; then + fileurl="http://files.sa-mp.com/samp037svr_R2-1.tar.gz"; filedir="${tmpdir}"; filename="samp037svr_R2-1.tar.gz"; executecmd="noexecute" run="norun"; force="noforce"; md5="93705e165550c97484678236749198a4" fi fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" fn_dl_extract "${filedir}" "${filename}" "${filesdir}" From c547ecfe1e57a3e20a870763c1182c98196ecb4e Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Wed, 12 Oct 2016 02:46:37 -0400 Subject: [PATCH 0002/1895] name fix --- lgsm/functions/install_server_files.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 4961deb85..1df3af632 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -23,7 +23,7 @@ fn_install_server_files(){ fileurl="http://files.gameservermanagers.com/UnrealTournament/UnrealTournament-Server-XAN-3045522-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3045522-Linux.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="553fed5645a9fc623e92563049bf79f6" elif [ "${gamename}" == "GoldenEye: Source" ]; then fileurl="http://files.gameservermanagers.com/GoldenEyeSource/GoldenEye_Source_v5.0.1_full_server_linux.tar.bz2"; filedir="${tmpdir}"; filename="GoldenEye_Source_v5.0.1_server_full_Linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="ea227a150300abe346e757380325f84c" - elif [ "${gamename}" == "San Andresas Multiplayer" ]; then + elif [ "${gamename}" == "San Andreas Multiplayer" ]; then fileurl="http://files.sa-mp.com/samp037svr_R2-1.tar.gz"; filedir="${tmpdir}"; filename="samp037svr_R2-1.tar.gz"; executecmd="noexecute" run="norun"; force="noforce"; md5="93705e165550c97484678236749198a4" fi fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" From 25d8e2f1187f33d602f094a0811623bdd0d43485 Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Wed, 12 Oct 2016 03:13:08 -0400 Subject: [PATCH 0003/1895] adding config --- SanAndreasMultiplayer/cfg/lgsm-default.cfg | 17 +++++++++++++++++ lgsm/functions/install_config.sh | 6 ++++++ 2 files changed, 23 insertions(+) create mode 100644 SanAndreasMultiplayer/cfg/lgsm-default.cfg diff --git a/SanAndreasMultiplayer/cfg/lgsm-default.cfg b/SanAndreasMultiplayer/cfg/lgsm-default.cfg new file mode 100644 index 000000000..558aeecbb --- /dev/null +++ b/SanAndreasMultiplayer/cfg/lgsm-default.cfg @@ -0,0 +1,17 @@ +echo Executing Server Config... +lanmode 0 +rcon_password +maxplayers 50 +port 7777 +hostname +gamemode0 grandlarc 1 +filterscripts base gl_actions gl_property gl_realtime +announce 0 +query 1 +weburl www.sa-mp.com +maxnpc 0 +onfoot_rate 40 +incar_rate 40 +weapon_rate 40 +stream_distance 300.0 +stream_rate 1000 diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 5a856f8e6..e829d153b 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -401,6 +401,12 @@ elif [ "${gamename}" == "Rust" ]; then wget -N /dev/null ${githuburl}/Rust/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq sleep 1 fn_defaultconfig +elif [ "${gamename}" == "San Andreas Multiplayer" ]; then + echo -e "downloading server.cfg...\c" + wget -N /dev/null ${githuburl}/SanAndreasMultiplayer/cfg/lgsm-default.cfg 2>&1 | grep -F HTTP | cut -c45- | uniq + sleep 1 + fn_defaultconfig + fn_userinputconfig 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 From 8d060955aa03e6d220b99394e76f51e6cd21ce78 Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Wed, 12 Oct 2016 03:39:26 -0400 Subject: [PATCH 0004/1895] config fix --- SanAndreasMultiplayer/cfg/lgsm-default.cfg | 4 ++-- SanAndreasMultiplayer/sampserver | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) mode change 100644 => 100755 SanAndreasMultiplayer/sampserver diff --git a/SanAndreasMultiplayer/cfg/lgsm-default.cfg b/SanAndreasMultiplayer/cfg/lgsm-default.cfg index 558aeecbb..1a1922b60 100644 --- a/SanAndreasMultiplayer/cfg/lgsm-default.cfg +++ b/SanAndreasMultiplayer/cfg/lgsm-default.cfg @@ -1,9 +1,9 @@ echo Executing Server Config... lanmode 0 -rcon_password +rcon_password "" maxplayers 50 port 7777 -hostname +hostname "" gamemode0 grandlarc 1 filterscripts base gl_actions gl_property gl_realtime announce 0 diff --git a/SanAndreasMultiplayer/sampserver b/SanAndreasMultiplayer/sampserver old mode 100644 new mode 100755 index 99753333f..219b9e173 --- a/SanAndreasMultiplayer/sampserver +++ b/SanAndreasMultiplayer/sampserver @@ -28,7 +28,9 @@ pushbullettoken="accesstoken" # Start Variables ip="0.0.0.0" +port="7777" +#no params - check server.cfg fn_parms(){ parms=" " } @@ -57,11 +59,12 @@ libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" -executabledir="${systemdir}" -executable="samp03svr" +executabledir="${systemdir}/samp03" +executable="./samp03svr" servercfg="server.cfg" -servercfgdir="${systemdir}" +servercfgdir="${systemdir}/samp03" servercfgfullpath="${servercfgdir}/${servercfg}" +servercfgdefault="${servercfgdir}/lgsm-default.cfg" backupdir="${rootdir}/backups" # Logging From 2762ce780ae4aa6d237ec360a6e8c610f4cfa5ad Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Wed, 12 Oct 2016 03:43:13 -0400 Subject: [PATCH 0005/1895] ready for merge --- SanAndreasMultiplayer/sampserver | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SanAndreasMultiplayer/sampserver b/SanAndreasMultiplayer/sampserver index 219b9e173..6fa9a9165 100755 --- a/SanAndreasMultiplayer/sampserver +++ b/SanAndreasMultiplayer/sampserver @@ -30,7 +30,6 @@ pushbullettoken="accesstoken" ip="0.0.0.0" port="7777" -#no params - check server.cfg fn_parms(){ parms=" " } @@ -42,7 +41,7 @@ parms=" " # from a different repo and/or branch. githubuser="dgibbs64" githubrepo="linuxgsm" -githubbranch="samp" +githubbranch="master" # Server Details servicename="samp-server" From 2c67ce74a9d6ce213520844df4880ba35ec44baa Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Mon, 17 Oct 2016 15:59:41 +0300 Subject: [PATCH 0006/1895] Initial Factorio support --- Factorio/fctrserver | 144 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 Factorio/fctrserver diff --git a/Factorio/fctrserver b/Factorio/fctrserver new file mode 100644 index 000000000..916a94f16 --- /dev/null +++ b/Factorio/fctrserver @@ -0,0 +1,144 @@ +#!/bin/bash +# Factorio +# Server Management Script +# Author: Daniel Gibbs +# Contributor: Kristian Polso +# Website: https://gameservermanagers.com +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="171016" + +#### Variables #### + +# Notification Alerts +# (on|off) + +# Email +emailalert="off" +email="email@example.com" +#emailfrom="email@example.com" + +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert="off" +pushbullettoken="accesstoken" + +# Start Variables +updateonstart="off" + +fn_parms(){ +parms="-fg -ini ${servercfgfullpath}" +} + +#### Advanced Variables #### + +# Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="Krisseck" +githubrepo="LinuxGSM" +githubbranch="master" + +# Server Details +gamename="Factorio" +servicename="fctr-server" + +# Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./bin/x64/factorio" +servercfg="data/server-settings.json" +servercfgdefault="data/server-settings.example.json" +servercfgdir="${filesdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" +backupdir="${rootdir}/backups" + +# Logging +logdays="7" +gamelogdir="${rootdir}/log" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +consolelogging="on" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" + +##### Script ##### +# Do not edit + +# 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 -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_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_fetch_core_dl +} + +core_dl.sh +core_functions.sh + +getopt=$1 +core_getopt.sh From 3b6336c388aabb0f0ee49d00218620d8fa377a6f Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Mon, 17 Oct 2016 16:22:45 +0300 Subject: [PATCH 0007/1895] Factorio update scripts --- lgsm/functions/command_update.sh | 2 + lgsm/functions/install_server_files.sh | 2 + lgsm/functions/update_factorio.sh | 165 +++++++++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 lgsm/functions/update_factorio.sh diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index bffa4e6ea..13fff9e90 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -19,6 +19,8 @@ elif [ "${engine}" == "lwjgl2" ]; then update_minecraft.sh elif [ "${gamename}" == "Mumble" ]; then update_mumble.sh +elif [ "${gamename}" == "Factorio" ]; then + update_factorio.sh else update_steamcmd.sh fi diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index e2778ae64..aab2a716a 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -112,6 +112,8 @@ elif [ "${gamename}" == "Minecraft" ]; then install_minecraft_eula.sh elif [ "${gamename}" == "Mumble" ]; then update_mumble.sh +elif [ "${gamename}" == "Factorio" ]; then + update_factorio.sh elif [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]; then fn_install_server_files fi diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh new file mode 100644 index 000000000..3bea70bee --- /dev/null +++ b/lgsm/functions/update_factorio.sh @@ -0,0 +1,165 @@ +#!/bin/bash +# LGSM update_factorio.sh function +# Author: Daniel Gibbs +# Contributor: Kristian Polso +# Website: https://gameservermanagers.com +# Description: Handles updating of Factorio servers. + +local commandname="UPDATE" +local commandaction="Update" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +fn_update_factorio_dl(){ + fn_fetch_file "https://www.factorio.com/get-download/${availablebuild}/headless/${factorioarch}" "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" + fn_dl_extract "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" "${tmpdir}" + echo -e "copying to ${filesdir}...\c" + fn_script_log "Copying to ${filesdir}" + cp -R "${tmpdir}/factorio_headless_${factorioarch}-${availablebuild}/"* "${filesdir}" + local exitcode=$? + if [ ${exitcode} -eq 0 ]; then + fn_print_ok_eol_nl + else + fn_print_fail_eol_nl + fi +} + +fn_update_factorio_currentbuild(){ + # Gets current build info + # Checks if current build info is available. If it fails, then a server restart will be forced to generate logs. + if [ ! -f "${consolelogdir}/${servicename}-console.log" ]; then + fn_print_error "Checking for update: Factorio.com" + sleep 1 + fn_print_error_nl "Checking for update: Factorio.com: No logs with server version found" + fn_script_log_error "Checking for update: Factorio.com: No logs with server version found" + sleep 1 + fn_print_info_nl "Checking for update: Factorio.com: Forcing server restart" + fn_script_log_info "Checking for update: Factorio.com: Forcing server restart" + sleep 1 + exitbypass=1 + command_stop.sh + exitbypass=1 + command_start.sh + sleep 1 + # Check again and exit on failure. + if [ ! -f "${consolelogdir}/${servicename}-console.log" ]; then + fn_print_fail_nl "Checking for update: Factorio.com: Still No logs with server version found" + fn_script_log_fatal "Checking for update: Factorio.com: Still No logs with server version found" + core_exit.sh + fi + fi + + # Get current build from logs + currentbuild=$(cat "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null | sort | grep -oP '(?<=Factorio ).*?(?= /)') + if [ -z "${currentbuild}" ]; then + fn_print_error_nl "Checking for update: Factorio.com: Current build version not found" + fn_script_log_error "Checking for update: Factorio.com: Current build version not found" + sleep 1 + fn_print_info_nl "Checking for update: Factorio.com: Forcing server restart" + fn_script_log_info "Checking for update: Factorio.com: Forcing server restart" + exitbypass=1 + command_stop.sh + exitbypass=1 + command_start.sh + currentbuild=$(cat "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null | sort | grep -oP '(?<=Factorio ).*?(?= /)') + if [ -z "${currentbuild}" ]; then + fn_print_fail_nl "Checking for update: Factorio.com: Current build version still not found" + fn_script_log_fatal "Checking for update: Factorio.com: Current build version still not found" + core_exit.sh + fi + fi +} + +fn_update_factorio_arch(){ + # Factorio is linux64 only for now + factorioarch="linux64" +} + +fn_update_factorio_availablebuild(){ + # Gets latest build info. + availablebuild=$(curl -s https://www.factorio.com/download-headless/stable | grep 'headless/linux64' | head -n 1 | grep -oP '(?<=get-download/).*?(?=/)') + sleep 1 + + # Checks if availablebuild variable has been set + if [ -z "${availablebuild}" ]; then + fn_print_fail "Checking for update: Factorio.com" + sleep 1 + fn_print_fail "Checking for update: Factorio.com: Not returning version info" + fn_script_log_fatal "Failure! Checking for update: Factorio.com: Not returning version info" + core_exit.sh + else + fn_print_ok "Checking for update: Factorio.com" + fn_script_log_pass "Checking for update: Factorio.com" + sleep 1 + fi +} + +fn_update_factorio_compare(){ + # 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: ${red}${currentbuild} ${factorioarch}${default}" + echo -e " Available build: ${green}${availablebuild} ${factorioarch}${default}" + 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_script_log "Update available" + fn_script_log "Current build: ${currentbuild}" + fn_script_log "Available build: ${availablebuild}" + fn_script_log "${currentbuild} > ${availablebuild}" + + unset updateonstart + + check_status.sh + if [ "${status}" == "0" ]; then + fn_update_factorio_dl + exitbypass=1 + command_start.sh + exitbypass=1 + command_stop.sh + else + exitbypass=1 + command_stop.sh + fn_update_factorio_dl + exitbypass=1 + command_start.sh + fi + alert="update" + alert.sh + else + echo -e "\n" + echo -e "No update available:" + echo -e " Current version: ${green}${currentbuild}${default}" + echo -e " Available version: ${green}${availablebuild}${default}" + echo -e "" + fn_print_ok_nl "No update available" + fn_script_log_info "Current build: ${currentbuild}" + fn_script_log_info "Available build: ${availablebuild}" + fi +} + + +fn_update_factorio_arch +if [ "${installer}" == "1" ]; then + fn_update_factorio_availablebuild + fn_update_factorio_dl +else + # Checks for server update from github.com + fn_print_dots "Checking for update: github.com" + fn_script_log_info "Checking for update: github.com" + sleep 1 + fn_update_factorio_currentbuild + fn_update_factorio_availablebuild + fn_update_factorio_compare +fi From 88f35767e2c2bfcf7ea639ec9e73b491edee0d23 Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Mon, 17 Oct 2016 16:30:06 +0300 Subject: [PATCH 0008/1895] More integration --- lgsm/functions/command_install.sh | 2 +- lgsm/functions/install_config.sh | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 5b741a126..030b5a9dc 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -18,7 +18,7 @@ check_deps.sh if [ "${gamename}" == "Unreal Tournament 2004" ]; then install_server_files.sh install_ut2k4_key.sh -elif [ "${gamename}" == "Unreal Tournament 3" ]||[ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament" ]||[ "${gamename}" == "TeamSpeak 3" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Mumble" ]; then +elif [ "${gamename}" == "Unreal Tournament 3" ]||[ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament" ]||[ "${gamename}" == "TeamSpeak 3" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Mumble" ]||[ "${gamename}" == "Factorio" ]; then installer=1 install_server_files.sh elif [ -n "${appid}" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 997bc4cc2..97d12c972 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -169,6 +169,8 @@ elif [ "${gamename}" == "Double Action: Boogaloo" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Factorio" ]; then + : elif [ "${gamename}" == "Fistful of Frags" ]; then gamedirname="FistfulofFrags" array_configs+=( server.cfg ) From 4047ea2ca34899c5efe4a7c4607042fad7599075 Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Mon, 17 Oct 2016 16:37:44 +0300 Subject: [PATCH 0009/1895] Missing stuff --- lgsm/functions/core_functions.sh | 5 +++++ lgsm/functions/install_server_files.sh | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 987ffcde9..10af8cfcf 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -444,6 +444,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +update_factorio.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + update_steamcmd.sh(){ functionfile="${FUNCNAME}" fn_fetch_function diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index aab2a716a..30216d7d0 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -113,7 +113,7 @@ elif [ "${gamename}" == "Minecraft" ]; then elif [ "${gamename}" == "Mumble" ]; then update_mumble.sh elif [ "${gamename}" == "Factorio" ]; then - update_factorio.sh + update_factorio.sh elif [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]; then fn_install_server_files fi From d8c1b2d6012992dc179183bfdb530c07a737db76 Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Mon, 17 Oct 2016 17:00:14 +0300 Subject: [PATCH 0010/1895] Extract dir --- lgsm/functions/update_factorio.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 3bea70bee..6f449bde3 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -11,7 +11,7 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_update_factorio_dl(){ fn_fetch_file "https://www.factorio.com/get-download/${availablebuild}/headless/${factorioarch}" "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" - fn_dl_extract "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" "${tmpdir}" + fn_dl_extract "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" "${tmpdir}/factorio_headless_${factorioarch}-${availablebuild}" echo -e "copying to ${filesdir}...\c" fn_script_log "Copying to ${filesdir}" cp -R "${tmpdir}/factorio_headless_${factorioarch}-${availablebuild}/"* "${filesdir}" From b0b21d888b95a79c6b69c500bc35831c5eae1575 Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Mon, 17 Oct 2016 17:05:24 +0300 Subject: [PATCH 0011/1895] Correct folder --- lgsm/functions/update_factorio.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 6f449bde3..00c75012d 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -10,7 +10,7 @@ local commandaction="Update" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_update_factorio_dl(){ - fn_fetch_file "https://www.factorio.com/get-download/${availablebuild}/headless/${factorioarch}" "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" + fn_fetch_file "https://www.factorio.com/get-download/${availablebuild}/headless/${factorioarch}" "${tmpdir}/factorio_headless_${factorioarch}-${availablebuild}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" fn_dl_extract "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" "${tmpdir}/factorio_headless_${factorioarch}-${availablebuild}" echo -e "copying to ${filesdir}...\c" fn_script_log "Copying to ${filesdir}" From 3e33596836432fbef53d2f048003bf69a3e80363 Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Mon, 17 Oct 2016 17:09:44 +0300 Subject: [PATCH 0012/1895] Tmp dir stuff --- lgsm/functions/update_factorio.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 00c75012d..dba918df7 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -10,11 +10,11 @@ local commandaction="Update" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_update_factorio_dl(){ - fn_fetch_file "https://www.factorio.com/get-download/${availablebuild}/headless/${factorioarch}" "${tmpdir}/factorio_headless_${factorioarch}-${availablebuild}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" - fn_dl_extract "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" "${tmpdir}/factorio_headless_${factorioarch}-${availablebuild}" + fn_fetch_file "https://www.factorio.com/get-download/${availablebuild}/headless/${factorioarch}" "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" + fn_dl_extract "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" "${tmpdir}" echo -e "copying to ${filesdir}...\c" fn_script_log "Copying to ${filesdir}" - cp -R "${tmpdir}/factorio_headless_${factorioarch}-${availablebuild}/"* "${filesdir}" + cp -R "${tmpdir}/"* "${filesdir}" local exitcode=$? if [ ${exitcode} -eq 0 ]; then fn_print_ok_eol_nl From 7874986b94b484230466dc977960e2130a24152e Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Mon, 17 Oct 2016 17:14:50 +0300 Subject: [PATCH 0013/1895] Tmpdir factorio --- lgsm/functions/update_factorio.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index dba918df7..bc8339bde 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -14,7 +14,7 @@ fn_update_factorio_dl(){ fn_dl_extract "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" "${tmpdir}" echo -e "copying to ${filesdir}...\c" fn_script_log "Copying to ${filesdir}" - cp -R "${tmpdir}/"* "${filesdir}" + cp -R "${tmpdir}/factorio/"* "${filesdir}" local exitcode=$? if [ ${exitcode} -eq 0 ]; then fn_print_ok_eol_nl From 3c136bc1a265d01a1d8a61869fb467fca4e00ddb Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Wed, 19 Oct 2016 12:44:41 +0300 Subject: [PATCH 0014/1895] Create initial save --- lgsm/functions/install_factorio_save.sh | 14 ++++++++++++++ lgsm/functions/install_server_files.sh | 1 + 2 files changed, 15 insertions(+) create mode 100644 lgsm/functions/install_factorio_save.sh diff --git a/lgsm/functions/install_factorio_save.sh b/lgsm/functions/install_factorio_save.sh new file mode 100644 index 000000000..ed71fe166 --- /dev/null +++ b/lgsm/functions/install_factorio_save.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# LGSM install_factorio_save.sh function +# Author: Kristian Polso +# Website: https://gameservermanagers.com +# Description: Creates the initial save file for Factorio + +local commandname="INSTALL" +local commandaction="Install" + +echo "" +echo "Creating initial Factorio savefile" +echo "=================================" +sleep 1 +${filesdir}/bin/x64/factorio --create-save ${filesdir}/save1 diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 30216d7d0..b4a6fa22d 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -114,6 +114,7 @@ elif [ "${gamename}" == "Mumble" ]; then update_mumble.sh elif [ "${gamename}" == "Factorio" ]; then update_factorio.sh + install_factorio_save.sh elif [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]; then fn_install_server_files fi From e13c816940a13ed2041345e08d4d552693501697 Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Wed, 19 Oct 2016 12:48:23 +0300 Subject: [PATCH 0015/1895] Fetch install_factorio_save --- 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 10af8cfcf..de66fb55f 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -479,6 +479,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +install_factorio_save.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + install_gsquery.sh(){ functionfile="${FUNCNAME}" fn_fetch_function From ab7f487a5525b9ed38f9fe378b7e18d2f282fb8f Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Wed, 19 Oct 2016 13:06:12 +0300 Subject: [PATCH 0016/1895] Factorio configs --- Factorio/cfg/lgsm-default.cfg | 23 +++++++++++++++++++++++ lgsm/functions/install_config.sh | 6 +++++- lgsm/functions/install_factorio_save.sh | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 Factorio/cfg/lgsm-default.cfg diff --git a/Factorio/cfg/lgsm-default.cfg b/Factorio/cfg/lgsm-default.cfg new file mode 100644 index 000000000..a433fe726 --- /dev/null +++ b/Factorio/cfg/lgsm-default.cfg @@ -0,0 +1,23 @@ + + "name": "", + "description": "Description of the game that will appear in the listing", + "tags": ["game", "tags"], + "max_players": "0", + + "_comment_visibility": ["public: Game will be published on the official Factorio matching server", + "lan: Game will be broadcast on LAN", + "hidden: Game will not be published anywhere"], + "visibility": "public", + + "_comment_credentials": "Your factorio.com login credentials. Required for games with visibility public", + "username": "", + "password": "", + + "_comment_token": "Authentication token. May be used instead of 'password' above.", + "token": "", + + "game_password": "", + + "_comment_verify_user_identity": "When set to true, the server will only allow clients that have a valid Factorio.com account", + "verify_user_identity": true +} diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 97d12c972..0489a915d 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -170,7 +170,11 @@ elif [ "${gamename}" == "Double Action: Boogaloo" ]; then fn_default_config_remote fn_set_config_vars elif [ "${gamename}" == "Factorio" ]; then - : + gamedirname="Factorio" + array_configs+=( server-settings.json ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Fistful of Frags" ]; then gamedirname="FistfulofFrags" array_configs+=( server.cfg ) diff --git a/lgsm/functions/install_factorio_save.sh b/lgsm/functions/install_factorio_save.sh index ed71fe166..36ef169cb 100644 --- a/lgsm/functions/install_factorio_save.sh +++ b/lgsm/functions/install_factorio_save.sh @@ -11,4 +11,4 @@ echo "" echo "Creating initial Factorio savefile" echo "=================================" sleep 1 -${filesdir}/bin/x64/factorio --create-save ${filesdir}/save1 +${filesdir}/bin/x64/factorio --create ${filesdir}/save1 From 253f5db2ccac98f86729c8e4628c150584102ae4 Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Wed, 19 Oct 2016 13:22:56 +0300 Subject: [PATCH 0017/1895] Configs --- Factorio/cfg/lgsm-default.cfg | 23 ----------------------- lgsm/functions/install_config.sh | 6 +----- lgsm/functions/install_factorio_save.sh | 1 + 3 files changed, 2 insertions(+), 28 deletions(-) delete mode 100644 Factorio/cfg/lgsm-default.cfg diff --git a/Factorio/cfg/lgsm-default.cfg b/Factorio/cfg/lgsm-default.cfg deleted file mode 100644 index a433fe726..000000000 --- a/Factorio/cfg/lgsm-default.cfg +++ /dev/null @@ -1,23 +0,0 @@ - - "name": "", - "description": "Description of the game that will appear in the listing", - "tags": ["game", "tags"], - "max_players": "0", - - "_comment_visibility": ["public: Game will be published on the official Factorio matching server", - "lan: Game will be broadcast on LAN", - "hidden: Game will not be published anywhere"], - "visibility": "public", - - "_comment_credentials": "Your factorio.com login credentials. Required for games with visibility public", - "username": "", - "password": "", - - "_comment_token": "Authentication token. May be used instead of 'password' above.", - "token": "", - - "game_password": "", - - "_comment_verify_user_identity": "When set to true, the server will only allow clients that have a valid Factorio.com account", - "verify_user_identity": true -} diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 0489a915d..97d12c972 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -170,11 +170,7 @@ elif [ "${gamename}" == "Double Action: Boogaloo" ]; then fn_default_config_remote fn_set_config_vars elif [ "${gamename}" == "Factorio" ]; then - gamedirname="Factorio" - array_configs+=( server-settings.json ) - fn_fetch_default_config - fn_default_config_remote - fn_set_config_vars + : elif [ "${gamename}" == "Fistful of Frags" ]; then gamedirname="FistfulofFrags" array_configs+=( server.cfg ) diff --git a/lgsm/functions/install_factorio_save.sh b/lgsm/functions/install_factorio_save.sh index 36ef169cb..8a9850818 100644 --- a/lgsm/functions/install_factorio_save.sh +++ b/lgsm/functions/install_factorio_save.sh @@ -12,3 +12,4 @@ echo "Creating initial Factorio savefile" echo "=================================" sleep 1 ${filesdir}/bin/x64/factorio --create ${filesdir}/save1 +cp ${filesdir}/data/server-settings.example.json ${filesdir}/data/server-settings.json From 057f1fed234437e88067ca7433909afcc253b2b0 Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Wed, 19 Oct 2016 13:32:50 +0300 Subject: [PATCH 0018/1895] Details --- lgsm/functions/command_details.sh | 2 +- lgsm/functions/info_glibc.sh | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 2ae4632f0..7dbbd5e52 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -290,7 +290,7 @@ fn_details_ports(){ parmslocation="${red}UNKNOWN${default}" # engines that require editing in the config file - local ports_edit_array=( "avalanche" "dontstarve" "idtech3" "lwjgl2" "projectzomboid" "idtech3_ql" "refractor" "realvirtuality" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" ) + local ports_edit_array=( "avalanche" "dontstarve" "idtech3" "lwjgl2" "projectzomboid" "idtech3_ql" "refractor" "realvirtuality" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "Factorio" ) for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 655402584..3f5740571 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -23,6 +23,9 @@ elif [ "${gamename}" == "Double Action: Boogaloo" ]; then elif [ "${gamename}" == "Empires Mod" ]; then glibcrequired="2.15" glibcfix="yes" +elif [ "${gamename}" == "Factorio" ]; then + glibcrequired="2.15" + glibcfix="yes" elif [ "${gamename}" == "Fistful of Frags" ]; then glibcrequired="2.15" glibcfix="yes" From f7e99e6428b07e3edd27911c9fdd21888a81bcdd Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Wed, 19 Oct 2016 13:43:51 +0300 Subject: [PATCH 0019/1895] Details --- lgsm/functions/command_details.sh | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 7dbbd5e52..e9f8f6b4c 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -290,7 +290,7 @@ fn_details_ports(){ parmslocation="${red}UNKNOWN${default}" # engines that require editing in the config file - local ports_edit_array=( "avalanche" "dontstarve" "idtech3" "lwjgl2" "projectzomboid" "idtech3_ql" "refractor" "realvirtuality" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "Factorio" ) + local ports_edit_array=( "avalanche" "dontstarve" "idtech3" "lwjgl2" "projectzomboid" "idtech3_ql" "refractor" "realvirtuality" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" ) for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then @@ -298,7 +298,7 @@ fn_details_ports(){ fi done # engines that require editing in the script file - local ports_edit_array=( "starbound" "spark" "source" "goldsource" "Rust" "Hurtworld" "unreal4") + local ports_edit_array=( "starbound" "spark" "source" "goldsource" "Rust" "Hurtworld" "unreal4" "Factorio" ) for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then @@ -340,6 +340,15 @@ fn_details_dontstarve(){ } | column -s $'\t' -t } +fn_details_factorio(){ + echo -e "netstat -atunp | grep factorio" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\ttcp" + } | column -s $'\t' -t +} + fn_details_minecraft(){ echo -e "netstat -atunp | grep java" echo -e "" @@ -673,6 +682,8 @@ fn_display_details() { fn_details_rust elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fn_details_wolfensteinenemyterritory + elif [ "${gamename}" == "Factorio" ]; then + fn_details_factorio else fn_print_error_nl "Unable to detect server engine." fi @@ -685,3 +696,4 @@ then fn_display_details core_exit.sh fi + From 9fccb196196457e3144e970b76ac67c9358ce202 Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Wed, 19 Oct 2016 13:50:24 +0300 Subject: [PATCH 0020/1895] Update fctrserver --- Factorio/fctrserver | 76 ++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 916a94f16..6ef50a96a 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -5,9 +5,9 @@ # Contributor: Kristian Polso # Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x fi version="171016" @@ -27,11 +27,15 @@ email="email@example.com" pushbulletalert="off" pushbullettoken="accesstoken" -# Start Variables +# Server settings +# More settings available after install in serverfiles/data/server-settings.json updateonstart="off" +port="34197" +rconport="34198" +rconpassword="factorio" fn_parms(){ -parms="-fg -ini ${servercfgfullpath}" +parms="--start-server ${filesdir}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" } #### Advanced Variables #### @@ -91,36 +95,36 @@ 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}" + 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}" } @@ -141,4 +145,4 @@ core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh +core_getopt.sh \ No newline at end of file From 0526935d32c1671d313c16486c578fc776537d36 Mon Sep 17 00:00:00 2001 From: Kristian Polso Date: Wed, 19 Oct 2016 17:44:24 +0300 Subject: [PATCH 0021/1895] Typo in fn_update_factorio_currentbuild --- lgsm/functions/update_factorio.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index bc8339bde..8122678a0 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -49,7 +49,7 @@ fn_update_factorio_currentbuild(){ fi # Get current build from logs - currentbuild=$(cat "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null | sort | grep -oP '(?<=Factorio ).*?(?= /)') + currentbuild=$(cat "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null | sort | grep -oP '(?<=Factorio ).*?(?= \()') if [ -z "${currentbuild}" ]; then fn_print_error_nl "Checking for update: Factorio.com: Current build version not found" fn_script_log_error "Checking for update: Factorio.com: Current build version not found" From a05420bf105f5248357cc1ab042915cf5b455501 Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Sat, 22 Oct 2016 16:10:41 -0400 Subject: [PATCH 0022/1895] adding Project Cars --- ProjectCars/pcserver | 155 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100755 ProjectCars/pcserver diff --git a/ProjectCars/pcserver b/ProjectCars/pcserver new file mode 100755 index 000000000..312b3cf32 --- /dev/null +++ b/ProjectCars/pcserver @@ -0,0 +1,155 @@ +#!/bin/bash +# Project Cars +# Server Management Script +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="211016" + +#### Variables #### + +# Notification Alerts +# (on|off) + +# Email +emailalert="off" +email="email@example.com" +#emailfrom="email@example.com" + +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert="off" +pushbullettoken="accesstoken" + +# Steam login +steamuser="anonymous" +steampass="" + +# Start Variables + +fn_parms(){ +params=" --config ${servercfg}" +} + +#### Advanced Variables #### + +# Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="projectcars" + +# Steam +appid="332670" + +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta beta" +branch="" + +# Server Details +servicename="projectcars-server" +gamename="Project Cars" +#engine="source" + +# Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./DedicatedServerCmd" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" +backupdir="${rootdir}/backups" + +# Logging +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" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" + +##### Script ##### +# Do not edit + +# 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 -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_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_fetch_core_dl +} + +core_dl.sh +core_functions.sh + +getopt=$1 +core_getopt.sh From 93343ac2088af31b0125f0356afb214661812a68 Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Sat, 22 Oct 2016 16:20:28 -0400 Subject: [PATCH 0023/1895] fix --- ProjectCars/pcserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectCars/pcserver b/ProjectCars/pcserver index 312b3cf32..fe583240f 100755 --- a/ProjectCars/pcserver +++ b/ProjectCars/pcserver @@ -33,7 +33,7 @@ steampass="" # Start Variables fn_parms(){ -params=" --config ${servercfg}" +parms=" --config ${servercfg}" } #### Advanced Variables #### From 74677362066cc1aafb78fb62cd008de9e0746d61 Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Sat, 22 Oct 2016 16:24:17 -0400 Subject: [PATCH 0024/1895] updates --- ProjectCars/pcserver | 1 - lgsm/functions/info_glibc.sh | 3 +++ lgsm/functions/install_config.sh | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ProjectCars/pcserver b/ProjectCars/pcserver index fe583240f..e2564fd6f 100755 --- a/ProjectCars/pcserver +++ b/ProjectCars/pcserver @@ -56,7 +56,6 @@ branch="" # Server Details servicename="projectcars-server" gamename="Project Cars" -#engine="source" # Directories rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index f7f333d63..a477f95f8 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -41,6 +41,9 @@ elif [ "${gamename}" == "Mumble" ]; then elif [ "${gamename}" == "No More Room in Hell" ]; then glibcrequired="2.15" glibcfix="yes" +elif [ "${gamename}" == "Project Cars" ]; then + glibcrequired="2.1" + glibcfix="no" elif [ "${gamename}" == "Quake 2" ]; then glibcrequired="2.0" glibcfix="no" diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 43d0a0000..4193fcf55 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -291,6 +291,12 @@ elif [ "${gamename}" == "Project Zomboid" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Project Cars" ]; then + gamedirname="ProjectCars" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Quake 2" ]; then gamedirname="Quake2" array_configs+=( server.cfg ) From e912cc5f783c1ca98224908b48ac70cb1ba163a8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 28 Nov 2016 22:31:12 +0000 Subject: [PATCH 0025/1895] #1204 "/stop" is replaced by "stop" --- lgsm/functions/command_stop.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 95aa10536..c5483a864 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -144,29 +144,29 @@ fn_stop_graceful_sdtd(){ fn_stop_tmux } -# Attempts graceful of source using rcon '/stop' command. +# Attempts graceful of source using rcon 'stop' command. fn_stop_graceful_minecraft(){ - fn_print_dots "Graceful: console /stop" - fn_script_log_info "Graceful: console /stop" + fn_print_dots "Graceful: console stop" + fn_script_log_info "Graceful: console stop" # sends quit - tmux send -t "${servicename}" /stop ENTER > /dev/null 2>&1 + tmux send -t "${servicename}" stop ENTER > /dev/null 2>&1 # waits up to 30 seconds giving the server time to shutdown gracefuly for seconds in {1..30}; do check_status.sh if [ "${status}" == "0" ]; then - fn_print_ok "Graceful: console /stop: ${seconds}: " + fn_print_ok "Graceful: console stop: ${seconds}: " fn_print_ok_eol_nl - fn_script_log_pass "Graceful: console /stop: OK: ${seconds} seconds" + fn_script_log_pass "Graceful: console stop: OK: ${seconds} seconds" break fi sleep 1 - fn_print_dots "Graceful: console /stop: ${seconds}" + fn_print_dots "Graceful: console stop: ${seconds}" done check_status.sh if [ "${status}" != "0" ]; then - fn_print_error "Graceful: console /stop: " + fn_print_error "Graceful: console stop: " fn_print_fail_eol_nl - fn_script_log_error "Graceful: console /stop: FAIL" + fn_script_log_error "Graceful: console stop: FAIL" fi sleep 1 fn_stop_tmux From 85f589746517299dae51c5eab27652449fee4db6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 10 Dec 2016 10:50:41 +0000 Subject: [PATCH 0026/1895] Removed insecure from the parms --- BrainBread2/bb2server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index 977e60025..c66b84fcc 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -41,7 +41,7 @@ gslt="" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters # Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ -parms="-game brainbread2 -insecure -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +parms="-game brainbread2 -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } #### LinuxGSM Settings #### From 83e6ce0e4851bf741f3f3f64190b2b64a6bb71ec Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 10 Dec 2016 11:04:03 +0000 Subject: [PATCH 0027/1895] Adding COD4 --- CallOfDuty4/cod4server | 188 +++++++++++++++++++++++++ lgsm/functions/info_glibc.sh | 3 + lgsm/functions/install_server_files.sh | 2 + 3 files changed, 193 insertions(+) create mode 100644 CallOfDuty4/cod4server diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server new file mode 100644 index 000000000..e748b993d --- /dev/null +++ b/CallOfDuty4/cod4server @@ -0,0 +1,188 @@ +#!/bin/bash +# Project: Game Server Managers - LinuxGSM +# Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# Purpose: Call of Duty 4 | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki +# Website: https://gameservermanagers.com + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="161125" + +########################## +######## Settings ######## +########################## + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters + +defaultmap="mp_crossfire" +maxclients="32" +port="28960" +ip="138.68.147.159" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### Advanced Variables #### + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Call of Duty 4" +engine="iw3.0" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="cod4-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./cod4x18_dedrun" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/main" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${filesdir}/Logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" + +######################## +######## Script ######## +###### Do not edit ##### +######################## + +# 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 -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_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_fetch_core_dl +} + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + +core_dl.sh +core_functions.sh +getopt=$1 +core_getopt.sh diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index b8b29239c..951adefd7 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -23,6 +23,9 @@ elif [ "${gamename}" == "Call of Duty 2" ]; then elif [ "${gamename}" == "Call of Duty: United Offensive" ]; then glibcrequired="2.1" glibcfix="no" +elif [ "${gamename}" == "Call of Duty 4" ]; then + glibcrequired="2.3" + glibcfix="no" elif [ "${gamename}" == "Call of Duty: World at War" ]; then glibcrequired="2.3.2" glibcfix="no" diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index bc28bd2f2..694fc6b71 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -17,6 +17,8 @@ fn_install_server_files(){ fileurl="http://files.gameservermanagers.com/CallOfDutyUnitedOffensive/coduo-lnxded-1.51b-full.tar.bz2"; filedir="${tmpdir}"; filename="coduo-lnxded-1.51b-full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="f1804ef13036e2b4ab535db000b19e97" elif [ "${gamename}" == "Call of Duty 2" ]; then fileurl="http://files.gameservermanagers.com/CallOfDuty2/cod2-lnxded-1.3-full.tar.bz2"; filedir="${tmpdir}"; filename="cod2-lnxded-1.3-full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="078128f83d06dc3d7699428dc2870214" + elif [ "${gamename}" == "Call of Duty 4" ]; then + fileurl="http://files.gameservermanagers.com/CallOfDuty4/cod4x18_dedrun.tar.bz2"; filedir="${tmpdir}"; filename="cod2-lnxded-1.3-full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="87744d1ab4ac49ac0edd2200f5152ccf" elif [ "${gamename}" == "Call of Duty: World at War" ]; then fileurl="http://files.gameservermanagers.com/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.bz2"; filedir="${tmpdir}"; filename="codwaw-lnxded-1.7-full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="0489697ff3bf678c109bfb377d1b7895" elif [ "${gamename}" == "GoldenEye: Source" ]; then From d57d64f741301ec7323ca7d2145b3d41e25b7bb8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 10 Dec 2016 13:01:33 +0000 Subject: [PATCH 0028/1895] Updated COD4 file --- lgsm/functions/install_server_files.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 694fc6b71..330e4fb40 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -18,7 +18,7 @@ fn_install_server_files(){ elif [ "${gamename}" == "Call of Duty 2" ]; then fileurl="http://files.gameservermanagers.com/CallOfDuty2/cod2-lnxded-1.3-full.tar.bz2"; filedir="${tmpdir}"; filename="cod2-lnxded-1.3-full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="078128f83d06dc3d7699428dc2870214" elif [ "${gamename}" == "Call of Duty 4" ]; then - fileurl="http://files.gameservermanagers.com/CallOfDuty4/cod4x18_dedrun.tar.bz2"; filedir="${tmpdir}"; filename="cod2-lnxded-1.3-full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="87744d1ab4ac49ac0edd2200f5152ccf" + fileurl="http://files.gameservermanagers.com/CallOfDuty4/cod4x18_dedrun.tar.bz2"; filedir="${tmpdir}"; filename="cod4x18_dedrun.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="bebdfc1755626462bdaad49f6f926c08" elif [ "${gamename}" == "Call of Duty: World at War" ]; then fileurl="http://files.gameservermanagers.com/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.bz2"; filedir="${tmpdir}"; filename="codwaw-lnxded-1.7-full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="0489697ff3bf678c109bfb377d1b7895" elif [ "${gamename}" == "GoldenEye: Source" ]; then From 93b93379f531df9f2d1cfca582632a8f24efdfdc Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 10 Dec 2016 13:07:43 +0000 Subject: [PATCH 0029/1895] Added COD 4 --- lgsm/functions/command_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index d7c3cbc54..a840af48a 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -18,7 +18,7 @@ check_deps.sh if [ "${gamename}" == "Unreal Tournament 2004" ]; then install_server_files.sh install_ut2k4_key.sh -elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament" ]||[ "${gamename}" == "Unreal Tournament 3" ]||[ "${gamename}" == "TeamSpeak 3" ]||[ "${gamename}" == "Mumble" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then +elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament" ]||[ "${gamename}" == "Unreal Tournament 3" ]||[ "${gamename}" == "TeamSpeak 3" ]||[ "${gamename}" == "Mumble" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then installer=1 install_server_files.sh elif [ -n "${appid}" ]; then From 64e6a08745ed1b9d10353392058d1e378bdf2676 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 12 Dec 2016 21:33:41 +0000 Subject: [PATCH 0030/1895] Added Call of Duty 4 server config --- lgsm/functions/install_config.sh | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index b5f7a1148..1f946381b 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -83,20 +83,20 @@ fn_set_dst_config_vars(){ randomkey=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1) sed -i "s/CLUSTERKEY/${randomkey}/g" "${clustercfgfullpath}" sleep 1 - else + else echo "${clustercfg} is already configured." fn_script_log_info "${clustercfg} is already configured." fi - + ## server.ini # removing unnecessary options (dependent on sharding & shard type) - if [ "${sharding}" == "false" ]; then + if [ "${sharding}" == "false" ]; then sed -i "s/ISMASTER//g" "${servercfgfullpath}" sed -i "/SHARDNAME/d" "${servercfgfullpath}" elif [ "${master}" == "true" ]; then sed -i "/SHARDNAME/d" "${servercfgfullpath}" fi - + echo "changing shard name." fn_script_log_info "changing shard name." sed -i "s/SHARDNAME/${shard}/g" "${servercfgfullpath}" @@ -105,7 +105,7 @@ fn_set_dst_config_vars(){ fn_script_log_info "changing master setting." sed -i "s/ISMASTER/${master}/g" "${servercfgfullpath}" sleep 1 - + ## worldgenoverride.lua if [ "${cave}" == "true" ]; then echo "defining ${shard} as cave in ${servercfgdir}/worldgenoverride.lua." @@ -182,6 +182,12 @@ elif [ "${gamename}" == "Call of Duty 2" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Call of Duty 4" ]; then + gamedirname="CallOfDuty4" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Call of Duty: World at War" ]; then gamedirname="CallOfDutyWorldAtWar" array_configs+=( server.cfg ) From 1e5852b75353b1ecf4c86ac2a16e82bf86ff054a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 12 Dec 2016 21:40:14 +0000 Subject: [PATCH 0031/1895] Renamed to CallOfDuty2 --- lgsm/functions/install_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 1f946381b..a9a97423f 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -177,7 +177,7 @@ elif [ "${gamename}" == "Call of Duty: United Offensive" ]; then fn_default_config_remote fn_set_config_vars elif [ "${gamename}" == "Call of Duty 2" ]; then - gamedirname="CallofDuty2" + gamedirname="CallOfDuty2" array_configs+=( server.cfg ) fn_fetch_default_config fn_default_config_remote From 25d18213e4759d7fa79bbbb3a9f0a96f68ba42bc Mon Sep 17 00:00:00 2001 From: MrJefff Date: Fri, 16 Dec 2016 12:36:51 +0000 Subject: [PATCH 0032/1895] Update rustserver Had issues logging in with experimental rcon after latest Rust Dedicated Server update, Caused disconnect loop. Warning asks to add rcon.web to startup script. This can be temporary or edited better but solves error > "You are connecting to your server via Experimental rcon type The support for this rcon type has been discontinued and can cause instabilities and crashes." --- Rust/rustserver | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Rust/rustserver b/Rust/rustserver index f02e29231..d78b86c05 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -29,6 +29,7 @@ ip="0.0.0.0" port="28015" rconport="28016" rconpassword="CHANGE_ME" +rconweb="1" maxplayers="50" # Advanced Start Settings seed="" # default random; range : 1 to 2147483647 ; used to change or reproduce a procedural map @@ -39,7 +40,7 @@ tickrate="30" # default 30; range : 15 to 100 ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters # Edit with care | https://developer.valvesoftware.com/wiki/Rust_Dedicated_Server fn_parms(){ -parms="-batchmode +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${servicename}\" ${conditionalseed} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile ${gamelogfile}" +parms="-batchmode +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${servicename}\" ${conditionalseed} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile ${gamelogfile}" } # Specific to Rust From 073bbea78628eae99e88f5eebaae0407db9ad05f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 20 Dec 2016 21:18:59 +0000 Subject: [PATCH 0033/1895] Added COD 4 to details --- lgsm/functions/command_details.sh | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 5ab856ed0..9d9d8fddc 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -152,12 +152,12 @@ fn_details_gameserver(){ if [ -n "${tickrate}" ]; then echo -e "${blue}Tick rate:\t${default}${tickrate}" fi - + # Cluster (Don't Starve Together) if [ -n "${cluster}" ]; then echo -e "${blue}Cluster:\t${default}${cluster}" fi - + # Shard (Don't Starve Together) if [ -n "${shard}" ]; then echo -e "${blue}Shard:\t${default}${shard}" @@ -378,6 +378,15 @@ fn_details_cod2(){ } | column -s $'\t' -t } +fn_details_cod4(){ + echo -e "netstat -atunp" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + } | column -s $'\t' -t +} + fn_details_codwaw(){ echo -e "netstat -atunp | grep codwaw_lnxded" echo -e "" @@ -752,6 +761,8 @@ fn_display_details() { fn_details_coduo elif [ "${gamename}" == "Call of Duty 2" ]; then fn_details_cod2 + elif [ "${gamename}" == "Call of Duty 4" ]; then + fn_details_cod4 elif [ "${gamename}" == "Call of Duty: World at War" ]; then fn_details_codwaw elif [ "${gamename}" == "Hurtworld" ]; then From 32e0c921750d5c794c2479f563f341cd5bba2fbf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 20 Dec 2016 21:34:33 +0000 Subject: [PATCH 0034/1895] Added COD 4 to Infor_config --- lgsm/functions/info_config.sh | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 09cd8900d..829bba841 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -94,6 +94,20 @@ fn_info_config_cod2(){ fi } +fn_info_config_cod4(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + rconpassword="${unavailable}" + else + servername=$(grep "sv_hostname " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | xargs) + rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + + # Not Set + servername=${servername:-"NOT SET"} + rconpassword=${rconpassword=:-"NOT SET"} + fi +} + fn_info_config_codwaw(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -123,7 +137,6 @@ fn_info_config_dontstarve(){ gamemode=$(grep "game_mode" "${clustercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/game_mode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') tickrate=$(grep "tick_rate" "${clustercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') masterport=$(grep "master_port" "${clustercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - ip=$(grep "bind_ip" "${clustercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/bind_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') ipsetinconfig=1 ipinconfigvar="bind_ip" @@ -136,7 +149,7 @@ fn_info_config_dontstarve(){ tickrate=${tickrate:-"0"} masterport=${masterport:-"0"} fi - + if [ ! -f "${servercfgfullpath}" ]; then port="${zero}" steamauthenticationport="${zero}" @@ -145,7 +158,7 @@ fn_info_config_dontstarve(){ port=$(grep "server_port" "${servercfgfullpath}" | grep "^server_port" | grep -v "#" | tr -cd '[:digit:]') steamauthenticationport=$(grep "authentication_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') steammasterserverport=$(grep "master_server_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - + # Not Set port=${port:-"0"} steamauthenticationport=${steamauthenticationport:-"0"} @@ -575,6 +588,9 @@ elif [ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: Unit # Call of Duty 2 elif [ "${gamename}" == "Call of Duty 2" ]; then fn_info_config_cod2 +# Call of Duty 4 +elif [ "${gamename}" == "Call of Duty 4" ]; then + fn_info_config_cod4 # Call of Duty: World at War elif [ "${gamename}" == "Call of Duty: World at War" ]; then fn_info_config_codwaw From e3b86e1c862080bff7b10c43276ffd2c4412ccb9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 20 Dec 2016 21:40:36 +0000 Subject: [PATCH 0035/1895] Added COD4 to getopt --- 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 8434f4454..03aa7359a 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -699,7 +699,7 @@ case "${getopt}" in if [ "${gamename}" == "Mumble" ]; then fn_getopt_mumble -elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then +elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fn_getopt_generic_no_update elif [ "${engine}" == "lwjgl2" ]; then fn_getopt_minecraft From d1d3d875498a4520ef20d6ce4e2519d8f2c1579c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 21 Dec 2016 17:11:54 +0000 Subject: [PATCH 0036/1895] Updated to release 161221 --- 7DaysToDie/sdtdserver | 2 +- ARKSurvivalEvolved/arkserver | 2 +- Arma3/arma3server | 2 +- Battlefield1942/bf1942server | 2 +- BlackMesa/bmdmserver | 2 +- BladeSymphony/bsserver | 2 +- BrainBread2/bb2server | 2 +- CallOfDuty/codserver | 2 +- CallOfDuty2/cod2server | 2 +- CallOfDuty4/cod4server | 2 +- CallOfDutyUnitedOffensive/coduoserver | 2 +- CallOfDutyWorldAtWar/codwawserver | 2 +- CodenameCURE/ccserver | 2 +- CounterStrike/csserver | 2 +- CounterStrikeConditionZero/csczserver | 2 +- CounterStrikeGlobalOffensive/csgoserver | 2 +- CounterStrikeSource/cssserver | 2 +- DayOfDefeat/dodserver | 2 +- DayOfDefeatSource/dodsserver | 2 +- DayOfInfamy/doiserver | 2 +- DeathmatchClassic/dmcserver | 2 +- DontStarveTogether/dstserver | 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 +- Minecraft/mcserver | 2 +- Mumble/mumbleserver | 2 +- NS2Combat/ns2cserver | 2 +- NaturalSelection2/ns2server | 2 +- NoMoreRoomInHell/nmrihserver | 2 +- OpposingForce/opforserver | 2 +- PiratesVikingandKnightsII/pvkiiserver | 2 +- ProjectZomboid/pzserver | 2 +- Quake2/q2server | 2 +- Quake3/q3server | 2 +- QuakeLive/qlserver | 2 +- RedOrchestra/roserver | 2 +- Ricochet/ricochetserver | 2 +- Rust/rustserver | 2 +- SeriousSam3BFE/ss3sserver | 2 +- Starbound/sbserver | 2 +- SvenCoop/svenserver | 2 +- TeamFortress2/tf2server | 2 +- TeamFortressClassic/tfcserver | 2 +- TeamSpeak3/ts3server | 2 +- Teeworlds/twserver | 2 +- Terraria/terrariaserver | 2 +- UnrealTournament/utserver | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament3/ut3server | 2 +- UnrealTournament99/ut99server | 2 +- WolfensteinEnemyTerritory/wetserver | 2 +- tests/tests_jc2server.sh | 2 +- 63 files changed, 63 insertions(+), 63 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index 1e5bca25e..1b554719c 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index bc4c53812..f96e49bf2 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Arma3/arma3server b/Arma3/arma3server index b132595a5..083e4ea13 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Battlefield1942/bf1942server b/Battlefield1942/bf1942server index d011e57ac..25ea4291d 100644 --- a/Battlefield1942/bf1942server +++ b/Battlefield1942/bf1942server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index 025374c70..ea25b01f8 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index 5e1a91654..fed7213e3 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index c66b84fcc..ee8f3c4e3 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/CallOfDuty/codserver b/CallOfDuty/codserver index 8bf07b570..093c375a6 100755 --- a/CallOfDuty/codserver +++ b/CallOfDuty/codserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/CallOfDuty2/cod2server b/CallOfDuty2/cod2server index 49a32f1e5..48b43b34d 100755 --- a/CallOfDuty2/cod2server +++ b/CallOfDuty2/cod2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server index e748b993d..d77707606 100644 --- a/CallOfDuty4/cod4server +++ b/CallOfDuty4/cod4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/CallOfDutyUnitedOffensive/coduoserver b/CallOfDutyUnitedOffensive/coduoserver index 37e053e10..64c6bdfb0 100755 --- a/CallOfDutyUnitedOffensive/coduoserver +++ b/CallOfDutyUnitedOffensive/coduoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/CallOfDutyWorldAtWar/codwawserver b/CallOfDutyWorldAtWar/codwawserver index c5bfbf785..bfb080f98 100755 --- a/CallOfDutyWorldAtWar/codwawserver +++ b/CallOfDutyWorldAtWar/codwawserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 0fcd67964..8815e7c50 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/CounterStrike/csserver b/CounterStrike/csserver index 8fae4ad6d..0f0ab0665 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index 21b58f060..c32332f95 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 00234ea57..ef945f4d9 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index 6710cd78d..ddb55ae1c 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index f1638263e..ac3c70e81 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index bee83c953..583035330 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/DayOfInfamy/doiserver b/DayOfInfamy/doiserver index da1605b39..3a17b0201 100644 --- a/DayOfInfamy/doiserver +++ b/DayOfInfamy/doiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index 58b6c4282..823150526 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index 260a57a39..857e08da0 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 0938bd94a..2d889a31b 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index 224ad89db..49c7666cb 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index 379e36a08..c0329bb47 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index c661a3d91..b41fb6e4f 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index 49be6d637..e806c0ac5 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index 53bd98dc4..f0085130f 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index d0c9c33db..a8441d652 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index 930f367be..ca599ac78 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Insurgency/insserver b/Insurgency/insserver index 6427fcdb7..e3a2212a5 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/JustCause2/jc2server b/JustCause2/jc2server index 1a4fa6c9a..3688cbc3c 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index 53080e2a7..4d92fbcc3 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index b550880fa..eab523850 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index 8aee908b5..5887be549 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Minecraft/mcserver b/Minecraft/mcserver index 320edc90d..f7c69ec57 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index be06c44ef..27b9a55c1 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index 437921ad3..9b621eaec 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index 3ce13f844..6c68ac06e 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index 6409591fc..8abbee131 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index 8fe185650..a36dd83db 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index e2c920423..f1592016e 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index 481dbdd75..a5f295b15 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Quake2/q2server b/Quake2/q2server index 206ab8379..c8c9bfe84 100644 --- a/Quake2/q2server +++ b/Quake2/q2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Quake3/q3server b/Quake3/q3server index ae71118ec..078e0502d 100644 --- a/Quake3/q3server +++ b/Quake3/q3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index d7be6d83d..babb453bd 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index 85bd1b103..ffa02313a 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index aaaf3f761..d5f205db4 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Rust/rustserver b/Rust/rustserver index d78b86c05..22c489a78 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index f668959d6..170abc607 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Starbound/sbserver b/Starbound/sbserver index d4d93913f..09555200a 100644 --- a/Starbound/sbserver +++ b/Starbound/sbserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/SvenCoop/svenserver b/SvenCoop/svenserver index c69706307..039bb1928 100644 --- a/SvenCoop/svenserver +++ b/SvenCoop/svenserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index c4ae5feae..d1be35534 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index 68be7bfb0..3d4c3b3d6 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index b22971108..4352c13bf 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Teeworlds/twserver b/Teeworlds/twserver index 367baa386..8456c64a6 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index cc68d2632..564440e32 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/UnrealTournament/utserver b/UnrealTournament/utserver index 23a0d0ff1..e5c1e13dd 100644 --- a/UnrealTournament/utserver +++ b/UnrealTournament/utserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index 2ee0f9b3f..8eb5f1137 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/UnrealTournament3/ut3server b/UnrealTournament3/ut3server index f721859b0..5e96d62f8 100644 --- a/UnrealTournament3/ut3server +++ b/UnrealTournament3/ut3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index 8a86a4bfb..8de3f2b21 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/WolfensteinEnemyTerritory/wetserver b/WolfensteinEnemyTerritory/wetserver index 7cddd0575..2404333c3 100644 --- a/WolfensteinEnemyTerritory/wetserver +++ b/WolfensteinEnemyTerritory/wetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index c4d46cbcb..a03b45e85 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -17,7 +17,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161125" +version="161221" ########################## ######## Settings ######## From 2aa1569175928bec1cea481410cdf56a002a9f1a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 21 Dec 2016 17:32:46 +0000 Subject: [PATCH 0037/1895] Updated emserver and qwserver with new style --- EmpiresMod/emserver | 23 +++++++++- QuakeWorld/qwserver | 101 +++++++++++++++++++++++++++++++------------- 2 files changed, 93 insertions(+), 31 deletions(-) diff --git a/EmpiresMod/emserver b/EmpiresMod/emserver index 7fe58d3b5..be6b31e57 100644 --- a/EmpiresMod/emserver +++ b/EmpiresMod/emserver @@ -1,5 +1,26 @@ #!/bin/bash -# Empires Mod +# Project: Game Server Managers - LinuxGSM +# Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# Purpose: Empires Mod | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki +# Website: https://gameservermanagers.com + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="161221" + +########################## +######## Settings ######## +########################## + +#### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters defaultmap="emp_district" diff --git a/QuakeWorld/qwserver b/QuakeWorld/qwserver index 5e1bb60de..3918cc8ba 100644 --- a/QuakeWorld/qwserver +++ b/QuakeWorld/qwserver @@ -1,54 +1,81 @@ #!/bin/bash -# Quake World (nQuake) -# Server Management Script +# Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# Purpose: Quake World (nQuake) | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki # Website: https://gameservermanagers.com + +# Debugging if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" set -x fi -version="210516" +version="161221" -#### Variables #### +########################## +######## Settings ######## +########################## -# Notification Alerts -# (on|off) +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +port="27500" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server +fn_parms(){ +parms="-port ${port} -game ktx +exec ${servercfg}" +} -# Email +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email emailalert="off" email="email@example.com" +emailfrom="" -# Pushbullet -# https://www.pushbullet.com/#settings +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet pushbulletalert="off" pushbullettoken="accesstoken" channeltag="" -# Start Variables -ip="0.0.0.0" -port="27500" +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" -fn_parms(){ -parms="-port ${port} -game ktx +exec ${servercfg}" -} +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" -#### Advanced Variables #### +#### LinuxGSM Advanced Settings #### -# Github Branch Select +## Github Branch Select # Allows for the use of different function files # from a different repo and/or branch. githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="master" -# Server Details -servicename="quakeworld_server" +## LinuxGSM Server Details +# Do not edit gamename="QuakeWorld" engine="quake" -# Directories +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="quakeworld_server" + +#### Directories #### +# Edit with care + +## Work Directories rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" @@ -57,6 +84,8 @@ functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" filesdir="${rootdir}/serverfiles" + +## Server Specific Directories systemdir="${filesdir}/ktx" executabledir="${filesdir}" executable="./mvdsv" @@ -64,24 +93,26 @@ servercfg="${servicename}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory backupdir="${rootdir}/backups" -# Logging -logdays="7" -gamelogdir="${filesdir}/Logs" +## Logging Directories +gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" -consolelogging="on" - scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${scriptlogdir}/${servicename}-email.log" -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" -##### Script ##### -# Do not edit +######################## +######## Script ######## +###### Do not edit ##### +######################## # Fetches core_dl for file downloads fn_fetch_core_dl(){ @@ -138,8 +169,18 @@ functionfile="${FUNCNAME}" fn_fetch_core_dl } +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + core_dl.sh core_functions.sh - getopt=$1 core_getopt.sh \ No newline at end of file From 29a2fb8001b84df7bfd08e434173e549ebbab65b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 21 Dec 2016 17:44:03 +0000 Subject: [PATCH 0038/1895] Removed old configs --- Insurgency/cfg/lgsm-default.cfg | 302 -------------------------------- QuakeWorld/cfg/lgsm-default.cfg | 26 --- 2 files changed, 328 deletions(-) delete mode 100644 Insurgency/cfg/lgsm-default.cfg delete mode 100644 QuakeWorld/cfg/lgsm-default.cfg diff --git a/Insurgency/cfg/lgsm-default.cfg b/Insurgency/cfg/lgsm-default.cfg deleted file mode 100644 index b8a98558c..000000000 --- a/Insurgency/cfg/lgsm-default.cfg +++ /dev/null @@ -1,302 +0,0 @@ -// **************************************************************************** -// * -// Ingurgency - server.cfg * -// Version 060116 * -// * -// **************************************************************************** - -// ............................. Basic Settings ............................. // - -// Hostname for server. -hostname "" - -// Server password - for private servers. -sv_password "" - -// Contact email for server sysop. -sv_contact "email@example.com" - -// LAN Mode - If set the server will not show on the internet. -// Default: sv_lan 0 -sv_lan 0 - -// Set maximum server FPS -// Default: fps_max 300 -fps_max 300 - -// ........................... RCON Configuration .......................... // - -// RCON - remote console password. -rcon_password "" - -// Number of minutes to ban users who fail rcon authentication -// min. 0 -sv_rcon_banpenalty 10 - -// Enable/disable rcon logging -sv_rcon_log 1 - -// Max number of times a user can fail rcon authentication before being banned -// min. 1 max. 20 -sv_rcon_maxfailures 5 - -// ......................... Matchmaking Playlists ......................... // -// info: Selecting a playlist will allow the server to show up in matchmaking. -// Playlists use predefined settings and mapcycle. - -// You do not need to select a mapcycle as the server will cycle though the -// predefined playlist mapcycle. -// -// If you want to change the predefined playlist mapcycle you can create a -// custom mapcycle but only with maps from the playlist mapcycle. -// -// You can also create your own custom playlists. -// http://steamcommunity.com/sharedfiles/filedetails/?id=461776759 - -// "nwi/comp" -// "nwi/coop" -// "nwi/coop_elite" -// "nwi/coop_hardcore" -// "nwi/pvp_sustained" -// "nwi/pvp_tactical" -// -sv_playlist "nwi/coop" - -// ............................... Map Cycles ............................... // -// info: There are several predefined mapcycles available that are listed below. -// You can also create your own custom mapcycle. - -// "mapcycle.txt" - by default this contains the most popular options -// "mapcycle_all.txt" - all possible map/mode combinations for PvP -// "mapcycle_ambush.txt" - all ambush (VIP) maps -// "mapcycle_attackdefend.txt" - push & strike maps -// "mapcycle_checkpoint.txt" - all checkpoint maps -// "mapcycle_comp.txt" - firefight & elimination maps -// "mapcycle_conquer.txt" - conquer gamemode -// "mapcycle_cooperative.txt" - survival, coop, hunt maps -// "mapcycle_firefight.txt" - all firefight maps -// "mapcycle_flashpoint.txt" - all flashpoint maps -// "mapcycle_hunt.txt" - all hunt maps -// "mapcycle_infiltrate.txt" - all infiltrate (CTF) maps -// "mapcycle_objrespawn.txt" - all firefight & flashpoint featuring respawning for completing objectives -// "mapcycle_occupy.txt" - all occupy maps -// "mapcycle_practice.txt" -// "mapcycle_push.txt" - all push maps -// "mapcycle_singlelife.txt" - strike & ambush single life modes -// "mapcycle_skirmish.txt" - all skirmish maps -// "mapcycle_strike.txt" - all strike maps -// "mapcycle_survival.txt" - all survival maps -// "mapcycle_sustained_combat.txt" -// "mapcycle_tactical_operations.txt" -// "mapcycle_workshop.txt" - used by Workshop system -// -//mapcyclefile "mapcycle.txt" - -// .......................... Coop Mode Settings ............................ // -// info: Settings for all cooperative gamemodes - -// Set the maximum number of human players in Cooperative modes -// Maximum value: 8 -// Default: mp_coop_lobbysize 6 -//mp_coop_lobbysize 6 - -// Set the minimum number of bots -//mp_coop_min_bots 5 - -// Set the maximum number of bots -// Maximum value: maxplayers - mp_coop_lobbysize -//mp_coop_max_bots 18 - -// ........................... Voting Settings .............................. // - -// Allow voting? -sv_allow_votes 1 - -// Is map voting enabled? -sv_map_voting 1 - -// Allow spectators to vote? -sv_vote_allow_spectators 0 - -// A vote that fails cannot be re-submitted for this long -sv_vote_failure_timer 300 - -// Can people hold votes to change AI count? -sv_vote_issue_botcount_allowed 1 - -// The voting population required to pass a bot count vote -// min. 0.1 max. 1 -sv_vote_issue_botcount_min_population 0.55 - -// What ratio of the votes needs to be yes to pass? (1 = All votes need to be yes) -// min. 0 max. 1 -sv_vote_issue_botcount_min_ratio 0.5 - -// Can people hold votes to change AI difficulty? -sv_vote_issue_botdifficulty_allowed 1 - -// The voting population required to pass an AI difficulty vote -// min. 0.1 max. 1 -sv_vote_issue_botdifficulty_min_population 0.55 - -// What ratio of the votes needs to be yes to pass? (1 = All votes need to be yes) -// min. 0 max. 1 -sv_vote_issue_botdifficulty_min_ratio 0.5 - -// Can people hold votes to change the gamemode? -sv_vote_issue_changegamemode_allowed 0 - -// Can people hold votes to change levels? -sv_vote_issue_changelevel_allowed 1 - -// If enabled, wait until the end of the round to change levels -sv_vote_issue_changelevel_wait 1 - -// Can people hold votes to kick players from the server? -sv_vote_issue_kick_allowed 1 - -// Can we kick the other team? -sv_vote_issue_kick_other_team 0 - -// Can people hold votes to set the next level? -sv_vote_issue_nextlevel_allowed 1 - -// Allow players to extend the current map? -sv_vote_issue_nextlevel_allowextend 0 - -// Present players with a list of maps to choose from? -sv_vote_issue_nextlevel_choicesmode 1 - -// Not allowed to vote for a nextlevel if one has already been set -sv_vote_issue_nextlevel_prevent_change 1 - -// How many rounds before map voting can begin -sv_vote_issue_nextlevel_round_count_delay 1 - -// The voting population required to pass a next level vote -// min. 0.1 max. 1 -sv_vote_issue_nextlevel_min_population 0.55 - -// How strong does the yes vote need to be to win? (2.0 = 2x more voters) -// min. 1 max. 5 -sv_vote_issue_nextlevel_min_ratio 0.5 - -// Can people hold votes to restart the game? -sv_vote_issue_restart_game_allowed 1 - -// Can people hold votes to restart the round? -sv_vote_issue_restart_round_allowed 1 - -// Can people hold votes to scramble the teams? -sv_vote_issue_scramble_teams_allowed 1 - -// Can people hold votes to switch the teams? -sv_vote_issue_switch_teams_allowed 1 - -// How long should a kick ban last for if a player is kicked for hacking? (minutes) -sv_vote_kick_ban_duration_cheating 240 - -// The voting population required to kick a person for hacking -// min. 0.1 max. 1 -sv_vote_kick_hack_min_population 0.60 - -// What ratio of the votes needs to be yes to pass? (1 = All votes need to be yes) -// min. 0 max. 1 -sv_vote_kick_hack_min_ratio 0.66 - -// How long should a kick vote ban someone from the server? (in minutes) -sv_vote_kick_ban_duration_idle 0 - -// The voting population required to kick a person for being idle -// min. 0.1 max. 1 -sv_vote_kick_idle_min_population 0.20 - -// What ratio of the votes needs to be yes to pass? (1 = All votes need to be yes) -// min. 0 max. 1 -sv_vote_kick_idle_min_ratio 0.5 - -// How long should a kick ban last for if a player is kicked for team killing? (minutes) -sv_vote_kick_ban_duration_teamkilling 10 - -// The voting population required to kick a person for team killing -// min. 0.1 max. 1 -sv_vote_kick_tk_min_population 0.25 - -// What ratio of the votes needs to be yes to pass? (1 = All votes need to be yes) -// min. 0 max. 1 -sv_vote_kick_tk_min_ratio 0.66 - -// How long should a kick ban last for if a player is kicked for trolling? (minutes) -sv_vote_kick_ban_duration_trolling 60 - -// The voting population required to kick a person for trolling -// min. 0.1 max. 1 -sv_vote_kick_troll_min_population 0.40 - -// What ratio of the votes needs to be yes to pass? (1 = All votes need to be yes) -// min. 0 max. 1 -sv_vote_kick_troll_min_ration 0.66 - -// The minimum number of players needed on the server to start a vote kick -sv_vote_kick_min_players 4 - -// Minimum number of vote attempts required to start an actual vote -sv_vote_kick_min_voters 3 - -// The voting population required -// min. 0 max. 1 -sv_vote_min_population 0.55 - -// What ratio of the votes needs to be yes to pass? (1 = All votes need to be yes) -// min. 0 max. 1 -sv_vote_min_ratio 0.55 - -// ............................. Fast Download .............................. // -// info: Allows custom maps to be downloaded to the client. - -// Allows clients to download custom maps and textures etc. from the server at 20 kbps. -// Default: sv_allowdownload 1 -sv_allowdownload 1 - -// Allows clients to download custom maps, textures etc. from a web server with no transfer limit. -// Example: -// server location: maps/custommap.bsp -// web server location: http://example.com/custom/maps/custommap.bsp -// sv_downloadurl "http://example.com/custom" -// Default: sv_downloadurl "" -sv_downloadurl "" - -// ................................ Ban List ............................... // - -// sv_nwi_banlist is the official banlist. -sv_nwi_banlist 1 - -// personal banlist based on user IDs. -exec banned_user.cfg - -// personal banlist based on user IPs. -exec banned_ip.cfg - -writeid -writeip - -// ............................. Server Logging ............................. // - -//Enables logging to file, console, and udp < on | off >. -log on - -// Log server bans in the server logs. -// Default: sv_logbans 1 -sv_logbans 1 - -// Echo log information to the console. -// Default: sv_logecho 1 -sv_logecho 1 - -// Log server information in the log file. -// Default: sv_logfile 1 -sv_logfile 1 - -// Log server information to only one file. -// Default: sv_log_onefile 0 -sv_log_onefile 0 diff --git a/QuakeWorld/cfg/lgsm-default.cfg b/QuakeWorld/cfg/lgsm-default.cfg deleted file mode 100644 index e3da2497b..000000000 --- a/QuakeWorld/cfg/lgsm-default.cfg +++ /dev/null @@ -1,26 +0,0 @@ -// server info -hostname "" // server name shown in server browsers -rcon_password "" -sv_admininfo "lgsm " // admin name shown in server browsers - -// motd (max 15 rows) - this is the welcome message displayed when you connect to a server -set k_motd1 "" -set k_motd2 " " -set k_motd3 "Available game modes:" -set k_motd4 "1on1, 2on2, 4on4, 10on10, ffa, ctf" -//set k_motd5 "line 5" // etc.. - -set k_motd_time "5" // time motd is displayed in seconds - - -// edit the lines below if you want different gamemodes on this port -// matchless mode -set k_matchless 0 // run ktx as a regular match server or as a matchless (ffa) server (0 = regular, 1 = matchless) -set k_use_matchless_dir 1 // use configs/usermodes/matchless instead of [...]/ffa (0 = no, 1 = yes) - -// free modes -set k_defmode 2on2 // default mode on server -set k_allowed_free_modes 255 // allowed free modes (bit mask): - // 1=1on1, 2=2on2, 4=3on3, 8=4on4, 16=10on10, 32=ffa 64=ctf 128=hoonymode -set k_defmap dm4 // server homemap. server will change to this when last player leaves the server -set k_mode 2 // server mode (1 = duel, 2 = team, 3 = ffa, 4 = ctf) From e4fff032c5076642fc85c2a3ac1c49f745d4614a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 21 Dec 2016 17:44:30 +0000 Subject: [PATCH 0039/1895] corrected IP address --- CallOfDuty4/cod4server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server index d77707606..32322ae81 100644 --- a/CallOfDuty4/cod4server +++ b/CallOfDuty4/cod4server @@ -27,7 +27,7 @@ version="161221" defaultmap="mp_crossfire" maxclients="32" port="28960" -ip="138.68.147.159" +ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ From 08761036252fca6bdb465a23b9b6aba407cc0a94 Mon Sep 17 00:00:00 2001 From: cedarlug Date: Fri, 23 Dec 2016 18:49:21 -0600 Subject: [PATCH 0040/1895] Hastebin seems to have gone https-only and changed up their API --- lgsm/functions/command_postdetails.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 330374cf5..524d9a43b 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -17,7 +17,7 @@ postdetails=yes # The options for posttarget are: # The default destination - hastebin -# posttarget="http://hastebin.com" +# posttarget="https://hastebin.com" # # Secondary destination - pastebin # posttarget="http://pastebin.com @@ -31,7 +31,7 @@ postdetails=yes # to post to pastebin, or # rustserver@gamerig:~$ posttarget= ./rustserver pd # to leave the output on the filesystem. -posttarget=${posttarget="http://hastebin.com"} +posttarget=${posttarget="https://hastebin.com"} # For pastebin, you can set the expiration period. # use 1 week as the default, other options are '24h' for a day, etc. @@ -126,16 +126,16 @@ if [ "${posttarget}" == "http://pastebin.com" ] ; then # Output the resulting link. fn_print_ok_nl "Posting details to pastbin.com for ${postexpire}" - echo " * url: ${posttarget}${link}" -elif [ "${posttarget}" == "http://hastebin.com" ] ; then + echo " Please share the following url for support: ${posttarget}${link}" +elif [ "${posttarget}" == "https://hastebin.com" ] ; then fn_print_dots "Posting details to hastebin.com for ${postexpire}" sleep 1 # hastebin is a bit simpler. If successful, the returned result # should look like: {"something":"key"}, putting the reference that # we need in "key". TODO - error handling. -CedarLUG - link=$(curl -s -d "$(<${tmpfile})" "${posttarget}/documents" | cut -d\" -f4) + link=$(curl -H "HTTP_X_REQUESTED_WITH:XMLHttpRequest" -s -d "$(<${tmpfile})" "${posttarget}/documents" | cut -d\" -f4) fn_print_ok_nl "Posting details to hastebin.com for ${postexpire}" - echo " * url: ${posttarget}/${link}" + echo " Please share the following url for support: ${posttarget}/${link}" else fn_print_warn_nl Review the output in "${tmpfile}" core_exit.sh From 7b5515e0a7093722ac7812bc41c9d6ca8e90645f Mon Sep 17 00:00:00 2001 From: cedarlug Date: Fri, 23 Dec 2016 18:53:40 -0600 Subject: [PATCH 0041/1895] Clarifying hastebin post expiration policy --- lgsm/functions/command_postdetails.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 524d9a43b..664b1c66b 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -128,7 +128,7 @@ if [ "${posttarget}" == "http://pastebin.com" ] ; then fn_print_ok_nl "Posting details to pastbin.com for ${postexpire}" echo " Please share the following url for support: ${posttarget}${link}" elif [ "${posttarget}" == "https://hastebin.com" ] ; then - fn_print_dots "Posting details to hastebin.com for ${postexpire}" + fn_print_dots "Posting details to hastebin.com (expires 30 days after last view)" sleep 1 # hastebin is a bit simpler. If successful, the returned result # should look like: {"something":"key"}, putting the reference that From 5471a66dcf12ea7a005f042cd939da6bb87a5c91 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 24 Dec 2016 16:42:55 +0000 Subject: [PATCH 0042/1895] Release 161224 --- 7DaysToDie/sdtdserver | 2 +- ARKSurvivalEvolved/arkserver | 2 +- Arma3/arma3server | 2 +- Battlefield1942/bf1942server | 2 +- BlackMesa/bmdmserver | 2 +- BladeSymphony/bsserver | 2 +- BrainBread2/bb2server | 2 +- CallOfDuty/codserver | 2 +- CallOfDuty2/cod2server | 2 +- CallOfDuty4/cod4server | 2 +- CallOfDutyUnitedOffensive/coduoserver | 2 +- CallOfDutyWorldAtWar/codwawserver | 2 +- CodenameCURE/ccserver | 2 +- CounterStrike/csserver | 2 +- CounterStrikeConditionZero/csczserver | 2 +- CounterStrikeGlobalOffensive/csgoserver | 2 +- CounterStrikeSource/cssserver | 2 +- DayOfDefeat/dodserver | 2 +- DayOfDefeatSource/dodsserver | 2 +- DayOfInfamy/doiserver | 2 +- DeathmatchClassic/dmcserver | 2 +- DontStarveTogether/dstserver | 2 +- DoubleActionBoogaloo/dabserver | 2 +- EmpiresMod/emserver | 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 +- Minecraft/mcserver | 2 +- Mumble/mumbleserver | 2 +- NS2Combat/ns2cserver | 2 +- NaturalSelection2/ns2server | 2 +- NoMoreRoomInHell/nmrihserver | 2 +- OpposingForce/opforserver | 2 +- PiratesVikingandKnightsII/pvkiiserver | 2 +- ProjectZomboid/pzserver | 2 +- Quake2/q2server | 2 +- Quake3/q3server | 2 +- QuakeLive/qlserver | 2 +- QuakeWorld/qwserver | 2 +- RedOrchestra/roserver | 2 +- Ricochet/ricochetserver | 2 +- Rust/rustserver | 2 +- SeriousSam3BFE/ss3sserver | 2 +- Starbound/sbserver | 2 +- SvenCoop/svenserver | 2 +- TeamFortress2/tf2server | 2 +- TeamFortressClassic/tfcserver | 2 +- TeamSpeak3/ts3server | 2 +- Teeworlds/twserver | 2 +- Terraria/terrariaserver | 2 +- UnrealTournament/utserver | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament3/ut3server | 2 +- UnrealTournament99/ut99server | 2 +- WolfensteinEnemyTerritory/wetserver | 2 +- tests/tests_jc2server.sh | 2 +- 65 files changed, 65 insertions(+), 65 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index 1b554719c..1dc5ff4b6 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index f96e49bf2..a7683daf3 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Arma3/arma3server b/Arma3/arma3server index 083e4ea13..54f91c82c 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Battlefield1942/bf1942server b/Battlefield1942/bf1942server index 25ea4291d..16e41986e 100644 --- a/Battlefield1942/bf1942server +++ b/Battlefield1942/bf1942server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index ea25b01f8..54cf8d0e1 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index fed7213e3..ab472f35f 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index ee8f3c4e3..7812e584e 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/CallOfDuty/codserver b/CallOfDuty/codserver index 093c375a6..1fb6daf02 100755 --- a/CallOfDuty/codserver +++ b/CallOfDuty/codserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/CallOfDuty2/cod2server b/CallOfDuty2/cod2server index 48b43b34d..f90fae26b 100755 --- a/CallOfDuty2/cod2server +++ b/CallOfDuty2/cod2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server index 32322ae81..699c3b7ad 100644 --- a/CallOfDuty4/cod4server +++ b/CallOfDuty4/cod4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/CallOfDutyUnitedOffensive/coduoserver b/CallOfDutyUnitedOffensive/coduoserver index 64c6bdfb0..29c1d6776 100755 --- a/CallOfDutyUnitedOffensive/coduoserver +++ b/CallOfDutyUnitedOffensive/coduoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/CallOfDutyWorldAtWar/codwawserver b/CallOfDutyWorldAtWar/codwawserver index bfb080f98..961105a3d 100755 --- a/CallOfDutyWorldAtWar/codwawserver +++ b/CallOfDutyWorldAtWar/codwawserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 8815e7c50..5583d4480 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/CounterStrike/csserver b/CounterStrike/csserver index 0f0ab0665..d161759cf 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index c32332f95..e6831dc3a 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index ef945f4d9..8ab616e5b 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index ddb55ae1c..aae064a3b 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index ac3c70e81..1c4dea80b 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 583035330..f1f23e0b9 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/DayOfInfamy/doiserver b/DayOfInfamy/doiserver index 3a17b0201..ff4e57238 100644 --- a/DayOfInfamy/doiserver +++ b/DayOfInfamy/doiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index 823150526..e9af4107a 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index 857e08da0..8001e4a7d 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 2d889a31b..add4c4256 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/EmpiresMod/emserver b/EmpiresMod/emserver index be6b31e57..8fe3b4164 100644 --- a/EmpiresMod/emserver +++ b/EmpiresMod/emserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index 49c7666cb..314edb0d7 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index c0329bb47..42c220387 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index b41fb6e4f..8ecd7a8c2 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index e806c0ac5..f4da627f3 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index f0085130f..2a8cf8ce7 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index a8441d652..ebe71cc57 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index ca599ac78..b1a6f2a81 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Insurgency/insserver b/Insurgency/insserver index e3a2212a5..dd7f3b6dd 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/JustCause2/jc2server b/JustCause2/jc2server index 3688cbc3c..a49f23584 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index 4d92fbcc3..167348f93 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index eab523850..b3aab5c06 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index 5887be549..a3a5d4166 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Minecraft/mcserver b/Minecraft/mcserver index f7c69ec57..4fbb94103 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index 27b9a55c1..47ca299b7 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index 9b621eaec..d8abe3459 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index 6c68ac06e..55b4876c2 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index 8abbee131..a88526007 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index a36dd83db..c164da28e 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index f1592016e..1fdb643b0 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index a5f295b15..3dcc89927 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Quake2/q2server b/Quake2/q2server index c8c9bfe84..8694b7ec9 100644 --- a/Quake2/q2server +++ b/Quake2/q2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Quake3/q3server b/Quake3/q3server index 078e0502d..5aebdaf1e 100644 --- a/Quake3/q3server +++ b/Quake3/q3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index babb453bd..42e8fca97 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/QuakeWorld/qwserver b/QuakeWorld/qwserver index 3918cc8ba..488103ae4 100644 --- a/QuakeWorld/qwserver +++ b/QuakeWorld/qwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index ffa02313a..9371398fd 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index d5f205db4..4eff098cb 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Rust/rustserver b/Rust/rustserver index 22c489a78..071680a86 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index 170abc607..f4ca338b7 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Starbound/sbserver b/Starbound/sbserver index 09555200a..6fba61b59 100644 --- a/Starbound/sbserver +++ b/Starbound/sbserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/SvenCoop/svenserver b/SvenCoop/svenserver index 039bb1928..e75a16af0 100644 --- a/SvenCoop/svenserver +++ b/SvenCoop/svenserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index d1be35534..f0173fece 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index 3d4c3b3d6..d77647fb0 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index 4352c13bf..aeab10ecc 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Teeworlds/twserver b/Teeworlds/twserver index 8456c64a6..c525a3cc2 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index 564440e32..867dcfd0b 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/UnrealTournament/utserver b/UnrealTournament/utserver index e5c1e13dd..54ec900da 100644 --- a/UnrealTournament/utserver +++ b/UnrealTournament/utserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index 8eb5f1137..751bdf4fa 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/UnrealTournament3/ut3server b/UnrealTournament3/ut3server index 5e96d62f8..aaf89b698 100644 --- a/UnrealTournament3/ut3server +++ b/UnrealTournament3/ut3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index 8de3f2b21..ebf871439 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/WolfensteinEnemyTerritory/wetserver b/WolfensteinEnemyTerritory/wetserver index 2404333c3..30894d50c 100644 --- a/WolfensteinEnemyTerritory/wetserver +++ b/WolfensteinEnemyTerritory/wetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index a03b45e85..4f07338e8 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -17,7 +17,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161221" +version="161224" ########################## ######## Settings ######## From 1d940914ee1a4ba72db5fc21b896129aae65cda4 Mon Sep 17 00:00:00 2001 From: FMU1337 Date: Sat, 31 Dec 2016 10:35:10 +0200 Subject: [PATCH 0043/1895] :) --- CounterStrikeGlobalOffensive/csgoserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 8ab616e5b..e84590702 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -27,7 +27,7 @@ version="161224" # [Game Modes] gametype gamemode # Arms Race 1 0 # Classic Casual 0 0 -# Classic Competitive 0 1 +# Classic Competitive 0 1 # Demolition 1 1 # Deathmatch 1 2 gametype="0" From b3eb67dddd47194e689357161036ac4e46ab7503 Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Tue, 3 Jan 2017 14:49:25 -0500 Subject: [PATCH 0044/1895] update Unreal Tournament Server 3193528 --- lgsm/functions/install_server_files.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 330e4fb40..82f02ce49 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -34,7 +34,7 @@ fn_install_server_files(){ elif [ "${gamename}" == "Unreal Tournament 99" ]; then fileurl="http://files.gameservermanagers.com/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; filedir="${tmpdir}"; filename="ut99-server-451-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" elif [ "${gamename}" == "Unreal Tournament" ]; then - fileurl="http://files.gameservermanagers.com/UnrealTournament/UnrealTournament-Server-XAN-3045522-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3045522-Linux.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="553fed5645a9fc623e92563049bf79f6" + fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Server-XAN-3193528-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3193528-Linux.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="e3dd5853c4eb193674d5c832f60040d8" elif [ "${gamename}" == "Unreal Tournament 3" ]; then fileurl="http://files.gameservermanagers.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; filedir="${tmpdir}"; filename="UT3-linux-server-2.1.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then From c739902811551b9b7682ea7b7969f9eeabac6d41 Mon Sep 17 00:00:00 2001 From: Chaos Date: Tue, 3 Jan 2017 13:51:38 -0600 Subject: [PATCH 0045/1895] Adding Multi Theft Auto Support --- MultiTheftAuto/mtaserver | 161 ++++++++++++++++++++++++ lgsm/functions/command_install.sh | 4 +- lgsm/functions/install_config.sh | 8 +- lgsm/functions/install_mta_resources.sh | 50 ++++++++ lgsm/functions/install_server_files.sh | 2 + 5 files changed, 223 insertions(+), 2 deletions(-) create mode 100644 MultiTheftAuto/mtaserver create mode 100644 lgsm/functions/install_mta_resources.sh diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver new file mode 100644 index 000000000..4e49001a2 --- /dev/null +++ b/MultiTheftAuto/mtaserver @@ -0,0 +1,161 @@ +#!/bin/bash +# San Andreas Multiplayer +# Server Management Script +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="210516" + +#### Variables #### + +# Notification Alerts +# (on|off) + +# Email +emailalert="off" +email="email@example.com" +#emailfrom="email@example.com" + +# Pushbullet +# https://www.pushbullet.com/#settings +pushbulletalert="off" +pushbullettoken="accesstoken" + +# Start Variables +ip="0.0.0.0" +port="22003" + +fn_parms(){ +parms=" " +} + +#### 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="mta" + +# Server Details +servicename="mta-server" +gamename="Multi Theft Auto" +engine="RenderWare" + +# Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +# Server Specific +systemdir="${filesdir}" +resourcesdir="${systemdir}/mods/deathmatch/resources" +executabledir="${systemdir}" +executable="./mta-server64" +servercfg="mtaserver.conf" +servercfgdir="${systemdir}/mods/deathmatch" +servercfgfullpath="${servercfgdir}/${servercfg}" + +# Backups +backupdir="${rootdir}/backups" + +# Logging +logdays="7" +gamelogdir="${filesdir}/mods/deathmatch/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +consolelogging="on" + +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" + +######################## +######## Script ######## +###### Do not edit ##### +######################## + +# 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 -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_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_fetch_core_dl +} + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + +core_dl.sh +core_functions.sh +getopt=$1 +core_getopt.sh diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index a840af48a..e58ed8f6a 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -18,7 +18,7 @@ check_deps.sh if [ "${gamename}" == "Unreal Tournament 2004" ]; then install_server_files.sh install_ut2k4_key.sh -elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament" ]||[ "${gamename}" == "Unreal Tournament 3" ]||[ "${gamename}" == "TeamSpeak 3" ]||[ "${gamename}" == "Mumble" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then +elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament" ]||[ "${gamename}" == "Unreal Tournament 3" ]||[ "${gamename}" == "TeamSpeak 3" ]||[ "${gamename}" == "Mumble" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]||[ "${gamename}" == "Multi Theft Auto" ]; then installer=1 install_server_files.sh elif [ -n "${appid}" ]; then @@ -34,6 +34,8 @@ elif [ "${gamename}" == "Don't Starve Together" ]; then install_dst_token.sh elif [ "${gamename}" == "TeamSpeak 3" ]; then install_ts3db.sh +elif [ "${gamename}" == "Multi Theft Auto" ]; then + install_mta_resources.sh fi fix.sh diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index a9a97423f..e32956b3d 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -488,4 +488,10 @@ elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars -fi \ No newline at end of file +elif [ "${gamename}" == "Multi Theft Auto" ]; then + gamedirname="MultiTheftAuto" + array_configs+=( acl.xml mtaserver.conf vehiclecolors.conf ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars +fi diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh new file mode 100644 index 000000000..042e7e21c --- /dev/null +++ b/lgsm/functions/install_mta_resources.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# LGSM install_ts3db.sh function +# Author: Daniel Gibbs +# Contributor: PhilPhonic +# Website: https://gameservermanagers.com +# Description: Installs the libmysqlclient for database functions on the server and optionally installs default resources required to run the server + +local commandname="INSTALL" +local commandaction="Install" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +fn_install_libmysqlclient16(){ + echo "" + echo "checking if libmysqlclient16 is installed" + echo "=================================" + sleep 1 + ldd /usr/lib/libmysqlclient.so.16 | grep "libmysqlclient.so.16 => not found" + if [ $? -eq 0 ]; then + echo "libmysqlclient16 not installed. Installing.." + fileurl="https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16"; filedir="/usr/lib/"; filename="libmysqlclient.so.16"; executecmd="noexecute" run="norun"; force="noforce"; md5="6c188e0f8fb5d7a29f4bc413b9fed6c2" + fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + fi + echo "libmysqlclient16 installed." +} + +fn_install_resources(){ + echo "" + echo "installing default resources" + echo "=================================" + fileurl="http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip"; filedir="${tempdir}"; filename="multitheftauto_resources.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="97a587509698f7f010bcd6e5c6dd9c31" + fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + fn_dl_extract "${filedir}" "${filename}" "${resourcesdir}" + echo "default resources installed." +} + +fn_install_libmysqlclient16 + +if [ -z "${autoinstall}" ]; then + echo "" + while true; do + read -e -i "n" -p "Do you want to have the default resources downloaded? (Server is inoperable without resources!) [y/N]" yn + case $yn in + [Yy]* ) fn_install_resources && break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac + done +else +fn_print_warning_nl "./${selfname} auto-install does not download the default resources. If you require them use ./${selfname} install" +fi diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 330e4fb40..990dca980 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -39,6 +39,8 @@ fn_install_server_files(){ fileurl="http://files.gameservermanagers.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; filedir="${tmpdir}"; filename="UT3-linux-server-2.1.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fileurl="http://files.gameservermanagers.com/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; filedir="${tmpdir}"; filename="enemy-territory.260b.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" + elif [ "${gamename}" == "Multi Theft Auto" ]; then + fileurl="https://linux.mtasa.com/dl/153/multitheftauto_linux_x64-1.5.3.tar.gz"; filedir="${tempdir}"; filename="multitheftauto_linux_x64-1.5.3.tar.gz"; executecmd="noexecute" run="norun"; force="noforce"; md5="77caf91fe280877a8d21f8046d5f42ba" fi fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" fn_dl_extract "${filedir}" "${filename}" "${filesdir}" From cff49d1cb50b5434044ceae1035b62e884372a61 Mon Sep 17 00:00:00 2001 From: Chaos Date: Tue, 3 Jan 2017 14:04:49 -0600 Subject: [PATCH 0046/1895] Name adjustment --- MultiTheftAuto/mtaserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver index 4e49001a2..c26176d19 100644 --- a/MultiTheftAuto/mtaserver +++ b/MultiTheftAuto/mtaserver @@ -1,5 +1,5 @@ #!/bin/bash -# San Andreas Multiplayer +# Multi Theft Auto # Server Management Script # Author: Daniel Gibbs # Website: https://gameservermanagers.com From 1026922eaa88471723c4ae6c3b2664db9d7fe0c1 Mon Sep 17 00:00:00 2001 From: Chaos Date: Tue, 3 Jan 2017 20:49:50 -0600 Subject: [PATCH 0047/1895] Updated look of server file to match newer versions, updated version number --- MultiTheftAuto/mtaserver | 67 ++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver index c26176d19..7fe082265 100644 --- a/MultiTheftAuto/mtaserver +++ b/MultiTheftAuto/mtaserver @@ -9,32 +9,47 @@ if [ -f ".dev-debug" ]; then set -x fi -version="210516" +version="170103" -#### Variables #### +########################## +######## Settings ######## +########################## -# Notification Alerts -# (on|off) +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +# None Available + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +# Edit with care +fn_parms(){ +parms=" " +} + +#### LinuxGSM Settings #### -# Email +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email emailalert="off" email="email@example.com" -#emailfrom="email@example.com" +emailfrom="" -# Pushbullet -# https://www.pushbullet.com/#settings +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet pushbulletalert="off" pushbullettoken="accesstoken" +channeltag="" -# Start Variables -ip="0.0.0.0" -port="22003" +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" -fn_parms(){ -parms=" " -} +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" -#### Advanced Variables #### +#### LinuxGSM Advanced Settings #### # Github Branch Select # Allows for the use of different function files @@ -43,12 +58,18 @@ githubuser="dgibbs64" githubrepo="linuxgsm" githubbranch="mta" -# Server Details -servicename="mta-server" +## LinuxGSM Server Details +# Do not edit gamename="Multi Theft Auto" engine="RenderWare" -# Directories +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="mta-server" + +#### Directories #### +# Edit with care + +## Work Directories rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" @@ -58,7 +79,7 @@ libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" filesdir="${rootdir}/serverfiles" -# Server Specific +## Server Specific Directories systemdir="${filesdir}" resourcesdir="${systemdir}/mods/deathmatch/resources" executabledir="${systemdir}" @@ -67,20 +88,18 @@ servercfg="mtaserver.conf" servercfgdir="${systemdir}/mods/deathmatch" servercfgfullpath="${servercfgdir}/${servercfg}" -# Backups +## Backup Directory backupdir="${rootdir}/backups" -# Logging -logdays="7" +## Logging Directories gamelogdir="${filesdir}/mods/deathmatch/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" -consolelogging="on" - scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${scriptlogdir}/${servicename}-email.log" +## Logs Naming scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" From 3b9ec2b1a4995af5b5b6426594bc7bf2be459cea Mon Sep 17 00:00:00 2001 From: Chaos Date: Tue, 3 Jan 2017 20:56:35 -0600 Subject: [PATCH 0048/1895] Fixes Steam Login fail when password includes a '$' --- lgsm/functions/check_steamcmd.sh | 2 +- lgsm/functions/command_validate.sh | 4 ++-- lgsm/functions/install_server_files.sh | 10 +++++----- lgsm/functions/update_steamcmd.sh | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 20a36afea..79c016b58 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -58,7 +58,7 @@ fn_check_steamcmd_sh(){ 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 + "${steamcmddir}"/steamcmd.sh +login "${steamuser}" '${steampass}' +quit if [ $? -ne 0 ]; then fn_print_failure_nl "Error running SteamCMD" fi diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 0037185b4..8b55aaae9 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -24,9 +24,9 @@ fn_validation(){ fi if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" fi if [ $? != 0 ]; then fn_print_fail_nl "Validating files: SteamCMD" diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 330e4fb40..7d0aa48d3 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -78,18 +78,18 @@ fn_install_server_files_steamcmd(){ 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}" ${branch} +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +quit local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} +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}" ${branch} -validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} -validate +quit local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} -validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} -validate +quit local exitcode=$? fi fi @@ -107,7 +107,7 @@ fn_install_server_files_steamcmd(){ 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}" ${branch} -validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} -validate +quit local exitcode=$? done fi diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 167daf5fb..d2808974c 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -26,9 +26,9 @@ fn_update_steamcmd_dl(){ fi if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" fi fix.sh @@ -156,7 +156,7 @@ fn_update_steamcmd_check(){ fi # Gets availablebuild info - 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+\"${branchname}\"$" | grep -m 1 -EB 10 "^\s+}$" | grep -E "^\s+\"buildid\"\s+" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) + 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+\"${branchname}\"$" | 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" sleep 1 From d7bcd4bad3408ed0b57258bae029ae8f9b5d44f6 Mon Sep 17 00:00:00 2001 From: Chaos Date: Wed, 4 Jan 2017 22:26:45 -0600 Subject: [PATCH 0049/1895] Typo in the install file --- lgsm/functions/install_server_files.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 990dca980..d25b1e451 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -40,7 +40,7 @@ fn_install_server_files(){ elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fileurl="http://files.gameservermanagers.com/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; filedir="${tmpdir}"; filename="enemy-territory.260b.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" elif [ "${gamename}" == "Multi Theft Auto" ]; then - fileurl="https://linux.mtasa.com/dl/153/multitheftauto_linux_x64-1.5.3.tar.gz"; filedir="${tempdir}"; filename="multitheftauto_linux_x64-1.5.3.tar.gz"; executecmd="noexecute" run="norun"; force="noforce"; md5="77caf91fe280877a8d21f8046d5f42ba" + fileurl="https://linux.mtasa.com/dl/153/multitheftauto_linux_x64-1.5.3.tar.gz"; filedir="${tmpdir}"; filename="multitheftauto_linux_x64-1.5.3.tar.gz"; executecmd="noexecute" run="norun"; force="noforce"; md5="77caf91fe280877a8d21f8046d5f42ba" fi fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" fn_dl_extract "${filedir}" "${filename}" "${filesdir}" From c1f781ea18701d22f58906dde25dfd3b06276f14 Mon Sep 17 00:00:00 2001 From: Chaos Date: Wed, 4 Jan 2017 23:08:21 -0600 Subject: [PATCH 0050/1895] Added the mta resources to the core_functions script --- 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 ae1b436ea..a7f5e2805 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -554,6 +554,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +install_mta_resources.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + # Calls the global Ctrl-C trap core_trap.sh From 784a6ff26892fb5ab5562de4982fa774be029755 Mon Sep 17 00:00:00 2001 From: Chaos Date: Wed, 4 Jan 2017 23:08:54 -0600 Subject: [PATCH 0051/1895] Check if configuration directory exists before downloading and moving config files --- lgsm/functions/install_config.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index e32956b3d..724d88aab 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -490,6 +490,7 @@ elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fn_set_config_vars elif [ "${gamename}" == "Multi Theft Auto" ]; then gamedirname="MultiTheftAuto" + fn_check_cfgdir array_configs+=( acl.xml mtaserver.conf vehiclecolors.conf ) fn_fetch_default_config fn_default_config_remote From b6d0888a1b47af542f36aaa8657bfc1325f23fd9 Mon Sep 17 00:00:00 2001 From: Chaos Date: Wed, 4 Jan 2017 23:23:19 -0600 Subject: [PATCH 0052/1895] Improved formatting of the mta_resource install --- lgsm/functions/install_mta_resources.sh | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index 042e7e21c..97d17c940 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_ts3db.sh function +# LGSM install_mta_resources.sh function # Author: Daniel Gibbs # Contributor: PhilPhonic # Website: https://gameservermanagers.com @@ -11,11 +11,10 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_install_libmysqlclient16(){ echo "" - echo "checking if libmysqlclient16 is installed" + echo "Checking if libmysqlclient16 is installed" echo "=================================" sleep 1 - ldd /usr/lib/libmysqlclient.so.16 | grep "libmysqlclient.so.16 => not found" - if [ $? -eq 0 ]; then + if [ ! -f /usr/lib/libmysqlclient.so.16 ]; then echo "libmysqlclient16 not installed. Installing.." fileurl="https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16"; filedir="/usr/lib/"; filename="libmysqlclient.so.16"; executecmd="noexecute" run="norun"; force="noforce"; md5="6c188e0f8fb5d7a29f4bc413b9fed6c2" fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" @@ -25,12 +24,12 @@ fn_install_libmysqlclient16(){ fn_install_resources(){ echo "" - echo "installing default resources" + echo "Installing Default Resources" echo "=================================" - fileurl="http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip"; filedir="${tempdir}"; filename="multitheftauto_resources.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="97a587509698f7f010bcd6e5c6dd9c31" + fileurl="http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip"; filedir="${tmpdir}"; filename="multitheftauto_resources.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="97a587509698f7f010bcd6e5c6dd9c31" fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" fn_dl_extract "${filedir}" "${filename}" "${resourcesdir}" - echo "default resources installed." + echo "Default Resources Installed." } fn_install_libmysqlclient16 From 410530ae1e802c4a85ca970b92b46c3469de82c2 Mon Sep 17 00:00:00 2001 From: Chaos Date: Thu, 5 Jan 2017 00:35:47 -0600 Subject: [PATCH 0053/1895] Custom opt --- lgsm/functions/core_getopt.sh | 62 +++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 03aa7359a..86dbdbc73 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -697,6 +697,66 @@ case "${getopt}" in esac } +fn_getopt_renderware(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.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|detect-deps) + command_dev_detect_deps.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful information about the server." + echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + } | column -s $'\t' -t + esac +} + if [ "${gamename}" == "Mumble" ]; then fn_getopt_mumble elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then @@ -717,6 +777,8 @@ elif [ "${engine}" == "unreal2" ]; then fi elif [ "${engine}" == "unreal" ]; then fn_getopt_unreal +elif [ "${engine}" == "RenderWare" ]; then + fn_getopt_renderware else fn_getopt_generic fi From 9052fbb13902ac86cd6d3a53365394218d972fe7 Mon Sep 17 00:00:00 2001 From: Chaos Date: Thu, 5 Jan 2017 00:36:45 -0600 Subject: [PATCH 0054/1895] Changes to how the mysqlclient gets installed, if user cannot use sudo it will warn the user about doing it after the installation --- lgsm/functions/install_mta_resources.sh | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index 97d17c940..1fc11171a 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -15,11 +15,20 @@ fn_install_libmysqlclient16(){ echo "=================================" sleep 1 if [ ! -f /usr/lib/libmysqlclient.so.16 ]; then - echo "libmysqlclient16 not installed. Installing.." - fileurl="https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16"; filedir="/usr/lib/"; filename="libmysqlclient.so.16"; executecmd="noexecute" run="norun"; force="noforce"; md5="6c188e0f8fb5d7a29f4bc413b9fed6c2" - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + fn_print_warn "libmysqlclient16 not installed. Installing.." + sleep 1 + sudo -v > /dev/null 2>&1 + if [ $? -eq 0 ]; then + fileurl="https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16"; filedir="${tmpdir}"; filename="libmysqlclient.so.16"; executecmd="executecmd" run="norun"; force="noforce"; md5="6c188e0f8fb5d7a29f4bc413b9fed6c2" + fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + sudo mv ${tmpdir}/${filename} /usr/lib/${filename} + else + fn_print_fail_nl "Failed to install libmysqlclient16, $(whoami) does not have sudo access. Download it manually and place it in /usr/lib" + sleep 1 + fi + else + echo "libmysqlclient16 already installed." fi - echo "libmysqlclient16 installed." } fn_install_resources(){ @@ -37,7 +46,7 @@ fn_install_libmysqlclient16 if [ -z "${autoinstall}" ]; then echo "" while true; do - read -e -i "n" -p "Do you want to have the default resources downloaded? (Server is inoperable without resources!) [y/N]" yn + read -e -i "y" -p "Do you want to have the default resources downloaded? (Server is inoperable without resources!) [y/N]" yn case $yn in [Yy]* ) fn_install_resources && break;; [Nn]* ) break;; From f2cccf0bdd832d53102f0dfc08dcd10d655e44d5 Mon Sep 17 00:00:00 2001 From: Chaos Date: Thu, 5 Jan 2017 00:40:16 -0600 Subject: [PATCH 0055/1895] Appearance change --- lgsm/functions/install_mta_resources.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index 1fc11171a..8d3074f45 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -15,7 +15,7 @@ fn_install_libmysqlclient16(){ echo "=================================" sleep 1 if [ ! -f /usr/lib/libmysqlclient.so.16 ]; then - fn_print_warn "libmysqlclient16 not installed. Installing.." + fn_print_warn_nl "libmysqlclient16 not installed. Installing.." sleep 1 sudo -v > /dev/null 2>&1 if [ $? -eq 0 ]; then From f2d8752de72240e363eb35cc627a99568863553a Mon Sep 17 00:00:00 2001 From: Chaos Date: Thu, 5 Jan 2017 00:50:52 -0600 Subject: [PATCH 0056/1895] Dependencies changed for MTA --- lgsm/functions/check_deps.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 36e0a8f04..0279a9ede 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -158,8 +158,8 @@ if [ -n "$(command -v dpkg-query)" ]; then fi fi - # All servers except ts3,mumble and minecraft servers require libstdc++6 and lib32gcc1 - if [ "${gamename}" != "TeamSpeak 3" ]&&[ "${gamename}" != "Mumble" ]&&[ "${engine}" != "lwjgl2" ]; then + # All servers except ts3,mumble,multitheftauto and minecraft servers require libstdc++6 and lib32gcc1 + if [ "${gamename}" != "TeamSpeak 3" ]&&[ "${gamename}" != "Mumble" ]&&[ "${engine}" != "lwjgl2" ]&&[ "${engine}" != "RenderWare" ]; then if [ "${arch}" == "x86_64" ]; then array_deps_required+=( lib32gcc1 libstdc++6:i386 ) else @@ -238,8 +238,8 @@ elif [ -n "$(command -v yum)" ]; then fi fi - # All servers except ts3,mumble and minecraft servers require glibc.i686 and libstdc++.i686 - if [ "${gamename}" != "TeamSpeak 3" ]&&[ "${gamename}" != "Mumble" ]&&[ "${engine}" != "lwjgl2" ]; then + # All servers except ts3,mumble,multitheftauto and minecraft servers require glibc.i686 and libstdc++.i686 + if [ "${gamename}" != "TeamSpeak 3" ]&&[ "${gamename}" != "Mumble" ]&&[ "${engine}" != "lwjgl2" ]&&[ "${engine}" != "RenderWare" ]; then array_deps_required+=( glibc.i686 libstdc++.i686 ) fi From 5ed99c9943788d4be0ad5a78fcbd3a4db8eb336f Mon Sep 17 00:00:00 2001 From: Chaos Date: Thu, 5 Jan 2017 01:14:46 -0600 Subject: [PATCH 0057/1895] Strip components flag on the gzip extractions. Required for the way MTA compresses it's archives. --- 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 6d971b997..e7f73621c 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -58,7 +58,7 @@ fn_dl_extract(){ mime=$(file -b --mime-type "${filedir}/${filename}") if [ "${mime}" == "application/gzip" ]||[ "${mime}" == "application/x-gzip" ]; then - tarcmd=$(tar -zxf "${filedir}/${filename}" -C "${extractdir}") + tarcmd=$(tar -zxf "${filedir}/${filename}" -C "${extractdir}" --strip-components=1) elif [ "${mime}" == "application/x-bzip2" ]; then tarcmd=$(tar -jxf "${filedir}/${filename}" -C "${extractdir}") elif [ "${mime}" == "application/zip" ]; then From 8949b3d3de51357a4abeffabfdc58d622c80e9a2 Mon Sep 17 00:00:00 2001 From: Chaos Date: Thu, 5 Jan 2017 11:17:23 -0600 Subject: [PATCH 0058/1895] Do not require glibc --- lgsm/functions/info_glibc.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 951adefd7..d9529995b 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -131,6 +131,9 @@ elif [ "${engine}" == "refractor" ]; then elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then glibcrequired="2.2.4" glibcfix="no" +elif [ "${gamename}" == "Multi Theft Auto" ]; then + glibcrequired="NOT REQUIRED" + glibcfix="no" else glibcrequired="UNKNOWN" glibcfix="no" From 631dab60ad375ba153e8aeab1fd3275b17df9955 Mon Sep 17 00:00:00 2001 From: Chaos Date: Thu, 5 Jan 2017 12:35:18 -0600 Subject: [PATCH 0059/1895] command details --- lgsm/functions/command_details.sh | 24 +++++++++++++++++++-- lgsm/functions/info_config.sh | 36 ++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 9d9d8fddc..3be04f541 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -168,6 +168,11 @@ fn_details_gameserver(){ echo -e "${blue}dbplugin:\t${default}${dbplugin}" fi + # ASE (Multi Theft Auto) + if [ -n "${ase}" ]; then + echo -e "${blue}ASE:\t${default}${ase}" + fi + # Online status if [ "${status}" == "0" ]; then echo -e "${blue}Status:\t${red}OFFLINE${default}" @@ -310,7 +315,7 @@ fn_details_ports(){ parmslocation="${red}UNKNOWN${default}" # engines that require editing in the config file - local ports_edit_array=( "avalanche" "dontstarve" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "projectzomboid" "quake" "refractor" "realvirtuality" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" ) + local ports_edit_array=( "avalanche" "dontstarve" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "projectzomboid" "quake" "refractor" "realvirtuality" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" "RenderWare" ) for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then @@ -701,6 +706,19 @@ fn_details_ark(){ } | column -s $'\t' -t } +fn_details_mta(){ + echo -e "netstat -atunp | grep mta-server64" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL\tINI VARIABLE" + echo -e "> Game\tOUTBOUND\t${port}\tudp\tPort=${port}" + echo -e "> HTTP Server\tINBOUND\t${httpport}\ttcp" + if [ "${ase}" == "Enabled" ]; then + echo -e "> ASE Game_Monitor\tOUTBOUND\t$((${port} + 123))\tudp" + fi + } | column -s $'\t' -t +} + # Run checks and gathers details to display. fn_display_details() { @@ -716,7 +734,7 @@ fn_display_details() { fn_details_script 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" ]&&[ "${engine}" != "RenderWare" ]; then fn_parms fn_details_commandlineparms fi @@ -783,6 +801,8 @@ fn_display_details() { fn_details_rust elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fn_details_wolfensteinenemyterritory + elif [ "${gamename}" == "Multi Theft Auto" ]; then + fn_details_mta else fn_print_error_nl "Unable to detect server engine." fi diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 829bba841..a5fbf1a40 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -576,6 +576,38 @@ fn_info_config_sdtd(){ fi } +fn_info_config_mta(){ + if [ ! -f "${servercfgfullpath}" ]; then + port="${unavailable}" + httpport="${unavailable}" + ase="${unavailable}" + servername="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" + else + port=$(grep -m 1 "serverport" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') + httpport=$(grep -m 1 "httpport" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') + ase=$(grep -m 1 "ase" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') + servername=$(grep -m 1 "servername" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<") + serverpassword=$(grep -m 1 "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<") + maxplayers=$(grep -m 1 "maxplayers" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') + + if [ "${ase}" == "1" ]; then + ase="Enabled" + else + ase="Disabled" + fi + + # Not Set + port=${port:-"NOT SET - Defaults to 22003"} + httpport=${httpport:-"NOT SET - Defaults to 22005"} + ase=${ase:-"NOT SET - Defaults to Disabled"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET - Defaults to none"} + maxplayers=${maxplayers:-"0"} + fi +} + # Just Cause 2 if [ "${engine}" == "avalanche" ]; then fn_info_config_avalanche @@ -643,4 +675,6 @@ elif [ "${gamename}" == "7 Days To Die" ]; then fn_info_config_sdtd elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fn_info_config_wolfensteinenemyterritory -fi \ No newline at end of file +elif [ "${gamename}" == "Multi Theft Auto" ]; then + fn_info_config_mta +fi From 0a361905501f42100cb4e32c776b0566c3a40bc4 Mon Sep 17 00:00:00 2001 From: Chaos Date: Thu, 5 Jan 2017 12:35:26 -0600 Subject: [PATCH 0060/1895] Graceful stop --- lgsm/functions/command_stop.sh | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index c5483a864..4175ee5dd 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -172,6 +172,34 @@ fn_stop_graceful_minecraft(){ fn_stop_tmux } +# Attempts graceful of mta using rcon 'quit' command. +fn_stop_graceful_mta(){ + fn_print_dots "Graceful: console quit" + fn_script_log_info "Graceful: console quit" + # sends quit + tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 + # waits up to 120 seconds giving the server time to shutdown gracefuly, we need a long wait time here as resources are stopped individually and process their own shutdowns + for seconds in {1..120}; do + check_status.sh + if [ "${status}" == "0" ]; then + fn_print_ok "Graceful: console quit: ${seconds}: " + fn_print_ok_eol_nl + fn_script_log_pass "Graceful: console quit: OK: ${seconds} seconds" + break + fi + sleep 1 + fn_print_dots "Graceful: console quit: ${seconds}" + done + check_status.sh + if [ "${status}" != "0" ]; then + fn_print_error "Graceful: console quit: " + fn_print_fail_eol_nl + fn_script_log_error "Graceful: console quit: FAIL" + fi + sleep 1 + fn_stop_tmux +} + fn_stop_graceful_select(){ if [ "${gamename}" == "7 Days To Die" ]; then fn_stop_graceful_sdtd @@ -181,6 +209,8 @@ fn_stop_graceful_select(){ fn_stop_graceful_goldsource elif [ "${engine}" == "lwjgl2" ]; then fn_stop_graceful_minecraft + elif [ "${engine}" == "RenderWare" ]; then + fn_stop_graceful_mta else fn_stop_tmux fi From de2ccb3423e1ce64acfd5b369bd78266412584bc Mon Sep 17 00:00:00 2001 From: Chaos Date: Thu, 5 Jan 2017 12:35:35 -0600 Subject: [PATCH 0061/1895] Ready for master! --- MultiTheftAuto/mtaserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver index 7fe082265..07ac899f0 100644 --- a/MultiTheftAuto/mtaserver +++ b/MultiTheftAuto/mtaserver @@ -56,7 +56,7 @@ logdays="7" # from a different repo and/or branch. githubuser="dgibbs64" githubrepo="linuxgsm" -githubbranch="mta" +githubbranch="master" ## LinuxGSM Server Details # Do not edit From a9999f7d36d71ed31e32b87d64dd71a886231a75 Mon Sep 17 00:00:00 2001 From: Chaos Date: Thu, 5 Jan 2017 13:14:38 -0600 Subject: [PATCH 0062/1895] Header change --- lgsm/functions/install_mta_resources.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index 8d3074f45..c1f16393a 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -1,7 +1,7 @@ #!/bin/bash # LGSM install_mta_resources.sh function # Author: Daniel Gibbs -# Contributor: PhilPhonic +# Contributor: ChaosMTA # Website: https://gameservermanagers.com # Description: Installs the libmysqlclient for database functions on the server and optionally installs default resources required to run the server From e18c0d4489db0706f84c2b4ebed2620f83d2b99d Mon Sep 17 00:00:00 2001 From: Chaos Date: Thu, 5 Jan 2017 15:36:16 -0600 Subject: [PATCH 0063/1895] Add unzip to required dependencies for LGSM --- lgsm/functions/check_deps.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 36e0a8f04..7d02097a4 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -147,7 +147,7 @@ if [ -n "$(command -v dpkg-query)" ]; then array_deps_missing=() # LGSM requirements - array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python bzip2 gzip ) + array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python bzip2 gzip unzip ) # All servers except ts3 require tmux if [ "${gamename}" != "TeamSpeak 3" ]; then @@ -224,9 +224,9 @@ elif [ -n "$(command -v yum)" ]; then # LGSM requirements if [ "${distroversion}" == "6" ]; then - array_deps_required=( curl wget util-linux-ng python file gzip bzip2 ) + array_deps_required=( curl wget util-linux-ng python file gzip bzip2 unzip ) else - array_deps_required=( curl wget util-linux python file gzip bzip2 ) + array_deps_required=( curl wget util-linux python file gzip bzip2 unzip ) fi # All servers except ts3 require tmux From 257ba88d7b6b286b4afe90e5c3ced7131aba6f91 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 6 Jan 2017 21:16:26 +0000 Subject: [PATCH 0064/1895] Updated fctrserver to match new style --- Factorio/fctrserver | 187 +++++++++++++++++++++++++++----------------- 1 file changed, 114 insertions(+), 73 deletions(-) diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 6ef50a96a..8ab14b1b2 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -1,57 +1,85 @@ #!/bin/bash -# Factorio -# Server Management Script +# Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# Contributor: Kristian Polso +# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# Purpose: Empires Mod | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki # Website: https://gameservermanagers.com + +# Debugging if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x fi -version="171016" +version="161224" -#### Variables #### +########################## +######## Settings ######## +########################## -# Notification Alerts -# (on|off) +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +port="34197" +rconport="34198" +rconpassword="factorio" +ip="0.0.0.0" +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +# Edit with care +fn_parms(){ +parms="--start-server ${filesdir}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" +} + +#### LinuxGSM Settings #### -# Email +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email emailalert="off" email="email@example.com" -#emailfrom="email@example.com" +emailfrom="" -# Pushbullet -# https://www.pushbullet.com/#settings +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet pushbulletalert="off" pushbullettoken="accesstoken" +channeltag="" -# Server settings -# More settings available after install in serverfiles/data/server-settings.json +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update updateonstart="off" -port="34197" -rconport="34198" -rconpassword="factorio" -fn_parms(){ -parms="--start-server ${filesdir}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" -} +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" -#### Advanced Variables #### +#### LinuxGSM Advanced Settings #### -# Github Branch Select +## Github Branch Select # Allows for the use of different function files # from a different repo and/or branch. -githubuser="Krisseck" +githubuser="GameServerManagers" githubrepo="LinuxGSM" -githubbranch="master" +githubbranch="feature/factorio" -# Server Details +## LinuxGSM Server Details +# Do not edit gamename="Factorio" +engine="" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers servicename="fctr-server" -# Directories +#### Directories #### +# Edit with care + +## Work Directories rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" @@ -60,31 +88,34 @@ functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" filesdir="${rootdir}/serverfiles" + +## Server Specific Directories systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./bin/x64/factorio" -servercfg="data/server-settings.json" -servercfgdefault="data/server-settings.example.json" -servercfgdir="${filesdir}" +executabledir="${filesdir}/bin/x64" +executable="./factorio" +servercfg="server-settings.json" +servercfgdefault="server-settings.json" +servercfgdir="${filesdir}/data/" servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory backupdir="${rootdir}/backups" -# Logging -logdays="7" -gamelogdir="${rootdir}/log" +## Logging Directories scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" -consolelogging="on" - scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${scriptlogdir}/${servicename}-email.log" -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" -##### Script ##### -# Do not edit +######################## +######## Script ######## +###### Do not edit ##### +######################## # Fetches core_dl for file downloads fn_fetch_core_dl(){ @@ -95,36 +126,36 @@ 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}" + 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}" } @@ -141,8 +172,18 @@ functionfile="${FUNCNAME}" fn_fetch_core_dl } +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + core_dl.sh core_functions.sh - getopt=$1 core_getopt.sh \ No newline at end of file From f8b88a8a3e777b857ad47fba258c9882510db20e Mon Sep 17 00:00:00 2001 From: Chaos Date: Fri, 6 Jan 2017 20:17:00 -0600 Subject: [PATCH 0065/1895] Refreshes the package list after adding i386 architecture --- lgsm/functions/check_deps.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 36e0a8f04..7986f6b0c 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -92,7 +92,7 @@ fn_found_missing_deps(){ sleep 1 echo -en " \r" if [ -n "$(command -v dpkg-query)" ]; then - cmd="sudo dpkg --add-architecture i386; sudo apt-get -y install ${array_deps_missing[@]}" + cmd="sudo dpkg --add-architecture i386; sudo apt-get update; sudo apt-get -y install ${array_deps_missing[@]}" eval ${cmd} elif [ -n "$(command -v yum)" ]; then cmd="sudo yum -y install ${array_deps_missing[@]}" @@ -110,7 +110,7 @@ fn_found_missing_deps(){ fn_print_warning_nl "$(whoami) does not have sudo access. Manually install dependencies." fn_script_log_warn "$(whoami) does not have sudo access. Manually install dependencies." if [ -n "$(command -v dpkg-query)" ]; then - echo " sudo dpkg --add-architecture i386; sudo apt-get install ${array_deps_missing[@]}" + echo " sudo dpkg --add-architecture i386; sudo apt-get update; sudo apt-get install ${array_deps_missing[@]}" elif [ -n "$(command -v yum)" ]; then echo " sudo yum install ${array_deps_missing[@]}" fi From 352bd068877fc63a7fc711896fd6b7f1f5117322 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 14:20:28 +0000 Subject: [PATCH 0066/1895] Various minor changes --- Factorio/fctrserver | 1 + lgsm/functions/command_details.sh | 6 ++-- lgsm/functions/install_config.sh | 6 +++- lgsm/functions/install_factorio_save.sh | 3 +- lgsm/functions/update_factorio.sh | 44 ++++++++++++------------- 5 files changed, 32 insertions(+), 28 deletions(-) diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 8ab14b1b2..5a1e0fc91 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -102,6 +102,7 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${rootdir}/backups" ## Logging Directories +gamelogdir="${filesdir}" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" scriptlog="${scriptlogdir}/${servicename}-script.log" diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 8853b30ee..bb84bf396 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -309,7 +309,7 @@ fn_details_ports(){ echo -e "Change ports by editing the parameters in:" parmslocation="${red}UNKNOWN${default}" - # engines that require editing in the config file + # engines/games that require editing in the config file local ports_edit_array=( "avalanche" "dontstarve" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "projectzomboid" "quake" "refractor" "realvirtuality" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" ) for port_edit in "${ports_edit_array[@]}" do @@ -317,8 +317,8 @@ fn_details_ports(){ parmslocation="${servercfgfullpath}" fi done - # engines that require editing in the script file - local ports_edit_array=( "Factorio" "goldsource" "Hurtworld" "iw3.0" "Rust" "spark" "source" "starbound" "unreal4" ) + # engines/games that require editing in the script file + local ports_edit_array=( "goldsource" "Factorio" "Hurtworld" "iw3.0" "Rust" "spark" "source" "starbound" "unreal4" ) for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 5e58aebbe..10a7040d2 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -262,7 +262,11 @@ elif [ "${gamename}" == "Double Action: Boogaloo" ]; then fn_default_config_remote fn_set_config_vars elif [ "${gamename}" == "Factorio" ]; then - : + gamedirname="Factorio" + array_configs+=( server-settings.json ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Fistful of Frags" ]; then gamedirname="FistfulofFrags" array_configs+=( server.cfg ) diff --git a/lgsm/functions/install_factorio_save.sh b/lgsm/functions/install_factorio_save.sh index 8a9850818..8cb28b326 100644 --- a/lgsm/functions/install_factorio_save.sh +++ b/lgsm/functions/install_factorio_save.sh @@ -11,5 +11,4 @@ echo "" echo "Creating initial Factorio savefile" echo "=================================" sleep 1 -${filesdir}/bin/x64/factorio --create ${filesdir}/save1 -cp ${filesdir}/data/server-settings.example.json ${filesdir}/data/server-settings.json +"${executabledir}"/factorio --create ${filesdir}/save1 diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 8122678a0..7535358f6 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -16,7 +16,7 @@ fn_update_factorio_dl(){ fn_script_log "Copying to ${filesdir}" cp -R "${tmpdir}/factorio/"* "${filesdir}" local exitcode=$? - if [ ${exitcode} -eq 0 ]; then + if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl else fn_print_fail_eol_nl @@ -27,13 +27,13 @@ fn_update_factorio_currentbuild(){ # Gets current build info # Checks if current build info is available. If it fails, then a server restart will be forced to generate logs. if [ ! -f "${consolelogdir}/${servicename}-console.log" ]; then - fn_print_error "Checking for update: Factorio.com" + fn_print_error "Checking for update: factorio.com" sleep 1 - fn_print_error_nl "Checking for update: Factorio.com: No logs with server version found" - fn_script_log_error "Checking for update: Factorio.com: No logs with server version found" + fn_print_error_nl "Checking for update: factorio.com: No logs with server version found" + fn_script_log_error "Checking for update: factorio.com: No logs with server version found" sleep 1 - fn_print_info_nl "Checking for update: Factorio.com: Forcing server restart" - fn_script_log_info "Checking for update: Factorio.com: Forcing server restart" + fn_print_info_nl "Checking for update: factorio.com: Forcing server restart" + fn_script_log_info "Checking for update: factorio.com: Forcing server restart" sleep 1 exitbypass=1 command_stop.sh @@ -42,8 +42,8 @@ fn_update_factorio_currentbuild(){ sleep 1 # Check again and exit on failure. if [ ! -f "${consolelogdir}/${servicename}-console.log" ]; then - fn_print_fail_nl "Checking for update: Factorio.com: Still No logs with server version found" - fn_script_log_fatal "Checking for update: Factorio.com: Still No logs with server version found" + fn_print_fail_nl "Checking for update: factorio.com: Still No logs with server version found" + fn_script_log_fatal "Checking for update: factorio.com: Still No logs with server version found" core_exit.sh fi fi @@ -51,19 +51,19 @@ fn_update_factorio_currentbuild(){ # Get current build from logs currentbuild=$(cat "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null | sort | grep -oP '(?<=Factorio ).*?(?= \()') if [ -z "${currentbuild}" ]; then - fn_print_error_nl "Checking for update: Factorio.com: Current build version not found" - fn_script_log_error "Checking for update: Factorio.com: Current build version not found" + fn_print_error_nl "Checking for update: factorio.com: Current build version not found" + fn_script_log_error "Checking for update: factorio.com: Current build version not found" sleep 1 - fn_print_info_nl "Checking for update: Factorio.com: Forcing server restart" - fn_script_log_info "Checking for update: Factorio.com: Forcing server restart" + fn_print_info_nl "Checking for update: factorio.com: Forcing server restart" + fn_script_log_info "Checking for update: factorio.com: Forcing server restart" exitbypass=1 command_stop.sh exitbypass=1 command_start.sh currentbuild=$(cat "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null | sort | grep -oP '(?<=Factorio ).*?(?= /)') if [ -z "${currentbuild}" ]; then - fn_print_fail_nl "Checking for update: Factorio.com: Current build version still not found" - fn_script_log_fatal "Checking for update: Factorio.com: Current build version still not found" + fn_print_fail_nl "Checking for update: factorio.com: Current build version still not found" + fn_script_log_fatal "Checking for update: factorio.com: Current build version still not found" core_exit.sh fi fi @@ -81,14 +81,14 @@ fn_update_factorio_availablebuild(){ # Checks if availablebuild variable has been set if [ -z "${availablebuild}" ]; then - fn_print_fail "Checking for update: Factorio.com" + fn_print_fail "Checking for update: factorio.com" sleep 1 - fn_print_fail "Checking for update: Factorio.com: Not returning version info" - fn_script_log_fatal "Failure! Checking for update: Factorio.com: Not returning version info" + fn_print_fail "Checking for update: factorio.com: Not returning version info" + fn_script_log_fatal "Failure! Checking for update: factorio.com: Not returning version info" core_exit.sh else - fn_print_ok "Checking for update: Factorio.com" - fn_script_log_pass "Checking for update: Factorio.com" + fn_print_ok "Checking for update: factorio.com" + fn_script_log_pass "Checking for update: factorio.com" sleep 1 fi } @@ -155,9 +155,9 @@ if [ "${installer}" == "1" ]; then fn_update_factorio_availablebuild fn_update_factorio_dl else - # Checks for server update from github.com - fn_print_dots "Checking for update: github.com" - fn_script_log_info "Checking for update: github.com" + # Checks for server update from factorio.com + fn_print_dots "Checking for update: factorio.com" + fn_script_log_info "Checking for update: factorio.com" sleep 1 fn_update_factorio_currentbuild fn_update_factorio_availablebuild From 9b3afbc1b529fc9188ba6c083ad5341fc2ca8fae Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 14:37:41 +0000 Subject: [PATCH 0067/1895] Fixed updater no longer detecting currentversion --- lgsm/functions/update_factorio.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 7535358f6..0b9191555 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -49,7 +49,7 @@ fn_update_factorio_currentbuild(){ fi # Get current build from logs - currentbuild=$(cat "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null | sort | grep -oP '(?<=Factorio ).*?(?= \()') + currentbuild=$(grep "Loading mod base" "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null|awk '{print $5}') if [ -z "${currentbuild}" ]; then fn_print_error_nl "Checking for update: factorio.com: Current build version not found" fn_script_log_error "Checking for update: factorio.com: Current build version not found" @@ -60,7 +60,7 @@ fn_update_factorio_currentbuild(){ command_stop.sh exitbypass=1 command_start.sh - currentbuild=$(cat "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null | sort | grep -oP '(?<=Factorio ).*?(?= /)') + currentbuild=$(grep "Loading mod base" "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null|awk '{print $5}') if [ -z "${currentbuild}" ]; then fn_print_fail_nl "Checking for update: factorio.com: Current build version still not found" fn_script_log_fatal "Checking for update: factorio.com: Current build version still not found" From e09c5454bd894bd9538adfeccd33997573521959 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 14:37:54 +0000 Subject: [PATCH 0068/1895] minor wording update --- lgsm/functions/update_ts3.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 5e897f7b9..1f74e0037 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -15,7 +15,7 @@ fn_update_ts3_dl(){ fn_script_log "Copying to ${filesdir}" cp -R "${tmpdir}/teamspeak3-server_linux_${ts3arch}/"* "${filesdir}" local exitcode=$? - if [ ${exitcode} -eq 0 ]; then + if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl else fn_print_fail_eol_nl @@ -23,8 +23,8 @@ fn_update_ts3_dl(){ } fn_update_ts3_currentbuild(){ - # Gets currentbuild info - # Checks currentbuild info is available, if fails a server restart will be forced to generate logs. + # Gets current build info + # Checks if current build info is available. If it fails, then a server restart will be forced to generate logs. if [ -z "$(find ./* -name 'ts3server*_0.log')" ]; then fn_print_error "Checking for update: teamspeak.com" sleep 1 From 31e550de0d97aa44eeb78f9f3d4a5cac8d92cda0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 20:06:24 +0000 Subject: [PATCH 0069/1895] Updated directories --- Factorio/fctrserver | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 5a1e0fc91..1beef72ae 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -93,9 +93,9 @@ filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}/bin/x64" executable="./factorio" -servercfg="server-settings.json" +servercfg="${servicename}.json" servercfgdefault="server-settings.json" -servercfgdir="${filesdir}/data/" +servercfgdir="${filesdir}/data" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory From 712f5f0f2bc780deac226fcc157a7d85ab47f63b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 20:06:39 +0000 Subject: [PATCH 0070/1895] Added factorio to info config --- lgsm/functions/info_config.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 829bba841..24ac82b5f 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -166,6 +166,24 @@ fn_info_config_dontstarve(){ fi } +fn_info_config_factorio(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="Factorio Server" + serverpassword="${unavailable}" + maxplayers="${zero}" + else + servername="Factorio Server" + serverpassword=$(grep "game_password" "${clustercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/game_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "\"max_players\"" "${clustercfgfullpath}" | tr -cd '[:digit:]') + + # Not Set + servername=${servername:-"NOT SET"} + maxplayers==${maxplayers=:-"0"} + rconpassword=${rconpassword=:-"NOT SET"} + + fi +} + fn_info_config_minecraft(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" From b6f1e8f605f4727387892b029a4a8c7f23a29545 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 20:12:37 +0000 Subject: [PATCH 0071/1895] added factorio --- lgsm/functions/info_config.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 24ac82b5f..5a5dff232 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -615,6 +615,9 @@ elif [ "${gamename}" == "Call of Duty: World at War" ]; then # Dont Starve Together elif [ "${engine}" == "dontstarve" ]; then fn_info_config_dontstarve +# Factorio +elif [ "${engine}" == "factorio" ]; then + fn_info_config_factorio # Quake 2 elif [ "${gamename}" == "Quake 2" ]; then fn_info_config_quake2 From 85014ca4837946f0c154ffb6863757f8c6c104ee Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 20:18:38 +0000 Subject: [PATCH 0072/1895] corrected gamename --- lgsm/functions/info_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 5a5dff232..374b41110 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -616,7 +616,7 @@ elif [ "${gamename}" == "Call of Duty: World at War" ]; then elif [ "${engine}" == "dontstarve" ]; then fn_info_config_dontstarve # Factorio -elif [ "${engine}" == "factorio" ]; then +elif [ "${gamename}" == "Factorio" ]; then fn_info_config_factorio # Quake 2 elif [ "${gamename}" == "Quake 2" ]; then From 172e276586dfcefa1f038a296737f38ad546f8a0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 20:24:54 +0000 Subject: [PATCH 0073/1895] stray = --- lgsm/functions/info_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 374b41110..f78273a6a 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -178,7 +178,7 @@ fn_info_config_factorio(){ # Not Set servername=${servername:-"NOT SET"} - maxplayers==${maxplayers=:-"0"} + maxplayers=${maxplayers=:-"0"} rconpassword=${rconpassword=:-"NOT SET"} fi From 0e72d35a8efa6e8bfa3080056aadbb089ee53b82 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 21:09:53 +0000 Subject: [PATCH 0074/1895] Updated rcon password --- Factorio/fctrserver | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 1beef72ae..326f48077 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -1,8 +1,8 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs -# Purpose: Empires Mod | Server Management Script +# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# Purpose: Factorio | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki # Website: https://gameservermanagers.com @@ -25,8 +25,9 @@ version="161224" ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters port="34197" rconport="34198" -rconpassword="factorio" +rconpassword="CHANGE_ME" ip="0.0.0.0" + ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters # Edit with care fn_parms(){ From 269970ad8a0dbb029a391e6849d83a041845f465 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 21:12:23 +0000 Subject: [PATCH 0075/1895] corrected factorio vars --- lgsm/functions/info_config.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index f78273a6a..2da3c4d84 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -173,14 +173,13 @@ fn_info_config_factorio(){ maxplayers="${zero}" else servername="Factorio Server" - serverpassword=$(grep "game_password" "${clustercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/game_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "\"max_players\"" "${clustercfgfullpath}" | tr -cd '[:digit:]') + serverpassword=$(grep "game_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/game_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "\"max_players\"" "${servercfgfullpath}" | tr -cd '[:digit:]') # Not Set servername=${servername:-"NOT SET"} maxplayers=${maxplayers=:-"0"} rconpassword=${rconpassword=:-"NOT SET"} - fi } From 000bfc69851e7825c53c730f2cac662d7d79c623 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 21:12:35 +0000 Subject: [PATCH 0076/1895] spaces --- lgsm/functions/gsquery.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/gsquery.py b/lgsm/functions/gsquery.py index 512d7411b..6172d53b4 100644 --- a/lgsm/functions/gsquery.py +++ b/lgsm/functions/gsquery.py @@ -29,7 +29,7 @@ class GameServer: elif self.option.engine == 'iw2.0': self.query_prompt_string = b'\xff\xff\xff\xffgetstatus' elif self.option.engine == 'iw3.0': - self.query_prompt_string = b'\xff\xff\xff\xffgetstatus' + self.query_prompt_string = b'\xff\xff\xff\xffgetstatus' elif self.option.engine == 'quake': self.query_prompt_string = b'\xff\xff\xff\xffstatus\x00' elif self.option.engine == 'quakelive': From 3177584b7d257af48ac61199f1fae76b7e8b5c6d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 21:15:37 +0000 Subject: [PATCH 0077/1895] Updated licence year New year, new me --- 7DaysToDie/sdtdserver | 2 +- ARKSurvivalEvolved/arkserver | 2 +- Arma3/arma3server | 2 +- Battlefield1942/bf1942server | 2 +- BlackMesa/bmdmserver | 2 +- BladeSymphony/bsserver | 2 +- BrainBread2/bb2server | 2 +- CallOfDuty/codserver | 2 +- CallOfDuty2/cod2server | 2 +- CallOfDuty4/cod4server | 2 +- CallOfDutyUnitedOffensive/coduoserver | 2 +- CallOfDutyWorldAtWar/codwawserver | 2 +- CodenameCURE/ccserver | 2 +- CounterStrike/csserver | 2 +- CounterStrikeConditionZero/csczserver | 2 +- CounterStrikeGlobalOffensive/csgoserver | 2 +- CounterStrikeSource/cssserver | 2 +- DayOfDefeat/dodserver | 2 +- DayOfDefeatSource/dodsserver | 2 +- DayOfInfamy/doiserver | 2 +- DeathmatchClassic/dmcserver | 2 +- DontStarveTogether/dstserver | 2 +- DoubleActionBoogaloo/dabserver | 2 +- EmpiresMod/emserver | 2 +- Factorio/fctrserver | 191 ++++++ 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 +- LICENSE | 2 +- Left4Dead/l4dserver | 2 +- Left4Dead2/l4d2server | 2 +- Minecraft/mcserver | 2 +- Mumble/mumbleserver | 2 +- NS2Combat/ns2cserver | 2 +- NaturalSelection2/ns2server | 2 +- NoMoreRoomInHell/nmrihserver | 2 +- OpposingForce/opforserver | 2 +- PiratesVikingandKnightsII/pvkiiserver | 2 +- ProjectZomboid/pzserver | 2 +- Quake2/q2server | 2 +- Quake3/q3server | 2 +- QuakeLive/qlserver | 2 +- QuakeWorld/qwserver | 2 +- RedOrchestra/roserver | 2 +- Ricochet/ricochetserver | 2 +- Rust/rustserver | 2 +- SeriousSam3BFE/ss3sserver | 2 +- Starbound/sbserver | 2 +- SvenCoop/svenserver | 2 +- TeamFortress2/tf2server | 2 +- TeamFortressClassic/tfcserver | 2 +- TeamSpeak3/ts3server | 2 +- Teeworlds/twserver | 2 +- Terraria/terrariaserver | 2 +- UnrealTournament/utserver | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament3/ut3server | 2 +- UnrealTournament99/ut99server | 2 +- WolfensteinEnemyTerritory/wetserver | 2 +- lgsm/functions/command_details.sh | 797 ------------------------ tests/tests_jc2server.sh | 2 +- 68 files changed, 257 insertions(+), 863 deletions(-) create mode 100644 Factorio/fctrserver delete mode 100644 lgsm/functions/command_details.sh diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index 1dc5ff4b6..99f77df29 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: 7 Days To Die | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index a7683daf3..9912429cd 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: ARK: Survival Evolved | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Arma3/arma3server b/Arma3/arma3server index 54f91c82c..77cb59eb2 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: ARMA 3 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Battlefield1942/bf1942server b/Battlefield1942/bf1942server index 16e41986e..d9c0537e4 100644 --- a/Battlefield1942/bf1942server +++ b/Battlefield1942/bf1942server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Battlefield: 1942 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index 54cf8d0e1..6a599555f 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Black Mesa: Deathmatch | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index ab472f35f..f4214061a 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Blade Symphony | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index 7812e584e..5a9e401af 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: BrainBread 2 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/CallOfDuty/codserver b/CallOfDuty/codserver index 1fb6daf02..a5d88b91a 100755 --- a/CallOfDuty/codserver +++ b/CallOfDuty/codserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Call of Duty | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/CallOfDuty2/cod2server b/CallOfDuty2/cod2server index f90fae26b..c7277d16b 100755 --- a/CallOfDuty2/cod2server +++ b/CallOfDuty2/cod2server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Call of Duty 2 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server index 699c3b7ad..0290ab69d 100644 --- a/CallOfDuty4/cod4server +++ b/CallOfDuty4/cod4server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Call of Duty 4 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/CallOfDutyUnitedOffensive/coduoserver b/CallOfDutyUnitedOffensive/coduoserver index 29c1d6776..d658af116 100755 --- a/CallOfDutyUnitedOffensive/coduoserver +++ b/CallOfDutyUnitedOffensive/coduoserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Call of Duty: United Offensive | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/CallOfDutyWorldAtWar/codwawserver b/CallOfDutyWorldAtWar/codwawserver index 961105a3d..15a984e25 100755 --- a/CallOfDutyWorldAtWar/codwawserver +++ b/CallOfDutyWorldAtWar/codwawserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Call of Duty: World at War | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 5583d4480..93e6595c5 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Codename CURE | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/CounterStrike/csserver b/CounterStrike/csserver index d161759cf..9853a148c 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Counter-Strike | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index e6831dc3a..69c68a8b7 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Counter-Strike: Condition Zero | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index e84590702..6f97641a8 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Counter-Strike: Global Offensive | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index aae064a3b..554b1ee8f 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Counter-Strike: Source | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index 1c4dea80b..55ade1e61 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Day of Defeat | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index f1f23e0b9..45b0407e6 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Day of Defeat: Source | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/DayOfInfamy/doiserver b/DayOfInfamy/doiserver index ff4e57238..dbc17e178 100644 --- a/DayOfInfamy/doiserver +++ b/DayOfInfamy/doiserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Day of Infamy | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index e9af4107a..2c7ed676e 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Deathmatch Classic | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index 8001e4a7d..df915813c 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Dont Starve Together | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index add4c4256..4bfb6fa9b 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Double Action: Boogaloo | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/EmpiresMod/emserver b/EmpiresMod/emserver index 8fe3b4164..525657530 100644 --- a/EmpiresMod/emserver +++ b/EmpiresMod/emserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Empires Mod | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Factorio/fctrserver b/Factorio/fctrserver new file mode 100644 index 000000000..326f48077 --- /dev/null +++ b/Factorio/fctrserver @@ -0,0 +1,191 @@ +#!/bin/bash +# Project: Game Server Managers - LinuxGSM +# Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# Purpose: Factorio | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki +# Website: https://gameservermanagers.com + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="161224" + +########################## +######## Settings ######## +########################## + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +port="34197" +rconport="34198" +rconpassword="CHANGE_ME" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +# Edit with care +fn_parms(){ +parms="--start-server ${filesdir}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="feature/factorio" + +## LinuxGSM Server Details +# Do not edit +gamename="Factorio" +engine="" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="fctr-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}/bin/x64" +executable="./factorio" +servercfg="${servicename}.json" +servercfgdefault="server-settings.json" +servercfgdir="${filesdir}/data" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${filesdir}" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" + +######################## +######## Script ######## +###### Do not edit ##### +######################## + +# 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 -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_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_fetch_core_dl +} + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + +core_dl.sh +core_functions.sh +getopt=$1 +core_getopt.sh \ No newline at end of file diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index 314edb0d7..f57dea7c7 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Fistful Of Frags | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index 42c220387..da7bf61b8 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Garry's Mod | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index 8ecd7a8c2..4714c9a64 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: GoldenEye: Source | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index f4da627f3..eaedd7e05 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Half Life 2: Deathmatch | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index 2a8cf8ce7..d82e3228f 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Half Life: Deathmatch | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index ebe71cc57..95c542c99 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Half-Life Deathmatch: Source | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index b1a6f2a81..af38201da 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Hurtworld | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Insurgency/insserver b/Insurgency/insserver index dd7f3b6dd..4f7d585a6 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Insurgency | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/JustCause2/jc2server b/JustCause2/jc2server index a49f23584..3112912eb 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Just Cause 2 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index 167348f93..0cd35653d 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Killing Floor | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/LICENSE b/LICENSE index 24a57533c..c6ad3cd89 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016 Daniel Gibbs +Copyright (c) 2017 Daniel Gibbs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index b3aab5c06..f8f4f84db 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Left 4 Dead | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index a3a5d4166..d7c3a0fcc 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Left 4 Dead 2 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Minecraft/mcserver b/Minecraft/mcserver index 4fbb94103..8d0f317cf 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Minecraft | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index 47ca299b7..13f8a5bae 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Mumble | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index d8abe3459..ce5348a19 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: NS2: Combat | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index 55b4876c2..a449c704c 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Natural Selection 2 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index a88526007..ea7251ab0 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: No More Room in Hell | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index c164da28e..b75a9d67e 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Half-Life: Opposing Force | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index 1fdb643b0..73702aeb5 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: No More Room in Hell | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index 3dcc89927..70298be30 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Project Zomboid | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Quake2/q2server b/Quake2/q2server index 8694b7ec9..98ecb348e 100644 --- a/Quake2/q2server +++ b/Quake2/q2server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Quake 2 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Quake3/q3server b/Quake3/q3server index 5aebdaf1e..78f68fb21 100644 --- a/Quake3/q3server +++ b/Quake3/q3server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Quake 3: Arena | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index 42e8fca97..f0bcd183b 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Quake Live | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/QuakeWorld/qwserver b/QuakeWorld/qwserver index 488103ae4..f1d5a43ab 100644 --- a/QuakeWorld/qwserver +++ b/QuakeWorld/qwserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Quake World (nQuake) | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index 9371398fd..cc8d24232 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Red Orchestra: Ostfront 41-45 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index 4eff098cb..0775d0f75 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Ricochet | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Rust/rustserver b/Rust/rustserver index 071680a86..b7848b97d 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Rust | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index f4ca338b7..577205ad1 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Sam 3: BFE | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Starbound/sbserver b/Starbound/sbserver index 6fba61b59..45136f09e 100644 --- a/Starbound/sbserver +++ b/Starbound/sbserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Starbound | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/SvenCoop/svenserver b/SvenCoop/svenserver index e75a16af0..0be845023 100644 --- a/SvenCoop/svenserver +++ b/SvenCoop/svenserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Sven Co-op | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index f0173fece..4db8d44c6 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Team Fortress 2 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index d77647fb0..fbd933328 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Team Fortress Classic | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index aeab10ecc..5fb6e174b 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: TeamSpeak 3 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Teeworlds/twserver b/Teeworlds/twserver index c525a3cc2..45b4a9bf9 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Teeworlds | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index 867dcfd0b..f76c5ec53 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Terraria | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/UnrealTournament/utserver b/UnrealTournament/utserver index 54ec900da..be80e850b 100644 --- a/UnrealTournament/utserver +++ b/UnrealTournament/utserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Unreal Tournament | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index 751bdf4fa..c29fe97e6 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Unreal Tournament 2004 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/UnrealTournament3/ut3server b/UnrealTournament3/ut3server index aaf89b698..5946ff18d 100644 --- a/UnrealTournament3/ut3server +++ b/UnrealTournament3/ut3server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Unreal Tournament 3 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index ebf871439..e0b6a2539 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Unreal Tournament 99 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/WolfensteinEnemyTerritory/wetserver b/WolfensteinEnemyTerritory/wetserver index 30894d50c..cdcb14e2c 100644 --- a/WolfensteinEnemyTerritory/wetserver +++ b/WolfensteinEnemyTerritory/wetserver @@ -1,7 +1,7 @@ #!/bin/bash # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: Enemy Territory | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh deleted file mode 100644 index 9d9d8fddc..000000000 --- a/lgsm/functions/command_details.sh +++ /dev/null @@ -1,797 +0,0 @@ -#!/bin/bash -# LGSM command_details.sh function -# Author: Daniel Gibbs -# Contributor: UltimateByte -# Website: https://gameservermanagers.com -# Description: Displays server information. - -local commandname="DETAILS" -local commandaction="Details" -local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - -# Standard Details -# This applies to all engines - -fn_details_os(){ - # - # 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 "${lightyellow}Distro Details${default}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = - { - echo -e "${blue}Distro:\t${default}${distroname}" - echo -e "${blue}Arch:\t${default}${arch}" - echo -e "${blue}Kernel:\t${default}${kernel}" - echo -e "${blue}Hostname:\t${default}$HOSTNAME" - echo -e "${blue}tmux:\t${default}${tmuxv}" - echo -e "${blue}GLIBC:\t${default}${glibcversion}" - } | column -s $'\t' -t -} - -fn_details_performance(){ - # - # Performance - # ===================================== - # Uptime: 55d, 3h, 38m - # Avg Load: 1.00, 1.01, 0.78 - # - # Mem: total used free cached - # Physical: 741M 656M 85M 256M - # Swap: 0B 0B 0B - - echo -e "" - echo -e "${lightyellow}Performance${default}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = - { - echo -e "${blue}Uptime:\t${default}${days}d, ${hours}h, ${minutes}m" - echo -e "${blue}Avg Load:\t${default}${load}" - } | column -s $'\t' -t - echo -e "" - { - echo -e "${blue}Mem:\t${blue}total\t used\t free\t cached${default}" - echo -e "${blue}Physical:\t${default}${physmemtotal}\t${physmemused}\t${physmemfree}\t${physmemcached}${default}" - echo -e "${blue}Swap:\t${default}${swaptotal}\t${swapused}\t${swapfree}${default}" - } | column -s $'\t' -t -} - -fn_details_disk(){ - # - # Storage - # ===================================== - # Filesystem: /dev/disk/by-uuid/320c8edd-a2ce-4a23-8c9d-e00a7af2d6ff - # Total: 15G - # Used: 8.4G - # Available: 5.7G - # LGSM Total: 1G - # Serverfiles: 961M - # Backups: 2G - - echo -e "" - echo -e "${lightyellow}Storage${default}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = - { - echo -e "${blue}Filesystem:\t${default}${filesystem}" - echo -e "${blue}Total:\t${default}${totalspace}" - echo -e "${blue}Used:\t${default}${usedspace}" - echo -e "${blue}Available:\t${default}${availspace}" - echo -e "${blue}LGSM Total:\t${default}${rootdirdu}" - echo -e "${blue}Serverfiles:\t${default}${filesdirdu}" - if [ -d "${backupdir}" ]; then - echo -e "${blue}Backups:\t${default}${backupdirdu}" - fi - } | column -s $'\t' -t -} - -fn_details_gameserver(){ - # - # Quake Live Server Details - # ===================================== - # Server name: ql-server - # Server IP: 1.2.3.4:27960 - # RCON password: CHANGE_ME - # Server password: NOT SET - # Maxplayers: 16 - # Status: OFFLINE - - echo -e "" - echo -e "${lightgreen}${gamename} Server Details${default}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = - { - # Server name - if [ -n "${servername}" ]; then - echo -e "${blue}Server name:\t${default}${servername}" - fi - - # Server ip - echo -e "${blue}Server IP:\t${default}${ip}:${port}" - - # Server password - if [ -n "${serverpassword}" ]; then - echo -e "${blue}Server password:\t${default}${serverpassword}" - fi - - # RCON password - if [ -n "${rconpassword}" ]; then - echo -e "${blue}RCON password:\t${default}${rconpassword}" - fi - - # Admin password - if [ -n "${adminpassword}" ]; then - echo -e "${blue}Admin password:\t${default}${adminpassword}" - fi - - # Stats password (Quake Live) - if [ -n "${statspassword}" ]; then - echo -e "${blue}Stats password:\t${default}${statspassword}" - fi - - # Maxplayers - if [ -n "${maxplayers}" ]; then - echo -e "${blue}Maxplayers:\t${default}${maxplayers}" - fi - - # Game mode - if [ -n "${gamemode}" ]; then - echo -e "${blue}Game mode:\t${default}${gamemode}" - fi - - # Game world - if [ -n "${gameworld}" ]; then - echo -e "${blue}Game world:\t${default}${gameworld}" - fi - - # Tick rate - if [ -n "${tickrate}" ]; then - echo -e "${blue}Tick rate:\t${default}${tickrate}" - fi - - # Cluster (Don't Starve Together) - if [ -n "${cluster}" ]; then - echo -e "${blue}Cluster:\t${default}${cluster}" - fi - - # Shard (Don't Starve Together) - if [ -n "${shard}" ]; then - echo -e "${blue}Shard:\t${default}${shard}" - fi - - # TeamSpeak dbplugin - if [ -n "${dbplugin}" ]; then - echo -e "${blue}dbplugin:\t${default}${dbplugin}" - fi - - # Online status - if [ "${status}" == "0" ]; then - echo -e "${blue}Status:\t${red}OFFLINE${default}" - else - echo -e "${blue}Status:\t${green}ONLINE${default}" - fi - } | column -s $'\t' -t - echo -e "" -} - -fn_details_script(){ - # - # qlserver Script Details - # ===================================== - # Service name: ql-server - # qlserver version: 150316 - # User: lgsm - # Email alert: off - # Update on start: off - # Location: /home/lgsm/qlserver - # Config file: /home/lgsm/qlserver/serverfiles/baseq3/ql-server.cfg - - echo -e "${lightgreen}${selfname} Script Details${default}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = - { - # Service name - echo -e "${blue}Service name:\t${default}${servicename}" - - # Script version - if [ -n "${version}" ]; then - echo -e "${blue}${selfname} version:\t${default}${version}" - fi - - # User - echo -e "${blue}User:\t${default}$(whoami)" - - # GLIBC required - if [ -n "${glibcrequired}" ]; then - if [ "${glibcrequired}" == "NOT REQUIRED" ]; then - : - elif [ "${glibcrequired}" == "UNKNOWN" ]; then - echo -e "${blue}GLIBC required:\t${red}${glibcrequired}" - elif [ "$(printf '%s\n'${glibcrequired}'\n' ${glibcversion} | sort -V | head -n 1)" != "${glibcrequired}" ]; then - if [ "${glibcfix}" == "yes" ]; then - echo -e "${blue}GLIBC required:\t${red}${glibcrequired} ${default}(${green}Using GLIBC fix${default})" - else - echo -e "${blue}GLIBC required:\t${red}${glibcrequired} ${default}(${red}GLIBC version too old${default})" - fi - else - echo -e "${blue}GLIBC required:\t${green}${glibcrequired}${default}" - fi - fi - - # Email alert - echo -e "${blue}Email alert:\t${default}${emailalert}" - - # Pushbullet alert - echo -e "${blue}Pushbullet alert:\t${default}${pushbulletalert}" - - # Update on start - if [ -n "${updateonstart}" ]; then - echo -e "${blue}Update on start:\t${default}${updateonstart}" - fi - - # Script location - echo -e "${blue}Location:\t${default}${rootdir}" - - # Config file location - if [ -n "${servercfgfullpath}" ]; then - if [ -f "${servercfgfullpath}" ]; then - echo -e "${blue}Config file:\t${default}${servercfgfullpath}" - elif [ -d "${servercfgfullpath}" ]; then - echo -e "${blue}Config dir:\t${default}${servercfgfullpath}" - else - echo -e "${blue}Config file:\t${default}${red}${servercfgfullpath}${default} (${red}FILE MISSING${default})" - fi - fi - - # Network config file location (ARMA 3) - if [ -n "${networkcfgfullpath}" ]; then - echo -e "${blue}Network config file:\t${default}${networkcfgfullpath}" - fi - } | column -s $'\t' -t -} - -fn_details_backup(){ - # - # 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 "${lightgreen}Backups${default}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = - if [ ! -d "${backupdir}" ]||[ "${backupcount}" == "0" ]; then - echo -e "No Backups created" - else - { - echo -e "${blue}No. of backups:\t${default}${backupcount}" - echo -e "${blue}Latest backup:${default}" - if [ "${lastbackupdaysago}" == "0" ]; then - echo -e "${blue} date:\t${default}${lastbackupdate} (less than 1 day ago)" - elif [ "${lastbackupdaysago}" == "1" ]; then - echo -e "${blue} date:\t${default}${lastbackupdate} (1 day ago)" - else - echo -e "${blue} date:\t${default}${lastbackupdate} (${lastbackupdaysago} days ago)" - fi - echo -e "${blue} file:\t${default}${lastbackup}" - echo -e "${blue} size:\t${default}${lastbackupsize}" - } | column -s $'\t' -t - fi -} - -fn_details_commandlineparms(){ - # - # Command-line Parameters - # ===================================== - # ./run_server_x86.sh +set net_strict 1 - - echo -e "" - echo -e "${lightgreen}Command-line Parameters${default}" - 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 "${lightgreen}Ports${default}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = - echo -e "Change ports by editing the parameters in:" - - parmslocation="${red}UNKNOWN${default}" - # engines that require editing in the config file - local ports_edit_array=( "avalanche" "dontstarve" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "projectzomboid" "quake" "refractor" "realvirtuality" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" ) - for port_edit in "${ports_edit_array[@]}" - do - if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then - parmslocation="${servercfgfullpath}" - fi - done - # engines that require editing in the script file - local ports_edit_array=( "Hurtworld" "iw3.0" "goldsource" "Rust" "spark" "source" "starbound" "unreal4" ) - 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 [ "${status}" == "0" ]; then - echo -e "${blue}Status:\t${red}OFFLINE${default}" - else - echo -e "${blue}Status:\t${green}ONLINE${default}" - fi - echo -e "" -} - -# Engine Specific details - -fn_details_avalanche(){ - 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_cod(){ - echo -e "netstat -atunp | grep cod_lnxded" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - } | column -s $'\t' -t -} - -fn_details_coduo(){ - echo -e "netstat -atunp | grep coduo_lnxded" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - } | column -s $'\t' -t -} - -fn_details_cod2(){ - echo -e "netstat -atunp | grep cod2_lnxded" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - } | column -s $'\t' -t -} - -fn_details_cod4(){ - echo -e "netstat -atunp" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - } | column -s $'\t' -t -} - -fn_details_codwaw(){ - echo -e "netstat -atunp | grep codwaw_lnxded" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - } | column -s $'\t' -t -} - -fn_details_dontstarve(){ - echo -e "netstat -atunp | grep dontstarve" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game: Server\tINBOUND\t${port}\tudp" - echo -e "> Game: Master\tINBOUND\t${masterport}\tudp" - echo -e "> Steam: Auth\tINBOUND\t${steamauthenticationport}\tudp" - echo -e "> Steam: Master\tINBOUND\t${steammasterserverport}\tudp" - } | column -s $'\t' -t -} - -fn_details_minecraft(){ - 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_projectzomboid(){ - 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 "netstat -atunp | grep arma3server" - echo -e "" - if [ -z "${port}" ]||[ -z "${queryport}" ]||[ -z "${masterport}" ]; then - echo -e "${red}ERROR!${default} 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_refractor(){ - echo -e "netstat -atunp | grep bf1942_lnxd" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/Query\tINBOUND\t${port}\tudp" - echo -e "> Steam: Query\tINBOUND\t${queryport}\tudp" - } | column -s $'\t' -t -} - -fn_details_quake2(){ - echo -e "netstat -atunp | grep quake2" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - } | column -s $'\t' -t -} - -fn_details_quake3(){ - echo -e "netstat -atunp | grep q3ded" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - } | column -s $'\t' -t -} - -fn_details_quake(){ - echo -e "netstat -atunp | grep mvdsv" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" - } | column -s $'\t' -t -} - -fn_details_quakelive(){ - echo -e "netstat -atunp | grep qzeroded" - echo -e "" - if [ -z "${port}" ]||[ -z "${rconport}" ]||[ -z "${statsport}" ]; then - echo -e "${red}ERROR!${default} 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_wolfensteinenemyterritory(){ - echo -e "netstat -atunp | grep etded" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/Query\tINBOUND\t${port}\tudp" - } | column -s $'\t' -t -} - - -fn_details_seriousengine35(){ - 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 "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 "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 "${lightgreen}${servername} WebAdmin${default}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = - { - echo -e "${blue}WebAdmin url:\t${default}http://${ip}:${webadminport}/index.html" - echo -e "${blue}WebAdmin username:\t${default}${webadminuser}" - echo -e "${blue}WebAdmin password:\t${default}${webadminpass}" - } | column -s $'\t' -t -} - -fn_details_starbound(){ - 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 "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_mumble(){ - echo -e "netstat -atunp | grep murmur" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Voice\tINBOUND\t${port}\tudp" - echo -e "> ServerQuery\tINBOUND\t${port}\ttcp" - } | column -s $'\t' -t -} - -fn_details_teeworlds(){ - 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 "netstat -atunp | grep TerrariaServer" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\ttcp" - } | column -s $'\t' -t -} - -fn_details_sdtd(){ - 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 "${lightgreen}${servername} WebAdmin${default}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = - { - echo -e "${blue}WebAdmin enabled:\t${default}${webadminenabled}" - echo -e "${blue}WebAdmin url:\t${default}http://${ip}:${webadminport}" - echo -e "${blue}WebAdmin password:\t${default}${webadminpass}" - } | column -s $'\t' -t - echo -e "" - echo -e "${lightgreen}${servername} Telnet${default}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = - { - echo -e "${blue}Telnet enabled:\t${default}${telnetenabled}" - echo -e "${blue}Telnet address:\t${default}${ip} ${telnetport}" - echo -e "${blue}Telnet password:\t${default}${telnetpass}" - } | column -s $'\t' -t -} - -fn_details_hurtworld(){ - 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 "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 "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 "${lightgreen}${servername} WebAdmin${default}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = - { - echo -e "${blue}WebAdmin enabled:\t${default}${webadminenabled}" - echo -e "${blue}WebAdmin url:\t${default}http://${ip}:${webadminport}" - echo -e "${blue}WebAdmin username:\t${default}${webadminuser}" - echo -e "${blue}WebAdmin password:\t${default}${webadminpass}" - } | column -s $'\t' -t -} - -fn_details_ut3(){ - echo -e "netstat -atunp | grep ut3-bin" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/Query\tINBOUND\t${port}\ttcp/udp" - } | column -s $'\t' -t -} - -fn_details_ark(){ - 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 -} - -# Run checks and gathers details to display. - -fn_display_details() { - check.sh - info_config.sh - info_distro.sh - info_glibc.sh - info_parms.sh - 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 - 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}" == "refractor" ]; then - fn_details_refractor - elif [ "${engine}" == "dontstarve" ]; then - fn_details_dontstarve - elif [ "${engine}" == "lwjgl2" ]; then - fn_details_minecraft - elif [ "${engine}" == "projectzomboid" ]; then - fn_details_projectzomboid - 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 [ "${engine}" == "unreal3" ]; then - fn_details_ut3 - elif [ "${gamename}" == "7 Days To Die" ]; then - fn_details_sdtd - elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then - fn_details_ark - elif [ "${gamename}" == "Call of Duty" ]; then - fn_details_cod - elif [ "${gamename}" == "Call of Duty: United Offensive" ]; then - fn_details_coduo - elif [ "${gamename}" == "Call of Duty 2" ]; then - fn_details_cod2 - elif [ "${gamename}" == "Call of Duty 4" ]; then - fn_details_cod4 - elif [ "${gamename}" == "Call of Duty: World at War" ]; then - fn_details_codwaw - elif [ "${gamename}" == "Hurtworld" ]; then - fn_details_hurtworld - elif [ "${gamename}" == "QuakeWorld" ]; then - fn_details_quake - elif [ "${gamename}" == "Quake 2" ]; then - fn_details_quake2 - elif [ "${gamename}" == "Quake 3: Arena" ]; then - fn_details_quake3 - elif [ "${gamename}" == "Quake Live" ]; then - fn_details_quakelive - elif [ "${gamename}" == "TeamSpeak 3" ]; then - fn_details_teamspeak3 - elif [ "${gamename}" == "Mumble" ]; then - fn_details_mumble - elif [ "${gamename}" == "Rust" ]; then - fn_details_rust - elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then - fn_details_wolfensteinenemyterritory - else - fn_print_error_nl "Unable to detect server engine." - fi - - fn_details_statusbottom -} - -if [ -z "${postdetails}" ] ; -then - fn_display_details - core_exit.sh -fi diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 4f07338e8..697176aec 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -2,7 +2,7 @@ # Just Cause 2 # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2016 Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs # Purpose: TravisCI Test: Just Cause 2 | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki From 997a40bfe09eec45c8a374324b4272cc28a87022 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 21:31:02 +0000 Subject: [PATCH 0078/1895] Added factorio --- lgsm/functions/core_getopt.sh | 94 +++++++++++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 9 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 03aa7359a..0cbd6f2b0 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -80,6 +80,73 @@ case "${getopt}" in esac } +fn_getopt_generic_update_no_steam(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + u|update) + command_update.sh;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.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|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update\t${default}u |Checks and applies updates." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful information about the server." + echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + } | column -s $'\t' -t + esac +} + fn_getopt_generic_no_update(){ case "${getopt}" in st|start) @@ -144,7 +211,6 @@ case "${getopt}" in esac } - fn_getopt_teamspeak3(){ case "${getopt}" in st|start) @@ -697,26 +763,36 @@ case "${getopt}" in esac } -if [ "${gamename}" == "Mumble" ]; then - fn_getopt_mumble -elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then - fn_getopt_generic_no_update +# Don't Starve Together +if [ "${gamename}" == "Don't Starve Together" ]; then + fn_getopt_dstserver +# Garry's Mod +elif [ "${gamename}" == "Garry's Mod" ]; then + fn_getopt_gmodserver +# Minecraft elif [ "${engine}" == "lwjgl2" ]; then fn_getopt_minecraft +# Mumble +elif [ "${gamename}" == "Mumble" ]; then + fn_getopt_mumble +# Teamspeak 3 elif [ "${gamename}" == "TeamSpeak 3" ]; then fn_getopt_teamspeak3 -elif [ "${gamename}" == "Don't Starve Together" ]; then - fn_getopt_dstserver -elif [ "${gamename}" == "Garry's Mod" ]; then - fn_getopt_gmodserver +# Unreal 2 Engine elif [ "${engine}" == "unreal2" ]; then if [ "${gamename}" == "Unreal Tournament 2004" ]; then fn_getopt_ut2k4 else fn_getopt_unreal2 fi +# Unreal Engine elif [ "${engine}" == "unreal" ]; then fn_getopt_unreal +# Generic +elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then + fn_getopt_generic_no_update +elif [ "${gamename}" == "Factorio" ]; then + fn_getopt_generic_update_no_steam else fn_getopt_generic fi From 3d22fe5faf9bd43e77418ef25cb6a868ca2e91fb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 21:41:00 +0000 Subject: [PATCH 0079/1895] added gz and zip to progress bar --- 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 6d971b997..7355c840c 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -117,7 +117,7 @@ fn_fetch_file(){ # trap to remove part downloaded files trap fn_fetch_trap INT # if larger file shows progress bar - if [ ${filename##*.} == "bz2" ]||[ ${filename##*.} == "jar" ]; then + if [ ${filename##*.} == "bz2" ]||[ ${filename##*.} == "gz" ]||[ ${filename##*.} == "zip" ]||[ ${filename##*.} == "jar" ]; then echo -ne "downloading ${filename}..." sleep 1 curlcmd=$(${curlcmd} --progress-bar --fail -L -o "${filedir}/${filename}" "${fileurl}") From ac114960a428db30f4ec33a03299308b02e8323c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 21:41:14 +0000 Subject: [PATCH 0080/1895] using --start-server-load-latest by default --- Factorio/fctrserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 326f48077..88f69b1a1 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -31,7 +31,7 @@ ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters # Edit with care fn_parms(){ -parms="--start-server ${filesdir}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" +parms="--start-server-load-latest --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" } #### LinuxGSM Settings #### From ca01255e5d3cccdbe6ea04f8c71634e7deb64681 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 21:48:21 +0000 Subject: [PATCH 0081/1895] removed update message from installer --- lgsm/functions/update_factorio.sh | 2 ++ lgsm/functions/update_minecraft.sh | 2 ++ lgsm/functions/update_mumble.sh | 2 ++ lgsm/functions/update_ts3.sh | 2 ++ 4 files changed, 8 insertions(+) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 0b9191555..c3e16d802 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -86,6 +86,8 @@ fn_update_factorio_availablebuild(){ fn_print_fail "Checking for update: factorio.com: Not returning version info" fn_script_log_fatal "Failure! Checking for update: factorio.com: Not returning version info" core_exit.sh + elif [ "${installer}" == "1" ]; then + : else fn_print_ok "Checking for update: factorio.com" fn_script_log_pass "Checking for update: factorio.com" diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 717e798cd..746ddfb2e 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -79,6 +79,8 @@ fn_update_availablebuild(){ fn_print_fail "Checking for update: mojang.com: Not returning version info" fn_script_log_fatal "Failure! Checking for update: mojang.com: Not returning version info" core_exit.sh + elif [ "${installer}" == "1" ]; then + : else fn_print_ok_nl "Checking for update: mojang.com" fn_script_log_pass "Checking for update: mojang.com" diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 338ad4545..6f5c35a88 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -86,6 +86,8 @@ fn_update_mumble_availablebuild(){ fn_print_fail "Checking for update: GitHub: Not returning version info" fn_script_log_fatal "Failure! Checking for update: GitHub: Not returning version info" core_exit.sh + elif [ "${installer}" == "1" ]; then + : else fn_print_ok "Checking for update: GitHub" fn_script_log_pass "Checking for update: GitHub" diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 1f74e0037..b5f403597 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -113,6 +113,8 @@ fn_update_ts3_availablebuild(){ fn_print_fail "Checking for update: teamspeak.com: Not returning version info" fn_script_log_fatal "Failure! Checking for update: teamspeak.com: Not returning version info" core_exit.sh + elif [ "${installer}" == "1" ]; then + : else fn_print_ok "Checking for update: teamspeak.com" fn_script_log_pass "Checking for update: teamspeak.com" From 7a1d0fd4440a6fbb86a4cd950a8b0e705767a859 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 7 Jan 2017 22:24:41 +0000 Subject: [PATCH 0082/1895] Changed default to 30 days --- lgsm/functions/command_postdetails.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 664b1c66b..566d5c323 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -36,7 +36,7 @@ posttarget=${posttarget="https://hastebin.com"} # For pastebin, you can set the expiration period. # use 1 week as the default, other options are '24h' for a day, etc. # This, too, may be overridden from the command line at the top-level -postexpire="${postexpire="1W"}" +postexpire="${postexpire="30D"}" # This file sources the command_details.sh file to leverage all # of the already-defined functions. To keep the command_details.sh @@ -128,7 +128,7 @@ if [ "${posttarget}" == "http://pastebin.com" ] ; then fn_print_ok_nl "Posting details to pastbin.com for ${postexpire}" echo " Please share the following url for support: ${posttarget}${link}" elif [ "${posttarget}" == "https://hastebin.com" ] ; then - fn_print_dots "Posting details to hastebin.com (expires 30 days after last view)" + fn_print_dots "Posting details to hastebin.com" sleep 1 # hastebin is a bit simpler. If successful, the returned result # should look like: {"something":"key"}, putting the reference that From ff4864f568e75e2e6f0141c5d964dfbe34bb83f5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 8 Jan 2017 21:12:39 +0000 Subject: [PATCH 0083/1895] Fix for issue #1157 Also re ordered functions --- lgsm/functions/command_details.sh | 194 ++++++++++++++++-------------- 1 file changed, 102 insertions(+), 92 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index bb84bf396..8f86b3117 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -340,8 +340,19 @@ fn_details_statusbottom(){ echo -e "" } + # Engine Specific details +fn_details_ark(){ + 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_avalanche(){ echo -e "netstat -atunp | grep Jcmp-Server" echo -e "" @@ -417,16 +428,27 @@ fn_details_factorio(){ } | column -s $'\t' -t } -fn_details_minecraft(){ - echo -e "netstat -atunp | grep java" +fn_details_goldsource(){ + echo -e "netstat -atunp | grep hlds_linux" echo -e "" { echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Game/RCON\tINBOUND\t${port}\ttcp/udp" + echo -e "< Client\tOUTBOUND\t${clientport}\tudp" } | column -s $'\t' -t } -fn_details_projectzomboid(){ +fn_details_hurtworld(){ + 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_minecraft(){ echo -e "netstat -atunp | grep java" echo -e "" { @@ -435,29 +457,31 @@ fn_details_projectzomboid(){ } | column -s $'\t' -t } +fn_details_mumble(){ + echo -e "netstat -atunp | grep murmur" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Voice\tINBOUND\t${port}\tudp" + echo -e "> ServerQuery\tINBOUND\t${port}\ttcp" + } | column -s $'\t' -t +} -fn_details_realvirtuality(){ - echo -e "netstat -atunp | grep arma3server" +fn_details_projectzomboid(){ + echo -e "netstat -atunp | grep java" echo -e "" - if [ -z "${port}" ]||[ -z "${queryport}" ]||[ -z "${masterport}" ]; then - echo -e "${red}ERROR!${default} 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_refractor(){ - echo -e "netstat -atunp | grep bf1942_lnxd" +fn_details_quake(){ + echo -e "netstat -atunp | grep mvdsv" echo -e "" { echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Game/Query\tINBOUND\t${port}\tudp" - echo -e "> Steam: Query\tINBOUND\t${queryport}\tudp" + echo -e "> Game\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } @@ -479,39 +503,55 @@ fn_details_quake3(){ } | column -s $'\t' -t } -fn_details_quake(){ - echo -e "netstat -atunp | grep mvdsv" +fn_details_quakelive(){ + echo -e "netstat -atunp | grep qzeroded" echo -e "" + if [ -z "${port}" ]||[ -z "${rconport}" ]||[ -z "${statsport}" ]; then + echo -e "${red}ERROR!${default} 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_quakelive(){ - echo -e "netstat -atunp | grep qzeroded" +fn_details_realvirtuality(){ + echo -e "netstat -atunp | grep arma3server" echo -e "" - if [ -z "${port}" ]||[ -z "${rconport}" ]||[ -z "${statsport}" ]; then + if [ -z "${port}" ]||[ -z "${queryport}" ]||[ -z "${masterport}" ]; then echo -e "${red}ERROR!${default} 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" + echo -e "> Steam: Query\tINBOUND\t${queryport}\tudp" + echo -e "> Steam: Master traffic\tINBOUND\t${masterport}\tudp" } | column -s $'\t' -t } -fn_details_wolfensteinenemyterritory(){ - echo -e "netstat -atunp | grep etded" +fn_details_refractor(){ + echo -e "netstat -atunp | grep bf1942_lnxd" echo -e "" { echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" echo -e "> Game/Query\tINBOUND\t${port}\tudp" + echo -e "> Steam: Query\tINBOUND\t${queryport}\tudp" } | column -s $'\t' -t } +fn_details_rust(){ + 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_seriousengine35(){ echo -e "netstat -atunp | grep Sam3_Dedicate" @@ -523,15 +563,41 @@ fn_details_seriousengine35(){ } | column -s $'\t' -t } +fn_details_sdtd(){ + 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 "${lightgreen}${servername} WebAdmin${default}" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + { + echo -e "${blue}WebAdmin enabled:\t${default}${webadminenabled}" + echo -e "${blue}WebAdmin url:\t${default}http://${ip}:${webadminport}" + echo -e "${blue}WebAdmin password:\t${default}${webadminpass}" + } | column -s $'\t' -t + echo -e "" + echo -e "${lightgreen}${servername} Telnet${default}" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = + { + echo -e "${blue}Telnet enabled:\t${default}${telnetenabled}" + echo -e "${blue}Telnet address:\t${default}${ip} ${telnetport}" + echo -e "${blue}Telnet password:\t${default}${telnetpass}" + } | column -s $'\t' -t +} + fn_details_source(){ 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 "> SourceTV\tINBOUND\t${sourcetvport}\tudp" echo -e "< Client\tOUTBOUND\t${clientport}\tudp" } | column -s $'\t' -t } @@ -577,16 +643,6 @@ fn_details_teamspeak3(){ } | column -s $'\t' -t } -fn_details_mumble(){ - echo -e "netstat -atunp | grep murmur" - echo -e "" - { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" - echo -e "> Voice\tINBOUND\t${port}\tudp" - echo -e "> ServerQuery\tINBOUND\t${port}\ttcp" - } | column -s $'\t' -t -} - fn_details_teeworlds(){ echo -e "netstat -atunp | grep teeworlds_srv" echo -e "" @@ -605,54 +661,6 @@ fn_details_terraria(){ } | column -s $'\t' -t } -fn_details_sdtd(){ - 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 "${lightgreen}${servername} WebAdmin${default}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = - { - echo -e "${blue}WebAdmin enabled:\t${default}${webadminenabled}" - echo -e "${blue}WebAdmin url:\t${default}http://${ip}:${webadminport}" - echo -e "${blue}WebAdmin password:\t${default}${webadminpass}" - } | column -s $'\t' -t - echo -e "" - echo -e "${lightgreen}${servername} Telnet${default}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = - { - echo -e "${blue}Telnet enabled:\t${default}${telnetenabled}" - echo -e "${blue}Telnet address:\t${default}${ip} ${telnetport}" - echo -e "${blue}Telnet password:\t${default}${telnetpass}" - } | column -s $'\t' -t -} - -fn_details_hurtworld(){ - 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 "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 "netstat -atunp | grep ucc-bin" echo -e "" @@ -700,16 +708,16 @@ fn_details_ut3(){ } | column -s $'\t' -t } -fn_details_ark(){ - echo -e "netstat -atunp | grep ShooterGame" +fn_details_wolfensteinenemyterritory(){ + echo -e "netstat -atunp | grep etded" 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" + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game/Query\tINBOUND\t${port}\tudp" } | column -s $'\t' -t } + # Run checks and gathers details to display. fn_display_details() { @@ -738,6 +746,8 @@ fn_display_details() { fn_details_refractor elif [ "${engine}" == "dontstarve" ]; then fn_details_dontstarve + elif [ "${engine}" == "goldsource" ]; then + fn_details_goldsource elif [ "${engine}" == "lwjgl2" ]; then fn_details_minecraft elif [ "${engine}" == "projectzomboid" ]; then @@ -746,7 +756,7 @@ fn_display_details() { fn_details_realvirtuality elif [ "${engine}" == "seriousengine35" ]; then fn_details_seriousengine35 - elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then + elif [ "${engine}" == "source" ] fn_details_source elif [ "${engine}" == "spark" ]; then fn_details_spark From 93b019be1c50ecf1303172bf9153a6544492c0bc Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 8 Jan 2017 21:41:05 +0000 Subject: [PATCH 0084/1895] Fix issue #1056 --- lgsm/functions/check_deps.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 36e0a8f04..fb1cd301c 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -202,6 +202,9 @@ if [ -n "$(command -v dpkg-query)" ]; then # GoldenEye: Source elif [ "${gamename}" == "GoldenEye: Source" ]; then array_deps_required+=( zlib1g:i386 libldap-2.4-2:i386 ) + # Serious Sam 3: BFE + elif [ "${gamename}" == "Serious Sam 3: BFE" ]; then + array_deps_required+=( libxrandr2:i386 libglu1-mesa:i386 libxtst6:i386 libusb-1.0-0-dev:i386 libxxf86vm1:i386 libopenal1:i386 libssl1.0.0:i386 libgtk2.0-0:i386 libdbus-glib-1-2:i386 libnm-glib-dev:i386 ) # Unreal Engine elif [ "${executable}" == "./ucc-bin" ]; then #UT2K4 From 5b325bdcf8d0a0ef32c0c71e1de9f38e1d0f97c0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 9 Jan 2017 16:59:09 +0000 Subject: [PATCH 0085/1895] Added unreal tournament eula --- lgsm/functions/core_functions.sh | 5 +++ .../install_unreal_tournament_eula.sh | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 lgsm/functions/install_unreal_tournament_eula.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index ae1b436ea..90aa7fff8 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -510,6 +510,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +install_unreal_tournament_eula.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + install_retry.sh(){ functionfile="${FUNCNAME}" fn_fetch_function diff --git a/lgsm/functions/install_unreal_tournament_eula.sh b/lgsm/functions/install_unreal_tournament_eula.sh new file mode 100644 index 000000000..b39f9b2e2 --- /dev/null +++ b/lgsm/functions/install_unreal_tournament_eula.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# LGSM install_unreal_tournament_eula.sh function +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +# Description: Gets user to accept the EULA. + +echo "" +echo "Accept ${gamename} EULA" +echo "=================================" +sleep 1 +echo "You are required to accept the EULA:" +echo "https://www.epicgames.com/unrealtournament/unreal-tournament-pre-alpha-test-development-build-eula/" + +echo "eula=false" > "${filesdir}/eula.txt" + +if [ -z "${autoinstall}" ]; then +echo "By continuing you are indicating your agreement to the EULA." +echo "" + while true; do + read -e -i "y" -p "Continue [Y/n]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) core_exit.sh;; + * ) echo "Please answer yes or no.";; + esac + done +else +echo "By using auto-install you are indicating your agreement to the EULA." +echo "" + sleep 5 +fi + +sed -i "s/eula=false/eula=true/g" "${filesdir}/eula.txt" \ No newline at end of file From 774cee7ad68d0bf172c959ce1631fac3ec548a66 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 9 Jan 2017 17:00:08 +0000 Subject: [PATCH 0086/1895] now using UnrealTournament-Server-Linux-Latest.zip This will make it easier to update the url using the LinuxGSM website Also swapted eula to be displayed before install or server files --- lgsm/functions/install_server_files.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 82f02ce49..0f98680e0 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -34,7 +34,7 @@ fn_install_server_files(){ elif [ "${gamename}" == "Unreal Tournament 99" ]; then fileurl="http://files.gameservermanagers.com/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; filedir="${tmpdir}"; filename="ut99-server-451-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" elif [ "${gamename}" == "Unreal Tournament" ]; then - fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Server-XAN-3193528-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3193528-Linux.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="e3dd5853c4eb193674d5c832f60040d8" + fileurl="https://gameservermanagers.com/files/UnrealTournament-Server-Linux-Latest.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-Linux-Latest.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="e3dd5853c4eb193674d5c832f60040d8" elif [ "${gamename}" == "Unreal Tournament 3" ]; then fileurl="http://files.gameservermanagers.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; filedir="${tmpdir}"; filename="UT3-linux-server-2.1.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then @@ -125,11 +125,14 @@ fi if [ "${gamename}" == "TeamSpeak 3" ]; then update_ts3.sh elif [ "${gamename}" == "Minecraft" ]; then - update_minecraft.sh install_minecraft_eula.sh + update_minecraft.sh elif [ "${gamename}" == "Mumble" ]; then update_mumble.sh elif [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]; then + if [ "${gamename}" == "Unreal Tournament" ]; then + install_unreal_tournament_eula.sh + fi fn_install_server_files fi From eafb1bec502216860a9c1c988b0e2141a5cb0f0e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 9 Jan 2017 19:57:29 +0000 Subject: [PATCH 0087/1895] Reverted to using direct link md5sum would still need to be updated --- lgsm/functions/install_server_files.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index d994b5df6..feb208919 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -34,7 +34,7 @@ fn_install_server_files(){ elif [ "${gamename}" == "Unreal Tournament 99" ]; then fileurl="http://files.gameservermanagers.com/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; filedir="${tmpdir}"; filename="ut99-server-451-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" elif [ "${gamename}" == "Unreal Tournament" ]; then - fileurl="https://gameservermanagers.com/files/UnrealTournament-Server-Linux-Latest.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-Linux-Latest.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="e3dd5853c4eb193674d5c832f60040d8" + fileurl="http://files.gameservermanagers.com/UnrealTournament/UnrealTournament-Server-XAN-3193528-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3193528-Linux.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="e3dd5853c4eb193674d5c832f60040d8" elif [ "${gamename}" == "Unreal Tournament 3" ]; then fileurl="http://files.gameservermanagers.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; filedir="${tmpdir}"; filename="UT3-linux-server-2.1.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then From 0690dfe92fcc85dddf35f003bc51482af6b92dda Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 9 Jan 2017 20:11:54 +0000 Subject: [PATCH 0088/1895] Added factorio to glibcfix --- lgsm/functions/fix_glibc.sh | 16 ++++++---------- lgsm/functions/install_factorio_save.sh | 1 + 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index bd793d72a..9360d5764 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -8,6 +8,7 @@ local commandname="FIX" local commandaction="Fix" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +# libstdc++.so.6 local libstdc_servers_array=( "ARMA 3" "Blade Symphony" "Garry's Mod" "GoldenEye: Source" "Just Cause 2" ) for libstdc_server in "${libstdc_servers_array[@]}" do @@ -16,7 +17,8 @@ do fi done -local libm_servers_array=( "Black Mesa: Deathmatch" "Codename CURE" "Day of Infamy" "Double Action: Boogaloo" "Empires Mod" "Fistful of Frags" "Garry's Mod" "GoldenEye: Source" "Insurgency" "Natural Selection 2" "NS2: Combat" "No More Room in Hell" ) +# libm.so.6 +local libm_servers_array=( "Black Mesa: Deathmatch" "Codename CURE" "Day of Infamy" "Double Action: Boogaloo" "Empires Mod" "Factorio" "Fistful of Frags" "Garry's Mod" "GoldenEye: Source" "Insurgency" "Natural Selection 2" "NS2: Combat" "No More Room in Hell" ) for libm_server in "${libm_servers_array[@]}" do if [ "${gamename}" == "${libm_server}" ]; then @@ -24,7 +26,8 @@ do fi done -local libc_servers_array=( "Black Mesa: Deathmatch" "Blade Symphony" "Garry's Mod" "GoldenEye: Source" ) +# libc.so.6 +local libc_servers_array=( "Black Mesa: Deathmatch" "Blade Symphony" "Factorio" "Garry's Mod" "GoldenEye: Source" ) for libc_server in "${libc_servers_array[@]}" do if [ "${gamename}" == "${libc_server}" ]; then @@ -32,6 +35,7 @@ do fi done +# libpthread.so.0 local libpthread_servers_array=( "Black Mesa: Deathmatch" "Blade Symphony" "Garry's Mod" ) for libpthread_server in "${libpthread_servers_array[@]}" do @@ -40,12 +44,4 @@ do fi done -if [ "${gamename}" == "Call of Duty: United Offensive" ]; then - fn_fetch_file_github "lgsm/lib/gcc3" "libgcc_s.so.1" "${lgsmdir}/lib" "noexecutecmd" "norun" "noforce" "nomd5" - fn_fetch_file_github "lgsm/lib/gcc3" "libstdc++.so.5.0.3" "${lgsmdir}/lib" "noexecutecmd" "norun" "noforce" "nomd5" - if [ ! -f "${lgsmdir}/lib/libstdc++.so.5" ]; then - ln -s "${lgsmdir}/lib/libstdc++.so.5.0.3" "${lgsmdir}/lib/libstdc++.so.5" - fi -fi - export LD_LIBRARY_PATH=:"${libdir}" diff --git a/lgsm/functions/install_factorio_save.sh b/lgsm/functions/install_factorio_save.sh index 8cb28b326..353d57c20 100644 --- a/lgsm/functions/install_factorio_save.sh +++ b/lgsm/functions/install_factorio_save.sh @@ -11,4 +11,5 @@ echo "" echo "Creating initial Factorio savefile" echo "=================================" sleep 1 +check_glibc.sh "${executabledir}"/factorio --create ${filesdir}/save1 From 2c5de2bb97a4263a0a73385d403c242a9f972c2a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 9 Jan 2017 20:18:00 +0000 Subject: [PATCH 0089/1895] Added amd64 lib files for glibc fix --- lgsm/functions/fix_glibc.sh | 22 ++++++++++++++++++++++ lgsm/lib/gcc3/libgcc_s.so.1 | Bin 627675 -> 0 bytes lgsm/lib/gcc3/libstdc++.so.5.0.3 | Bin 2886540 -> 0 bytes lgsm/lib/ubuntu12.04/amd64/libc.so.6 | Bin 0 -> 1807032 bytes lgsm/lib/ubuntu12.04/amd64/libm.so.6 | Bin 0 -> 1030512 bytes 5 files changed, 22 insertions(+) delete mode 100644 lgsm/lib/gcc3/libgcc_s.so.1 delete mode 100755 lgsm/lib/gcc3/libstdc++.so.5.0.3 create mode 100644 lgsm/lib/ubuntu12.04/amd64/libc.so.6 create mode 100644 lgsm/lib/ubuntu12.04/amd64/libm.so.6 diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index 9360d5764..84c244a9e 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -8,6 +8,8 @@ local commandname="FIX" local commandaction="Fix" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +## i386 + # libstdc++.so.6 local libstdc_servers_array=( "ARMA 3" "Blade Symphony" "Garry's Mod" "GoldenEye: Source" "Just Cause 2" ) for libstdc_server in "${libstdc_servers_array[@]}" @@ -45,3 +47,23 @@ do done export LD_LIBRARY_PATH=:"${libdir}" + +## amd64 + +# libm.so.6 +local libm_servers_array=( "Factorio" ) +for libm_server in "${libm_servers_array[@]}" +do + if [ "${gamename}" == "${libm_server}" ]; then + fn_fetch_file_github "lgsm/lib/ubuntu12.04/amd64" "libm.so.6" "${lgsmdir}/lib" "noexecutecmd" "norun" "noforce" "nomd5" + fi +done + +# libc.so.6 +local libm_servers_array=( "Factorio" ) +for libc_server in "${libc_servers_array[@]}" +do + if [ "${gamename}" == "${libc_server}" ]; then + fn_fetch_file_github "lgsm/lib/ubuntu12.04/amd64" "libc.so.6" "${lgsmdir}/lib" "noexecutecmd" "norun" "noforce" "nomd5" + fi +done \ No newline at end of file diff --git a/lgsm/lib/gcc3/libgcc_s.so.1 b/lgsm/lib/gcc3/libgcc_s.so.1 deleted file mode 100644 index acb442512fe19e4f151d7b6b7cc49933bdcaf5c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 627675 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

<_lre&6h)Fv|Rr)4ZsaVUy3PlcO2 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®_+= zUyo?hav!_EN1#XcFe)M5Qikrt3FIcQEWaSy%yZ4Lv$}iPl3=imHjCUn7*I3k38T&0 z?&Y{N4CHI`ICmaC$fattj{DlM5D{$_yJgt{VzgP}{skXXk+01L?%<37^0)Rf_x9eE zkZ7}^dw6UmB-(7`?tu`~wAsYHsBO@oSvQ-yuR0+j+HB^wJvT%|o6X&;FiENFW(${( zaQmGTZFY29VQ_s!wAsnM0*dw#(Pn3NS*4F?vx|E_Cers2ZFY70gqQ0W(PlSyyGqmM z`Is#|6yq)0yag8kXARn{!N@B@Xhr5Q-`8d;zNRW3XtS1ke+%;~4S_Zb+~w!^h_B7M z?ub)DMApsYUA{Yye?7s+Ceh{z?oiB)kBBzgxJPS-h-kCi9f1qb_YrNjcRxPSN1#pi zFe+h8m!dmy0=d^O#~YY-qotC5zBc>2D@O&xXS6xQJ-i~AbAL}C>Tc;5K>nUS%w1i% zM9I2Y;r@kn+n)&0=5V(*b_9bMZH{m|;q;cK&2jGgX9bY2&GGL3(90Sp+MM7H4$s2= zjm3#>+q1)hX5F0Z*27ZjQ;>CYihD5z&PPO>Q{60_>oP^x!-N`5nr35+zac4 zh-h<+``i8y5pB+LGe?AoXmgG`8*3~7@&x^gHs`tX6ConnT;TRN-AABJ_An}8Oy38> zaRRv~ud=MVI0LGZ4Zb$da*trMG=pWdxyc=JTrlUwX5HNE{x&0kd~I%VPZ(OQdS^W_Q%ZY1(`Uv!yqoYog6RhTu_Lj2W~! zfRQ&8p%vN3d|#WX_#IX8K%3{d&tu+mb5P9J=6UY1T0Y`ybGv)uun-Y#?r^WcOh_qz z-Mrd8)ILN+oBQ2CP_*wO+PucSr)`LcHV?TEW0MgdXp=p}Z*L-u=~3uToM!Gvn5YS| zZr<%{^B%WT>tL{qHXm}EW(9NZubU6MvpNQlugyo?Qd}GUAj`V>s5^c{h=?{HbGPAw z@O3YLkU8cyhIrDn`HXucJj?p)=Ckf?;1tMJwE3KS2WBvUM4QjMw@(crqs5g}eGl6%FGxEMeXhpix z_O+Rc52=a=+PvQ#j&+k?`Utf7fcpWCd4l-be8Rl|3%`$uHlK1EO%4%RH{WpI+!G?A z&9~fnl|G`)ciiW;hCZUr_gtrik3f&?VN^oA{~Uzl1ajA|#X|vD0946OzBYe$>y-t= zXSDf;`*}q$=l;6+r~AvS0P?l@m)jO%N!8}x?ky*Uh-lODnqVwawW+*03xkUM^Jc_r z5U$C-HZ!~{t_r;TJw56@hD$z8o7KEc*i?PUXfy7;8(wHeo0;DEVD8hDbu-J`j-m7s z(Pp;y)XsEmCcIWXLLbp)p;tH|L`0iK-ZR*D{dz>3wY`}oAp!weC3U>K%B@7SS?sM@ z7y5`cOS}aqr)l$d%$9x_E3jzuTYOODtU;R_8F`x!;{Dgm_qCad^M+R%9%%Dd_ic3P zVpid=o4>g^SNe#rO~*S99S|S?vykgOx*qA7eS=0L%o%DS~ zoB7`SpdM(GJ;bZ=5ytd|U=*iW?J}G&bR@SfD(ibSXqGhg%txXo-pZ4LF*6c9!P|@d z!AyM@v$ePO)?pG2lw&@wxAFeGJSb{nkaI z!@Zj;Kahz;M|h85M@cz$UV%x|(=o>)(WO{fIBSq-Lq=Y6gjR$?52ToiUsx3nB--55 zC*ms)9*X%AZRy>BNfpGGXa}$7oDh-avy)d82@#QKU+-oNmS0LF+TT055)p|G@V4#= zeMF)Iy+3e)NGZsYJ&Z~i({0e5IDy>zvC|abD5y%N_}ZN6Z7mOm&uDXww-mdNne(nj zn{&Nq>jY4)(dIm_92=`Y?6S4b_kP|UBBIR&UcYexVzjx?D>*5s$k*m+-qe}_Pf+{}#^10Oe5Sy!yh&I=IM@|V5(dJp+&nrSiw0X8y1||5VM4RV&S6}8M z&?b8rl`y8C2ctNFYCExfW<+xNBIkJ+eN}RqFVWpzC!7?_xEhIG?OCCWY8i>{^M+0c z)ZiJ3?)UgU_f&}<@Ot8e;Ugl^YrN@K1c;I7LGM}YSVsQ#gunM-8gKNvVOufK`oI7F zdxG5XyvbWWC_vu?YCgLk_MTiApli+7KyLQji~y={gnGn#U`NobSwwI3n&TFSPfhmu z+q~6SO?*Uzdb@WByK$;e@9;|&J>F{U zI6fjmz0Z5QO^Aq4k9sTW`v`=}9!4d^@9}_9oItgj-{3hfotujfQsZZXX33|%P(Sl7 z+ZBwN5$dTg~zTuG)m=Z`?BzkAC-)1XiP_4nTsWkvnNd%9_WT6&@^segK(6bD#qWu*GI zH+5i0Mb=a+ayzz=RH>@SSCt=FM5<0?+~Rbp>c}kYA$}>5YIdYF9Ii1U)kNg|Mxl>L zH5utu=_69jjWoU{^bx7%MV@aJA|llqkuNbhDN@~tSsab8tN1>_MvejJ!Gs zt;l@l`%+EC*Hy&>seb8gJBSY~6H&~U>et>`BYeb{>M!2qSiHo?m+G(Hu>m0>QjJ84 zFvPx(NHrR1919VVYAo_6)?MF6q?#FdwA4o+RrU}s^hOxd$D=!Onz?suwyb6Kz^|lj z#GFOTBL%?BG#HJZ7`batFzNn&-z74lSpfNG(XNr|I3@YhC;NT3$id+uB8zGFNX3Ex zF&aH762S##q~~k2Pvo650?0WUXtZx+Ov3=Z_p3mo{UQ^vOqk+USEJGXktg#4tVgcV z=zz#Ai-LyDa(Zgy`_MaV zGV&fmXhm{q`x;Hf>sQ4CjdqCq0J_gG+t+BP$iNLg;%l^LD4^J{F!{PtJr7Y@JfRFOl<8*ID4lRm$Dli*aZ>t$&A|8Q-4J6#)a29l~fd}Z8y z3f5#*2RWt9??Y%ZrhG>KX-KOK`zX zyv;KGQKs~aHE50VrR;>4Rz@aqYJ6MZx$e)(UPRJ7=c2g06vUd^mhQJ+OVcmOw?pzoNXP%e>H5zc8*jF z>Q7b7sC^jEmA0g_8jgjDHR9C@$eVctC3*GQv+inPSxl+qj_$a`8p+kU48ZJ~7?sj~ ztZMcS@G9*`ea?RDAnNSL*L%#7>Q50aaZ;JfC2bOn!{D-aJo(IX{QRgoFUw8!}tKUpS zqdCTl`@>S(A@Dk@agh=Cf6HWvx{&A^CCja!R&0sL4q?>hCvzu0& z)y+JDfUTrB&H4|qmIt z{0c@D3;4QiA&PQulTcNnsB0Jg`$Xq*4U=|&?Va@h-p*3Cv!Dp2q!pBUo3&MK1vTx$ zf4`NeZi@nPZB3sEi|f~6WIrSgE~CN;D>d-6@#80Bh2k}YK3Z|on|=@hm#^pG9+^yz zDMf}a{~G!!T_+dOpyfC6@>(ZLONBN46_n(1mO!bxRZIGfZ4Mfnp1@wp)vN_Pr&sm% z+u4@d&NjcD72Ji@>s*jq90D6A7odV0rIO{J0#Yr`rO&{Xm|=im|O2R-L&Y`ju=2_8b0VmGkL6>sRt9(8pP#vXYmP{EU#P zWIA_e9uF*h-6?|qsiL#DWvu3&42iBb>PcYuh)f@WVmvh@P^8vBi;2F~IML0()r{p1`)BE(QB%vLv|3R5C6wlIq6JE}`+qAvt!ilp$4c(dT~V^n zKTDf7XN4C_Ke%&;9thX1|8!q|h|B&wX=L#7ewB%eF`Y9hd&I z9@Fenzu9oKr}GfZEqo7(y!X#yrumhr&6`ApUqzmwvC^jzlfC!!C_d`1ydFwsl?Br{ z>&x|ZmUaAkUM-mRw;rsCEaN3aDSzrGlrCyICWutO-6ed`g1@dF5xXH3IKjOOL2 zIoZ0cW!3NegNE6=0%%MAZe21T=lp7|N6?`;vg)_+=P)o`e-t==U1!&S z4V{fODf!WLcuCys7g$tHWzlO-MA11P68HpMRr39f@R<7(0k0;3kvHP~Zu4B+OU*w2 zGy-S#M3MP52<(awxbtRsENDO=8=tOJavePuwj*$~34y82Q0byR1V&-CQOWPw%HmN3 z?#CTrm29;hz>?Vn25?_X{y>kVs|hT`lBbe~CRkRD*Z7-ojmisQE;YZW_4#Jl%k2Gh zT(ts@*%MYGT&G^Fh6wS;jO}&m-;DJ-6^$XzSf>gZC)TN^jEmQ)E{wabQ-c`eXKE%h z#*ekCWn$Rt)wyEm^=h{m8SB+eVkFk92gN8}uU-}d)qFgb<&kgEI6WwB>M@;mZiGE>p zmg3KysPIQcHmE1tNXfTMw28Uv)YyKA5YJ}}c4soisBLEq7W)~4#T|^n;(NyHRL%Z~ zymhKEV{3zYi&M5ieQP57R7q7gQJIN4nrMKDrn6w?GW_k47rs1K&3aZ62Gv0l@ij|G zeQzRrn51$|RL?|hOw`Ln!%Z~9L@P{mo{26q(e);}*F?{l=v@Qi1aNQ`iQSBRz-|=+H&UdYi>JG6RiOshexlR+Y-xj->*x!lWN^EBg zeM-fyA$C2n8;adl>`r3W7khx%EySK6c5AWQZ(%)MFZ95nkJ#;iZ&2&;w;yze&*`h= zf3P7r^=4tMOHMu)_Z5oyFhlZNppg=8Z^@tYV3zXRJISxw!>oJpT9{YNgn2yw+>$J= z3$rDk#z~&H9A+!2;cuKyA}8>xy~#K5Cxu9BsqDI|VYcDQnmp1AW?QMZX?sx39Q|l2B32`fMf=locJHykWW6p3}zQG8#RO3RnuYLLYUnI zt+4=RcQNH9{j>Ak{OZy z4o^~%Q;6V35q_Yxg+-TI9RTn)?*hcQBeRT=w;G|3eKcqS3kua*{FYUKc6zfMMs4h&%A4Mk`*=d*Xs#<#2j zqhFN}`o)6xp(g299UNj=EnY8!5a0hoW}Ien_GUD{$jr=km`g=22Qa~rRWhOH&WE{L zCO?iPC$dKR^)*GbR;KPW%5c5-cE`mO*&x2LJ}}P~^j_AxS(?Zg1#^pNZ(A#v+XO9c zjO*ouZ@|fZa4$||NY-;3I*Ag%jp%`qaSql;shLevL+@>Zk?qr{X zR5O!GI2#rt)tny!?7Ddlf56vmVe)D@ADx0!OTO{Ou3O~P!CAmr)al>|C7bwbb`eKwOXJ6Ik6xbAH&F-gwSf<8zKGDVQ{L1$cfcNC5*}Q zNpS+n)@P!*?#oey{T2cywcFL%avtDrX4H7?wYKO|>vjZWL02^Q0VD4-gjVyX5z;Rm z28&9FELaU5Z$*evLKvr+{0XNWx2LFtzwqo1=FcQ2-&h25WZph-TaJK9?GATNIS6<} zCAYQ~U1|+RKyGvei8B~^8xUH}XCiDizHJp4+$tgRVKsQX5n)W9hcHevSzyfq+dD=PL&Wjv6`raG3^`xCj!Ygc^xmmcrEUHsS!Dr)llxn zDRs8$I1VS%@0-I@;bquuSfUq}?6cL~3z6}I$w(fXg-`B{hafkqdD2NfOJLr~0Fr#8 zf0MehXD%25vmX1HtUw2w953tP-F0Esry{ctV$D$5C36rq`h6~LT2@oXJa`{#Wm)yR z_jTED1eHVisX@tKQ&8 zUd+8$!7RIgvWnwCklB7m66Oe`vzxw;V)jt9&tyh+Bj>4(fc-_@I!7&Vg#pa zcEE9lC2BQ833iAj!F&`WZvsLqzb8WarNafO5J|I|sDv>+4MpMvlEX==%`&9z&k-=0 zk=@FWI)U3BhSew4+9Y+&l~}G>qSiwQNQx!V`nQa{pAlO5Zy=;!I$V$nkrb=JYpM|9 zONR*KG?Nu1)g^Wat)GE_$wYQ1L#i{6Zk41?G|7yb6X3`awMHNyDV9X*8yI=#A++-6 zBcxwCT#yQp2&;)o7}Hx}#|b2-o(mQwAL5jdh79OAyg@|CD3+yCB~ zFprm`!XBFS<$UlFE{8+|Ia-~9iy_fy81$cPf`eqD**+e)GW)=6a|d_IjA=02uP6HA zGMFb`O7j4&?!-wq(X0hwB~HGJW;Hf^$`+b;Y==4i5t?_>obn0H0~oTz48H0zS%S(F zbI;xbb1H^9G4Dc}^`YIwqVa6_l~ZA^rSy}{&xLuWIZIMU7#11)_C(nYpQ)+mkAIyuThPk-b6PL=l`-;9WcT?@z-)T%t^5!TO z%@#bwB{M;)`3W!4)qLSu~$KpXLgzP>H9mqWOItQxh7`g1x_W0{KwNnumu0X(s#H(D9(e8KIEc$ zuF5-PS!H#4oTqNUeWsh?sFaFdhWK1n>w0JfcUILsxbynFWVz0s7hEfTJ1e|#BJQ1; z4+N1i%W7Hp42CcHHI~AbwZ$BWF)aSkMlC~|B4AP%e?4|6hHFj5aP0k7#dSl_U_~#C znqAQl2TKR9euHcHF*b(QFU8%kQvpKdPA7Z_i?cGT2kyw&R_pqxQ$1P&0RJwYsH{F4 z@%Aqaj<#}QO32?QKBf@hi_a3|CIZ4%WxcAtlA4sam;f7<^HK}5a`8Iz^ zZVZ+D#DsExW8_&1Q3PGF6dOs$Gtw|j(Y^3{0{^SgaIM&$ZD1IQ&zOUfnfhUXnfeuk zS#KhU9pO3^$<&__`5Hm?%y~<2Qc7rcG*iNa_P`*Efc)FG3Tfl=(mLg=aP z2_N}O_@G+&dlnPQ<=`rB1wtz_mNtu~;~8lfM5kkL%#<*p*TBvqVB_79*5w1R#Ogw) z8#Yf}M1({9Nf)GQ8yZ?a1ypGKg|p!AOej}DtICTYv?3o7VnykAMjD2JDaGofNAjC&0 z+N>xY$6K^hFb+x%95W?M=!;-y5lBwL>@{eEFGhF^RnGmmrXyQ84!KX`&hHDsQ>v-Jpn|V|f!T??yl2Lf&CNFDth*e$COlIp~G{p0qeE z{jiZYL}j4IJG{zkgV2gZX|u_6JR=RmwZ@`sQLZ%`q}QP0ObHXZBQmoH*cZY2&ko#j z&giJ;uxd8FaXQ}0!-R5oG4l2x#OGn!;+%$Oq+uMNu5iqhFrg2?&LUtp#J;!@mq$E$ zt;3&uk6uTFmr4G^NL~M{$CP&J-fvsc!)DGiw1SV2T3ldRf58Q$SWbC5LQ?s(S#3I= zk%o~DpGmjbMq?NkMelWLY(_ixnRYCv5KBY!p={Ji4v+6c>S2@0a2nP{>JgKQJ1QR$QI1{jjMISS%JZI5WNF6h&TF!^Kl@@*6q>7wJvCKuEFsWkau31PuWm5H=qg#=B z+N8>yhZ`aFj7c?dZW@Txb7rhsI7g-+^@16z*3QqTAoY^zLpx{w`AEHNQk`3>deYS>J1~u9?tpuk$RI~=C|wia=H{E^;TU;^{)O7meJ@wr))H$ z_f8P-cL$|8Qo|k*(K+J%rZbLSCj_8JDM7<Pc%dQD9Mc6d$8|BqbdUwusqdz?Oj}Fs6T%h^0^vh8KQYYw17klHY1CE;F$s! zrb1Zx*?bKDJx;L4QSms`;7{H~q*IyAK@76*W;W?jv8FU-9Av-2Y|>?Il8q|=12CaU zJX6AiE`~=IfrOqYFvEl{Crs160@gw~FtjiShL)@l1E!ZDM<(i5NQiFe=srf?wFt45 z(Pq(fJR=QbW1ZlbDPck%hMh&A_MU2Z(Z*b>i95l0y*u{giGI7zQ5?zKNhYP8_S2D? zY*HCceQa;;6qAZOdvOuEQ%x%2Y?_ADG?U769@&M|bd##(99MzV43jEyUfGA#Op_{h zc5XmwjyVz3bF!J5OLBJIGQAS9jKO!8Sk`q+DEDSY-W>?7*Gh=uD(xb-xZ3FR^m?~q1_`~0-oNIIU8hT)jbmPM!_PF|V%LGVoY;X)u; z1nh@0E$bR=pDNz2#O{PGt>aDIEQ=^UH|Ik9U0;b8C>|k`)VpblcZ5K)ROvJ_$(o+wp1B_^d4* zgvC03(w&O~#8Rb?5$bVkSP>5TKg|QwvuIf8rAxCgKJi`^7lcqo>1EjX;=P;ahft!l z00SRCc|In}G-wr<_QQn`?^Dn^gu0g8fL$@(_sg>b=y1ue5MI1r$B;wc(la?I{fD9n zQoOpN4qp@a=#pma-q2R328b#dJr&5X9~TCQ zT{3Pskc!2)YW&7ZuEp5Lhxf(qWRQ%K^REUnVyh02M9Gf6Kt>MV6d=VpUC#s3{upLj zU&iU?0{Jwqw`XPU-Ip18Zz8lJM`(*mR4Sg4hCxxREOs^++c?wnFU6S>CiMHr$Rc2O z$igvmIjYMXrE_3Qvw0XMW7)AXFs?U@#q5Gpy76E%d zthRWuv&tN;PiIx^VfC(-#S9d`j*)jWLMyU^wm7HZ8EF`s8U)8o2^0Db*jWVZf%xFD zkq7Y1RkfDjIB*ZZoM+d-bv3EvWFH6fbTJ!YnljH2v&)Gv*NFM?OqgqFYQAAds7{2W zSuvBMl=}lE{=Wp(mkG76JQrSiR3g>CE*)bvn|9>IPvVRL>Gq zsBRQfsGcpRP(6pHevwo-s%x*p?#%=~1||@B5rkHRFYgOzrQjh|!AO-PG9|?4KNQU( zU>|_Bp*O0?JYT5hAZ@5_5+*`*vzS74i1w6^v9#0-q5PCiI;MvuN6bpx{Y6P(|i;p?WVsL-itIB2;&XDO7igDO4{O zQ>b1-Q#V9iLbZP#yfB{$42GWM=Zeb!+FBem&ULmGXy;4k}x`(EIiBu?n30o|S6@#jsgUHK3XhpsvY#gQ>b1ercgadQ?Ef; zq1psBvtm%afsuCvp%uB9wof$$52*@9sw9yqVM6~4b`}A9a4tTM;UKOuuM?{G0W?&v z7bZgW1~G-|jbaMbo5U2VhiU3Ys7t8s8-?FnV*)>D!pIwk5P!d??Nd#`L#l$2DoJEY zn9x&DD2ssoC#)YJEtPphsLn*%P`y={2-Vxf6sot2DOB$eQ>flaQ@>0q6u?C6`K%aJ z9S(yRMQBC7Cgf91!9%Kokt#`KN|?~uD4IpUJ_xJkZd8$Z_y0rLcYsMzY~fbTboUIn zGt4fqENmbwK@C?*6kU(;1kM8#`Z)N5AMYtHBu z!&OYztMC6$RoC<^_}=&UKB}w#^H5M9%sf-bqX)Rbc8A~h;gfG z1b3uQS~K>imER& z>TRbgG=N1z@vy}k?R&+z1Pu|Y#5aVjsuA3&Di~Fz5-ABY9=EpB1Y)-%b~~0jI`x{U z+7$Oj)z?K6QS}XpimKZsDyqIIQBn0RM!hqTR#Y9{6PfZx`}gn?Jcv*wu3_A&8o`~a zf>Bi}f#-9C8SfE0pVM^xnpc8#j<+{ZoQy0|{}xq?ac@-pS~L+=cS=-L{YIjq>bDXVRlj4@TY>Q53CRezSKsQL?|UT5Sbs-B7`5@rll59KA8i4fU91Pb}l{twq7i&TkG;9HH={sLFhqd^4#(#nc!M8L<0Uv6 zA%0YiajQTCcM1qb1(0uKLe9gJc^HfORf=Mm@unkDn$g%ph~bS2iW=`- z#;jPY<%^Y~07X5w1!79VjQ1SkX#%lMt(7_ne|)La6WdDJ z_)~h1Z~CRot%u>&HgB}wotK~np-Pl7E~)bHWFE#cUy?EzX1sn#lx8%x7O@v6A&c~+ zwgRxs6PYLLIkj3TGEn9%yaab4REf(NmsELpG7n=pgFsA4nDOpMJWU|hqzw*RVMf*I z$!!H-nO`$cmU+htrN}^;EqDo9Ayf&EaY>bjC-X3txk<`onDN>pQJT@%J&2W{1$BB( z$zxaG!5jBQ`aUtWb5(E3hfhXlmJIO0nP&SN2TH-UMTV zQ6|s*mUtuMUC=n*sGZ1@uQqB2;cm3K^NNDbxNAdpd^Bq2jd>cS@|5kDc--*D8d^a- zj!igkoE-9~%yi^oQ#MBP3Z!G#jKvkzn#4N>;s#?F z%Igb>6nw(9HJ&4)&6SY$2SDN zWmjzu@2vSzsYXxpC1%J)1>#_*B*ZQQ;%Nf0q3v-7Yzi8x(R-!>?-PNUwELO4Q`G1~ z?T-Mc16D(|D`fm23O=y{pH`w(m;ETAIW+ow@+mN=Fx@!dYCn_N7x}14GgBPELYVOm z1~JWO>iQy~wnu1HwBY*- zumOq%f(~S~b=GYNAJd$>m*$1B;Lz$YBuYt$Sqkwqfx<`k#-rAWAQw&2-40!jNcU$i zfmd4+`+6yU^bAt`ta0~VXosSCvBC*x6cz^P#9@Hu$J$_gh0t~;Ton7q;dVrW)eIi7 zXijVmrT}&n5*FQ&!WpL4Z0qiCVO}qKNw=7#)MDfVX~_`>Vmk+l6*LO~c#jg6zPKC@ zL(~QjL%al^B2TIxs`8oa@AFaO0$qNyQ88|tt*Q-$gD-~g82us^rgT0| z*q_3tD5Pk=*adJ}Y;Px=N#Tz-Lim|}7aTT*6$alzrn0A!A-#2x_KwW!uIe?EwPBZS z(p}Lo(LU>;hn$6MC&r2~Mok|xl#VvNjRP-8&;R!D1y0s=z%fjAD#kaO5pVJl;`t9q z+C_W;GL5a#AaL zCPqan_hq~;#&ZWfIrSB7i+Kydmkul5M=6$qj=7GPU>!o0;4f@x7MPFYMPM02wQ>>6e_m#W^s}ZW2gDI!}MOWh^ z8zNCP$2jns5VZ7*D7pP0(60+6*7aoXrl`ke^ump?*i1XJ{B=^+$t)}TvSX}^y^eW> zmC%-PwlIDsL(J{A*q2x!$>_BD(ia5mFIC-wnHtNB{SR%VF4$#x2^N zfOf%s$=~;Ce**+MxD%nOnLxSgdy%M`1rB82N9pHL;`&}BVc*|Dk?s4JPQ|$zmf~-e zvMym+*?&65y4X&%7b_7mt`Wu$WZ1sHeR!CMQ6SRy#Y|}XetQFEVkj)q_I(v8w(sBc z!@d`7RP`hZZQoBSsFz+eaedzuV=9_G`1>0Alf z%_)yz#=DO^12EdVV;AJq0o_zIRquZ|TyxPhO?SBeWIVDKP1ihy=V_3n3+G^|$rKpA zB;j+vxWV~HLWeG|k0h^Gm}YO$i&_elJmeA5Xf zW77D*3qbD|1ftMyZM7l;xeenb7==(JGK`a553j6`W2xTZXswz~95EkXLBrgDw}O%n zeGl7(#ib<7coQH=8-UT+y9l~N0o`=6s5TAv-YNv5+5uUu$bbs+Vkp>w8; zKUNI-v1)h>~I==7)#i^HKigcWpY~BBZt7Pf&tY^cnK;Hs>DZ>Th*fYkM;3TwHc+uL)AJ;KKn5rsKeq? z5@x)%z|sa_bgx1Wr6gkyApYA@YIwM4*aP?8(FjDt{l;oV1~lBvORyE8N}S2K)i8=* zRUZ#EJfe2rP{ZdXpHM>=mh{pwUHC>S0KF6 z{z1G1hayyo3dXH!QM_AyJXCE?41d00M#CJ*hlh};4vR}kh*Oi0qz%Am>?;KCS5vjQ zqS}1idp98v)rR74A;^Gg-|-Usgis|OX56Y4#s66!4^^9YDTb9%O;<6Wcc>XuV{v#V zf-vL#jxcQiMq_7#`9mpHJ6cpr;NI)QHXHTh*d?jGQPQs-ThQCwc*NAXa#V-MInRP9yC=SR(E%Xlm!NBGuL}3QnjU`+FJm<6hKk!m*ce}1F9XyOK>%YdjEn@Dzj{)R!t<4--4H*6+)Hx59Q1Sm5kuYJdCCW z_FlIf339BUG5*pCdpImNB_a0zAWjn~{5xV>=H)9q3a&1q@V=mg3X>ix{4nC)g$P99 zn_(D_^9CPx=OuU^p-QZ0+$tQwox+0Q+4zE!phLl*3q@6yi2Xo>@I46Aj22GosnljJ z2_kJ9N1sPj-40%;D(RuBvk>=sAP`kYK-Hsoqy5Fa1ji%9M>!a`szz|9s$fv{xw%yJ zRE$xyDoe!QryD$ow?#7L{*lU@)%~k4#+0WXyF5h-3)7twrX`ro~oTd z2~{OMRCP1ro_ybjsvb98tF1tw>NC6q|3s(~H#2TqHG(@;1%s+jcBHB!IsaxnmY9+- z}e3(>ya#q7T+&V zUzLMkI>k?WGUQrMk~oLlfa%i*5g&+*D&J+MPkUnJt=dVPRu0Zc;(wAeqrKo_UI!c{ zahex6L&ck>oG7C#M!UlOkn)N{^0CL3oZ?MGHL}}8uYzhXfQVDAq})z z2__nJH7~*S2vuSi<*aQ!o-KkK(HGsQRPo=vCoqm!Iql!Zl&Yp1g-lfZApUsDWXGnn z&+j9gc%u``MnKhEO3uN94b;1OgqBC|nB8KkJ%_?FZ1q663(Fb^a?jdT>nW{mDAK{0 zZ109DF6k2#e%3*RWnCpH<>pbX>U~OQVeNp7$6=}cKs4#^6u#3$gj0t}Qp#=8=ID3b z;TVygiS_2@Xwse(Zre|Uc$T6%l-r~eDNSL)fKorgf^=&n=|KI&fg%{*T#`{{lBq&A zGFn*|!hsL~FVi^X9uK6;?xiargu`Dlv$1rp(7{jtTMN@0^6X$)DQ=oNJBO++TdQDgiL8I7En3fJ$Q&ru8_E9J=)wTGrSX(0SF}iUDthjhujJe{EVH!Wr@ig7ub}AX2 z&`P`rC-mZ(F=_uhSvK2$1Ki0?J8*-elCT{e+=?5Oc#?9a%*SiK2=U@M*l#f@Sgusb zv}s>G3h9dRO>rX+AE^uJf{G_<)v35cMEM7<1KLlv3!!|;h4As>&qUk7M%yV!DcU~P zNUQsewj5h{;umd?p`0n9Z3NF=OnfD#)#5I(Mldv4shiayr;;vkMB;>{V&|KRb!R2m z4Rg?BPnwExvV3WuG6`hx=zbXeQvF7-D#t=VlB~%mAnKU5#s$f<*Z>op4~!RX6j9PD;l2` zr2Q;Ys+xDgM8yxgWU|j`=Hp)|mif3&S7FW(=O50;Wdk9U`M6F`#L@)TX!LR8O;z+~r{)|;Depit)KI=yX7B!kEd{RlZS zL)Yp3`qZ1DKcG-%=sH~i|LQb|%+tSiOZPl0qfF3a<)+RtRs4mw zi*df4DBj`ymvO#zEB?|O1!roS^+$0W#u4l?uI%g1(D-MM)@zpa%4d};Ph;h@FODFE z@l_o2Wx#(q0`a&n1A7xDz+%sr0o($Ethkdufo0uG-QEkPFwRe$7tcseN4#p>5Y)dD zmxllKDh6pK(}@mbYqM$zg}$ss{3o&MB8s)6xJ21gsk)MktGVpY_zls*c3egnPms~H zKN!vY3$bjm1n&J;=Eu=kd%6qpCM)C(>@_`JG`7bZBAwP*qEtL)s@a zqs9K0n7Zk8K-<%lUv)XT_tDHw^amd5+>qqv`qJk6Fu6Z+k+Z^o8$OTj5c#^cw6u3f z`vQZxc#U6!ZHC<%v?_)*j9%0cj2r!LP`1rT+^fq?Rdpn-3mjST2LE)dTK|GJl(eJh z7w+^s!Y0}5c+<~})X+H;(jOGx3#cv!Bg`i8T=fj4KP-aubAN6HoGvm1Lp%Wk zmHmW_S%=e2`k$dISuZ<&RMy9k*3WNWPxa@NE~WPy7mV)i zq$(R93BiXekZelOr=OXWLi?z0P2rghk!o7-G~8Z(p1mn;1Dh;f6g0(VMW{;lU<%G- zvg3oBFq=>Xm*-*%H*ut#67-3rs=kDR1L{z-GlB(4W@o&-jO^@YC%q_WI@vxP?luny zxB4}5U*(ut9n8VNa*BONLA(hB*9T9v()N&u6r-}KQ4sz_w|P^r|H4ox4og+Hr*J!6 z`YplaOeD(#D44eh?e{?NF!YMl)l7rK=8-XTsVaUbXa;3=BV^AZp_UHd(cpvAwc;u# zY_9Bj3a8Pz{v)`1cD``fRtje?oTZAN38pm47iQn1aMBW_d@eW>J)4*9Zxj~p1GQfa zKEaeqpY6(QHX1iq-vQyPL27V4VU|K3fGFM`v_?1Or5s1$09NILU@tg4E|6Td3n{F? zV!!y4U?bW&Pk14PjnJ~iUj$7Ks3*LQ!nR`}{C997oLFAUmna;M4+9m)5-(NdkD1(L zmi^w*8YT(~cBiRq$(S&sOyZ*S?hG@dW&1l?Nn$&!KRQO)#sLGBo#|+864TNAQJRd& z>}ig%PvWI~hRUvW!cK{2Fr1^w#S>)f9HT06Y*{|TIW<-N8ENy%&|fu)|6$mLW0)DL zs=~357A%2uVB%`*YH;2PS2VfFRpz+rEV;L^p(iH3gewVi5}xr+hdIijiT~yXw^^h` zlse1tW+cAEc+ATx*J;(aI^KfBF4^!i3kb=IJXQUiqa2esK-@-zA`M-=!%>b)JRWHR z=Ax=I4-3CBabC_vMmow=y1V0T zNSwOI{G_)GdAcLtnb1r3RJcs%rkO5sB}ea0Q`u`A${>mQcxIZUW z!t3moZ=}zTAy)?a?}_GkHppx4T$@*4<9L50&P6-!&NG(&gyZRCmxv#BMOxeY#__!5 zzwp?zdw#iwsxF-rDw#-rkIMfA*;xMpj@&RgcE}#duBobzbL3R=Q|uP(p0iV2RbTDM zg~?Hoi6PQVk2p%>D{k~z zYf;&O6ehTAos%3ot)6feh2wibcvLdjUn_1|hIS^cKI{x4vVdQi`~Z^{Ywq&Cfj9D8 zuqt`|vGs(HP$=u=E0cpU3e1vN+E4W`OYqgnt48GuR0HnW@+6Y{T|{S zRr>M%Z(|pyI1{HT{6n*n&ki;CvNJ*|A1K4yy_&SPT~@p4cP3rTS&Nkt0xVBVnaIUPiiXsN;AU zkC=PC07!K+Xv!mbgTGPaC0K$GfB($5J**SK-C-TUP_f$sX#tj%@)+Xp|By7zXd%B} zcn2Ces^mA=f`}-28pxrNq=!ltAnv_SCD@%Ob;cn%AW*V|m!JZnO8gX2GJ-oL1%r~8 zOUDhvE;c%gCE~9H5oWx$$R^Eb;eCjWI5A(<#n|SHsM-;fP*u`HRW~8-osU3Nor=BU zM|q?DCwU2;MW_-tF>c#4f;&|OgR0LDfDQ%69V4o;#FWPnf1Hdk&1m6a)0BD;&(YCV z-Hzo;MAg^93sogORP}Jgy(|Jzbr2@vv?*pnr130x@tHwZ}YI9zK zmIzhi=ZLBi+^H%URBeX00=i(zL82;4#FwrSX1sRDCe3K!Kkx#qY%yP+<&KnHdW5)3 zbEIq^P{Si-B#WXrQpVv_X^)i2FtbO>h?^JHPkUD)qwq+XSh+n?Mk@zLj+9+Xjy+N) z=4FqR(Y(NsBV{*{^CV0J=aQsf?U6F}D>!nb>{fE@kuqsed!$SnwCfDppr4+Kx6NRp zLI2K6@GwIDNEzbxNLd8W&L(b;l&yisVCA&`6jQ32v%*Ajq|78^)7ifwy1|Kgq|Aur z?~AG)p~N03dl*v{|3n8H7b`23QnhbWXpfZbgPD$OQg&WPt@vl;F6kHw?UAyTuo?&`w@K$yYLArt2N`dVCcS_{ zd!(#?Pf1F-O?oS(_DES_H=MwVBy~s1rek{qB~oURsX{j74K?;i*)C-A|2|SS=}0l# z-H(*LgyjF9N6Ms2?2)pZ)$i0YiJW#g>cruhEz;^2lnQI2zB>2=H!5)z<@QKf1h082 z#N|ktkx;k#N6J`;s{Wj8d!%dwR!I>%2n^#-GVGDEuV;c`v{2P0RK^}DTY=@L6Lh1% z9w~ct--uv11@=hUD9-L-R)X1MS=Y{CK` z#-R)D#!^ui3}cdl`PiU^6QzquNr=DyM!snSFq#q{lJe*!QXc(4%Hv2cTr~?{NW-dE z&IXY$=M;F7=VOS&vq2OXhxLkaSoUlX_3?%v3+cvQSQjxrbmKL=1UDj7iK&d+vq2HO zW?6{K*&rifqnL3YIU8g|GUnlPsaHzEjJE+a%0hi`l$t+?DeopZT$I_Glhbk610>72{0(>a%mlO%AnmEv;ibk610 z>72{0(>a%0r^V&2$Lkzv-FMK*tR-5vKQF-$86=NTZqEiq@a$W}FS-%y^i6uptkC6- zWlB}^bC^iZ2AO1Zo2Kcjn#=*qo(<}N1y`P9t)bAK4eBZ0(drX%uLqH1&jzh8t><1( zqR^fVnuW(&9Ii1MM4aqZZakX!fW6uW7!Klx3wg08i zo((z^4{k1lh{G*mOWCtQFQ2eShg+wo_KzfvxZR9LdrL`}@kSu4v;i0`{0PA#7`Spa zh`2i&MAsXh4a!;UYsOvv4MMSmcH^~T9UHW!yDYnrP2$gpRFe(vtZWrXn_8TM?@ zE`I1}hPvqLOL4z>6*|Jn^qoW|OXM-MUkP}q(punCDTGdA@797>k zu2rUzX3qxAhHXS?>^e(3i!^&SX#T>#q}@WAJsb26)QslFxT=1U40|?cKdg1IdxEM) z&jzvns_Nh5*|R~9z;DQQMtC+Tc{DS@jsVUEy|AR7a6by|*`V(*d)qai^LS<mT--&GK$??b)C$gPa?ZEL~q(?i=LV zvq5L~by~V6x3r&0vuA@2!z0UX4O&$(9}Igo=tvZ5t1Ir+<)*5JkY>*Y?UO67KJ9SQ z?Af4ms!hw{fC@8GLsw9kI~%k?I!>`))Knm^IppjUdQ@c<} z##PlEGVIx)lQA1d7^?Ox3hmjTT^Mg+(mQFjwd*LgXM=vm>!W<>R!Z&Jp#3N3q&tyR zReemUJsY$O(k;%ad8O82wkch*xLHAQ68qlK&ogCs`_~{?Af5F52Y`Z3{>@(6xg#tt&eg7 zGxt=-7DH;!27Q9f-Y{9VB?b0u&;Y!UVoQYfQQen9dp4;2beGEJIf+txHfThdld9|z z3hddS4tP76m*+(k+Ot6e;d??&s_&q{o(J!ma+6 zTzfX?hkm&tvIWOLV9y41U3;Zqdavq5*D%sk=0DYR#Uex8&+ zW^$8RHnk+AHB5X2ql^wMnX0l`$H*kU#`2*)!^~*eLmjOoaWkHXqcpa0zyM#qanz=PcE)G`-x*zB^F|_7S+Q!HC3&bqTcpw(7(nx z%MD0ZRh=odXM+}CP0D#|w-uk+o~Ry6u00!cKVI(JF<_RQqEq#Wj&f*X`8^+d;8p4f){<~*L8tW@X7cRWpjTuo$;=ee zOcIzjeZ}#vOw4UsFF)Z$8thj`UX$1{XHR6)B(0AR3%@ZD)UUM5R8^05ybXz6Q}>jg z6mGiW6i2=@Q8a8%uE1Mli#t9 zSC%~E)Ox(!vY>j6<5eWzNz~)fiUI~I`viIRY|vx<|H8oVryq{iKKV8t59`~Z$~Ihv zjO^Ka4? z*&uBG@@!DSQ+!-3xC+mkx{zC`jj+j8}vm1uV z3CDs~!Ae*K{HOv^mED^cdFn2YAA&uouXt}W5{Hr&oz5yg-`U`7JgS`b~ zgCKVQnM$?30VOqCSaL`wr6vO`y1X~OQL(6L0?`4J5na3!Sr$EXC8Eb%Lc$8XwkkP} zX^YNX3-s8Vi9R+Omaxx{8qt2|09|tD*{nZAQvcU7INJdn^&iShFcP6k{D*QDT@UBC zUh{C(zBQqrJH%A86TUeM(SRSQ4dgSn2MnNW_A#p2DUS|Du01HG#EPd=Jb$TbcDmPa zcX8LVDCYiRvom{iG(Whk<>0aj#0Pf0ktFUmG&^_p0A;MkoNn&=6h)i@nq8R2Q$CM+ z+VnDWiHcpnB&qy76mscXuq^(0nEk3u?r3P&G#XVlmzu459=Yt9R7H|B#OfOOhX_fE zW6!Csqe;4yU3u-_C*XGvq_~6G=3VDew7dgEH;o(_R@W$bK1F@m>l@Bp6}A*p1(NhY zJ$um{)$F!8S(~hb-Z>rQyEdcSX(rn6RE(W}Z3|dL3BJ@Z2KLg2M#4jz!)F05=}Q8g zbIBImiY@g)F(tjkYBKC!db)zW@cZR=<3{^wUVd!QsTPCGU90$WPospv=B{o0#Tqb& zaNy$eMsa>MuEkJu*D>C5f7~5l?)HgqYlOSu=5F8k*-ddb(%f~5PsYAei_zw;bG+Gk zxI4()b%`I=0C$tj-G1KLXa^Z|$Ir%x=Xrx;ZoC8!BUFj&8D~S~6mps)*yKD-xF7hM%Ad3?T7PeD|<{7kGjuQJ~>3cwHrI-?NMQBanbpf^H%|CMp3 z%*T^?7!_d7_@M`c8E*g*r5TMKc)d~|^v0ajq$W1!0{mc96Ig2LvQ9Uy#*xXY1ZE5K z$&gOnHvp&^Ggm2o@m%ZpmX%7CUdD9-tzz@lxLaxNym(LaXX)kqX#|`wFIs~ES9+R! zDC>1wAta1cV3_?mL+P!IpJKCZf!o)4Da3Rz$EE_}0jH#UQLsjfXK z8;3pC(lxj5oiA%YhO!<9Lw3XXBbbGhui76;d>R~g>AEve`4I1VCh<1If!|Vek)2p< znyxof#uo^scYIrfp@`-R>tp7}=SWzJWTkg!{Jg~Sx8~*#&a?j}>qk5bl`YqWh?^FX zc}xCay?qirqc@^COCPReOV~COVRd^7>*gYLpx->Ip0w*gN+0cxq)%SHK2HNIo;Jd! z%Ifr4u{?oMO)8*byO6%aFc?Vbi*4D3=xiPDdI<7+)r?8y-OeJ|sVz|Y9Mh@urBjcU zPJM!M=7CO);{PJvK7!jfX(NPO`f|u-Ii{u5$e(7S9)KyG&4o)5&%cz;Sxo{z zjZ-@JdPaHjq;%eTM)^^i(xYxibo6HzLO*`Dt@N{Dn6;P{9)<3KNUPBaj#_yn1(73m`K$oFAga!^+#=U6t-u;K-KQ+D3$s_n0T0rWW_+$j&_s|`oYFIiYzi2 zsM-@qSq~-3D)ihqDW<|XeXY_fNjwDZt}LxjnRwxpeo(;cW7_=wz#f&m}DAW z=?#w8?$r>)(6fceNN)FUC)gSawz7)t(wEq5%3g>Ha=NK@JsjnYJyXmGYB$C4-VJ%u z3OR4n?gU5qIFDkKT;rr)hEhq(L1fCPd61MeYdr=-UhF1(N&Y59^cAJ!^#`~-gZhQp zNL{nPI>teoKPehzNLOV`FAejUtZU)Aq6})GvNdFI_oZ|yPD2_4w56!*K~6YJpNPsv0Qx3b-2^Z-ROY>7^@1l^ePfM5RF7Wjn+pf%Ko$v(x5XLHf zKv-t>a|*c~RCpT2TCK?!R-a1Y<@nM^*;jfinlJ1i*Uzf@+K^Iunf@HT6s4%_LzK1~iW;rb zXZEj``*sSCJ{1G#Ae}k9UefAsDdic7(ra`VERkFj7GS+0hha*u(@&t2&4h21 zG7;aT%jV*z*WjydLzrQk9qSky^eMN5bG31#td|;g3>kRWUwW7RX~rJ170rJkgtXu5L zmiY`*%23Csjr}rwcSgi-WEVK@*jS@u^1042sO+U74b$@QcDvJ5mi0Dj9U5B?pB_~_ zVmPmp#-lE!@9Hj?uR_C-x^>+}DWBrYe){d${5(w6TCcK%(oghReRpR>t9F3nexskr zxzfUzeA_#8?ilPwFVle^I$rZwF-Glf z*_o;qVu@g~tB5t)`!8tG`u24RI>x?2nY-m1sq`$z9TDqY@E2T_z0A?Z#IBsU2U@OY zvzr`uQfx9j6({hpcNw>Tb;*sk`{poJ=^3%xuqVG;yGyD_ zz|l_0mQ%T~DrTVl`F zGva#cvkodd%O!XsHn5)Us?%V2;N>%$lM$8ryAF z`|yzMPvO05;gFifmlo9%9!4Sm2Bowl{`LlJZs5tstsTyzkejz<>ti2-6Ioc~wttO+ z*?U56Y0LO=?ee*9sHp6AN2`oK6VInbEbMq(kXH6qY~jKAw1|RFlXmkUC|DDJ z5%Flr5e2^wX=VS86~iq=Y4sH>Srca2KmH>+e~(<1?eA!V;#F85L}?KP=aBZ=$xv`u zoZtVC(jp389@5HwjjhP$)9NeuaL6qk9Up;(c{EGMRoM?6ZG8N3ceoF%G$-#i0`pgtb+dyxux^tIQF?`E=E24x|CejE54y#Jt7JoNE(k1 zlrD*XH`?reL|4VO(4$G?o1W5B;{Q0rzOyhs#LkPWLq^%C_~Y&K8REbtV4YR=1;?Ec zzX%J;od9<$RPvSLtq$M1RL8|XD9umBUR2pqR;>MrYOPwI z6vLOt|2Yrk8br7LJDym|Us$&|L}IPyy#>yTFZ2o#ul4l3VygV5&ijW*vh~8bNcD2> zk`T$XKKKiydgb*IA<}B>%=z!5L^@VVuU_1Jxo-4tO3a`5XyN_xD@HYJ(`oH1#0Pw-L7r0sD_X2&5*= zn}x^EEK+GUYWa5U`#0f6wHxKIw=5Ry1&L}m#|hpE1!79=&Ub?MLIG3cW8F-rH$=LAK?yfR%D;FZiJx<#o<>`vSBKO9EeQmH)JVk3A8NCgC#n;h&Q( zRO+8FS8dWx)K9RtWBP%EtcF9cCRrM{ExO(+OhZry=_X4+-do>%Gq=F1o+7iFo!Le2 znywTZ1Y2~{E(3M1iy-KxXWc3rY0^tlrU`_k(!8X+x#-~rWUymo-1$JMX2vT7oMtp7 z(LU#`SBm_$g{(h`b=) zJvATqqxAVxah3rXP5p07GFs1Vpwx2~+N&JU7~K@}#lI{xZ4scc`ibSRbPLVp5FDpp zISIc)Xrabnu{E(b?Qu)wZGJ zu6-dnRL?&&A{jc65)R+;+3Y0Y2m2sH)A~aXck($oIa}At&vo)6b8mSFO^2U0aqcY)_A zKU>${5|L9BTtYc4j@Oj;70vTzMEQVX&9eb{{67hV2XRf)m8HpQK)W%b^y9pz(b)T! zcu$M5_aE?{=3?)^P}c|*__eF^am9MT9<|kASn`WobN=EF$-}Np`y8N{3{j*6)p7d zuvk>9@q+_#TdIFVOT#gGXE1jT(U;CpY86$+wg)X=i zpEWuP#ERa!`}H$X$}pX2V^xE{TM9>6ae$s*W9Ox~_WlS9f5gX!rcB}YO5q!&@M2`C zB~R@~@S1%?yrM4@5Q(Z8O7HVOACQpD+U!A-WtkYxWVU;_sI?3V}}JuwPm6z*jI;%a}X+L{;(Nzej{XrxjFS z;~VWAaOd!ts@U`#TG%F8bi`6s@z5n`83S~B@nEeg9=;uIVS$Nol@*&$D|5he1RnVm zYbwk5868rw<)sb|DC`d4(Ung1PL&TJ)5i`%W7{O<@ZJ@V??f+KV0144TYHUnz`ZL0 zJW-8@1Izd?hG)e;&OOrsXR-QEcE%)V8P)p%sJjp0Gty$6`ko44+t6wUY&ssmv+a&^ zz};y8&s_|oG)WGdxp=Xvc=4P8NS1tZ2IzG4aHM!`Ri_X*?C{w~s){$)&Qa=RQ^*m=9jhwdY7ccS!1qBF zZ*PU71}ItzA6T$2-wF@s*9I$oIOTR3L9yX=d*Sv+bL+*1_oZR&dLQb+GsK3!gJE9r z6P*~2*v5u`!jbT^xy{7-_w9+>M%p-;Cb9k}!SX9wX}Y0UWl3yY!A-cY)Ncez?Vwf0 zbh1Bx0=J^Aegm50*W_aTr=yE1Z~zVRSmlgZ{}!z6-kQTURyixy{}*b|MRTbXtDGAv zIB+!<_eJm0*6*d7MW3>lo}o@fA0-fdfsVL{ukb6j)6W+D4s)&enx3fr&38bH*U%Of z-+qR5qxL@ossrbxRPB>wY)XMqr2D`W@G%d=8HlW~2%z}CY=x#eg&95+t15LTBu~JI zEB4iQV@%Qggi`TH3cG+L3UvZs*oMmdsC(fI2@-`=NL2fjODvC0?DX)D`~GWqj~yDs1sJ+6!RXX zgV$p$&esQH$kS+?mVY|oVtrljP-t}62_;pw>@Lus+Y6bWpdW4!GHfOLIpHb#f+nFb zn*0zl7Q&BItk65USift0Uv?Q~FJBAI&e0FR+T>Bdb{rp2@Fid}mJCMf^YzsWLWU`P zqP~3?1Q+Yh>#T>*zCil8=0I2K>*g!<6T8A@XlnB<8NXxXS6rhj`ziH%eMU_~B728Wai>0IA1oX|%NJuI!j(ZQ zN&*^cAhDfn_Ke461qhJgXR;B;`Det_Cd#pjpZ7+H?;jC1QBJxzfG6-4!i=VA25FA8 zG{;z)qpJb6WExpOCYYBL_r2sLrEzw~uV7s9)LujK-$kgGC3D z=$7r;JdG7X%T8^kDYYFn!N!7aGXys+J3raiL9sRsFw?c{Qgo|>yf&>sZ@J$Dj8mI1 z*`_6-t~bFKSSZtG^wTlbvfHq=4r)0on&x=y(n@u%*=s#qmb_Z}1Yl zgHR<7Wn41I#~0SeaqNfC3QU2mx9W3z<1g^X#vD)Pm4)m(?nJJ5WV#CW-1;fqaRt3{ zeGZARbn3|HB$Z}0GF}{EO2Uly5#nhAg-70pr})=ltF3R14{C{<253pI_3iP&wU;BC zX|oobgnf?%vrba6X(uh1rQ*|0nzaCrbY6dOrS6Y)REoKv?hAMcmLOD#gBh2c^YCOI zM!h~4y%^&Ar%04$wD8*dm0I>M>b0LgXcOR9;Df!^-TcAazf*%b8uZ`>@OiPpui*%5 zd@zsqdaAG#3HLdk-0ptkjVsYm-F;?;1-SPEbz*;Q8;irg0HO1JyabyNs>EK5GjTqi z%)^xGcjK|hHtU~uiBgX;iS|bE!kka;q|`qI^SAL5yogXGW-~7J(RuiZ^>I8~ltY2m zz5Jm_$BLVuPm{O1<`u7MK-Jl|c6T)6k(ZJXfBynungG7nDlkKQWt1?Zg}wid83JeY zbnDuna!gYcHc+N~uLuIEL?b+`k%eX$z)LU`p-Sw-xTMU(lX)1+dK+coleP#m-bf@$ zGg|mPV*j}cj=xPpH||#!Q*DxVA*C8~*R4$h`zyR&z0!GXd~8=E%yuVCx94z_s0s&dRO+(Eh*n-4@An9-rt*^bI~B;F2NjyZpDC@pEIwj_U5IKmqxT7b zR>o(nbx^;3;0`MaReXFahdhSWbLAEB1<2Rtea~nhSH{2W>N1+~ zCo-*E9dCGW4yv32=<4`~!*b9ZtVSxYiNiUY)iIRHdVto%D@Hn~Uo{K7F8*NKu)uy5 z7!Z}$$Ndcs*&Fjt}pgoYA{r2+zb1M1>5bj3Ly;Uj`#;2;1V5`Z+`l z;o10gr-sN3F@)#hZ(#9YGKv{Pcsbr>KnSTBVhFFqKRYuAi6OiiU$`;{i6OieAF#iJ zj3K-cpOOv>G={J}el#r4swsx>W}NSuEh2{SR{RQZqK5Ex{Aw(rEJqCC)A+OSj}{R_ z_$)rFi9^H?K93LY?hrJNs{A@W0$$Um5<}P-|L|moh#`CvzvbM}5K3AesMIX3SdqkeMgq+r;s6Z?(uo z{qPK^`_K3@nBRmmQTJH@< zBOo8gTVWQJoMD@+VM;=LAsq^*2^60Fh*Gb0fqs>{tZn`jue>d6EMuGhi=PbFZ0sjt zZ1a!!v|~dkW^D7%_&O{qY_p4#Qr=aI93r-J(_bjVw;V;RmF}Ywwdv!l;+!J zq4zSnEoz%(-VFHmsBM;eU*F;ovCRr^!EFwK0jbJX-c@MqsBO0P7NE~9BDUGa+l-nS zCndJ29)@i`yBVECZ`J)u9IHgH!3HnnC0L12B|f6u+GZ60u|6K!=CAR`Pc#dR&^G@Y ze;pRYC5N`Q>3IWS?G_Q+47^G3-xd+uY~poa>=3cdVsC%A4a*VREb;hj0TvP4Y~i(8 zViDLTYnYNS_bFa=%N%`+2dcTcql8_U>cFRyP|*yq+Zdwbt!Lde?Y z{@zWk!gOW=?c*JEtwY2%`+ApQf-)UpY_p%&@g|p%@tcFaFUmv6+U5}NnTV4V+Z^gm z&^eaa<}mMfxUxLkJkaZu8y+%&4)>bpEKzK8gm(&tu(b}c&5_>4m^Gt*bCfq33l7T> zzd6~PIL;yBH>Y^#aOu(mjj8*IZ64yS%W+^ps`4;zEQYz|h~J#*U4`c$i->Jb^BPv= z+2(cVEpPUt$d|U6K$h$^*k%V_g3bt4;#A75ZAS6S>f@npR(k^{;@A`|(fZAv-Y{6J zAl5bqc-LI)5V6gH-q5}d5!)Q=ozu`EVw>Z=0b?B^wmH%J43=nf7TcWUeTI$^1h&Z< zrX3uV3#RB({0F_wPnINNjVt zcL{t-o^7u1n&)O!vCT8R73HA{{lqrU@{XVG5V6g(y_+ZJ+vYjmvWpx?Y;&de?dc8? z+q~Snv5!No#l#5S+={L1LR5y|pDdNNjVH*MFIV%$)wP z_safZfo4wM>`lp8huG#L-pe^(Cbqf7dwgELZ9eM#0&BHaCbqfFo421s#5SMxw&r}R z*yeNI#W@ZP2n#sxDfq;w-+aM4^BRYUZNBJzgaI6x(_cq#dDs5~okYKR9R?eF4YoO* zmtZzRm3WYHYnxGgTYWsV%?;l0Li2f(&^B-N4o0<4=!}f4ZQkoG!*H{R*yjD-vvBhk z5!>AA{R!V{5wXpGcvG=$Wf8H>r@XIyhlp)H<2AV2BCt)?5I=Z=5WoL}>ZBPh-1W3l zhqi+@mG4;FeAoMGdDvLSHb3z$c9zk|*yg8R&5+OxJY$=mdGlZyw%NrtKlhp+?GUle zFT8u5(=xWX!|Sj%%*fj2H{PxAQF*rct=FS*4iek^&U@zUtR+J402A4 zW8B(i6rWWe4{h@U?@sI_Y=iF%ZSx~-)kza5T)7Q%dOPS>*~B;N&8Ggf zOT)%8wpr${MT43?&luY*_pis$Fp#y)3i-XDsBO0N-#RGF$@tAy{@#s3#MowQ{||6X zM%Fev_~VlyWasp~{f)zNkl1EN|K6!NNNjT-e=Q8r}CQEBSveA8!KcOP* z^H#=hUhMxiH-xNhUgD1$9i}tS>6iLvp5YL&&CC2%O+&=k=1TvnQ^Jg_ZLap;f!Eq0 z=4x&8YQI6t93-}RjlUK%U&s=_xyEmCvV)9mUgsa_CIRC&ulJXrQKGhagTK9xL&P?3 z^t*S-x6QS_UgS7pn|Jz~PjiUa=3V~9LmeWv`8S_mZnI^HZQkQoUg8k3&3pZANr#AS z-sc~(I?px-qqn>iI!bKw_X$d|*I=73@e;g&P$k+iZf!G)*VM;D+dR*I1^v#G#i8H4 zz~5G45o?>P{C=3#gk$IQEB#y16BZHMT<_oB%OT=7H~8aV(Uv2&d8@w#)0aiWHgETz zy3iu9P1Z0aVa9t03a1Ga&VE^`8R9n|v9`Iz?~@H1%lOSF{m$vI&#m8l%0FuV5VE%U zwBH6}!*+!D&1d}S7*Q4x+pP0f9v>pcHn;iv!g!2{S=)Tk|ND>-vbOn>{~&Y<4N+|K zWq%WTFoeW5U-382c95~n*Zdt=s9F`oZ@%uw;|>wO`G&vcVuy%rZug(Vz>m)9Z~9N< z{GHh5$NriDE|u8kC;pOLK4P1n`a5$RvCYr@(=jJleZ)4u@Q3Ge7Tet6e}RYNh~NAW zz2)8h5{!s`v*kdg*lV!Oqj?FAL8uZ>P;PBAioaeT4{h^t|6uq{9`p!p^9lds#TK!) z`J8_#9KUd^ZT{2W=Lm<0ZT`!DXRSlTHsAFZ<~U-T@B1%b<~U-TANujG7J+TDhA9a% z-U+Bqnn0m`O{vr10CeS#);4$fZTAkF&)DYg{+C#P8#Aze^MC$NM}?5J%|HAeFqWuo z{^{R8$RT2zD(K`4!`P+{<{uMgWNkAMbeJ1L);5#D4L9W=vCRfST~Q7a+iVzIgh|!t zY1f+t!3S=j8NZndE`;V*O|i{%unJ9S5wXoi!9TCcx6Mq@eX!$*ZI%Y5GaMqeSr)u_ zf1*flY9I?&T!Qun*Y;zfU%Nz14I*GRVEglrvYp~4( zFF^_+e*cYfYnxGgaeX|r&0qZYP$m9EacG;r`9(Kc#M)*&s6YjTV{Ow9o;k}Q|A(^o z0F$EVzK5&3YkHQM*f}$XZ1QC@Wm=#}9%wk5& zIp^@2GrnfOb8dC_&aC=-zW+YY-nw<_R@JSlQ(=0#dxV>n-7m2bc{ak$s&2*g0V3Qy z&HWgS^lXHiS?+wl9B`8@Oc$At;814<=eNH@mx!Z3qzI zW)Jt}xvAXj>E7Bqun}$!ai^CtQMftO&1@Ce2sekh-*pTS;by738k?k7yKr-adu!Pz zG2!M&_fc#mN$X}cjFx`?B@7a|xfEw0jvBamkb!$0qzeDSbdQ_Kc#Jm5xX;bTuI_** z#llGT&YMl$n=q(?c-(B`@|Tf3M9!P-TwX8t5aDJY_f~Y4hX^%PE7 zxH-uE9Wz66ftze$y2uQD3mlFUsMPv3Jfu+-{uNB|xH;9`TH<$~;pQB7=_US{cQV|Z z>pqKPhv83U!_9ea33gPk+htFm@1EKoAi~WBZr^b}Vz{}`t%;eC!p-IG)YE*({l^J$1U!P!9MyXQ1hYvi2G!4GFW5o0J_x;rTK<+3{h`$AKc+rYc}|!ZsYm^A{+ee z?pat(l8JhUdmXmnWTGB(&vF7AA?ic!xn~535cOgAy|S4qM191)ugnH)QU#B>-v`~$ zL5TXeJF81jju7>P8@)J%s3S0Rx(Zc6cuOU^q19gw6$@t*%xKGrp z+^KNx7bbf|-S6haJj5gF_3pE9S8P0@-ssjU3=kpe-EM_MfCy3VbQP37qDa6_ya$sC;!p0*-DgrgI~UCs{>;pn9BrDZn4 z(JA5g$`()I=+y9ldOmeRTyN8$02oO1w_6$Fh8z92bk>N&714KAFDm)y= zekpmFB^(_S?u2H0h;VdVxY;rf0WaA?yZ|3ELwAKoajMaJNAWP59%8?*)F&?+$2O=kKdxK0DnW6K5 z#|aGi5}JjKrcqX%7yGbLb>8tCT}y_e;(`FBjjV*p4*GuJV2&xcguqfGajpM)2_;Nx{0`Wdz(gL&@Cw6xAU z&9R4=mP%HXH-z<{2G&@e^H|HMNtS9n- zyBMm{RJxy-isxg>fDuvA5@0n25WNL ze=<~4C(&lsMrcU7NId_9QsM+M zG`q}>eW=tP{wztoY1JxDx71}wPprPzQuU^9D}b7r1$72h{Sh5tKYr$-Y~({fCK$NY zAXWHxrn8JxJS_!d#jGP;WQMMRtZ@RBDt@HY;E-p2F{M0S=eHWMq9-dP(X5Ot3Uj5i{=F-OTP9}ThRg^#bYsa zi)r%AMN4!^0WznH%+O7d7$;zV_zA8mFSb-#ajQgD8_fLX{gIYvtd*+Yq%nrN&-faa zDsDqN_D-J6EDDhTP5AM04^Gg!lyZy30zAXWGn(`lWG7ryD^ z#U1?&>c8-yXDOU%`b90|trPwjd9Ry`io4dI$WAc@^D#O1n|i*Gcl$PJM%(o9uVs>%Ams^3T5Q>|ExSeXgi7bRg%54Oz$r~{tldWWVF;-X8s^ZPCntt0@%lnlFQx>mByL^z*>&ufg-FXzIvv2SD z52n)Nb*;yH*{XQni)b%v@LVT*yMQcsmZ~UoJg&2p68noa# zR-19o^*-O9gNOG!@%bvJ;C#!jmNpFQ4C%%nbZO9v_w~vi(4e*K0sL*325sns{I*Mj zw({F98}|W~-|EmiI0jq^&hBBUO{fLz-pat;38}(2F`bp9;)O5!c!QOG2G&wWCPRwC zp98x~e7k^}#$@VgtS*cy8Z5Th6wl5Z=^3O(gL!XZDww_$@34i?*-;H)-efonAh{aN z`?DEq;_1yUSaWFw+_bS~Qw&v1dKds}Tc4H}J(jByKu|LENZa z+7q~mfKmSv;C=!|eWC*`o+Uta*1FG>8r&V6|TKbHf`o>1hp`Ta5fT%By+f$Inp>AJj)XA~JUj&>04utQy{?Zw5LiAIoyX zqo&Y7bDryl*zKm!A!_~}RQw?RQO-2g@Ns=Nb8N*%+38ZUYZ9d8U&oMW??JGx#g#TK|RE+;+Pa&d~ZiV~+|3d+tL-IzycB7PRd`Ak&H zcOW=`l%JS-6(Y-zLOkvx_lp&1av$o7lST_(h1MF1=|9FSJQ;`}T}%4^ppvX6oiU`7 zk1OQJ!{79(F_QgjuN*&qqNhWhkA%3TlR}TFm@^ph5vMk_tnRaTNYNDx3+JR9Fw_5MiOh2%w|_(GB=dp~7;~U<=Sa zwErg>n2~-R$qnIR*+~ECBi=|acop?<-7}4q>4CwSrW#zrCCyBaOJsV;oVbLOMlHSq z0sEm73ZFJh`rrmcF&%DaFlfnf1e^{}N?2uS9x|})>yhC?dSs@-GQe#6Q9!Q{mbMQC z%C-|dhX22}{Q;m)(*EDu9)Vlq@L$&U#y;Y;eevY4O)C~4Vdw1sAFcSrfAOq@)o{ zrt8B4h+jZ= zuYi3>$e;T+4}ivjCVAi^ehWvT0B)#BEmVt_0c6Q6v9~F8AfooRG_~qlC}-YCA|l~B zNjyv6fQ{j##t5SAXHC5>h}qj>>g-eXu(h1jM_~Jm*q@!BFUWIrEh^Y$M#aceU6LA zd1uaFteVZN3pBQBD7;EsHrQ6pW^px4d~}1Qn$4CEx7T+7I%nW}K;Pd0bnY3<;hx4E zXWWbjw&u+uaN%+SYrDgE{we}{u+~|LJ8y->f{O@LypX^;S}eSR!0`qIrsB-dY!TP; z#CI%z@m)-N;4ssgtp~8=B!L0Aj%p>or^V7Y2`n5y;JOLO_u7~`xISKz19hqWC-u)Z zLtkd=?_jtJ-+Wk!9bIsTVR2Oe=`skh31D!wmIW>rRGgYvp|^R>oTEEynZLT3<8lv=(PZglpDW35IwNf>kJrz0PVSie6{+ z6(wz*HBOX_b=E>r^4D4Cih^QxQ8}{Kx{hI=b=Ex$HT-#o3c~jo!msZoVXdXp4W7vm zcs+*jw+%!1+m9jq9mg<#y|t+}!u3|Ax)RhjL5T_am|(04R+(TUE)QDgTAAIz*`_+= z?7J|e)>}o0qL@!cOVDhF1l<{&XYmJttl(#N)>~uGm(+PCsBs};Yc0Nhp6&UaA^eVC zi4cD0GlbvG7{c#v4B_`V4A)v$GjK5+4B^Mj{Rr1vXPMw)6C5zX?It*3f;Ua@BQsVg z{=qz-Cm)4bPWUP*XC#gaD2{IE;hkF6WnTohfMII2|hBxDHFKYO7_!CP|pOd zP0+^#qfIc!1ZSIIiwUkW!4VTYXo43^kcp)Op4BnI84T81-!VX+$;BF^W*iYCzDL4J z{89nyQte+ArUYB(Hq7}Ez!nHb)7)a`DO}}r>wg6cd?4CjEt)zPx6_!YE^0KsiDHhd z84&zf!<_i&aw!9M52Pwy4N1FHxPCIkLp+N~7nz~=L5~wijG$93jzF~wPVrTNbgG$g z>hvG2WT%>&D4lAmm?P^C2s*`_sJ)1R+Za+6SAnEmDh#K}AUefj(nV(I7RVAOkSL{7 z9lIlL-wDBJhTG0K)t+DAm-SQ!6HS9t%@lKFT>?R;m=m?%&%k{IQWakZNxM`SPL)A) zipAg^z>pdGBxIawV)6yJc9YKsrV`&^P$MXH@ccePda=|_4#E`JBnJ|2x_NqiC(=BYG*++ z7eMVI>Y<%byG!-A?uOcv1D;qq3~Dc_;uq8t=`FS&RD?R zt&yQyP8zNk+b*M_o-4M|-cUCRdLPT(ELEh9g1SYxx2+k}ZGz_4$3?}{-+)i{&A;I6 zg=lSE+#hP6<1DeHW=#F3zD7>T0{+`A!F z@l}wtONB8KWe{gNi%A!WQ9zbBfy7Vvnn$;N4sp8+R&hpSx|PF=p}O_C(lX`TunVy^ zkD`n5vKjc)QZYkTE;7(3W<=$^7`OuU4HSyzeRM%ZtavqilJ>&|sKk>#QsAs6(;M)`kiRuwf|7!t{Ec30kqDfW<2>M1- zI5CTXy8sf`Tp=5cZ(Rg!y)@_C%7{%f!x?kJGubT5l zb;M?wSZ=j1hT?iZs?91uwQMA-M^6|JONDciAvTP~q>IFRV2~wFAW;{q zv0gkIarU~2@-;dy zTw4~O12dr(%0jh|Y8_dfKEkFFt}6?B|G`j;&p{It4X}-c8*SxspWYj4i-Vk}Y15## zo=^0}Wl%euNA)oFxp3FZsaC^27w&bKYJ?T{Ka=VJmOGRm$r7!x_=HC-rh05U)bY2{ z;7+PjUZ8pyN#PmMG^jQAL!G;rOY>B8Re0VxRO_sSx~MPRc?hHlwY!Sw5-et+o)=Jk zWgraJNbfYh0P5N|$oA5fBNSjwcy+|&4kHWx(H_HiOYD=hF($SYKPM6IugRMI`k=+`n`s8w|E3w*ypW00IyB<(q znnU#)sxPmj+HEw{S9U`!us{QMw7nD6;dKj;xkn(_9quV?D1L>fG9357wURmrzY&Y|#-y?mFJPovHDzxl za?v@J>b}cWxF?*hRBzR9P-9?tmi!cXA|n$QZrcmdhT&w;`onD~DP8Y^j5i~fZ=Q%3 zw3(w`xSmpNb9%i8^eaq(w$())1gC2KZ~__5_yK}ZUF)my!$7aq-9})MSKV$v7;wG@> zO4;c$Pix)^z51nirjZGaaseZAB6bXeX%gx+L5g4m66LnMB~zTg48 z?(m55Elr;X8}V&%HZE~H;sf*Hh6zOQJKEG)EPPAC(^4?H)0ma9j{2C=m+JeR%+09h zep8Qfaxf73;q6Gre&jrHHDZsLSejE*fY_rZ7IR*jh}dH$mf=j;hS=jKR>fJgAF&fA zR?Ycv3}R21Sg!LJCL11cmm2b&yD@L|Qzlm1IgY{CPn%dh=aFK>o-wfo&Mkuwd(QM# z6X&)mh`nI?s=0Ft(^$V`+R)0Ge<5Non^?Pe=c-uWyK=;xqYaSo3SJ|L#&vRLr6cyn zK5?X*b0Jo4{pK|i>)~|FLF}!YCDyazJ53O~+NlS+>h~TMuvfeUlQFc(Ml9YJyHu!K zI@J$B)=-@%p*s1Gp<_S$pVZdRnT2uFU%Vihhv{JmWjM32xqQHg6=Gv7_ftp}owfd(5{FKYD8~ArWnUJsxO0@e)r?J5bCDi2Hg&)S7vE$#{GyfwGtH=?c>0O zqxu8*nO+^tO$%kvq4h`NBt ziBoW?Ras9)yppv=;=8TNr(?I#32Upw_gZ>96zPg?XX1UBA!+h`4BUqyRd_kmSsA(_ z2~SJG*yhbJtWs4c_~Wr$%QJMyieHT-Jk*1Ysl0X&#>2IGBAI@U?2KsGnkG?Qc@5^g zPP5LFXj*07SD-6cdn6jmpOyxIOT<2eaOf}t_eMxnEf3N={wBd$$q=?>R(}Ob zk{h30_KHjI;6MG&raNWH>_k7gKa=Sm`D=2M)PC|DCevM(Cdnugi!?@$jz>jC^nZZF z2t@P`4q?iOeu6Mny8}9`0eUaZ9p*fAHHsSUFP06ktGT5nrgbLlWY~^kD`Y10MmGj- zA4r@4sk5L|9KW-Wgt6*pP<2#fL=Qry7y|X(m{`m?Pz$lCCYIq`G!3z7CRW9HbPr^ldsg)77|raK}OU%M{Hw=j%YA*NaGxsZ5|Fm+avil?PucxyRpmiYq5=~q<02|pvA z+yo>>ze8|dcb2gAc=LZGZc}JH48GPg#-$v&(V)KSI8|Wie-sq`7hX1h8 zN9??DBY>1H#;oxw%ex+ZpEjZowoHSh6x= zMp_?*5Yj!3`SvLzR_JR6?vIf8U_xD3l7gqDU|Tl^sh*WQME6O zDz#uWF1A&u?wp*6!)Og6oFgL>h}FDCV%40s;}EO$ABp8U_n`e13QP>wJAjJ2^;h6c zWsKlWWenUWAXRu3bykv!r=?(+ru+@8{rH!SJEUsP0NbsoCLGl_LB@F8iE4gb7h8{# zBl<5iBq}nZpCwGdZXH*u=9S1CnOAF61EpRn@?i-L;X_(Hc z%i(Lw<9PWnA^zxfWck-vCN1}4l;D2BVrt*Zw5bbm9rnI%c-TNHV2YRgCX?qZ!39~3 zW|vPcROv|OFFQuox5P&q_L${z5jNrotB7;MNq?DoVIA7@C*vaL?RX-o~UHn>C{AdTd+HxtA>MPtqBmVepWc!nF`k#&Nrjhi? zu2v0GjHEgaqAGluMi+BbFTZW5ITqr@`fOC;w@g}77fJj3_48XUU0Rrd@wM8M0Eaei z_dAWbOx8Nq)cMm?zD`4F(8c?37I&T#h*&i?*z1VTFjcBVRak z>P-P0ZBGMkFSYJPRA|)>1d6s60_~z3JO{+U&DB_DK$Pg@xN+P?@NXxTcys=^UW<8Qu42d%~_KpNmx#}ZWG3L3<4u!s)5zso-vTt##=xlVyKNwVF z?_E(32J^nXJhg?z248p*c#2=jCIxvlBrVp`8H$dHm5>)0`1*NhZ~7#Q1`gl%A8XYQ zDmYN9Jq6Hi35w5Uj&|DeYRL^PMW zsK|(Zk1&CVe4>iTi7EZ?bW~wSWEHgsV3A*p&S?^F0207lx#OgceRYk0yi8XLW zE!2TGIxfR*$xgu_3}fJqg2V-1>g=dgJS_!d zNB=3qLK)E$kSRtr(Wo-6ptr!$w&Fr7{s4L*W6OFJTlpkbm5PfjCZo?Qf7=kz#a>ib z<}|Ok#EYg?-iJl4;!=wl@%vGg$6`mQxXg=YRGzdM(dAyWO6Ai)#fmGuyw$Xe8l-)z zFgu$wg6|UVT~p#+%Rq;ZllSn;w=_;a<<~#UGVdWmlm(w{sfwQtKSNJAKl_~>3a>HzF-9J z@?+pyRp|E1)LCUJo|b~4x0#hS%E%I z`N9NLF^z#c2U3LxQ5WMBJS_!dU&UY;6&cZspvMTS|Fxo(XjgRecxoimMZcE5(B0>VFxyUqPzy^VC^MDxQ{t(LFj5 z6^W|`&|?Jbi!zn!xfZz->&4Zd0UB4&6;H&~^F$R_H;5{(ZWL8qJ)f$cg0jTbHT#uf z!Eosk2JUW16+Vl)=V}rjxGET3r4vz+5q%{x#R%9Xrzv%APZW{3P+UET6yxee;)%Gr zSyXX#i>Tu2#iEL_5T-{Ao-%VFI`TOPJDkCFS=u-yn z*N`gw0(H;TBs_3cFuF=7q9P;uN9ZvE_U39z4Z8|OBrX?Me*tJ*-7B7mt5=9Bu3jms zxO$bS;_5!CdMe5iS0`-2v(1d)*=7drWsoX-Hg(U{Bs_3cFuF=7q9P;uDrAZguv=k= zy|pijNE{SbuSSY-^=k1%Ts3e6LIw>QN`7pMHN?X5mj70 zLRH^GS4e=XM=8aE;p%4$+;1RN_(kfTt4Vm^s$g`LPDDjU^eN~u0`?ZHK;MH}R^m2s z^;dw#)uZBxxO%&&;_4luimS&&6<6=1s;8kWadqM>+(pL-?xJJh?txU{bEtc+CgFjr zg3(nv5fvHH`;aL{z;2BL*J*oEMB*NC^$=2wtM`g0;_7{(imUgFDy}{tsOWkud2@hNqjIPp& zsK|)^33`lxeK9^ee9#z0B%Tyke*ggy;T%F%T zDHaS@cQ9}-hg9L!)IC>|@W55U=qjCvio{oN$P^=Bx4}Ml9WF6hi5JDy!$>i%z9gQA zt1pWxuD&9wxcaK7;_7Qub%J{)d$msqzNR%BXeS144@leyLEUpT2@hNqjIPp&sK|)! zhfFa7_Q%i$jHRn@imQVWH?F=Vo`|b&iz=?ZBdWOiuBhVbdsOv($SbZ6zDy|=j9&eM zf%_dK&VSTBSCjC-Rl(>gorsEz=>I{F5wN%7IP!g66p{E)T>TxOarGndL|pw?RB`na zQN`8&iYl&tN>$H5S>o!qO_gH7aCIjGcQ2$0uc7X_nuG_g3PxAyL{wx%A3&xU0lO_0 zs@@|}MB)o^^%|rYSHBcb#MQ4v6<5C&Rb2f>RB`oNs=6{4Jrbbv>G(#T5i8W0f!h;O zh3ixITus6QR|TW1bRsGerz~WO5wJgjRvn+Nti%uE>JY?@t3Qe-;_4|;#nqog6<7Z! zs<`?yRee8Qp{r-N#`_5vu|i)maJh1;@GI0kSCjC-Rl(>gorsFWDGPdxKw^5nQr#~? z5s8>pYkeD~{s3Bkyo;oCOC0D33vu9c9B*h22j((x7enIuKXv9z#nVzSI>3^nA|rYw zGQ|iaK81D>&b(G4!#Hpb0OLR<=d+z{>NK`WptN~yg$TAK*#0uC0SDlAf5inwfzGdM4 z1gXMrQ1={2!UG2cW2G!PDiX5{dW=9~HkQ@XCZdQ$u5rKuU>vA!9Ow!_9QbeuZg6A7 z3N2*dE{DYLXj1naNWudL1fv5iIVv)u&xQ`t!GSL!ZYo9*iG1V0IsnFjn#O@g0Eh!G zEyeGMGJ@X=W#Ik{iQf^W?m3Wz2M!2E2Uv1cB(79Ij}b`BEx=7dg(xCX+c@9=Fb)(N z2f70g2Wo-oG=~F=8MwSr3h$Am?m3Wz2M!2E2Uv1cWJIrq9wU(W8sffIC?ZkMIB+fi z<3N#d;4uK=z&3Og&Ede04BTHKRrnq1o&!mE;DBIsfF(yoMzpF82M8qQL+dsIMI;&+ z2SNah0}YJ>JpqUVTNmSYAV#dvQU>lSNZijy-E$xb4;&DT4zT2?$cSDGJw_n$EyP6| zP(-4MabN=g<3Lm6zzG22K(9$k(Hsu^#K8R>Qib26?m3Wz2M!2E2Uv1cWJKE-^%#M~ zLTF!&LJ^7P#(^*Z<3J1JKyNaH(@=%+{t2nVA5ixkNWudL1fv5i zIVv)ubsacBAi=A9n=e2SiFU?;3IL1)?TrI{0f+=dPBl%VeF$$6)3&f^Q5NxKBXhJqpw%R|=k%g0Y?n zFpP@C_kYl11nj2u@TFWSil|)LSOC^p0ie`5wuMr(K%FHF-1d;TnV7odO2N}oFxL5! z)JYl9U6Cn9)jkAm89u97l}9!ffOVeDGTF}S*C|B{)OiB~_f|;UYfD{nrQm5P80+Z; z!>GuJJ_bET!0uFpi>>HEtMas3_g{(|s{zJ~SL4F+4EBA+*l4J;D&9E=!JLXsanPwe zui_o`5iHQvkXKx5*GnlD1lM{naQi{3a1-h*G!;)v!RQ(*jf%u63z=dB?9;GLe|r#D zysNZ#o|}wYo4OFewcvPuH{9@Bl#7_Nz7G<*FGMDMM-uN{6|s)|)=}Ti%Gqx7 zVT6i(Ts2|Lei)VU>4R!cKc^A8!s)*rcJl2=SHuRGn2x&*5vxUOXFwl_f!(0uVGZXq zFvA&S%wmp%OK#5K{Zd2*Zpvz**bAp!0l~IDixBO3nSuKzq^fol(tDC53C2xX@^Fbj z?EEKSR&&`*`Ga?nPOCJzCrm; z_Hvco&O9u4RjxFQz~_G!%&u8}1->7H87gSTz-5xMdOG_nzuph8J5i&Ik7B4`{J(3#Zqi6r7(RBf0}}#;DqlLMuH39aZIR z(|~t~fF?!DSUQucyoXzy7?JlytD>#chcn?rFCj#h;1TGXnZh<#`DElO@Ws#f9B_5I zDeS+gsEV;~qPi<2?tg-eQMIRmmN(+KVr9nG^~G_)9gK1@HtShieI0O8CR2i-QqRu;+fA{*;DX(bT-McYEABqPnytc zp5_A3?RXyHSX8_O53kZ2D>RmYI~h`ihcTUb%Hh+?}*9Qfct3Sed>?f8=<%1MwfZQ)?dM11}qZ`3v0o^>qJyXV1mRU9G9O-2f@|XY@ebn`}1EG~uG8CTx}_7{9mJ z93A8L#WruDsn5MQbE}kFKZGMf<~I8m)KOpBbBWDwr}cyMnIyb;5$^3rDtyCb*WabGw~#Q?_T@etIOpVPuf`%*MQjf*(c6QO~zodF)><2 zG>0%MGNLok(wG6LCO$eHtMESL&b+|TGzaMa%XqT@f4sk=?v3~F)V=WzH;3+x_vgU% zt?X}(_bGlVK`O?(8Uwcmq-y&Z)5%vEZ%I*Y-wQyFce43!ObNzYQvC6*j_UmJe)eo! zVP`y4Bz0M=tE6LKalrlxnS|oL@W%#=9!!QF8GdUv_NzAUrgrLs9)dL}El@Y-B_d zV=M!ghJi*jhdC-TqH6<>8Gvg0y%1dGbmmyA!=wa8VVuP!u)|1vD9s#i@u3U71V%E1 z)3z$b92i0xS?&Qu@C+WI(QC@%X(<>zX$-@Nz7{e@wPPN3vP>@MnQJWl21_AP&RB+5 zR3Qbm6f$t@L#puiOqY!;1#cUs4e`vieh$^i;vMms>wLhY2r9n`rQq&M$cS!=oH442 zeb6SgMmd=~?OG3DTWblR{+jieaXW2JA-#gN(7T3paPI{pc;0}4dn2R@Z>7$hsd!on z#!6XoR3z^IhaMwf-vh3_i;GdZS}XfCe2+1{3R1GpYI+qGjO^3HSQ%(xSxuWA0?=yU z45fI#xMex_Zo`9YTe+I>AbcUJ%16;V-x}%PmG&yjQiazsZSZ2G?YXXAYFfdA zOlyhLLDrQ+CbI~sUlqJgeB5~82iBtTK3;f=crBEhbvS{o(k#R#Phlo{%$hkLY1e-P z4s$*9+am|L!ge%Rf^1ngXJ9TSWtMHk>?I{*Y4s!4*X%V`r3;iYJtEUy_NIa}X>bP) zX<2s_oL^RlB(~bk#K$o(*{=2Kta7P^N11vbW@6UEmmEy-K()4bc_jOB>s&h}!MG+3 zz|H@-o>;dh2$JyX%1* z{00+U!J)L`Alxnp&c{Fa&{A1rXFOw5{t#8b|`a*548V`7D&Nc`nZNWW6mGKPM#rj9@Y zR==I8*~}KyvN=s2h{B|T)eavyldBaIW7mBI?P614mt)<8nTHd%j5Y0D3f2A0z$DLl zzjm1k`_rXR-LD8t3ar}?mYGOV6sr62z@)Bqd*w2d;3jU>{WF>zgcI2{tQpC@EYmO$ zs=Lz`hNE`FFm83O#j?zBs2s$0U*EYv$Tc5@xUe=X?T~Rk5#MJYKQrKNI zHb^+`CzP;>MQehDr;`(s`m*TSz~tqBHZf~W(UXDQTfUw2LfL9l^jTo?L5hiSGKNM< zld?baQzb7ak*T9?U7Ez%>VcT@LRSB*)SF4%0J4Ty?;>cA_W8v~TT5mK7Q?M0*{K%v zRF!NFEJj+Lv2-PuK`&Iv^|a`G2B*1|JJ}G>t3{PO9wbh&R`0;kR9rCgt>;HfoH}m` zrmS^wL2AyPR(n5jzSVb0YR-}xOzgxuapx)4dd}^j&bC3~a_i2sz@4NzOGYxWVg_=q zvT`bx%egd2Tx}gjVoJ_Sm{_S8y?L%RXB1kFCCgtrN^W7|?(31b(fV|Dxx}ZK$Wvn0 zCQI!}O>FfI6EDHF>g><0EsfBpAZ`O8eeaCX8 z_hRDgv(c2{R>q`qSzAqHY8~9Znsu4gXhV>yO3q=z6xe6&wH`!~=00^ZY$f}cC>!y9 zD;HZKKa_YKVb+?GhXRX3)~dt)UTqdqwoCQ=kQNh{sH_{UpC-~3np_JllACsS zVEeW8Aci>EHmPZE1!mgb^p6XU!z-HfDl5(YJ}0%Hq^8xU*%grljy$mXj9|5k2NqhASZ``T?{|6;33 z>@I$h1MMBd{=qD%Sw(?usXY=a6`P&X1%|$ZX!a#{fbn+DdH+(RDp?emO|#z``1jIO z$z_4Xe0vp+Q-7;ZP7o!J(k!+Z^{ucAy8lakuIcjMeB0~-`;~thnP7O5`@KO|zlOE; zwP*ZW4N09pGRUygo`k9Jw}Fysm_e0X5ZLaqznk`Nwn@WqdywHud*$BL48lYaroEp8 zwg>GD9QcwQDYH%TJkiZ>>NWPR^Z&05s-&xLo4wxt0W0}G7oOz#5fWlt?o=h0 z5^<_vr%iVbW6NPXgA>55Ogyp=3sO~Q2|k~uBtFB$i>|`FsOG$W2;U1~I|_3C%0#z1 zDm`d_0Gnh713E~vR7uSqo^4j1v$QbPHdvBXNw2`Hz@Vz097dB%EAQYY-!`kG^CL|E(N>k* z8klu;PR~m)dd z5||Bfe!V!=EXl!@G<$6<94vK4uS_*da`2FEmYwdjUz%!G-odAQ+pKX;yEXq}t4ewzmTFN} zuGqFVzV33aoB4m)ndYk)=TSsI+=ACfDI@v?)D<%T)rjV0rKre={)UMJ@Ux$$>*aep zC+Yi;nvbnQht*tCgYr$Tr8WEG41^JgcQ@V=)_Whu zKF77D!6jZ~YjHm|-JA-z;S%44(@lI=y!kXhG0SNmKz(ws@a9yu1{Hf3?Qof=&mSl| zC)=_c1(<4aIsDG4Xm`tsy4(A@OaR;`G5vl53a#v@}L=CPD&YY7gIQWbEa~T#NOSH z0?qO_;PoJVT3I@K*GvC1NS|Jo&TccyHz}kBWFu}3#A=l@GcfYVJ)i~C#DUpCnmC}k z4`Y(>exCJ5lGi4=fG_L#IwAt#y zX0>(ixbimJV5qvkLmQ=Gv(EY&3!GnrDW?u?23d`;^5mRnbv~Sw&LlU)bTE!#R8Q;& zdgegorxcH#8MNd7U>Gz&7~@hFqg4iZW0GPm87FDHcn`+O7%yJRIO*cWr!h{hc=2V7 zvqk)8Rl5+zm>Amtfu~HUZpXyHqb5*0_8y`XJ<&N&TfLv=ba>OFKUVhYn4~%HSQ}Oc zH}!P4U~dNNeQV4*=?4~JxdS29kR0k*b8|lAC?};1ZS1FfimSnrfUlnJIfM$nv@kUO zITk+Q#1qy35pUU1!)7DrEgj)vZj0gbFQX|ehOGr!w+r6emOE_twlzMw3+OUD>92Da z4{z4aM{feU`eqDo?zZ7!kVHzbU%)Bnssomqle=TsYq0q8bk^}n>BUQ6P}+1PtV;Qn zx{Vh#4#guQv(dG=zdKbh<#PXIX6}9iu0ZUsA0(zLvjcN++cFBk`ce5?WXrX@{Ixb3;K2YjjzU%Mw(p?X=;dkc-!OXw95U@@(Jj4@nz(c zsgqUiZI@K^fu@5O!Q$xWpsHsvW9kZ(d;1rCeW2+&I&jC!SZ9ny(;NEOD)-n)G}6m5 zfASKQd*>GPjA!x82utPObsd%-4;Y5pbMHPUHvmo&xaT9BsXUASVL)>4<(=FfP^lS! z`?dwHH!V1dLhm1r&h{*-WA)B`;46%>2MlNp;CO3H4-Yu94ZwpfKspcj4V!!JLmR*_2f4CtwK@Vur7{KGVLbjJ4Yuf&704I912!LbD06bB+Gyran130<4tq+WxxL|?G zeP%-^yrNyo7&&ptRF(T|wYfgf^v)H?^4w~8<5|p{r*faa0<+bN&tHlzePIk1GXpf; z-3K{d+}^+kMoyYKUFE*IZyLS_FqKSRx=7`|RtN5S0KXKBbH9&j`*1)v-{A#$~ zc;w0b;rmiq80>nFM-lzeM73S7J&AQ{I64w5gI(`UO!M5IxQO9kVb}YRGvR+Gnql{D zj}I2P6)m&KRIz)n1oLzAEiOZLK{dNiY(L@!*2`Ep??g2?{HFE(y&16DRzG-Q7v$T$ z$76_c>w0U^1iN=OTU*cKw6zPS*u8(I2aPNqmF$8UcFo?qaJY}ZMXn#AoAHl0N{`W} z`1?2sxnrWL0vr)QZg`x4%_m7k&Z{mElJ%=$tCyZ&zE#m^j#KP{U6&UeQpMd`}BL z7n^&ARnhtxzzi;32RHGj8orJzPo}>x9 zToxoQu=cj`6OEVL0946#TATzAa+h0o;T)Qh{q`Vnm9?pgpO~Eed0NcFI+DB2`m~X^ z?wYl)yb9aw;;T33FGmRF%w}r)JRzU|m8&uw+?OIwySHWT*)^KTxf6Uy) zByQ@t2Qev3ni}w*0KJyS64UsVC|8{!8%ypD)~aIj$X04H4kA1m)ZoKhE{W=jCXV86 zE&wn<8mC84d4qNP`$>T8win#@UrYFPTRU zkYSbuG^%GvSx_T*lP)Fi-;D?y(R}e&RAfYNqoDz)+Aod4C$=9k$Ez3SKZ+AV^#-+Y z7Ur7(abdyA?~X|Ih7Y$7AUnT8J3x&R*94Hx&qtqCZ#)$9)XSKbpGT<4eyjx^l#xH+ zQCn4S+H+q3<>wFE4XbAN?hT+$`OVJ*boxLifY#)l0fJUe3-8cv=d^uHB2?i;9fsPmn1_z@9u7uNSI{N3m)&8I}Y6ky~);ta19N`Ll6&Y=fp* zr8O_bufCS1Ux!n&(rsZQ?o{5O6f?t}nGD?dkoaW->QZ0|o|b~qoiE@*RAfXiMWz^m zL`w|catrR{-E6fu9ZPWDe=G}2b!Xt13Hojp&qI_mL#ZAFaTg^6cL<~kzrb`UAQk_( zJg!<+VzzbI0`rbr8?Z6)lw{-KRrHGa-a;-u${ZPF?ZkeZ_lQ-5t>N!BGz8P>Bh|sU z9T93opNUGNA|rYvkQjl)JJ4#s1g_>?GU12mA2oHvk^-{+dpF9eh#U^&rp|=Q}DDDjDC%UVN@iZ|AQVQ zkVs6x^`0Zb@WHeeK=@pbf!hdDh1W5inN#t!6b!%Obk!mh+dOp6 z7QCrUO3{z_C7+3dPiw(K9T~XYA@Te()1^Ill}Qr*O?e!jEvmzTyw;%}$j64`4Lumf zGJ&zB>jb^4qY+IzyxREZ6-TDKoqOvZs26u4!Ldljow{#K{&Q12*bsc~(V1KQ?H*cU)!im{;NU*f!g z$!qeBDLw*ZyE7y|K<>u`%)iu`+tNqI-7)~k4(GEbK|$mGLZSJ)oXChWr~rF>{%+?z zY}Im@ga^~GpXXoZV0jCm=GbQP_c%3ht-!My(}ET5b#AZiS2(5yD3yPO6FL+i^{{g1 zU+GNW9U$kSg#4?V!gJ94$?SqL^ST4s=M3u@*!+QgApd~V@bUoRljZpbomuEKuLFA3 z0dlpos?0{=FaNOfJjTVdN$de~jnlVlfbh(hf336Q3h-2F*DrA#xH4890xAd=s>HxO z4N`@_WV#HXm5k#t7Y?e2fjC?SVsD4!t0h8LYqZ3D=#;brFx96>y%gblAavq3)( z5jMQ))V?f0gblAbm%=8Q4X-=9+XptnhL4;lu*`Vn2pc|jrhq0MB5e4?>C-Gg&^apq zOQ&x*K!gonIq#hrAi{>Pox>Y_Hq^@NjpY`jrN5X0kL0Q(sKQahP~XJBy$w=@9qP0$ zhi8_@)p%;uH!Q(Rab& z7}Z2qtS&D$Lf!eNJZ}Ev6kO|fmRYI(aL$bSV;(l#{L>k?$cJpRQvKx|*x=_gE0xka z=Ld*z6Hf%XK4Q3O>yzkfLott=X*wU%&u5)*vx5EuyN(YDH*x$eDT9QYcsWbi5@)!X zt|R!|nas_&zOQV}5pGu0+cN_j;bw+DBL`iA{_$6;O8Pkrn^%r-GgnW*T9C}m>iWyW z0V3S2q2~r&IR*q$`T2S$I@`-7+^nhRV$3~6xLHfzjh2~}O1ODHMoVv;4sXcKW;^hK z3!?@O_GaMn(F_&7is>FVlkxwQ$9-=8;ykdzd+D>s&EK4tz##72V4`qS>rP<1hX^-a zU5Z8ALxh`Ebh8BkBHYZ>ZLw^4Hp0zn`o+-!BHYZ@wHA8__{bJUMdEiE(3}{7#JjVU zx|Az%ep79B(Pmm@`<-RD*;=>H^=aU7vyCR@JxUpFw$=Od{d|U-?ey@nO+>iaUT?)N zWd_1(LLG+h;Va|-Vg~8;pPzC zX;6R&H;3tu!9=fQ;by7+7y}~+xXBhqMMm^@a5zRFu?my+g*j+e{w$B1v-R;{@C-K> z>GY=ln5UU_bFp5Hl_iCnOZ1^FK_|-zZ>iqZDnNvr%XBjw*v!xvZZ6l4t`7<_+&o*q zj{VDDBxT(^M|Wsb1_?J;>n|#nLBh>7dJEQ+6mG85S!KJbaC5z02j+Y15N@8Um*GV3 zA;Qh`^wlHLB}v@epwGG}un}%<)8DKP5aH$}`l@yTBHY}r_oH!M$->PY`p=yKBHY}m zuPF==;pQ$qVS5TUf5K>Kc|wls=GbX?KMqC>++54R-3Y0|uW}GQZYJZOm&bi>&eN6B z@%w@nq9^2edk+zcKB4(okB10FPwLH$14JnLlzs$Dqh})&eOj+CJM;=g zpV9AQ9=lSzZ0(m}(DWp%HnM!~#hl})fugk;xW$kvd?wR9iYDWm%i}&p59vOY@BtO> z_!PZHk3h2p@hEykpM_cHAwtpr=qEM>h*0#n{%do92t^;#V{sA4%Ow#${^w9ce-CBfDAW(&{gLJF39rvqn^__K!ls8^jb_0&vD`APkP0L=#nIE{tv&D z7uX0l?NF-<0V3RVLfsDph;UPfE-bSFfmFU5>R8q#!p(5#hx$P-;bvNB=#Ug{w!moV zKNrFyE}wNumEx#@o5vZrk3p(%CUuXS$#_wD+~?-I`UWgd{9zrRoA2wXwugA!{9NCF zWlwCpk3?VUu70lmmT>b|JqagU&qlcUyFUHO01Un7!_ccvfCx7mg<4(^Ai~YYq5T-7WNtPICGauDYn*ViZKxSK*F%Jx z?Lt?A(HDdT3JB4}&({+q+vvX*>mBP*EFL21U5}A4~v_ z8n`)zfjbFOh5y5JkDJN(qvdg*o7F-OG*R+92R=8mLo3er5RaP$p^^OqMAps1P^eCT z2scj;4a3;*8wq@n5^lB#9X~BVgqtOyk(hv;r><9)i+#DHdhtpdMH^+tEKhK9eZjKKf3aq>fixWaag0rw1C)}JEYPm7UXt+5! zR2vI}=Yp)8Q$oAYaULSvoEnPbBIWK;7eJGCr|9?sIcsh%cUBkGwuN2Zz4h<{=(8M};n_9U#KZF`-`%1&DBS zRwy0E9Vy4-=A6)MtgRj*+?*GhpAjI!%>|)uXL|^^$reUM;{A^+z)b>)Eob7UfP?Ta z|6Gro=Y?*=W@$RhaPy+j&>H@j=bLqNbLiI@KICz8OQ`<LZ4m+d?~6`2~6F=C072Shc+6&s^r*9jcI52Fbd4S!myoGDx_&CzOrWq^z5JL(_vz zz`N)jT8vIf=H`{5SK0-LaPz8AvqtEW$@up#dWWp}fsJtUhS1&T1c-3+#?a;-0V3SI zDdd)YY!YtX5-Qjd*a$a|gic_WNap6Pp;5b1xLE_-v5v0#Hc2UF;Ej^-Mq)+ z=DneI&Hc_Y+s-9CaZ@%nUR)EO7`HJ(vh5!+6 zzUn-M13#IYuQ?A_%y+`g51k#IgIvPRkDP@SigZNx%sE_1@_;X2Hw2+ zm&22N4SC%B+i3-|By;nWb7!{z5pF8CVL%McO?;3En|xi6H*bdAdcmCRaWm{*yT`Zk z*7Pdw6B!kda5Lhr$D-=dRdX}uz84&5dfu$+UIx!SH-(#VcQd-uLxh`Y?$cY*B|!ao zGu>_8J+KjO=D0cI14Ou)>pqM1(*m&G@+~XGph;TF0{TlvxHp0!*-Ly3UBHXOueu74NHp0y;cdlO!_{bJU zMdHRLcoZX0^&0Fj>`=yZWbL~TZYD}xeM;2OJ+GVJXPTmCxO>57J@lRQ(%!Ao@>U6Mr6 zUhW-z0vn;|PfM_lHga0v@SEnY#*WrB}O9bfkMn#R-{Ebd<}} z7*}eSOGzJN(Ck}4ZK3F5Y=t;#py*r%?qWz4dYtJVMU(N@E8{*zo49sI-1KB2n@7=R z?kyNpK|G4Kb$iST5Lw#WySbqN5sLP8??7jHxrCzq-QE?5P;{WXad%)N6dmmTi33D( zfud|-R3yHCfab&qWH?x9vauC35|cb`PIfnz`rW6wIm=y))klwcXU)yo?sIuQl&QHn z$1TOe>UFy;?Q`9e71v*coAca$XZtpqoAcd#90@7hT8+SsNByn@Ko6{k% z5pG`QesXny2shWeWpe^VxVgb?3b(zwKp>U4!mTwtK!lqc-Pt(sJsaWXCijoADcoF* z(X#tswh?YVo=}RT25v?fxTitl{r61wxS5PEs*L;GoaVN~I+DvGJZ{c#3l4gS$IXRq zv+DvxxVhN<2#c%a^0u98+`9$@h;Z{F_ayeZo{ezxVz)k+;32}zOWl3fcnG-37Dh!z z>>BVWMxg3eOrPOU#;q6QJL>3tBXNyK(VcF4>=bmLX^QT1RY0SfnxgyN;p2TaxSFB| z+;fASfu24Ox;?PN@Oob;ddQu6t&eDmUhh7K70aXO_*1(vjJLX7u&iik&8btT#>?+T zx4FxP_~=_e^-V#yyZ@c-=H2NlAbRQSWw_V>a=e z6`~$-Z{XCEMAUoS6{Yr7{K-9ww-1{I^C_>#MYBFA{GVT-gI(IUh zdz{H0QTMnxF%R*GdZYUs+!Y&doxj;FC<+jnMDKH}V8i9v2vHw!mt)285FzS=?mI05 zM2LFK<#!Xr21I2Gqaq{rF?bXsP_@Rlcv8yFICC9d1UVCKCO-3s`nh|}4!_SdQNMFv zxWpg&mYS&FyVDN%P?{#{5AJ(Y{d}6JKf3p$revc2xa?=yd&IyFIN)IZ&48u_TQC&-lgm-}hL$66Sgs;At^gZ+v%RaNK+ zmJrW5p{f!3y5fXIsA`4IUWl$qqN*L5fi=X-B~(od6$ITiMyQ$|;!ET`8=>lHp`H~s z;FC&ZhDr_vHbT{Ep%PA>zGf~zM(P2K6>a6Oz>gS#f(P1XnN+1O)!pm z(VF%SHl4rCo!FxkD?yK*VBkIriQhjY9TlhIVS~>27(Fh4A#M$X#K&16V^sUC$NAN# ztzdc1y45)33JzOC({Q8Y5#C(|*RA!8-9sxrE?N(vIMWTv)r=UFPibzZv_#l%lG zg8F(*%z*LE7^XUJ&?~zx%jH-cnSkH$k%(s2Vc<4^RH2ScU$?q4UOdLfiyHYES|Wpf z6ic_X&buv81s(J(P+mXQUjt+}nr~+bqgETL{@(rPMu7)|lAtpA1!V8}%7|Sj+uWl4@~ziA+trz{RtW7j$sEcY2tH zq4G~=BS*x(7kw5LiQoTGNQ^+lW>=b@V}%{R&`{yJt>am3!Lb%YVG(a)<1z21ccJ9^ z<7ykKZd=-sarHmULA1RdE88mQkLUB+A&0%6-m&+8u4|}oVU6DZnSuK|qzXO2bXuq4 z#qaxg-A;Z62iyF3uQE8(j9*bvg)!{mjT>g8;%+4qP=Z%5AKH>HL}l<;4n;iF{E-V`*B2rhWdKm1@f7x-?ZqmjqV*Kkkug#bU%tbERlMO^0B( z>khhVk)eOj(RHh$$C=i27}AEG>Xee^YHvQE!2=(|V8kov!X(F4(O*n^tUuC5J%tX? zM2w=F3{|HlTs5XlQguhKXqr;4DsIlCe(3YMW4%7}j^CnDlBqgU#&4-&c#kgX;gVj` zF0G^$9#&O#CtmEPS_yZx)eW>tyA@Vb?;2~U1a{T_2$7mDAFK2F@;RDrJq**CclY`S zQ|a+~#uL3wRd>!yXfJE<3L}Smfh-Z5e2a>V*b1Ex)4@Q;w(%OM)wZvr1%9O zO@rw;bXXn^Po{g%nYS8E{R&tVXBs!cM5yhV;2p?J{S|O=$cUaV2d2&}N8Kc2eH|qI zb^f%96#8}=a!rn54#8i$!N&5X(OmM(q>ap+g5t&sB zVtz5iyp|B=ra?2h!;baPZfE6s=5&SCQJ~+mg#L)kDubAL4umme#%eF`F{C~kmP1d$oC{YL5R|=d#o_5c4mG055hRn2MAGOx=&jjL*G#h|a)&%J|9{ zEC9Na_M6ZY8G~6IgIOE_{Kd%51+x6?z&esUiiecBaNM{Fo(}aKPX$rAvM%Bk;?+>h z#pEYr#**p3p@Zum3Q1)R*{Kd}6TbC~wf zL8did17OiA0t0bm8}T1$v3Mha`2z_&dxfb=dhY>%m)=007hj7Tm`eH*iEqJPzF~t0 zC6TjU{P}&RI<1qW-7sFM>aX+TS|z19P#5bD6McbpR$pTNh&=h_xHf3yk3SEx{F*SN zQGN>pv-}|jcKHho!sQ<^NH0IhAWgq_Q8XLx)0BMka3f0==8lz+z1DF2OtSsslLEw9DEC~v~REbpShVGP3M zlNqF!FJ+KeQKbaIij9pZ_lZ0r@=1|zi~OB(B|i#b1fO15@mx!0d0*s4CY4X<2WgZq zWMGzG#K11UnnAey1_tTn_cKVWILV+qr$3}y-h_c#@jl0H#ZMyLLDaKEHWb-O+^+mQ3*;nLfk+Vdu5P7-C>qOoz z@?nuLiu_3A&mx^NmRwzAJ&~kgFU1w}1n&cne}^%4@_FA_{A4w#1-$Vg{&gFuh5U6d ze(iLqMZ8iSPZUCJ#s?YV>y|-nE+w48r0kr*J166B;%cnZLJGTSAJmp>6wteRLTx4G zHtGwtHGhDKpVJCz8!7j?UQpZpEv{B&nv03V>9CQmhUrPi^QgYC1ZpQy8#IR6`68nG z=R@rxX!UteyNY^XE7TrR{T(>QoL=1G#Q7Q^r?*t`n+vs%*nXG>b>IqI;V?gdU^MLX zw^pO|&Hy4fSHRaHn<|>rxF3S220tLg_Wyqj+`k}I%@-kQmkQ(SkQERfXJ$q^=8+6v zW&?mPvq9o}%)77vQH|&ALG?qV1rx7_I+V*!d_e=K!=y1&8bTc|>M`VU%0#`5<9Vix zTom()Gj{~i%>O_zy4sm+eXttvbRxQ4%@j>)Y=&UFo0GGGW$2CI>_j9F=yAl6vN z(ya>@BG!a^3A3=8^#TUWYO2#}S|1NUtQlXoVHW0Ec?hlM+A;x#HCJ@0MlHC+k)UfB zi9QV6L6E9u3rO0f!WfAPh%90;QIQx0WQh@o|B{R9+D%5>d<}xpnAO_i$*I)_Y?D^s zgmv0#>wPa3KAoYMp~f8$^obc!`8y2Uk04de6Ogn^h2c{LM4wnpRAj{d0(y)24Lk$@L16isTB!h~MX6xB^+;7*5BH3ve{E)|9s6%f5( zF;S7|C1i;ai2saDh1Ek?!q3ZELvt}|@i!MhJ#!1J%-mtc~ z7lP4*HPPDF9q=U9MB4rr>xea3yBD@D%tUO89?qCG8V8^?Rmak;dTjMH9jj)I!bEFL z*ZFE%Z`ML=hK}W807@0Bt#K~|8_DX?$d4JgUqY&y&q2~I6-FZ~AU2Z4L`CBL7tmt_ z;`J~aTMHGAF>?U~qhV{F<>DZ+=4&sM#p}A3%pABt2%lOjW~k90f<7@LDqqIHT?wgb zPK2agDh!`0Ao|2&q9XA;FupR)tzYUGP0BG4Li|UZYyo4~tH{ zg&Hauhz&=*Hw^BcOWG7b|G;3r{66r=h(CfsblbP!T)GG}b$ivO`bx1sgc9L_m{*uh0&f)VK_S-S;p;^wSdz+-D$F!@ZESONARHLzwrO zk-Zem`z$tUQ%3BUAY)YHFT#zc%|y+`N_2X?MZ1CaDu-G>og9eGgK3-Q=)*WSo>l5R z8ihJ)Kfdzq;0KsTDt%3D)JHX!LtX3NfCeK!B4cEYFP@|x2N8G{z!x~c|*f!=w zBQ`T|w?nFiDhwwNo9q<*IP1qmG6P#@~SNhQYYTCI~vkoT&XM1NTu#)$n>q+NHvck|8?9 zVxl4=_LIcGBy}vb}dY)FN5pcT=q^ z>-xtyGSchGmS_Nui}VI2ni6k_4PbiXqMcBy_JP{6HCMRs6sT=%qAx9h+A*8zLF^FI zyEUa+6C6wL-HvL66%Rw?DV3*M*t>L94AWv*y)Db(|2R=BAa)C*);*{}@idfA7cg=r&wgG?rqF%hJ1leB^Of55bs{<1;!JF2hLpxS*j)K?opEiuq@X`{_; zhd8v?LT29y!HVUxvHIJwB}d9(b+)-4N%8dRc%wiE>4@QTp?>tTY28Sb$a8O`MR*dZG)= zvSRG+z=n(8MnpZ*62``nCNRR^iSz3G35Nh}F{G*!CB!jmP2N*oM?ZCe(_bEZ_|;&B7alItxn0!zmbkDJ;MN zMsM~YQ&eQcZh*Xe=_6i63vDgDh}kzG}-xg-$!WvBA1M?Z~C5WidF6t~c6%VIibf*a`V;v~GD$xY=L5D4B=b!x74GX4S$uFC%#IIs^A}NEMnzogP zCx2MOmvKd2j!ZGC`kF)4`|!GX!>xK3U^7%Tlcl-o4uwHQC~AKQKdaUP zbHh$L9a;l7#3l{p>sr1A9HW}S&sHA>cW<`iM&?5#ahkydusHKr38Lu+O{~JJj7)nX z;-|@riLJtIM&=ouDKcbRW)~ZvqM_u>xumU>LcDbraQx*`b=r(kUJ z1{hX5-Ogx?Y~1^$+l~?6k9EZ9$;M=!KN#cT8oiKAKSy;zG-OPXsGYeQ$GjajE|O?C zlRux?Rg4`HjbXprMsXuqBMgAf?nVfQ4l;0WhEz54AZeEhW4~JgVGd{YT-M~qIF~1* zF1>^Q^gEmGR3x(#{p0~mrhDYC&P`JL$+MVDcUhVwqsYq;kJxlPDiYre1`;C>v464% zQ)16Rn5x+k9o7)N7j}nRkL*WLBmBv-Ar?1Ru5(~&u=#~#8MedNA}|x0-JOBk7gB{9 zQ)fY`I9_g@gt6*pQFT-#Ugm~OF#_g2(B{jU(NwP)&Dbuk8CS4i4#BTz1wQ3md# zkScVDImZ@tkK4W8iDYaPo#>>M4ltu|8; zo2X-9t1i|Ncao09ti1(@c_)GC*7_-kP0?x9tjBjCHdV)JTD8j%o2FyA)~oDp?<6o` zZM_h&S-SJ4WdL;l-7V7|v4++~*-x?v2#Zid48(GQ_s?8_+RM z1{ejj9isplv0o)j)tnl}Z%bHI(nGVY{xNj!oCQEI3f8Si4$alqQf#X}Ccw}<-Hx!e zdnID?mx*P}?u1Z$?S?bnm5kstk%4<5qza9s&Pr18a0-UoFj%u3FYuFoMeVoXCoXP@ zTn8jZ)qFeRz3wI4I?rqmBDcG(i&8`l!^m^7`h?q`80sTt-oOPwI(&)MMcdeU-BC=q zqdV3|!g;H(N`*UZ!8)dG((`UW$A>$=GQ~#{dFRdp(q(@$AL*R;$2mZ{9>Hc==USZ@ zf)ym(?cRkxqKw27gt{LN3Q}g`=Q)6SYR5AX8ds9uP*kX+w*<}@xuMu1wQmmoX<|_KO9x) zl58WdIretpL0_HbLq=ZP6+i}G5)@?S9bN)t$nA%G8#}Ktn>W1qARjUEMo$JZ;-~pO zV&UJQ>-?B}i!)=@_6-;ofbYF-w_ zFT*$kuT!O#_0$AxMr#w{F)}IxvHU|4t7)}68?geuKc?B zu}`5PQIQe*Il=@?zIHetCm}{;PQh6X@%mk)#IJ0N40Gi)s`DtQa=^#=t9oR91f+{! z00u=DGjIIj-9Q)cSIqc>12IqyIFZFWt_8Y~R~hUwBuSHBLhM=mqiHWQaNmT)Ov7|m zT?s$GGOh}D5#onEBTK)? z7VF!!)DOA;pY(#y8_&eDi%^fB@P~ndHGWIL2eq zR`m_c5YhJJ3y+-olK@9M(152Q1rH!9v}z9mMddP;eKpxBonKYaNTwaR5@~~1VHY3`@Ty}8s%RMvV%S(jhdtQ! zpA5FsU|vHQjQkR8V*e!jpo;FJ!PV%Y=s0J9 zW6;3jOO|7;`$Gi>3OZna&R(st4uZpe4?+W5KL+ljkgDMxNZO^sjglc0ug`cQHcN|& z#QqO@i~#PL1)ZWIBli1*3E z0Z9^fnS)q!9kVU#sG;JmbqpV-%0XI39gA5Ci+H?~j-^`R5?&(dmfw*Rh7ys6~hk)UifZjY|+4p<|7$F}Us(FVnFmc3t#?9F9w{TC!6x2*Vk; zXF=kgS?cVlR6Lx5v5WtfVWEuJOwA&1>ksDn`H@ z5AC-txa@FRJG(V>sd_Dr7bc*JDGc0MkSa8ox)`V6;S`L06@y_^WW-(oJx0Lf;}!2N zLlGHg+54bNRn^cECZMVp7`U%Ns?hz^#W)2=D_MYtv8tso#I6635&Ip;7*(?sj)_*d z)!)b%ZO5TYRi}3b$cW*zXW({)RH3@m#W)2Ir(i7pL#c`~V)sU-7*+EFXlq-dh>Y@r zMc6G2Ks^53DsW>tU5TgFhPp!323U47R*KrGBh*!*eli{EYO3~skXKxtFhVI73|Bv6 z;C=(CLN8EfC8>Bg1*3a(0>3Fi;;I2;jHCK)NA8R@;_9yewW}A3C*tZwqKd0) zMHN>s7FArmgsMFWWr?e+_bA1J;nI~1+-;C5w4A!7`&wj*5im<@ zD0N{k6p?Y6xVjH1+ST>qiMYB!RB`okQN`6OL={&zQnk}imbm&CrhgU;S359pyFsc@ zJ?fsTNqFF@V04vEL`6pIKFAa!V15YgoGmCKW3#wA5OMA5RpN=bxeZr( ztJ|pB_t6y|{QdKAm5~v{`J93KEu;#)NZoTa2@hNqjIPp&sK|)@GxQh%b3;v~hF^yw zGOiIsp-6@`ktGh%MSFaUST)j?IadkIUdos!rSI1wDUkn++FNO@c(CULbPCL0zES35FryF;o_ed?a8NqFF@V04d8L`6pIzQ`0KV15Lx1oaphH;Jo* z5ZA8WES`v~w}>jP-YTlNdYh=?>g`nR`{@b^u>UNjSTJ1uf`R)Tqzb)6-E%bw4_pOfdpx8*I30>_ib6_lv6skfL3E zKs*swkBTa;J}9cV`jDvN>M^SJX(&rvJ%%ke3x=!w!2loNfK;Jk>Yl4fc;KpFbd^rv z6*7=mPmw7`)%+ORt`;aF<56*SFyh+P$HWtH^>ItbgorsEz*!__yM!@_8+Q6}N^(}FA2;$n+x5X22^&L^g z)ptb|SKkv=Tz#LaeH3}c)gjxJV!`OuuNb&LKw|$#-E%bw4_pVU`h7E{STJ1O%D~+T zsY0u%d#)zofvbYiRXPzB8L{^wQ;dMw4iiHG--;@( zekZE9`aM-Ulan3^(B%xJSTJ1e!ockXsX`^xJy(ga1kr6Wr*0fdXFQ6skTqIRB#DPw*5C^`* z_J-zgU^WAHAtbK#^rGGSamJD*h1~Nu9gRi9OwG%~TRMQTe z0;(N2T|3YP7UDqj1$d}~5xmETfx8$|h0dhzIgo@04hY6dSu(EGLgJk{$P}ZR@g=nP z_o9f5n%aTY0JH;H+JQ${0ej%Oi|{UIMhxeB2JSDAD)c6G&w(U7a6m9t%95iZag;%i z5y+T{X|=`#6p@ju9WVfB2Wn{tx&aUeJ{pQAp%^io`3&5pkSa8qy5~R=9ylNv9bm~( zk+^dkI!FfxzJ|D^0gA{-Xa_C;pdHB94m<`x9C&##z7x!d;rz(J{S^}5%%bi&kc0;g z2u253a#SR)R6vgr$e3M-`(TPtL`EI$fCWH1P^2B`0YDrm0IO*Z2Np7Lc}tKAjiv56 zkc0;g2u253a#Uo*UIjfyAmdwzqpeXyMt$wTg#fez#oB@60K|b!=qQ@Qfu9+;zeB3f zyVN}glJLL*!RP=>j*5)fstz0=kTDlp_mL*FGKoTA}AQ&BB$@o$?WW+unGDbDydx-UGQA9>l?Z8?9+JR=;ffE44f!^mR zMRPdt3j_C0NELdYy5~R=9ylNvD`m-1krCU(sK*Fo%!kI0OBxw1v;!dk+JTnZfj(pi z4?`8gkK2qG&Qb>M3P`*&iMr=N5*|1p7#(2AQIQdQ4fGg+j2|J&8>5Jf*4lwf0B8r= zXa}AGAP%g%7Rxpxc#kau_isoQ`jEQkKoTA}AQ&BB$x)GbXKYfc2)IA51@W27V=m1N`i$NhH_C=5}s^+^8 zeJ0>KP3BfF#={EYJwrY42 zsk=}a_7;}OI**OPky{*6^Y;fpvMT9&FbSvxiS=y zS=K}V)>#Fh)H${#ZgXVBa7r1t9UxUGpSt8q!NVyS>wH=2q>R|zkSRvhJOFJ8&ee>} zQB4G3ohw)-+j-*!O3?y!-o(JY15$;yP?uaOcsK=PJ-uNV6&bPbfgU4Zb}q)nR`j5e zIi=vitCV^GV7$R9Tv(pQzE6vdhB_nd-oXfFr8UDwCv#5PkrD*+?3&0cuC?#26bpiD zJsG(DAyud;brzb6hf^@R#!90ivCBfH7y+{e=IQVE;fi;)4%YJ%acfgoBDfYDPjts^ z+r@lJ!dlZ82|f631N=r3?{hk0o%pMxeK#v-zt!G^Z68eG#McbmA0buf8K$%NRJ{08 zAFtNS&%hsJRN>!DcnQ~dtBrUF=TlxH-rsQnE?id|o4XN4sMyCBxtV{X&n5jM#kLQ;a~w z9*GW!ip2hxFadKWxUgs}@>QGLZ1@cH#KK~f!T~Xif&}J+zhG*2gO!ZNhA{R&j9~x6 zz+DQ7{SS3or{duhj83pL?13S%|3Ri0RkI;}1iY8MTy2{*2h&}(Yc(Tq{?CHhHA{El z_c55Eg60g|){r>=XF9W1!au8wtHM)+X6!)edyfx+s>@M@HCWt|2=E6^cB#M{7}G8R z_V`a|v2P2fFF+~SKS4(9j>s9KYCaCF>`Zi2wRdy_-X#K>6fa@vOse)iZgFBn-Y2Sx zH&P$Lgpa%ghb%Ev^IMt1Hdp&}R5|$K=X)NwIzt!sSt_bx?3<|F4HEZ1LB^<>Q$Wj` zv0X8$Pq#zRrPvcqlwtz9Y!(A|0i+7$Q5WM>ym@6@6%8O%XQH91&;DT@u6EfhMGmtD zMgigZS^WqxLF4d>Pch@3C-HC@3W!n7;Fs9HTn6LnWk!q9tD&@f5?4^GFEqbiq|{KP z;)B^O+n^t+Pd85+=G_SZXjv~nv&;eP^gbn622YLE`&N{P{X0eqy{08+L}5C@+IirGL^wMr*xcPfZ!F)>&*z0f+1!qbcf4 z9eb9x!X>Qwag&aelu&=d zycl|0E_BsTnD#fYmjSDeiG{UbU~(9^`H(8)P-lgyI6kJDgwbO<6crh<>mgH&fcY~n z?d-S$xob8Pw;Lj*WLi(uy-q)xFHKmV)PxPv1nu|bCPzp6eTB)pT}rqXSKlb*mN?iV zRNrL&hB`{5Jy)9ib=rQIK9hu3EWo|}NQLiqa|CV#Qnh>4Z&UScc%zG?sCM56;C3JM z%%d#fh7qW1r=Q|YJ*AD9)apKr!gZ#JGh#WioYSQ)-jt+D2L%>;&6f+k`+z(PxxJ=z z2`z+f*PFcluFKH=a*oi?eYDiJ?XQ$yJZW!CSPfzyHBT&0O~zodF)><2Yz|>mWW-KKOJf?Kn(^@&n1y#E zclAp(O>=<${~2!<;E(qY)V=Zkle#zFp%&1+@#e>@>^s=s9Pg7nD?uv8yCws-Hl%8I zoayANjJKqycJBuu$2-~l52gg;Eh+wZ*Ftsvct5uSSJ)YMilr`tb(MAsEcTk;V3A}a ze2bV^Od;Zp_YHmhGPDCp<9#X3yzzdu3JcLDtkN6rgEaBR`!&ZOZ}CR8ev*mac+0(a z$@#^TV7yPqag1xk|CV3Q7PuY5YotS_adS~>j{ls zT^SFjVDzL33?ugSkTI&A^01Os=Y(E;wPC->Qb?3Dm*C6fNI@+{4BQe(75b6svXG_V z?LxF6Uj2MOhw5zbj`->q_<%FjmTvqatztKlB&@^L}vc zJzR{kYqmCD$L|>9sv#w7d9&*q_nh@T7ixM=oM3r8PZUAun5VJGK}603TX&oPql^qzawQbox*U zpI;eQMH>h?2^78c?NR<+X|J&?RdfT>hAc$djvMNyrWHQSv{u+1WL-OSB8!mvRpA@N z&mISS@A+uFj~AUJUVw754rXAf)DyAJQ&b&2W=x-pv>U$zhdCem?U9XKQF|IJLbj}1 z({U^&WtL?`uO+2pY4tPa*X-5CX_w+d1kxjN*vr~fcpeRoV3U^hpTbKj>X5|N+nD$S z1}57zUYk)VwdgQYkK#zodi2VDDITac1}~3fKVe*GrX*^#Vb%o^8S* z#9$j%Q(WQ7dXcR`)Xss43~DxNe}}#s&PUROFCbOu45qV;N_cD`4+|0}cBkOGL58@FV1zF?R#5lJfS>s9OI5$vP6J-CyMJMYVyB|=lIaw2{P~}!C zYZ6_Ib0?KGnH!QgPx!N@@R85>J&jPJh3l5>UI3_~*>7uVHoXM3YC)5SqA;mq zw8trDaQtDpKV1sdV^?5OXxzQ8 z!bFOqP(6+XCiRTFGb>EwR%r^=;|rSXgA>`cjcLifEQetrR1d2i4A0sI!?@9_u7t)UUe>jNU2%6G#G&U6rLenrY>;rwPbg&*i&qB;&m<=# z^=0w(fypcXY@+9y;{OJAZ~J!A3l+0X@fU%~hbbo7$ru_bP0IelPnEnph;$w8>d_?5 zRu94XrEta2GKXsJe#>8zmBJpD5^O=<9X64$D; zzch}a`}_e4##yzl+R-z~+Gu==QA##Zr45)`)Dtb*Y^>>2sr24VoVfx`8DXTKQz>if z2~4ev+gG!;8;#cnsj74(6DGkvYp3xriq!Y1>tQS1%|uy<_ZYcY3VBlEb%dU4N*@U< z4jAPJ{k2+8q->Y!^${&5EK*rF8^4VIha!5}Xo(mcHU>5PhZ0Kp0HEB>pLNuD3)4(8 zF*Uh+2NuVSHceA4G`VL47LOX~D^o2rx!2QTC>|@$Zf0)DOSRCo+#6VQF@MEGRN0TD zd872bz;>{iHb2!im>5*4(b=mM%W~hM|7)g7>-!ejqs@Jo(~~PrB2G`5HJXfJeA{S@ z^~xuXw5@0=Q~AJ3_AkFLNG(G*ZL@EX^^tKQXqsFLEs~pdUts&K@i2xs**2+ZZwF?! zx$Yk)9E(>p=~Y(P{4poBprodi(Ci=vChIiw18%##$z7JS3cJ#wfnAna9Y<}lUt*@4 zx+XBIZKl=#7qjH{@(D*>f3f-Hu7Ajo)aX|O+kR%-*uU7SQnRaHd_!2mRmDRO$A>Vy;<^?bQFNPj(Qc zkJBu+5cMrH3w!)aeXj2EKYZKlLi5#s8kt~tlKZ`3H@}AS&Fjznw;GZ7{|~4)cd8|7M#s40i_^t~JlynVLbEC_=aQ)4+D0nT`!#vLh9?NuFnP z_nUgiy!w*=R|Zwu&9}{7WB!Dh{GSU?@_dn>A?qIV-T1#{sMyw(9tbi#U_M!i#FgCF zo%w2z;bF6DCGJ&Z2sBk10%0_Ho-hZE`8Ss;Hly7eF~bujSlq7fx6a?MYqF63-U;8C zwBo~i*_%x>7sFh!ZtESe^a_P)y_B}oVU#_^SV`TRRoI=X^eQ4&HLSE%t%F!{*v?=F za0e4_-;D|BbZZgLPg4?~W#anla9q^1-Z+5Yg|Hk2Ie%xOTML!$Ge3k)vV#E~q*(%#pg4zor{W$*xxacKsv7lF|+(`XC?g}l7GA$9hSeS zHsxEKOY;X{4}*vB8zM`LSD~UdC4M*ofO}D(n-efZZ9m1u^_;_b-w(iBNd9{WCjdkZ zL*<=o8Y<`M>Fa#N$h)f$HqY#x=Obp`^w(kY>@!%&buK$^TofM*c&<@99|`BpnTA}? zx5X7SZIhli@-yUm;bl0Ykwotavu3HBmu@chkxu#VZNsar`|QTp=eWicxWtQWEg!_9 zn^OfhT;jKIx{2S4H`D+WGpr5))HeqcZ%(E$xPf=k4wrfQ{)Mu0vJJCwfT@<(!0()V z<3>ygvvg_ku0sIb!{P0BC8p#y%TYrA{YHzh?@d?-~)ND_d6kSAH zeq$)-yH_t(O0qf|q-8}1nZ`%CbACLD&eW&KlBUZkdV&Uglso5_cDSzne+@pQ!A6eZ zsj|zI>IPC6I`07E;TT}kI6T7ha9|p1mCmh$q4yjn5!4`~8g|?{^^N`ec^#}(J6g8n zU^X^Rj>F}D^qK$T`(UHZdL%S6CLNNiX);PurxwzAD#jpczXylXX~BW)`LyQ-&sLl7FOtda%sKIx1obN#s!0()4#(CJY?$l6^Rh&d#$p=2t zXo1}5bUE%+kL^skxdbVrjaj3UQU?BqDLj00CUcO)-ra)&_4GIJjUatWMLK)eOaD7a zpIVX5Zqw5@DWnEwBW?`BY?U)TF!IPfuqD&Pftf*?IG}nAXOi%Kj`3HL*E+e?0w!;o zj8YdE@9)uc^_!r2Y-MT_4$E@mz0)h2?A{zSuE%|}+33P%mGQvYm2Eb`Q1y71Hp+(0 z1;)3S;QShNIdy3>*l3KIC+8xg%fX~{CbRR_Wx8PKvc+oTTyMJsBrsym%Soq>C4y!Z^9&#g{P77V)1|U5zlt#MoL0JY_<4 zGY$+qY67)WpP@?86FcV_qt7!u9NzNikD0v|4$_==jkT+Sn|gW}u-Ak2fidO+=?4~p z_hLh;p*hqs=jMFGQBF!3*2GWw99M%S0Y5$6e*hJHZD45peJp&!jwfp0Dc-W9hV$zk zw{?Pxxh+S`-A+?j3_l-ey{>p~Tkh}?n^yZMKMS-3Px{-r3r93>@1wT>U3DvlH+R#B z5J(~=m@i_NbKPD;&C1;}{B>A-eFp3JwCsvSFeqy_3RY$ONgW@Mxn&q08JUT$&HdA= zhC?p*Z)WD|H*gnXr+$){oyiW&#cj(dfS-B$9@%mYZ@P)u9TAnjn^hf;#v==Qg5?+uz#oL|dl@zq)Pnk zT!5)%&>XyaBR9*){0*Cf+-!L@ADWeUH?D!?<`{ha2qs4RSKssJ&IgHbjKYs}25xmo z6-q}@2FpstI}4VJF3{GflwWVSdj<@1+Zru*O+YQZjPwG}HB6_A<^t+%%xdkeOO|0T zX5pM4?st^R*Ok|k${R`L8<;L-8cq`4Zm*B$c7OwtqS_rLco+`kcJx7Sifa7|lbT@V z&Fx}5oDE%nfNP}j2@d<*?#4A}siB%VpjGajOUI+r#g|c&CQnqkcU_t01I>mkfW_f2 zK~>LU+T>*__wKLy`9QM^=)jRzFwbaLy| z{&NGS9uF9f+H>z)nHvC45xDEU_k~?JTD|z(#pu!($6zwkK(lRqk>jP!4SitLIg_WV z+}Czb!S4XNl8K8KsNC1q8e;|!+rj24y=yRA6}S+3A4{Q3{h@9Z!Q{d_Q_^z z>l-|5&B94$pI_-gV}n~Ivv8W3-{)#$lU*_{SWjesm14sT=NvkxO8HS!;~pjsF&ftP6SY?~RHZ-Cg3ra~o@t~R|74MMrf)I9 z7{B`eTDVeB>r$G%#Db<9TTr9lcwNnKrgqP%T!a&I!q8|X*2Qj@U};m)8oALepNR97@{6nAq0fC18QZ2&r+M?;x0 zt@2pKtzM9LjDWCKx#;4PtdJ4=48l}nq(O{FT8zh7j7L{Gy<{HQK!#Wr(5O94%7Plf zn{+98|87L!h|L#&MMXyJO*GU1RrBRBIAi-6$9S!x#N*f@)M{9Oy)fSdhzkowq6Z?i z8a>(}fXqad_JA5^910*ikwBl-YBCJRsh2UF$RpHr59R_7N>2=Y+*Gxi_1YakiNx@2 zuxkFm&H(D1XmJssGX_}!v^wuh5VTf{=^&ae%gignd#!4<{H&&r*m<3?Y}9J?&UhaQ z#}C58TJ`t>#rUBsU|zBtW!g8Ry)wG(TjQmLj2OG5(jh5$I0a+Z?nLiJ zMMmsTkts&NoH!P*7djn}V%2UsJO}z?w_(>=`;4>Z&cx=iEt+POn zw}XwiletzYW`;Y{8Mt#HRcIJ>DKG^Or(ksFE4UC98L<~5Q;a}HD-7RK1McMAYP389 zQ*hp$hJmTN3ve6>_I)g#n<#6VQauUcE=mUOP)HSek?B%ED*j1jT(vrl*)G5mn0L%r zi-n0Ne0ILeEl{l2h<-3P!)i!Z0cl&;LP>5y;3GuhjB4=~okH zbmMVKy?{B`&THnB@%o)A>R_BPY80g30InJ(?Yt4xyc?<(Usx2OdN^4d5(k&g|>8+tH|6#`>R*9m%8Mf^<*XBD~Fq5yQEM zfqN8Eh4xUFoGExX1!G-Vw?3omTK8d!hR0XvcJwMT8U;%l%~w-fueU? z!#f2we_;y!_ zCNH8QBX%v66eEyvXtGjrR3#qp*l^TZf?ct8ShL}As|zTnd)d%zIBxYptNe}^HauZH z5BI!=3L8#XWgP=V*zlyabA^v+Haum$vePff)NFX(YTVg})Y-y@7pza#R6xRp7p*y% zp?rb}8(y+Hw+kT6hF7dJu?6v*s*MRI@v1cw^z#s5!)sQZ?ExZec-^`RHpy&w!`jv% zun{(VY(0r-#w$nI@QF1EH1QB&!>3l?<^h7vQHiguexU#nHhg2fe_ntH8@{y;UhK1> zAg>RmTa1?d)g*W%S0zCejv9vg76$HJkSb(Rr*$Q~dSzUVGiKvdG;z#2)z8~p1DUW) zB_6ddKI9<-jQ@;>yH8uku}sJX`2j|I?4}dXTAT<$5g*$cI(}i;*DUCR>PIC}hO`4;+qB&FF^NSb}H-E7TulGAk zbMr6jyr@6sA?Q`X+Kem*@@DSPYO01bpvHdNrfP|ZPIZMS9r@2|xj^MmAnVWI@XvLf(+)T4KR}XB2 zo9XtMIp`Af4<=oisZO(>$FO@t6yexmnBp`e1+vH*4FogRUF{0;xp8-iprl zatSx{?b#S}4-sw_*!Q7jdZrR?K8Vq>FP;i-$j#~ZrC>t!&AE4Sfs)3!TUKL! z8=j4Dv!?yh=l~IJX4?e|Jp_DY3!@_OT?RBKMj+$88A@HnnK;qR)~jf9TV?y5rMcP0 z?vU%#z~g3Ho0Rt`rMcP8-jne2X>PW+M^r2#!p#o$MyzvsAT&2S+QoZ_0J;c?{Ov>|-~qI6P$D>}zLLFj2VK&o0Ly?6E_* z+27vK16`8D%>ni(>^eLf;pQlN_>cgRdGkzrE%q;-jd1fUdvApe2&58Y?7=w9JsaWX zSbOWb01X;pSNwExQl{CEN_5NRAq~`3VE}D@YY;N8RIQGCr^}?sK!H-4$Ce zc|pI&%~HD;*eZy}&Cd4r4FMwD>}vPy5FoonfCx8-+MNdnh;Vbb{Rx=pl`PyW zvp>PW2m)@hg;9|a`v*82Bal&!gZ9N)XjWo|$IY4cv0(5tHy7AdoB3lN*7N2kKdfa z&0jEDwmc!nd2{R(ydMXn25z3uz`Yn!gdRu#XWu?UZw^X&W3 z@q&2VJl9^fBS3_k<@V_F14Ouasr|;101<9pX1{%DfCx7?*qNB!ypn~RSJ>_Qc?h`4 z7Dh!z><#cJMxg3xHhc?b)W)>@@ByfaJsw5(+TlTdpJ|HTVDEs19{M~@(HreAFn}7W zqNmTB?29T^HlgUvcD;dqNn?bfx7gG6`G}_It#;M8Uy!%7AGW_ox290^Zu`^x3P>n= z#NJ)A0uqYeV|Q8}KzjQ8kNrYBze0Tya-V%>1xbXW_uJ1`Old;V2keKYqf3$~der_E zr1i)q6g?r&+k1#m^hukK^>~O-^eKBolK>HlK5ajSsnN3$iauknso3-iMW3}lz;WzK z?Xt9Q$DrBgV78Izb0>~Djv6Rhhk@GwQiaZAx<}Dud_!g2r|1E@?`b$eg*!e)57{Hp zY(YGV-fl0)QRg8-(L3!Y*9C}B^q75WLx2cHAF;>cB9NC$DEgTFwG$vh(c^ZNZ5{%O zvW55{8Dzw6isrW zeby~gilYW@9%JAhhg6~J)IDw{hjn~zeqc{FJ;dYYm-bDV_Qb|J zCHmU#=I0t<2seMX&%w^tvk`9oX`gXzfCxALw%=_XAi_=MJaL7GfRAipRAj_{8V<(@ zWR!v7FA6uSIeOc9x^vAUzq2$qbDiDjP)(L}&COcQE@ae@$IaT#9Gu7{b2HC*eMEo= zHxo|%G#}C2%y<5VjV{RJW<6(U*oVArXMN{LuL?-GS?t_CwgM7vHgI->h#sjmHyb)v zwel;}^JXLGH7h`bn~j}Tmj;M%vx&0@gOtq8rcMS1x#KxE!5a-6yWBHTQ~8IG~x zFA_MB5^lD1j@1Yd;by5b3J0KPBiwA`eA3ZFz)iL=DiUY9Xikhk#*a(!4x^nYH_^}I zW`F0rv;6MU+#KfIey%^}-kLt#xxAkbd29LzXL-dGCG%#P^Ec*gZy`j&lwKR^Elh@y^g-FRacMZccDoT^wZ8+??pt!NlOXAoJ!V z=W2AEhX^+(J8|sfJVdxT#reG(x+H1doa$_-SQLbt3!Ewyv!rlyp>tNfpd8`mB4=iW zjc{{`v-QfrM!31unTVeBY8P%Ua|$rCC#~tTF zGcmV%h;Va`GdDdzgq!o6?khY5+++)*BJuvmW#A@(jLXl%O#%DhU*bZKn-@8EVX@Sm zrMbD@8CKgL^Msx^H#omf^C6F$mpcOn`uX(f`W4Qa^8-Y?(7~~0SPyEIN4}T%DlPLnHnqt-bHU`Avz_Qo7Xz8 zwhs{D=575b9t9ygQmzbfNC zH!pEsz_{~1U7wrloD(%Y#N*~>r{jnK5pHgA4q+rDm$#5jXHKPFrYP`&w_j}xYz-iyY?<~#DN1aA- zf6Tpk^D$=z&M`C%JZ?Vj6ri16C(FEf+!;42K!lr5IGdLEi00-Arv&6lnKz$x?h5v@ z-n{vob2ohQ=_=fO-nj=O=tIKI7n~!L14z%CFFBuMqv|;&^XAKrWd(@Lo3A(zYzPqH z=Bv(AIPjCX`I_@^#e65+{LtCaImjj4{K#2YQI2r)W9OR+8{y`s&MK@4oHL3`eFu0{#rpot*|TRuvRO6> zfrOx>5J&+81VZn<8Ct+XFH%#fqErQ>2~x!Z3U*PvV7V%a4Y7+A#a^$9SFG21{lD)w zXE$d9-rw`j^X$ww@Au8jJ2T&uQ+9J=cN7udeAi!EZ6m(OTi`O^*^8ce}6cOK4PSdDk7~jM{WWpie6y&a(0jEiHO?G`V&bi^nh?Tpi*K(do zu7<=no$9Sbd^6KovOH=dzM18e_lxn( z?iejQ9s?!5`7JIKIco6D7Z^FOB2~@_;)G!blBXl>@Ile$%kyN zi?($3VNeBeU9^MKdsY;Yt-X`eAP_~wMF%+dqO;sw;-Z6`e$|M$=n!Y)?x>BpXtDDL zCWz#Mi?W3Y65{_KpgBPT$$soK^>Gx`nUh`LoZ@UOigcgx%~{S|>^^49yBXh{?Y!JD z0;L$=EOm;ovAW$ZTYH)FQ}z89@y&8);MjO~-T`CQ-}*-;IN zZ!UEBZ$~2@EWUY(vv6`0GQN4K^IvRjE-CTN%be@6qq&Iq=3?i{q$nc3xx{JS6OrJfT;=4!6I?`m^GavW zwJrkRWD64{jJNB7QIJ65HY}fUf#kba;s2yJ;=y;2%!qZ zQ+6HIi=R~!k2vZsX9~zYO||Q&H#!+X7jYf+4(Dai6&rV-zst$ajUuv$KIGKGfy=cK zM}5S(6g!TKh@(F0yw@g*h@&2M_9|of!fy8?M#y6$x$PR-tP=u4)HnU=ML~iL2HQ zWJkN}B5~DlfIlMd+K8(r1^QImz@JoRN}%x8sExR4oxrhHQAAv|Zs6;+F|PUo2G718 zrvh=+Sr9mSaMf{)oGA!Z;6CbISM}mYYvK`C{o2`dn^NU0!gbYeoGV7Vi0i69JJ)0J z5*yc5e{qfui6Y{vfj|Rvv1=o)S}RbP5JkjQ69Ru?-F0omRTBe8vRwqO$`&R_7;n!6 zqacCAW(TpR+R65MrRFsP&CIp|b0jSa)CXpI+PG?$z(czuWAASJT?3<=M4hUS7A3+bDjJWE+ zz<4yqWLMpcs}2hAf7cqUSBi1fA%TBXMk+S0dS2kW=}|;nb!cGcv?wC3Iy~^xb?6$8 ztBwpb!_wh()$xI;3!;d)>V!ZK%xtf#P7G|Rwt+vX%*lZdtJhF*)hU4?dC^?rsuu@t z?ik~$^D%gKKWstbsxz@6bM)Y<@r;}>LKPTKz3Zx8ys9Q1an%li??E?%MYyioDNu~F zf*`J|_72QP*SJWh*=RuDz)KCHh`8$LK=YPSL|pZPz(}0_-CW|T7X`YZ*)AfkIyTU1 zo{PX$*+Tr|V1)5@T`&q#Ow5C;2JPf00DO-#b7odRr*y$T63)VZv_X^c&UXsG&!1IG z^IOCC(q&3Hrbt%2=A7V{N#`<|;3mTIvZ^Ch#AJ89Cn|Q~|s$(bR)12bpDW7fWUL!@t-%goMfBFT`n0J7cdw{)u|zKI9&# z-$pynV1*uF{qZ*S@%ASO6C}j{KL#EoFfbl#phorDdJ<=dH6W=Qy_U!BY4lN~d*l~q z8@(aFIGfZRnm3s%G#m$|MsNLsqC!74gLr&6&WWLJ81zPOvwij)lqel}{{$@SP@==e zF>8M6y?ZZzSw2@tkL_eQ3VOQ7U;8oG28ohYSm~kUUtDUM(eUFG7_QWlI-bc;wYrBkqnE! z`yUDk62O0-!2nn}I46y-(kiZTyHI)uOwHEoVG%mV#y8|!9029Kac67QxC8AtQS&~| zK(do@Oxu?|2w!cShaC0?WXDD1$Hw@D6j;O6&SB)VL8t=%p`O;Uczy;>M}jx*8p+TN z8A5$aK&B=C0gcM(OPkwgqvD>06HtO%Fu(66|6Ica99flHN!!G6uX!K0Vfy&2?z1a-WP^4f?cqtQCt9D>E^2KcMMQcwXc4w#?DyQJAS) z=~ zTFEprR-e+U_T8|$_`n#gGI2o?86o<-!*3+IeHl;6+YZ8X=6!w7U@AS{L_gEdQjJSr zLwi|+TNr(KIh-ioroSaf7;kq(i9rL@M(-yGFr^I^iVLtJuFf0I1>zhA@Lru)Iu6U! z5L#L}#a3P&OwjzH%+9Yd=Y6md$q}u>OqN@D_*SaQA8C>cth{lXkQ~jv_vI|rR^EUO zNMC5u%aAUoejGc-mvgzcvd5w027zAaYRs$r4t$SU*75v~vW|DdX*jJ>v(?W zcywH7)ozGg*oUE{?hw0^dT1i6>LG=##{!Vwlaxc9aDAEIi~K_P`CgUZo6QcXwGjLK z=OT#Q6!QCWIkgv~3Ynf~WA*LGbyWMiGjjSORDo^OlW{Dbe@6t*pX6pxlb$6u7Pk2p zYjScG5#RcZYC3Cv=`XD#&N_^BsoVsf7&trgD;~oVDGXd5(b=hTo6w3=A%D(3tdSlo z)v6nH_b!KS!4#B$+(}FM0#Za#S&OF%`AhK}+&6MDh)1D;yy6s8QP+ zX%u3yjr4RZ_Z*jq*39myM`&^(>dfDG5{^O(ZG~&alr!~f8a<3Y&fomox~NfntWhfN zm+48Qx~(Zj%PlFvYh)IMsa> z{)e!~M77bW?2N`BNuZ`4qVfJgmdZb{3DZD!UMuX2sW_TZP5qAMTm$kS_y<}+->vMAa0Q(qLzD}9nLv#5ml;x|ZTz?eG`qfKw1Pf&W>#ezh z70R;JPYNyMSv9}Eocinp+_#X$=uZqJIbqSMFURUkgeq_j^<)siV~&wx)3G>WlRxZC zR;uHosKK~18JM45lMQG3jWqp=Jup>kw%VoRtyUF1N~@;u)ci6%0K;pRrFP`4icU}| zi(aKZidLB|S{kL={g+Bv_2%hGn1GSiRxf#-%yPF_zl(xhHMcsFNsut!Zj73O251Q} z!7f5rCqeLO|HgIt5O_fyop(O3HqK$dEzgYXHSWmb#MTrwbU{utvKu@jdzEKoH+n{P zlV@bF_KfUSGqST~A(Lw$`!f_QBl`hnA334xe`MtRhEN4+Q6_^3?(Je@)3G38lfUas zR;uI3sKLH78F)u_5lstGU;aU@*=m=Lw^~)SLki@`9?}&XA|va+9_Fg(J}PBopVH4` zKAVx1MyYnksg#jDrv1nnY3*qv`?kJK2Hxbu$dXKggz>gQO+f=toc0Xv;8qO5Ljj$4 zkxWwp)r0wyJD5RV_O)1S6OhFW=9iwq{K_+!Uwa1gq-QX{@eJlEGnjeYAHLJ|ac`wC zfhURYH7mCtWoPhs|033+4bYhuvb-ARIBOS1>gV6TcQXeCoN-TDpl+f3P;$y*g|pi%}l(;9<4&J3*7 zs@m~~AkDxwvsz$3jkLC!f;(l~Sku^Q!xk5>>^Y|%GI#tBi#UN=8>OMSw?2tfOl#y8 z!VLWmE$}l}?B+9=p-6W3qT$faY)|HI-lSEthtNT{Jb;v%G@78ZU#VuxW!zkasY~U| zrF!x{sK*^f=xQDQVu)&@&&7B*8$AlUAOY=P`yfKDJnYj13FGbEC?aS8inE?Tzyo8! zKx_6xEpX3>Rp3cK7OT>n-AdhwbY_L623F$N3r3bbK=r8dUl38-8k+6+R5U|EmDfht z8J`CLy+F7x;mT16>mYwOd@3doQdRAUVIMQKGKE^%ja9=S{|jdYqhSh~D=vg)9^``9 zJhOkj&AmOUO7}udy2YrbR+WdY5O@XX>mCA6!kQ;yPqV#+eFrrQ45Ogcrm(w_)Fo2b zc|aE9;f=<6Be1wRQnknWWuX7{SPyos!?4_Vn)P`=7UL7?sfn=WG2IYl3jM(| zc(LOkz-mV9qPC zhI1>{Q?&yDl;6};-c99$44y(TCy`QhEiswZyq?hNow!5OU^F*uYyP-#6I>bML|0T* zm%@%WhYWx5j|HW;*uae-9_JSHX;m#hi4&NMt9g4_!SsJ%#l6T=fykx;5mnVO*zxv~ zw}OLNC}^drAU!uKtJ1-H@TM!;eHgv`i|Oh0Na|tbwV+{N9|8I-K4omV9%_2H{2XZ6 z;$zUfhtHXMTUCqeos6ovM1&qH*J@pyX<% zi!ZHn4=ttTo5GiE_Gwixl9SomG@|@&u%W*+LK)}aQ*j9rs{Cmeo&aciHQW&OvdxPC zT}${=&@9(L*`lRD))75}|CknC9m!X-MU`yPJM@9|P1BZY zKKIn4mg*|TaB(#5T!^Ory%cq^VRtjxmH&ZSIOU%}2~Xo=rhJK+@+AcHUVBibxq{iAbq`WsWkk^YS>li*2w<4j+Cjh2Hz6au^b0k#d0EA9#^}OdAf*zJ5LvVD0cj3Qu1$Z zt5`W7Da6dvY}}P9+$=M4RqVlXvvSnI1xx&9Zhp%&|4~=`W-j^2T?$dEsoDVREFPUq)9zy0G;LvP++EzqG!4-s^R!0lB3{@YRCVVIQ~$xNPcOYtZIq4+*eGM|AE5kw(p?4ckyxEHWL-G zviAYiLNyg#kf`9zjiq`xLM(}uY!!8Ns29IbRpX%JgBVYDO4|xw;Qa@ge}ylyVzpBD zy;CXPPAllH*^&*H)@;oxGvT_+#nNhQ=$INkBw=luyjsh`-&31LO4_`! zxhTIK+-|jAjb*i2-#rAt=pYq$U=xupB8)|E^ryXoT9x;Yz_qUqpRjMiZ^D^)=q%{$>(Cd%id z8g;i)AEN57SbaPasxk}VZ%F=0s1S*=HVCXu-72~>F&Kd!R(3uj-=;^FR7@dQL9n>& zG65f4!iBJ08t^!#SV2>vpuuP*Zafq;a~mKvZM@7YL zZ`OXQwaUGL(XH28>g=i6@IIN#u5P{7{0ZE%iv!5S9(6N051;^Z!$q!)Q^D8soHaw} zC)gjM6(7TqDR5-{Rm@6uUJZU>2%{Nq(^0F|z0j%3l&Yqjbpz_!^GW^CJ_A=~AZ6DMgMZhmrGneB7hSO8xtO>~k!2qi%r` z$1aO4RpzCv4I4Gr25S@MWi7M{_I#oy^HL7(8?`yPV_wRdWp3A5^D&|1cyzV9MvYpn zWhLJ1rZJ@^ao%n-6AsBXoI%&P>XGF~aaoXoGfQ948-P#s1zP24a2c--d2%iP61mtm z<`~Od{(IrnwHag}P~{3rPQ>X@&Z2=##PZgFS!_9=D#FprL82D! zBhb_46X^XIuhVTR^N@k61gcxH(VY-f_V>VL7a*aBmQ7*Avwjsb{Sk_I_ORW+m&v}6 zFpxvPOpn2>#e{);(x<9eRNLr9kJq?Z_KdTKg`u;?h-n6{xjrym5#m8FKvsgB(NK`p1Yhim%WChE?KJIV?6W2 zRDa3TC{E7DkcE$i3f|J)kmG>l@?7ectTnsUTVjb>wMN(HEIKZOUcMgLpTcJx@=e62 z;w2#bq~2gz@+v8|EyIHH`7Yxizjz=iK=}j8*Bb z`@kNpJdCD|#(zSG)B2GCGrTq;^z=rZ0b!};YkbzG`Q>rQz?JT0WOx-Hb1gW`z5UZ4 zT3$r|3z{&Bt3khvH`}aD<&~Erj)OjdHlBNJa%ZS6z%EooudmCVg1s&&zrw9N8`@la zVk(zH+X3y!yq-c;)qBXt=ae4jSR?yQejPIuufV`F6mvbYD$T%k4f|<4%Do>S^wI4| z>S0Uu0mRm(C9=rRfoeWJF*n3iRWIb`GeJ`~Q@Z-L>+HX9Cg@L01^K)!$QSfV`Suwr zJ&e-UULh6c(x#-WJt7QB`4+?n@Od2;DX^$Gghbgf(ax$kfml_3k8nJ6i>UttiHh(8 zz;WvOWdo-Bzku+iJ;RHsn!LUtwoIRddo&s>H~fQSCLF6WP!?aA`}^#)K(nMpyxY$f zZ3LI?D?KeL9}3M~_}mK3gJgO?5~_R-LN<`lqlBXk)Wb~s%CCkA+gOb9X5%AmEMpsa z#dQQR(N)yEf&?4R=NnazBhd(gVa^m-l3>+m2>6u3qp2P$Rn_A`rTD1SsAVL1*@eYy zo}8K&a4&((6V04#7<-&>Zp9!1B?#tL%%QkM#N7z_S2YO&ABK49HV4FJ7A@1S|(FyDa$F%`zP**ptZZvJ9?Fj$G7Z=lCobJ z6_+`%vNnawe?rX3`Tz_Mvn#9TRVDl5Q@4OJHV;F?23E2y-#~GS8KRA4D`%iyKK%A{ zVRaA7WT1t1yLFtWTgOSay6!aaA-vlM!!W3)trq&Nn6IR)4_P&tWif$-jCq7s&zeEzF z^CzQG()I;VtY;OTm8o>In{zi5Icq#Q%a=ey&L2SYQzTo=WGDJNHHLHP2X0y8QO?&f zWj*hfwF~Hd_?+H;q7PH!w*N=u;CmLvZJ9z_`SL_*>LcKUbmm&zyv2uYMN&=%EurIk z7anJy>s~>Xj)#tUTOiLxCSOA&kxwqTdI1`Sk857F1vl|Ma zsk$2pzL{@2hN+so4iGcDSav_Ni;`@PB5fMZ~dZJ!)E14lXm-dsRT-9R|nKrEHgzVgv9VH*okUUz(?jb&_OWEUfPAvLZuK8qZDufsH1 zhQeJhk9pS1V`dw=9mby3>i^n?O1nRXN94#;jtY!?A>_(K4XQQ>j;(qG)R zor1!@vAS&~F>NX?-vc}PVgUaVBn=ZA+r@>u%BdFU{PICR+rHzX?s5?O7Mwk`(19%awtxEbC&Ob zhMeyK`g9~)3}>PrQ{!$7zqn;(Zo;tO0~a?e%0G3>8V7VPKBu>z=+)G??N59H8)LNn zOrfoO_o}oxWY+W{tiQ&GwE&WhVE_caw&ij5=*F-RI_5ovJPodveCjnSy`N<{ncSr3EHS>pppls%7t`@$QDRrv;l zC-G^I0(#?9@iP(?@lQb~ZgdH-^~60>D8c4?N>v}j@)!g|nW>tTzaX|iE_~9o*)vGm z>=~)3gRe*ZeRf(zeEt#0Z0v4u`Du%%vE>7y;XHi+nxkZD_KZ@%Y&@Zt2uB-_TR5ie z>tMpRUxMwDf5+-El0#HVjYvkW!Fel{ud&S z#~j$dLQ>K3;1*#9Bok$_)pbx_OMEICAX7ySg8~GqyaWc^3fe7$b5PfGMiY8Vvd>S^`UxH*#(SBD#>gE6i=}pc9@wMLuCTo4DenmJUymLvyYlG zKZIuGHPU5LW=VMn8Wz|D=tO)x1r|$zJprCag{MHd_dx3WPBpKQAe2b<gHS(~UOq5e@sz^dI zvKzVRX%prmD8}LAoiM8Od*tMJv7kTjK|ARJcx~-4G(0D)19~;{u`|s%VW=v9A6i~s z9)jjcYI#*^E-#0gdr5BreUBP0@5ydSiz z>3V4PP+MJ-d)Mj#poge2HD!&w9i?X-Jist`3&POisknQ3&O($FYTXvj*?E_Re|)T` zmsP2}>Adq3x@IUY;Ail`YUtBDwaS~xTYjNCx&WQU>!#30c*K%7o7-XN{JU{8rSut; zmbG?1`YN=nH_Xb86WAFb@E{&oRx+u-vB1;oEH2Csy8DmLr07z00tG4Sp# zKAbW5PGJnb^BHGu)wK!{Z`B*o35fQX=zbGDYod2e^c$mX`r>wo;_#a`f1zj9R{e4t z$@!s)Hd4D;PZ)>@aTQ~*xPmd*ZD$M?w=)KdhZ%##PmDL~j6sMTkY|jtKOBO1tNy`6 z&UunbH&Ig)bv4m26U}7C@C7fL|A-?0H;v^iCJd@WCE~wPM(QUMIU^-i&qR49YHy+e zCc4l>vrKfEi8h#Mmx=b9=y4OhYNAg}^rMOVB~npc6E!hWI}`Oc(M%JqH_`Pbddx(x znCK%$oAtC&h|rPpooF;>)fg%K>T!rdM`tM2qHyF(oE`G5%a;k14ge6EbS0k8X7WEF zguaFA__KEVApTSbVm5#JGjy^&#GLn*K)hi(#9aPXQz$bBVoUxjkI#MV;SoqHg*Spn||9q0qGt(4nr0K|6BvxJFlA-0!tclCwXQN2v6iPSk* zm;9ZtCe=7H>2fK>WAh+(6|tZ>#BQsI?yZ2>UC_Ga5POJt^EQaRrTTk!KJj{ieDXw{l)g<+7O2-~d?;7ccUn~!UuXj1PG0)7SL2gLYB z!>^2-zYwal*Adb#7Ebpryl-$zRUPbXs9)l$)< z-c|%`*Yk+cfMblDw-BndyAU=X*RlqTc2z@Y7c+LpN7~g8Pu5v%f`sw*dyscew={h<}j`=#^yDUCt4~)H$MmB3bEz?q4r-cwh8?q zt`hVR%Uv&3#9aV!gZSR2RuDG{npub|fO9L3p$mGyiW38pjePmOa2DVKTA*iqw>3tp z(4=hNYd0a)6b8`6`O;B?ubI&WeYIC3)!d}QzRRnSI)|?nS~+!m$1q^N7Dkum`*bi; zE%^^;t(*qFhKPNwjAbS~tQDRRU?duX5=Vm6FcJe9IYSYuw6+Lo7Ykz~sv*A9z+w_4 z#3&$3kU;3?2B@y%#YkIkBVaPKzutE+J2(?~@>U#VR(Hi#}UVlW=_I2}ZSOd7b z={3&1)`}+e+QWn_Xo~8lFmh%hRB6QsX%`EFMKwegEG9uh^b)cJ350&camCkLyyOZj z5x!v!(EiXnl@QP04lC<-1Wek#QNF>q0Ulk=t*xR-y*Ch$8%;q%zfNuegevVMpyuP+ z)_}pS8X`9qlOSQdorsJ<0-=&_sBR3a3+=#4=9`%ZmGvP4CNq7Le0zEUo*Ws#=dscF zrWks0zROdPnrenK=(`Z>gzsXL3j3O{)zeI>j&C#;THkb&FU|MPSxC(=sRkH;BE@R! zJ%oUbWc6s|=Zu__2vyoKgtUu=(a36ujbt$i65>0#kb?w5O|TmKs;oEAvN;HtjPsTI z984l#g<+w5{ADAbtQ`1x9B^utRi%-iO+2YEFLu^D!p%UkKZYRlDh4jk3#n@RDFe0;sVo-li5Cd7tA-$Zxbhk(hYt8dM zCIn2z)h_V8&=Ih^JgXhLa>{H~yQy&%JG%o8BFs^5CIYsNInjvijGXHcs;0{k(k>Qm z=7q?g#Uw}=Z|{K|BoG=!Qf&@Ev>G2*ipjXztqiGixnZG)T~e)0($2o5L@DN|r;vlB zm=m=(W#qI%sG8P8NV{0LnHM4{7Ly=hyxk62f&@Y(B-OPa($>QWm<-qMWJq=9p{try z7n6+3<~I+Rquy2oB*mPl{c%RlGYD1FyAaYY7H;N+NQ%WINEmOw2sua~H04UL$ePNd z+IJY#aCQa7|I~q)Bge0QW8n!ml8yVO=@4^eliy9TvFz-hVrGP!$f0O3=0&)`LQ_Ib zaRdxEZ^ENeVtcuNJuo~nV1zhSv>$-P1v^OEFe?J0N?5sk?5~#xaF^6l9 zwKhU^jeZ30&&J^$I(;+V*E|kLYaM(7aVT6DUoh${eKevB;wL`| zKIkB;B>w^|;h+=-rOdq6JM|s-Qo>ARBqbKGQ@?>*3odevPP+?C@aBfz+Ci%wV(0fA ze#5VVmmzVj{tMY7@C$&i)mPzN_Xu(v$Thmo?Mme}?6p(xf$>{zU5`ulR`_y##Q0Mf zhyM$h9w7^7V-z=MqgLT}$Fw4VDkRsP?H_cL!2oI`hHWaUR zk9EyHq**7LRe8-=X+B;{y}~uiTo1EJNT`07qX*SVEReR|)(cNIw`kRWCGP3MBWw$e z#5>A3Hd|-;p2MhFXA|MEd2}-3tQRDe=Ib~XsqFV9)xh^K@>)42m1!>nD&M9r#MC&& zg!cc;$oT`I3S2{(mBiw4F&MUqf5PqvKJgU%Dq;5~Fbo8zaSKkg4+BiJUqu+g8mSTv zpuep^qWvk6FA>z9UOGqF{;-X?3QLAz+tScdw5CHUYmX9ry?q5O;7@&+2`#m|LnHi$ zrr|wqCh+s%jGVa$Rp5Ne%o>Zw#bB%~0K-HH!}cP`Ap+JZ1lJG2zG7$iy5sO*Hz2|; z{=6$vXBir{eH5tB`0ofjPhvv*|77I&aAZ({4=J;tSUfHUL&s!eNoF@Jg?*xgVY?Pe z2obOrLu!iSOq_p&?}@$W=aCUMO&20nVp6tU0y|-Iur|KQ!-V$Z-9oUzYcOC_N|^=4 z;&Cw;J0%3eLq5u3C#)Hcn$=aVc4FBtRad?sW!d^mV^VWbC<5O zKsoy~5i|_{0o}RVO*nNXDd!$dr?zr}DIaVH&;710l+yVqntX4h74|oz#qE9ItxDyh zFwiSxhUWA{3k`Vc0H$GDN_72+~UUY%uN)U&nLd zHFpxB@1{S6)LmCPOxeDi$MCKH{bnHI?5klTB&+J#rg7ckb2srg1*-$Aa%r~ z!oKlXSmK^BsXD&O8<9F{QfaduWT(+ZiaE_+Uv`^5YdNE z3D_^WC>!Ojsf|?fz@ZR()u;Fg*0frUpM&VjJc5q>(iZbUz8M&|xUY{%YJ@!ju?%NA z7SfNH(0(>XJ6|AFfrXUC31jfM7>vVt7^4`LK@Hp2B2$Rtn`rZRmhjLsc#z>FqyW)Q zE%GKT?n#?((GLk{VP%W+*CGXWm?&$bL{siJfI}3MR^lPWL3rz3aUq@Z7~QtErh+TV z;X)+CnkK%SEjq=XgmjW#FX?)C}2pJsFPk>*T%QTuU~hlx4*j0Y~?Nnmk8$M>3$NNYYMO ziajANPG2s`xD@`JTwE=EjUg+uvZ**HTaWv1JbEhvlAogK~$3-J=Wx=8%NYLsU}^PCTbM92I;U(;)xQ5 z?R$ZQ2!!qLK_F4Wu+9JA6(V4rQwz@~WfyN@cJY=h5FKU*ppk+41tU!}G_(yPrz1iY zXh@k^WAV5cj1|9#$`U0E+ue~VMBuEJ@whWFTQ&8M_r2W%8|8#AO})Ou$w*B!Dcjfn zVx%USRGhCd_8k9YlM4E7!X)%hF{!X`-BhHenp7R%(>sy6*rd{YXO|!~&7>Om-rS4S zbd$>TZMz()S!SDVLTC5TaY`(M_5+Azyn4>ZJxnIFpE{fx5vst;lvznE9v6ctmC2gLQNfeE5^X*m3%j9} z0L}!g5m-Uxzn3Sp%d$FQHR*UycU*n|#YIGxgM~h!)6roO#L5~{38eE^Sjdfyoz)Ai zO6cN@i6C)VOJ)G+x)oc7u?c70j*d_0_6Ek*AemVU%Yk&?+cJW5%ldsHkRJCpk0494 zhhni#==oq(1W`Ks8A81dMhn8}`^Qp1y&H^-TG`nl^iM*clB=RnT=uot_!9b_lOBb_ z+4a%!3H{12P==Js%pQn|kkG$=>nPMMYae#SgaKc#ia`6beu3j94D1-?Fd%ywJ7v%a zRN;1t&T4fIp!2>?iaKt}V%oI%1_TL%C+f7H4Nl9|k(kWOfS zK1SMZ%Hie&c@gt%yo|knDkEnWLKWymS-eDh@wgZa9>u~ER)MjFgLVKuhGRd%uw4m7 zh@$l_&dpgjptxXZ+67IOnh#Afe}6Do#+@yhKRFnbxsl9Y91K?Mqrq}?cH&&-OV;F7R6vcZUQG3@Ie6M-W17`e=kB5U zXIxGNSG3JH%RkPlur$GNR*`%wI;8d+lyje@{f;}($W>FiDJ9v(ROSAgDhFqf;M!0n z?$e?WwNnx7>nnY66dv8V)x4? zD8;h0|7vDbIcuZ3Uc(v_HwDs0p-fax+LQh&?!Q_@h0}WYCEQ<(MIfqrM85{_%29 zxnpRs9qUEnIRD@?87!v3*ak4TcsfLJf5Xr8VeT#(Ts;>CGtnJqFnE{-*XO~Y^whPn zEi5p2#dE-8cqxl6$lL63p|-x^=$KHE*=1E>L$tT{L`?(Va6EVjwfhz|zz5QJ^O?Px z-V8b}f)^mh(2i&1Ohu^b_d@92r1roWUI4RM$ges9r8igz6O{3e}Y&3e{C23f0vV?O#cSe!TQXrC2a1HDTm5Lx}y4vP;#2 zN2v-%sw9ypVc0$wnL-4t7a(2U7eyqk6{_u!HdNOM6QR0ZM4`GtM4@_>h(dKEMSCx) zkm{dUX<0C+zRJisj!*?2q3lxi;8CiAkt#_fN*K1^ha4hc&994p-?0@%ByAR|p8zye zw+IuVx>ZD>x=lo(x?Mz}x`U#99?BA`gBs${!i4r;#>iQLPz5fg>{9jMQL2KGDoG?t z7`CrOrVs%uyPi@bcAcOK_1tV3GNR%*aw??KA0qaFb_YOo6NqdB9d!!B3y~0GO-YlX} zy+uT!daH;+^)`z3&7?xAO|jUpU{HOHk@Ge}6*xrMrRu?>R0Shdl1P*=Y<~bbM8H~* zhI?e34oPwmYC5c1{!}eNa3K6gxWnhOo2Sp@3FH|=| zW2n9$OoZx-A_~=)L=>toizrlIp=kd>Dx_N02UjX67*q=wIV}*XKpo01RSzDeDj2Df zM52UYyDc(>2v{#ex*gY_I_Wi`+7W3(^>tw)RNoL$sJVP8r zSOyc?{{|!H1VR;fjIvABgGZ?fMye!{C}G(C2y%#kbqUU(LvVSllTHZL&jA{$?+O#4 z`kshF^?ebA>IWhU)ekA!!%&t`9eNE;gG^}uQbx{7geowDvP;#2N2v-%sw9ypVc1@W zOd$eRE=~{MH$f3ep9s}W&={(p3KOCFnTSI5a}kB=7a|JPe^IpmBo+4Rsg^kKn`22K zBc~-o6-cG*QuW|bs)CU!NhC^$BPue52w1N`>OY!PzZR;UkTz6L3KOCFjfg_^-y#at zZ$%WUrzqODkqW7HKNqj^Froc#GIHKUr~-#6yHq`Rl&WB)N)mWBf)J-HgdvL7A{_G0 zs)Ztweh{i(05nv86edFTClQ6}&ms!d|A;75f1zj(M_EGkvi7)aVgi>RjGR>nRbVD% zm#PPkQWcE!NFq@}oU)K9L?G!8NWIsgh@_xSThRe;`~xT)=RlRHg~02qfPM89He#BC zfW=M2i9@IYCkZiUERO#m=fOyTB_~RVCy~e+B9L?$q;)v+>ZGtCkOIIENHPRQ0uTa^ zkH^o9GJ&5vXXIRoPz7dFb}RGXQ38UI0837k5W5WI5P_usBItV^ib$$s2y6jh2&5VU zZvqektt#2#f+C1a@74mok{p{wo+cYZ0nI8D*D%2aggEj09M6qJ)@bkV6ELR2KHu2`D0| zfg!LBs3CBcA#fak5cp)6QZxqvhmjLRr~;>`cL{j#C;`DpfF&nN7`Bsc1kwQ*0{Mo(g#d)WCUg|dLEuV8&Q%CifcIu21Uz_@fM6uRk`pDw zqjJb00!cRRBljAGB9fXK0y}{k0?iD8cL4~2ja68dU=9NDjGQn+75I^Qw+B3Ulz?C) zz>*Us4BK^)HAEok3P|f#qKKpxhCl`YL!hN0Fb04S=r<8RjLC%duVv(HLZ||BDZ2zb zc$9!(B*2mrB@El!A%_SgIgRkcI2WLZq}GPObwCY)Hip3a0EB=F;PxQQK_JM;Nk*sw zKU41#@ZeDbf{_4APLwcgry*;IK+-Bmi<+Z|q;`hDSpW=y_J+VX0778R4e(bcw0}J# zXEQ?l8aZW`fCrBf5R3#^GG5C;7`CrL7^0XIhZ(T`N)(aQ$q={!s3FkV5cm*)5O|~v z_q#Y@v_Hhise@1jexcqa;K8E=1Y@NvIZ?u}T_0IP1gt7Z{U_i)O>(h4ki~M_={yc! z3ui+67cz2|AXI@#l*Kp(kBh-rRYMpiN*K1UfE*%Vy^jDlol(^=`+mq$)l%HWqXJcZ z%EUa6 z7Zck50wd>Dg!m8BlqFXT9v6eLp6M`5lrU@`ha4hcb-+1t9h2-Hq6ay~++0#8$Bp|N;e z3`RPvG*LpFvLJ^DSa;>&B)kWY+EY6FUYUgVsd^B>^MK^cUidb8{=G=~Rt$imw<8KW zxj*j8q;%zT7JC37A$RsBtP1%;Vi_Z66+#u5NIi=OIS-z{D1xW-jVO5gS>@-6vo7TP|Xp(*2+o+D;>iH5~VHX>-pwEX}ZZ`fs0d?W#{LTP-A-xsyaUdomMtf#3 za>@~^bNVB6zgyseTX-RM{#cj==S@dGytsfO6D7p^U%*2I!uClSC5AZv5~he>Ysb3; zV~{VUtmTLq=!vR)l)?egIxQ3H!PPLek0X%LSRV&c$O4uQBPWPZ1x`^<>sUN424lr6 z4QF74IR7APh@$m4qzBo{DLZ`pN0KQw7>__-u@ZL8{Oj?heI~U38Ai^F2yy*SnOSS# zm)68p&K5#5cB1r~jtqrp%27FY5uXeR{O|*|A4BInd7@}zX4(To&S9I!h`?^T6M{&c03Uryq z^Co5`j@Y&Hpj7xr@pM~ zPsZJK_JmKTP3n)e5puAe1He8;m}9~JY33nn z&Ty5EuQ@mtZK8#Y);eup95Y<)?xs$L>;c^(5wd5@+Uwqzqu3Ev-A0j2(E)Wwwbn<- z&yV~58_pSMcry+v<~PJd3B&e(frJQz?JvP8=?*a4*9-NfK4GP81p8V53PTMomHL#$ z#uswSN`2ZY0-k&p+EjZxGZu0SOFd$dNMRx6XDq(@)qxvb>QT#H4tp7}x)^TOf`Qr3 z$l*&aDzK9>D~!eCVldJqp+pJ8_9Ku(1gtAt;06Dykh@+>q5U|(!fAa__Zo}MGfi0M zX~KGGg5kZv;^-LOS6O^%ppbiU>P9KI(2pZR>LzOg>L`@@lx%Y)696D z^(P97G>PWMyNU+VRJM~KAru%{Z|BN>ah>SPiGLDQlzc?Hj z@9QYL#aaA-uoCi2N0@`7g8S`Z_%iZbE6=~+iSj&n&^0oCNkdt zpvoQZmoLLHowfKMmAbaEuA5g|vutt7i5*_bU%p-5{9A9>9LNUIAWBc*` zD-t0hAvQ8B$`H%Itzii{%!xL`u>DWk8GvHvmgg$PRnATwqq|H@h69e(Tmrj{#zkrB zIL()z?OHIBA)LAqbA$=)r;&DwkWhgvLKiNriO0oYtoLMoP*43mG{R5URir)RO~R*A}OPv>S#^Vi8i0$|)s2b{z1VmZ9+xJa-N8Y)r|tTawpB7Gjep_fG1j zmqB;OxA0-EhY{X#kjp(rgE`2Sc6S(a(X8U8Vcd1hUQ+Zut$xJ%n!Z#gU8$5YkZCV_ zQ%-G+jK04Kiuq^G>gqZ~*{&It&tPEE9sSmf8rt0c)E!g`ZJne z13HbGG(cH@Ab*p-aFDc@nsNv+*xJ_ucev7CWfmmu{j7q6S|7Dnas;%00V8KILKQel zJZR=i}+>qr*87z!(gVpM<1p?_WUIg zP3w76hEi9O3J#^UiW<}lX-$l8&79W<^d{g zf}Edt$Vi)b4N6Pq86$1d4HS8lN}EiI$vjD=P2qtg`Oz&9r|zM_1IBLhT~TFTcVCChLLn2$k{@r0P{jizaZM zv~O+%Oy8-_-jB-rFM{&>OX9E>#3-jwnLZ23pM1M(C|fP2ves}Ye?5UPQmJZtBNbCP zf3PZUi_K=XptjG_`6=`c{eTSZNB^nGygNGVbj1J!$E)TD{NFQwWf`r4}My_hC@KqCEYJ5h@MDYTfn4b#Ylw#6f^eQ}kncq2T^2V7>%vzH_K5F-F#7=sldbP=495wkk z#>9}kF{=GCqLsXyMDE%65t@Y9>hmz=#aSa~rT3}gT9GzPe}L#!v@cSOw6#cej984+ z`|HPAkf|!lj#`Y?-LZ6e%aE6Ni@MUHJHF_ z^<7Bil+wwVviho=*qnX0MU`cG;GEc;MF*(t#yYEXbFB58+tE5-i7Myo2QgQ<21Mp~ z(Kl4q4kPCxol(0+&UpBgQ7+N9KpB&>36)6&=*`RZtP8*vOIEblUR3hM>$Fw+Uo&ec zCs4^#Vj8|Dy)#zX?s6)x#=YwFuk>MbUu1xy7U1+p@_cML<|n< z^O~NagrbLO!1tHa4(StEX1tDRocq0~#bMpPMXZH!?!TfIPwMdESPSFaSzS=eFnql) zy`{CaVXTFzWpLD@yYd&7U>sS zd$6W^8}D(P6Etf!1%33cZeBe_9BEtbAJp;{{q&!ItBftfG%XL_BnD}p=*!Vn-dbqk zZQ6NJ+kflF!?CuWrd34EY-`OK7n~hYi#Y51jM#!aO*>4pTQD$bN!CZ))ZN8hwzF!x zqA#L$=~i9LT5lV~%rrHvTco(Nt=f5iW9DsduV{vR>#OU}kipaFnNiz;R)^r<*s7xK zQM2=`ts~B0=4sZWQQH!0G*&9lqAQ!Z8RDYPXm*l2z&I=8ioYpR6$QFS%%)oJo_Bg_ zs;GI?qRd)^kquW>7_E_lVHnX?-{K?`%E8Fd&-Y25aGUu^Ge@B{1z> z6t&%Bg>m@s5~;TJFuygL;Z|$=>i?BN6&;V*rmwJmz)F7R!adAu^^7$20qcG2WM|G$ zeXJ|$5Y6z2^=u6%u0h{)=FDh@$E_YUe6Kn~R8mFPMKe5Oop;gSQK~+S_IiRDc(XtK zwt;IR=XK*O)d!@af76OzS4!V(Sq)c#Ni$g0BLQAPRG z`s!e(P4wM@Er;!lo&fq#xqmknq*UJ=6c(eLMCH0&m=|fjw{OOCAzb-Hb6!OyznPW3 z$NCsHo`Xg8*RG^ls_6cRZCXR$+}v2(=#s38-iw;$_>TBu%{(4vvx!pkz1H*C4ZJl= z4@$2T6-rNlU|NCiLdae-Po<+GX6a8^9l1tSACOLKhv{4v+0s`v=x=OQ(aq5!k6Wd< z4DuG~A@~B#_F|mV+WB6(Cf3YD@Rx{L`qx%n97esRMSI2V=!ShFMRxW5h`~Rjtt#ph zHS6g+w_&WAhv00Qy>sYgz1P@1S(}ws4T7P4!ioS@N z4fFkWRjiqZV2F1Hj*kJs65oXjW6eASJ4DRV6MdcM#+ub6I3Z%2HrCf^>EGDm|1Cw# z($jtWalg^q(H?^L&}`NO5S-%MS!0rT2%dgl|R6*bY^6L&PF| zukJ^s+t;2!RTUxBGm&4D|TyuRN;E3hT#ZJOiAD9Ts^viumN5ooG zmn*jIjoo(N?bH94otaiD#NiFwqv70%5{B)IQCG+S6vH-eD8 zmF9aU2dN$=)xftX9{<_9r%7e{o_iWK^fIYNzL#*Drhaew6@HSy_bO9;Oe){kup?6a zOsc?l6vw{$15B#WcSR~vgG{QaZ}c3bhL}_{U%k~xjWns|zKd!hRbo=-*b4n1_Xy@q z!7p|(q5aJnIjs?@KpJIsR4g7BgRyUqqi^vzUwXI$GKDBwV}{^K=jV8ak#R8V6mGa> zJb&wAyv+nuYn8PSKQNW?!gTE22GLmu&`}vL-c%kztgPwBVe`_9I4~I-J8N8mr7~V_ zhR!fZTvq8c4&cwq4(!?YA_4NP+wXbs&8j!ICP>L=taPN)cKG=XiQFcasZ8eW# zs?D|Fosp&Qz{)$#l$P9MD4+*8iw17M&e#4@RMKW}9e}s#_eQ`gaeUU6ZgYPK(4Ct9 z03Z%aEg&^$`edc^Z$&Q6PR)1|cWqfJ{-16XJMLo6VrX#xE2=mVQOLB-|0Ak+FQQYZBUH^hLMiav-j5j!?O<+rEFp5b8nscYiie9FCm8s2=$_~Kw3egum=4O_!3c><1P z^*V7f<}Rac-Xj>+Z{J*nZ`LyDzfxM3dlM7HAgPwLP;lv%@+I zY#P{QcaaP(X~{`eBIBKKfS_SLwn0<)?U%wmk55Z}dP^~u9x$9z@w_vR;Uamj9 z+Ju<2Y zWtLM$pHaF!R-WQBb^q(q>@<0rc0?SHIcDlGgl9ffo}&El%%&edqv62k)Wo@z#p#vJ zxUr^qN2VDxetH1Yj2J&XhG~Y2pPtDyW5rJ|XPPbIhgDsSW1PnLdWc+eE!EAKBRQh> ztsaAGiC|)i59q-MI33>c!yhYq6HLtr*_qmhmA3iIm{HfX(Dp z*J!mUxpmyD@c60|>-e;0^GZ0>R8D|b%^_fpa`ukJH_+qJf63q6hM026|1dMpej|1w z^~bl8GI{L4q|%?G0IVN*-yvI4`^!zt^gvSjZc$_0_kk?v36`V1e?zL!7}{A)Cf@Ue z6rRiqEUeLEJswL?-8R#Qi$W5QL|g{lmW)2;dXS81U7Xr%N|pF^zbTfMk&AJzOcv_A zU$Hqz7RhtT(5$?>adjkFtod9EER5#I6!RBPM~#@H;K3g!@vi_#6^fxK&9XA_eu5>@ z1=bstehAOI7s4^wLwDIZ1GNm&xn({zER-vk06JDL!ZuFMORhG{SUA^*2ea^(Gh2DN zRNhJ|KZkZHQ)i{&J+DmR$=)C!7S;29f_H&HvQG;1m#A(p(bNHF-eiCMSP^tjmbK&b zCz$rhf%h&8X z4ov}->q+3A*Ral5kII{d;QdDT?nfj2EK6psRLT1;K+pIdFC3>;^8US8dVF9UYEM3J zS~39k6L|0t_Ef&dKQSQ5hhA(E07rBL@bH#^dS&@tDD;u>=xjer6Rh6JN594>`@o3q z0QPmq^zeb(w*Yvo3xduE{*9A+^6|4a1i%?={uAwR67)T~bO7+o9gy9n$0~cD3gFpe zx&*+z_$H8iuKB6}xHS%7|E8WPV8V>0OI7lPjs0*Bj+8NB#>zP=`C>s`3aGsABxE_b z7HoWv1&dYkrJb0qetO9&bm_}eu$Wn(a>o$lc;(`@DPY3PIrCKVja_r`##dX(tX0cZ z^35Yb*9Z99Tk@@aAZmfcO00p=Hv9#?Wi9d~fB2?G76zx~Gf^aev`OQ%?9IUXX*4<# zD}&SW9Zd7&&s@Z?v2a>`%$e{{o6L0v_r~@4WCLv%nTF2b)rkCLspc}|lovQdVpk(w zu3y8#d5BTz=GeHe$(2y%>R*GOMZ^rB<9glEZb=?KmZ(GMzPz}Sr^ydyBK(dRZy z8Pl^LpvPjYBgysp?+9dBckS9&^(}1&F9)-Ya?_i974Qd6zAjb8F#LMOK;%A0@4#%d z9=7t~dhZ|@HtBZP_$z!>Ke~@D1iD3Eu?WvU=1}+r+SbgZ$8SC1aj7ovgTLAz?$Ps9 zdPLX2V;9zNX-aCFc`;2qsVA?+q_8$M;?@AYf!h+>_*E!ZO_UQ$@+Q5eH5kGz(~OM> zcLt@jcnnleG$ER6xUGN#Y`Nl=Yc$G?GY5>At2rX^|2M(}at%+qIU;jS2f_s641+jl zTAXt%&e@esmdqm?$Pmi{nqy{5Sy1u!D?}vz=YhG2zeNGgHGJY$j!58iv;bA-;1s3S z|A;x>q*da7&TZX;x%jg7LSkPtFNHl5pMDGA{%CdU_YM;11fJ|8_+?#Y5i+Sp2 z440JlNXe?z7?Ri}0;Zij4yf4nt4YFs|_ zCvU^9vuUSEOR%ig^gz>eO|wh1a%yt+BC3?Bf{)P2+lc!ZnZS!^c<_#gRH2d7rN9h4 zoPm+fXP|)pxI^ZeWyln#dPGMI--#M@N^aF%I$;Se`HR+As(S;+OfdJbcy6NH`FIm3 zL7jCh58en!6?%boDIgR7=x|(h&0)6nI0csM(;IPO;(FoW;pONR`|}X5l-ZSel-`E( zamkaq6;2KR?L$XIIyq7ujW_l|#Xp)*X^zNTGY&|cz!7glt9TW$T5`QR`648;(UYcR zuUpgqA`~-ecHL^+`cyZ2wQ?q{uA8mgNvmhq;VYf_3w)*RkF>(;c$m;xAM)UR3aLW- zsY}TjcsK(iuZeKX5sANAL5~wSB0e2&B7d8_I%G|5U8~ef+2mD;hno*a@im+cx+WWI zo>TJ*E?v4cd`_BCM_d5k*4X)&l8#w<_h4UzBMZX@+{}edI6sRorcD8Ya|I7xYe*G3 zjdo_v#KRewQd6#4j$%7!opu2(+)62CU#jGjvGM65SXNISy#A0X^d{}n9^A^ChJSfD zj_(#tK%k_1)-lM(hHLo|y#iw>Q64ST($ZxjS#2dW3w`ataQmWcSFWm{;YQ)gi@=t8fL$W z4k+zQn~L8CIknGB7Fxd(>H5aWR%+3*$pY*m!mK@Uu#~J5C@K5uWI#XyNv*G{m zka0TAdIUnsZI|XIEzIpi8y>>~Ikj{aa$mI-EGoNkbkMppZ3{!NOvHy!Z+vQJAt5a! zQbojX;b}08NBTHo=OR&i2?Sa=7KiIucB?+nG}UHj=q$o)p_u%nw?eYy7!sPX7@{>k zmO4{tA+zP0)sS&I&DsSam{xXqsxX3-EMoCeT7L`AKiQ zWXUlkG-DJ5@20iXnL-PhE!RwjjMHh>dI%}EOPZT);rXp4oz18@dDwOx^@?FRvpKf$4< zLy9C*Ajv;u4K0Mj42~??$b-%zqP-Hym}CA0-(1risW{bH!=M>@bhj;GT1!jHszyV{ zV=Exz%s%yf+Tv)4?!EgWGzYg$6kc85oZfzOw!uxB1A7yEQq7sRABL54(IkMI@u^*h zMD4i{wxxj1Ae`3H>HH$BQHjB)_GToIeHIQK(YSEgP%bQO*${_+g3qTjHyAgf&u1@1 zLTAxgdkdH|)PXv4X5#aQ6W7~;OB4M}{(io{S<(fvm~tj8dPOuFyPUvKcgN~@`Z=OOd$WZM5sgl;KX-~F2UuI}%5 zwT2tJx(DpN@d>)R3k)CNa~8nc@TvV0iQ1naq^k+gPamn(b;jYwuM^{Qr?UbE2!$@cH)A^^sc^(nSW(hSDy~q53Qeg zZGBf)`(3>VZtUtwuusJ&=;~cC3|WBn6yS^a)Yc$TI~_v0n(&i^)4Q7gpzn`L2I5n@ z9tm`HcO2$OS5M09>aR(VQT-z#VS?>yI%}^lbB400Gbg$_4WD05d^1-cX`*iox|%u4 zrlhi@x|*)JrW#q}RA()MCIqT&S2OK*^`vFcRh(7E$z;}c2qBa1o8HwW3z7LNE+B)K zqxR`&{p#KIT|LNijhyZU6L~K_BI`2%zs0BaF(hiAhmfu&e28#*SAPWS z3{)~3pW3gHKv(a^;Sf3|TsAYat0%x9T^$C!F}ADeti2nVGqjXCbE2!$@c9=IFW~|r zP4taHS2IW1>{OOiSJO4u+zuJ1I*b2I5(0y5SIa+@>{2}QUD#BdRmRC=mVDwd2f&S8eHrXK@kw>{^z&f&41htV+U-cxUJZd0 z%*i;M#&W}24tQ%N5bdoKbBNS!$m zA8GjfTZ!*v+(;9BV-O$AQMNvnB^4iZ%{2!h<5Xw;6G8}#wmr$T-;?WpgN}c0LdMBt zRv8*1WYT@p!i`=10PGLr6Lj@982T+nlaZ+d zKDEP;sI7sJt|nYTIK8VE!Fn~o-87tp1iHEd4nIg&pOx9wACn+gy%wN%jO}VVYp)A) zhW<@EbE2!$@cD)GX~3x{P4taHS2IW1IjJnEuBI!VGKs8lsZ}70LSUlp zYNq|JzTjo(cx)MDoJ?l@0wHA5ebc*I$oJ;pPaO^UAzJ_F-ukYdYP)(myZLw6T-Z|G z3{sX_e{?{cH?!m#8y0pR+SS^g9_@aFyS@cy!kc^4eJJV=scJ5Fsk%lj*yWqljgG3s zM~}CrF>1ksFmb!p5Aa%R;)aX4UiVGw0N;^jLay&&;?7|o;6JR1dk5x<;bJOH>L%2M z59$&VaBI}T@LGDT#?>agngnuTVk7prr9+4$PQ$1~J2a)*xhsAx>dlunCHMmI zXeFNllql>0wR2xO;08NYe$+n5#6j#Qa{ID`;}1Zr+3zq>H zx)~z>41kN)drBR-zBdY&zlA$m<5#Skw5mA%GUn6>8ax}O4{|QLiNL2IqZ1!(gh$;& z1U&wBm6&)dE;KGaK;XO+37lSyEKA-ea9N1JeRsfP>9+(LoJU|iJ(j5z0QR*dFsD5V zU48_CN$m)H&stWL5qR`E0v$I1SlNldh)W3kgC45}5?D5Zz~1Tjv;LcWgif2PVyLU^ z<3~Q<1pNf3j*e?q({bwnrJA=s4M2|h9Dx{{elp;?yeOouYtDmHSH**=8_YwvZZZ$K zb#*+H)~)5CU)>fS)-Ar42mB;-j~t!F&&km&epim+#ox*?cd-+rU+LmTa_m>vlE>TY z_=g=mWbrT_jIOKYQP(Zw!KvFIXx&x|UT?wsE%-bS;kx&D$gTU9htefiw!&da^R|@T zL=F`>P2@6>n<!uEc)OAaEaOzIy!PH&ML%41a54m;s z@=&_udmifYhe3LEZFo>i-sPAq`BtPel6oVNEk*VeIYQ(-X2>qU74qQ9C-R?6bjkCh zDR~!!Uh=(2XFT;hkrg7lh&)E*aU$o7TrKikk(Z0SS>(eaUl93$$nQjA5~JjV$a0aL zMOIVR%{~q?T(<^6to4!&xWcZN@QO4ZZMPfO@7o<%g^gF=6Z|)4d-l!QUK_?2_G8QV z;%u+2O&L7q>?p+yg@wq#odYxClvT}xHxyEJI0}+}nJ^x6Ru6IEXEAsm8YG@Nhb(cb z3BD=Y>oNmrhc9SmGVIwGXM3IOZ7M#e&i+j+;8dxYq3{+6a$-hQ{uU432au}6laTbw zgu$sEA`cdmBN9&;haM-8s3E7mKS6coVVz(y*R$`<_ImHfS`_qCADaq;Q%A)Nh5eC% zoR|@n*YV)3fK(kOK+-Q02B&(6oLEebNL>FzmNeya)bfYuclj1vkqRZQTmYo`3q-a735OD;cci%tA725Kk1oGS5lAE=$B=$o#E+U0ZBa_2EnyGkwXhCuDcen`yh3bi|nPh2$! zYR_&cGRMd}BE7i)dOty1n7sO2NA)E%ExWI%t=mKGcL&kk%b@lbv@uT4*#kt~vkhvs zRDZ_~sDl^}iB*_u*~dy1zk);dVDbH11E?eJMfFZGR#GOz*~8?8_u0dVU<5H{ofKUP ze}dqcwSfVHQ^|u@1*tm3AnBJ0W6bIy)WnP=CO?MY!nR?tIU;jSZy4hQ5+zr|ceJ!% z)(ud{>|(DiZw+;HGk}c8bGQJhhS=7+xajU?W%`RBr~ptr?jgC?P9TbzX2q6 zb}+`NCXUC6D|@*enTw&WdIMD?uDcTI8X3@YmOwp420w-sID4%$@#|xtu9KlVkzu$& zd1aJm5n){vDHR?EN*oDN!$@r4!8-?1byy5Zzf2e- zQ4g`VSqyF!fW#;uOPp%r=On7@c@@&m5vSlMH6&xEo68-T>Ap@{rrevhBh|xys3kac zRm@QMB?LJ!BP!45!D|AkIyjK@%Y?zH9wHAGlOrMsBS$k~IC? z3(f`H-yaFEs8Vz(Tn0fFbVYSLdGM}Zgd5S?mT#XAytP8 z$o93}4}-z29wIjulOqz>|Bxk4AW_o~)lFq}i5)wj9zPu>r{FZ)3XWu{ndM$P5b*5O z06sq+sX3Nj*gYc;skwGIWA5agNX@gUT(<>VJ>RApx)Zu1wZP^paNll%)Iys|7JNAt zUv*J!;XfeQNLG(VHs!&qfK)}ghs;&h0dSPb57 z0-0+bfs9j4yu*2XlB}e2&cT=PX6K;465nS-ExVlRKXLX9mCGsQ8+2Z%LKdHE7C>z- z3)L>FN6PAS2q%?L3t8BQWAhhk-2hEYw8d#G)V`L>ea>L0U6ym6hUY@<-iIhRE1^E) zs9uNjTjrRXo`bFmEgnwwNQlt#BGP$$CoU@YT1<2$7PG8D6R5sE5)SL6cRHK{ z_4GFwp*J;wx?U#ICe#x;pA{u0VcxLY(Of@Qqml@D;C z7JA{W5R8*UI3ggv;KBP2QWZS~Nxw|EI32>d;}E>q;NS$uV)39;$XxR?WSna3J8rWQ zcVsKo@+h7U6FCqqJITo}m#y1>6uUJ}_4#9{uEq&1^w%j=zdr`*t39cHOZBzUR0mFm z`uaSmZ8XBbo9xWNx|w5+hfJ=8V0Xyl7VR?^+uVb-)tlx_glT!f%^-#UN6p6tu&V%Q zt>fq6n0R)fQmxwD2Gza}JMkic#k*;H1eLcgmmyn5iix-a=Ig6k2YQx! z$?I8a)j(YFv&JlU7lEm1z|92S#YNbZ$9(`+oPg_Qsq!9A^L~=vU#0;E2{Z`2v)p%? zy&W!m`Po-YOrzPpUQgsUR;q1pnLgvN-)Z}C*9{zoUXXE(nUg&lTJXg&Ppuk-(VGbj zA?gm=l%?YRk;pzV-7BG1J%y&6?R!n8*F1XdO!sP_R$YiD-0FKRrq?EVJ(2E}t5(fG zyI%FZPNUbI^!ofTuh&u5zkILF^m>b4d_#1=zM)#R2u&{qM)tet^#{GWq!l;GN5EAme)eCg)!>b|@dq=)IA_6gNq1`1@{Vrj7$R5z z48G0Ui>spx@Glo8bk-$2c$Y!qT>{jZH4_hKU|_po@k%^XGGdy;KPoa}c0rF3a2jd6 z3k&SRZn4`Rf$!oLW~tx(v@cRkEE{9KhO=Di{m(eeUAUmuG9J8^koYZ;It$9g!xHVKy=o zYTe6&cN?S%Vc3*rL76!IU6O`jMKqn@7!?^YcSDa6aPTHd`{H!RzBt{fObyD9ESMGl zV$cn6V{>`%T0-K#B-H&Er>Eh;i_-;T#e6$$R3zGuOfdrSrY=?(yg1$17pI#Ue!cSI zbTiW*40&<7nPpS<#p!0YP1zTxn>jXRUz~2{+LV29x|wHF_QmODzD?N|r<(;fWnY|b z7TNB$FHSdgB*z!0|H3x155C)h`|<#y54!Sz%LnL#1`VjA6`62uI>feDz%AAaBIki; za1j{GGD%uP57<)blczG6aW(WbqBK&sFa)cyCTr{Tf-(*?t~2-f9MsDz0cGK-o)kP%=0 z0zF2+S%di4i1`%rZghKgLav*LkagjcNZmXH-1)D~@<$!z-R`qCW8ot_R}|qgFkHZs z`LtJq1l}b@oyBJ2;S7wVekTXk(FQp#@g8;?Z$dqf*m{&(j3vc;VusJ*x!p)TX;Wdh zRXI{m*;LGZbp}#T+f=SQeG5|0*i=Jz`PE20Yf}a8$5W7c&Zd&?(>Seq`)#V!eE?@@ z@2@sh;qJQ-sRK6E(tWZuQZLw4Tlcn6NFB6&b(DMOY@}Ycebw3hX*g1^+BS4^mz;;x zYc|y@uYV(S&(RE6_pY`uyk3{Z4({hJ%t7kydD7H@?s-^dymuB$>KM0gF;efYlGLDv z?;nNKZnq^iE#8Oc3wUf^RT;`X_aF+(8_JF9z;~#AjAb`;V%Jnm;0B zpVoV`7uN-kGI|?m8W6q(``RFxtLfsFU!n`lEToUnoD^>P4qecx3(^TaUhG$Bb0ie$ zgMruvo)VU}uIIr!8xr3VXy-$N(FbXGI0Iv2$HB2M{|88J)^fcpowpl|Lvq3_IDHg` z!P7C6NtP4(BN@_dBxwrP;iTn-^$tRK<9WK zyk(Foc?c%@Wx`F;A>8WB>Sw~!<0#8Q;hlxtU{BsnNvGb-E=-vdurwt-hON!bSWcNM zX(nBkCT0{l3h9U;@uWTe27D zg>b*u=BAL+lGRIr^xs{XLi&~bdnS+peB`~&wXSqD=3V&c`>><7h|;Cc5E^(_P>^y; ze_RZxI*E$~zLzPDV?7KXQ?ogM!ljp&0~*w!Fo1GPi}2kzeC(1~0F{;w#VigFF6taW z{Yq}ZbO{gn65VWzzrEy_-9U!+3^)uaJ)NC0Y#gevK1P>x>;P!wmq(-^UD5;l{_v=? zgMyrryYQVjJo@(QQ$D7oJ)1YKr;yUTe&+(|{s~6f+y@~u^1x*{88U%aM)2VM z0;xg=sY{e(;JCY&k>g{CC>EA;78pA?cVCPci;9ex|G*F<;B1cKOYB-)rOa;P?w^6p zXj39Q3r z$CYY!B{D}A7foub)SCeFF6sfNC0u#)`b~f;8l^kyMQjQ zAo|D%3`=WH^}IeCfv)J9ixHXxlQj7iq+Z4cO?#6E?|n#I;GmsVABLZKIIhaBCd8*c zMo#?Z43_XYO7OmAG3EPco3l(s);v5A|LK+rXz|S-(7b4+imWvl(8J9Y1}9c|7*J$G z*H(6A(q2<^fE9PKioEO5r8%!ruV_twJ~K6P)|`H5B$MK*Dn^Qqb7bVaI3^bh@rz67i<+GRLNbsR)h z@fMvnb5t+CbF4k5YVS8Ts^UkQ*0q4?>S4oDEtf8>Xo&IEy%_*|&bm0&Y0PD_HrI1- z-*4oGxma@;V){t^buFB4=I&nr>!%#X!R46av1r#88Y@J!7vqI9r^Rf*(cX062D0cO zBqgkRA%LRYC4ep`4W7wjh|LXHW)LXn@ZfERRG~X*XU0st;zi=8HgHt5|EZX+EDN{c zFrzB_DzFWd*P;0Z(nqya4dBB9qsRI+sg_LxY-p->Ij2dEiXODyJpws~x7vnIWw7~G zRZOOh4||P{T3h2cz^{%asESkQ5bFzvv5yS+Gl!jYSlSj2$9)m9{gci?RXjq6?dYLs zZPxHVbNGM`(~@wQw*c$9gumry`>;Z>bNC>d=9DgU92S3fd1eb+S$x@k z;2FG>!w}^4qHwIMI~E-it72SW;9HlVy*V>A9bEniE7olkRK!40Z)|VatHl>UaM&Nj z5kt!-vuf`dNR`|JNxw|ENjik$?RGI@SXxwM#2kPgBM>oM>Y^ee<`7{55!r`E^Ro8t=@GX?vxsx(-x zX-1zHeAf=i6@JnbaGEz*=_kVlyRfJ=Sfy>S#R{h4jL_f&Kbc!Fa}$y$`pJd``3S`Z zC;52`OawJZ`*>ZZ8xuOK4-eizNc`?VoeVSaa0bSfoq#q)%mT=$$cPz&tT6)lpF?{e z%`Iqfv&L4S!7Z8y8is$BHMrGJcx`5>2DfSZbuU)%!FKSx-M7UHdOwRM-;rvCd5p9; zU4~w-)UQnFtUq}0vKo^1Thv))CLYefu(M!R)+jp*oO;Yi08x<<6Gc%m0?uq`zi!2) zjw5=SUeKlLjhHVqpo)b&cuOHwXdHEM&cMSN82c(0j!}^ja{}}j0p~@C_px2liAm;q z=u%Zfw1fs!^%@V}JCG{$D0Okpz|l$;;A5<64IHB)BjzLMF#=AHMp%1rB}^wKn*?;J zs!>1u$i;-t>c@k33?zO%qAt!EcsK)NRi8>#lo2xwnPOC(PoQn=f+7-YidJH`FdFH+ z7uVuq%qgUj$G3JTP8GE^PDP2+MCDt%6Kh5NWC7H5RL#T4D^zEUSBeFL>X$rt-$UXD z4C<^T6A#|nExx2j5>b&6^H1n80?vhvl^S$9awj$j)!zVGs%Hojp?apMLUp64LiH?B zh3eT<&3u$4RM%aNd$XC)S=)H1X?Q?YFj6InsK|)92AN_6oSyl3K++%- zkvLDNUJr|h{VN0bqvy$>LtQNsBRTisBRNgsBRZksP3R@9w8M@ z{$V9bv0zaBiU;o>koeh(x=%F?52y-8sw5E=88N>=j}dUT6euh3XBkSgN~)iBR1ms!+X7RH1sks6zDys-_{z5~^*n*sx$w z9l(QkETjsxrS4Nr!vm^#IM5x{(s!+XE zRH1sCs6zF2s^(ErVF2u&gg<^Tp|if`!TSMHh2Eg6{`19H49OeP@S<5?>l8eXYJs@yAl$= zTvPX{rr`lq!AO-Pq9P+^H!{TtIK7K;dc6WgBpwv1dttFu9}*@)^La2G)kj4Y zs{5##Mkq_D?!(sw77VIK^WgDesw&iux=%F?52y-8sw5E=iSsEk#Rxcmhqkjbiby;m zRL3E0sXi%8gz8hG3e~4Y6{^pODpa4PYW9%|1K^Kqm14o5`V9}>kC1ql0Ck^g8Xiy; zj8sVi*C!z(=3kI8s?Npu?(nw`C?fH^Q2hg-rTSN4B2*8EDpX$(Rj9rws!%;h)f|tq zgzA!Glw!f4dMOXyRgfyQfx1sM4G*XaMtUR>6^WnVkSRvM>4Wp!UR+|*iC2W`jj&j% zuL={P`kJUh^>tB&>Kmd8)irgz9^u3f1>T6{;VIDpWtDY92#gp*s3f+={@2 z&ia-I?~)QFSiCcH|!|P(l#RxcGKx>kXA`(9c)f%KN)gOh4Q2j|%q589^LiL}b z3e{hzn#W0nR8Q@$6blB`?|ATjhE$=qsryvZ@PMjdq)HM|k=SKHj}gc}z7)>}J0C?P zV!CKU4=4ay*W#N(B1a2>qX7tkFR;C#I|wY}!8;LBg(g#%oEdmH10w+q$Ee7NITd=0 zK>k+{=VQ;S6S~_Y=f^r5s8MDfD6D9Xk-ag0}uiom*d9|CUn*c9=z3%Dm0b4Paq8s2na?3 zEIBGNV%9>B5y<}r;=^lDM54eFI0JwsP-qD}4L}H7btaxK#)QuLkq7TzkSg>(b)P^Q z9uN?W1XyxZBxV^F(-?vLCD8I`pom1$637Bz2{f?;1_2NPACJMUAWZ12RXliWAaN5M zb)P^Q9uN?W1XyxZB!1C@9wU(d9mFlIQADED64(g95@==#JPSYwyt)d%=`*3Te&)gZ z4N`?Zr0x?)!vg|>kpN4Mio}(Qau6VpzYN-0%~3?6!V(ApumqZ00)qhvfilbyx`P03 zme$^>kSa8Tx=$bt4+scG0xUTyGGaDBj}gfK2gJkOP(-4oC2%$XOQ4k{upfXB*n*Ct zI|%&3gZCdu75W=>pFkQO5D<(6SaMWk#Fz>YAdtTT+Q8#bM53)FkPW~RXlDrw1t0`2 zT!AZQOz5oDJa}s%RcIDPaq8s2na?3EIBGNViO2N*^#rzR zTwAG|Pjk7HWwK5_C66Ac^BEqz1CT0o2X)Dnfrm3N)-xN9QIYul4|kzcrY0gcmNp>UVlj3SxsGXW#HiqjCH;#byDJ{B4mnDb@oC#0pHbh z-h{RSu+Gz2Cfj-AdhFks&{?csK(iHC7rGiCq>l#RxdXSf{_c7FWC*_I3}>0+#_qaL&mq9f%9E ztxAz{Hw=NHdKEI^H&H=LTh5S60h6t3DaJIrm5 zu5gE+g~HGXxBt;djj$<`=e0wsjNa~uArK>vh01^Pe2&O)M_IR+%ipHm(R-wbT=`cH zd!hJh2)6YV9MPV)c|P0Nk4KKjJ!KSY%XW#C!rhMj&D) zqi3QbvHvAZz*&M=SUDB>8ZN0Ew-7zCq7_QvfM{J*iuFLl!3=_s(byEm{)Y+de|YfL zKw|$xUA!~!a0W&aEDd{LNbG+gV^p1^@FU=T?B#|#+{IY#8eVB50^k2(mWof@iTfDg zhKjrL;PryU_kY@%^)UR)!*NySGTXw-Q2I4bkA`Z?QDw!%Ply12=%@bmcq={sY+z6Q zfEK5GL3$$!#{LNs_dge-w3>MTT9-i+;v zZoI%mp-ZvP;(`Ya=(43ecqc&O-zL<>ITP=CIIb#26RMb{RpYwv&&978E=!SV)=HNV zURF4i5DgXws}F=BWyG9<0%BD2`+>|CC&9UKjqW^o9h5H5;RH(WksNgNL?v zM?W-P;2bg5zY_q^NrM0_a>_8j_>&>MUT4N7&g0k~$y5fEkM*zdT<0<@_#7yB<=vQr zYMZgIyS$0Bc;gp!(QG`XgiUgF(X7EroesTOJ_|MdxF6wIG`I-wmL?mWHG>Cl9;6CQ zpq+UR!;e24S6$C0bmt<}Sf`upwiI2z+q&+dao{Exm+2R<4JH4;_&AM?P)Xws&be5v z*sX!_5RE@x1>-0BUHGswe51FV9IF)h%4nUh&Ag1^>ehs|G7j0j`Y6l_?lde^eWdLVkYy+Z3_SK;O0FpkjVQ#ch$05mN^wW>xlle&JF0#xoH0HGbSF zx)AJ7fw?LIoAQtYl1fAY-h&SJcTuW+98qFZKyxv@E*M$Jkd3N z)-m71Uk0o(mN?defhpm^YYwSG+0xz`c zUwW!4Y3lj_M&T;Q!8c-=Sy_cr7jH^ZRbvB>Yn)fh{riA?54pXj>STIIxZU7iFx1Dsek>~u5f_&okZXsDqsve-rHQPb-0jF6jJ1OwUL$Xob-lK6pd+#CV z15Brk{KBM{p0N&r{jl@wDVb&rCL0r@SHy4#qaq`wAxh1`wLv0+*Q z^#5nPSwL#Mf1>V>x9SYtAMYr2f4skekGY#IDe^Z)By$TiB>>2Wa%iyC!y6eqj=f zcO%TB^x`?b?AV-9Jv9E<5;gxuB1R;}Mn=RKV;Q(K3^ao0B{L6Y#Iyt+vjElJyCAsA znZ{FfpP31a!Zgh#u+Id1DQ#SsD!8-`4LVV_gCI_@89ba`gt}3<= z$|^+})l;K6#*BQovf+*EcN9qws?V(u?LyS@%FcDsVcXD~2Do|Xq9 z`aLJsiu-7N7;~`jiHokyV1NgM--DPcdPbk&WEd#WbD31361P!;Vg<1l;_@gvi4f41}&=fZ=jQdp1e zDK+3{oKFkiI=&zkm%)RCTD*tBEPRhK3{LLRzhL`Qbo4dF_yZfMU{l&)6mAzp%;){> zW339O%FWC?VH8f|{va=cSx{KZCgyPmRXCl&oW~7R;SAY7@uX8YGdvV1&pCy&a;S1E zRXCdz^SF~LoWl)C9>4Gx&P~wa-gYQ#K3_MPcRSGqO{v~Pbzue6fs;A^@45o%PX-OQ z1A*@)tzpt?Ab+p1#?QaN7fjXzV;36bB(DZuMvoQ>?x>gH@Z9; zg-f>Xg|D3H)ryPttDa0hK1sT;Sl@z~=lZuf)8C^|)u#n6CHkX^dKdPmN1>{(4qVFh z-3akiDH1jms`|;mrG>sbuik}YW$(4ti4s^!gr%WHq`VrNjx7X!a{Q-0D5^{Y+GuLGCAWw=<9xoD&`sp#{RRq}EY**bc* zp-Y^t9*HS0!J67D4X24GfWk5Q104FJeW_xktySzq>oH#6UX$I_Kv z23e@8Tj|k%BB!}d&awgM*P^PP4~(<*+O4==A{6X=8}xS?`TD5B`FeACX3jxby;H^| zdg#i`oKP{N@H-y5o^xuy^%y^JS?h*^n)#|cLW49k@ya?B- zi@wnN(0!=^3dUJ=JED*8Qh1^M6r+^xqN>`{+WZ)_=wiL0?_s46qw)AtF@eVG+?j`E z?KX$jBXRp`;ibC$#=xqo*3&Q>{)JcQ$1uqDq;7|;YB!AwmcV$mPU2L^FC~6Q*lAn! zbl|Z^uemODuC@!QoazRBMvoaQRpHJ0=jne^#Go)*A`W-yk!}B^gsRqb;NAR%59@cZ z%%lgV4enuq$3ETts7wzV+=~N`Cv@&0xVmDDdd-@a%Uu zkF<58>f^w7l+$2Yrf;w?sH&`fex*1q4{842ZmOzn%A;tqb1l~N^h(nLX9(Te%|Rc% ztJ~vzl?ohbTgCCT@((LTKmTiaW*N3=+fxpOAL}y^rs=iNBfV*l1is&B{y`w!H?3(O z25!bV_fHp`5U*&GRbklqM{#CBX-(@ux9c!4g-19aaogoD?s7V-_p7Q2{0g1Mn6>G= z#LYJKtiY|Q)1c-5a7%CRok50H&KEoXBtu%G-wu3-I(!o3e{rzU=nY6UX{57t+@H9m zHLG3VTjNZ?O2uYpbb$@uadi6%OMhXlQ+($CC{k6O5V*~C-W~bhrKzf&fyWYO4YpJN zRiEr2s-B};Yz68&$tkb?AN6^*%l}CE7L_}%|Jld{!;{|cM;)E2;dJMQiT|sHw9cOr zWZ34+#8mjN&X;QJ2y6;`FLS=1`@ekChT;Ao!5@kB#N-@{UY$a*2%?&FP%ue zZyNK)15-`C-r0Wk|CK>i4NCbIZE$|TO8)1Cr!hY%m7(xn=l%Hq%22q6r@qG(RT;9)+?i(!0s%lu^R_;Cxmg#P35w;@bR&m)<@ROK3=o{-UUt|dNh3HUN>Py!^8<|p8u3~XGt2LG zZrbl5&7NL^4r{iuDdjs{OPdYH9tMBHKMGl5yb2XHl=$HU0PaPB?##gu_4pJQ*Ng8e z;X4V7pT8bo0ElX>N>)2s75{a?xhX`K+*!^id0ewJg*YV(-h|H!2XH30xlBoI)KSGR zw(FTf!X=C6BiF$mxPoSVa!Zc;47px<6+|pjdhCovi&XI|H@8Y5eVcu-15X4QybEJr z?CFJ|#EWcQ9>GbsI2$)y;`xotSfo90>D7&~w zJM9BZb-5h8i<{{iu_W*@Vkj+dz-U1Ca(IVs!;;+n6u@1EHw1Wteh)#=csl?`cey7H z=q7!~l}gRWVhczOTQFPcmbW37W~UavuCvy$RMqm?0DIHNyp6D^mLCO%cTxt4r0Wnhl_Q=w|vB5?U2!$thq0M)WTU9KGqriXkN|EfsEOj>wVr1-PD!uXM$JS|(x zEN=$(3I)9wB^Bq;x8*|^)^A_OERn2PTcl+bH`2zxau@&OCv>L$iYzu;PQ~+dxM&p| ze(s6u+W+nFDIG5482(Xn9&TwyP-vTXxPB}K*wJ^5_Zg1JW3AG;6&Ng^Fatr2)D5xY zE^euJ@8)%|u6^m*g@f5%|5S@-?w~^u2GTF1bocXNsMNEsm#b+qN>Zm4;-q3cM9s$_ z)QBD&82}qtxm|J=Aw685gYyyF!BD@2Sw`sj*|@^!Ls9Gtibv{3 z?eJDXADXrV&?x=bI!q=Xn$IaXTEDa!_Xzn=9$HsCMqeJqol-tD1MyuvR-cSL>n;mb zZ{Q;GS~K9s>CVWFPM3M7s&~?Ia~oJD>qV2(EF&JKh10iq4hKp6y*((<_Wp?X0{h&0 zJA2o+JEKzh=hfTUZDRKrLTW@)I*r6?RlFc@@`HOs_n?5|1Dg;~)e~rvxL>S)Ph)M( zT~DBS%N&%tTz`1A4cAl?RP|-FcHpp_qCaR<-(>Ih6ggG>2z@T};ImdgH0^Mot#DM; zf1{5w@L8|F!2*}6!IsmSKBIJdtUSeM>i*ZI*=h2!X-CBI7&UW-Av{Z<@>_}@o{i|o z&uBOtg=36MS&Uwd7&q1w>%laG#!nAnni1otCo#=%@zV>LW~}(>lbL3V_+eF-;~1kc zb}j_|WkPj3CI`gF9i{IB9*9JHBRA<584%SC{ z%6jPs7NNbdkZMc`b*#C?A9Iw`EMq&REPuzfN>$5)+L$EP)$SHhvDass?+4gqtNbH`ZRS$jO5G?4tw zZHOtC{0}b-@a#8YCsKd>Q&OgY9hg)alIusocgU91{&EvD1CW%yThtiu)j<~Y1k2H$ zi?GL|fN5tnnRw6BQg|{eu&_pXT$aZYRJZN);i8blQy-T>w2d@ZH zg&LwL&9XA_eu5>@1=gFlfxwfmrqjtDy35WPsAZ7OE%T{iIbFE~(6M?^H~+lkYO|V! zbA5O)OR46z@-|X=rBuF!b}3V5rQtoVOX11hARrdi^D%;Vfk3iP3iOw#Zg0`l0cYN1 zfBjeybi1q_r$528PY%?VqorC^W+AMSe>rhF{_rbYCd{5QOC|5Ts6h&-9K9SKcYT3S z^*!d#IY}k&{&Hvvs9aA1_q>L6#(GrVG{jNKd-tP}ewHP(R;uKE7ocZ+j~9;9DtZ52 zEImFj4z(vAI4v0f`w2XF2zx5ulzm`CcL4jkV|w_&?OOmm)&)W51OLX!J^A=q8v@`AHvfrsI0^b5T{-}G<_^gI z(qomqPX+MoFk*L+m~+!_b4e^bvCFk!~hr7HQt#(qj2BV|mOv2u<|zF1I~ z0xIu230V%V1smUE!D5wsX(wi@pI)*GUHbAAEM^v{+%W_>Ub(n!3Yai+&ODWTW7k}4 zG;JlbRxMY_H;)8eAK;Hd$+z}_s0H#?Vhs$p;ZMUYYLO@T!_PIcFgPuqi6Z%({Vw^7&oZ>4pdY))82R9t9Rod8sqF7DJS5;jcy0oxw$HZA;B*>y*!S z2LD0^?KQVbPWgPN+2HNi+~>W^SihY#^A2&8o+hWfk3vuna3Rin>|Cg?bDhom4dI&n ziYrlB30KQk&=<*XKf%6HXH91Zdci8Cs{7F6UTmzA3Ed0bg*&UP&%-DRn*f^s&0c7v zbFe8*nN`;{wD4~Y$u{~{%qcEEDXV>8VD(nI?7>DXS*aHz5L0GV^%toXCy(TC-4tIF z*f5lFi$`y9Okv(b9k9v-gu4uWBmZg-8p!dD$j_tAwwx9BSt;s0+O3co)^6QDP6TVfl3D#}$8<;0S_ zNv~f%$QXqM~*s46~ zMh#`eR1u~cV;ICZ(_)-sG0v_=WXU|Tfef)Mpi#qpeT-_v@a!Bh?_-x95jbM_V6>>n zh}lX<3s805oTAkFA2G+9G%tM$JA@`}%di*blK?fq(rP4{w0oj=06C@Ey#Tf6gS~w( zQ(B5XYtmsX=BW>bOG^kHbv4!kAIdEq@f6-@T{&o10F{=G+X1hR4_y&J{YpEZ38>RZ z(DyU0E18G@ZPIxG0?k5BN%IJb>hf7Z3Na=9aN20n^}XpSB%F607&d9a2Po!UzZvdr z_;ez3JK8Iw+p8NMTF8XXdY=dH5Tpt{OIW#~x^!u4#6OR!&XMUPP5Lec>Z?@;2h}Nlf5PQapGo zAXVr%>QZ0^9?rl>=UY&Sij0`m$P^=x-vh&Uq6VFkTXmOCSb|IbqBWLk4l8DYd4$Dt z6XnjwvkC~}E=nG}8b}p-opvc86aV~hTy<^4Z0m6fEZL_w;>5%+e-8eyYWQy-IwI1^k?LsNjtDhkPD7M)BhqAGii3+YTT1kH+!{mCatcUt=vhgXV>8?op}Jh()LHNH)1Jh``>x+ zzJbL5|ENpJ8F)AYBd-~7jEcnn|DeYRpFnKSWl2By@MtCpkK&RM5jfbR%Wig`9wGXGE0Td=I7dGH29s?dkDOMCDr z6Cf%4hr@Avw`c+aCEc@*K|VHIdouKaz}S*H)Be@bh@oFpWW*du}LcGuMVz@$pAb6>)^_??uv49NBF(4zz7AV#(H26yXD47k*8 z-b9fSN{w(*Z6H`yBObhBNEP~yb{RmOj^l4G98@1e;BXm?{W2ZmuMiQ#xQL33m}V#` zMj-#DIZE|~U6(%ON5jMJ3D^~_e())nnc4(?k5}SA&G{U-Njg;QXwkQ@QT~7 zX8_q~c+H)NEr?G_qTzM-c!ZyiNHo0RR$Lk&5)E&tm}Pb zxW0cn=>FAx8m9?Hk{+&mVK-g+g8LH|LLa#fF;M!h`>zWFq>K~pefN~o0BOq!_o2JK zO@O@70Lb6mQk;yW9KUZ~K z?6Yhbglug7$DM|gjD;KikpY)*Bpt>2Ik_%fse#y zu9;Yz8JkC#gBUhH?j$yoW;)h_^w?}-zPc_zBsQCxx}YnuVZ)G=nr-N8KbOR2GgF5# z_YsNBGV=ghW>+eS&BrlX=Dc|r5XNT5t@y%)Q9}$4=fN8bsY2J%?#E_2e$U}}DmH(0 zA3e#Qr?nrO|8`$R1o6y`NR-$#rXQl+M4{~-_mS8v zFt1Dw5Q)tqQ?|lK5RYtORAj_VL~~*U@;_dv)FoVrODl~%i*_`sDAif^EZW`lPNu@Z zkIf$DdrYQ`*z9SpE=}dLvDwRvzdS%BHhY^3ah9?JVPmt8X?1l_kd4iO=CdX#$X_?B z&C_X%q{QYiW~{FFlGq$%e#27cN3e~}!KQ8f^pJIPh$*a(M2XFzW(}sW9~}~#!_21Y z%-9@mCScd$`$%j~FylrC$Qk8`yNPBa_AkDV#O5S(O}!6Hs&tAOg=y~lNNi3u+s+LT ziOp#y(kUZ0r(v{A3k;ORW(Y-c)DWAW^Wc38sX~3J`>~mhk2xGq#by^X09!AOpSTiuA3{&TC6M?vANRh zxgh9d+2O4++q(sb#O4X6BQ|VyXl!hrXr9^-6l7!bRPz?jU#Ue>*3HvQpC0v)#O7M_ zWrKQ1Vso9j0BcG{Y_2!_pQs-T5}O;$dPKgDNNk>APQW(aMx zS$}4e5WU&77?CPziiGGbX8yG)#D?gtCMTXM$lrF}WxhkVW`yY7=F?{Nkc8+xW>-Ny zBq4gQ>3d25+2!+o^HR@Lh4$3`fSFhyBod+znuGOAnuO>>=FtV2A^NcS1wrcvn}q1I zW>Cmw5~BOfrg|Tku#YoOVrlftkq|v#Hq>u=B}88^A7LIx(7$**2!n1X z2F=V}f;2<)3d}i<8bY)s4_FVv(85(ME_!*J2yZiME99LHU)@;=;LPUssND?ebRiD6(AC#Pn+x=KJx!4dk-)v zitT;4y1Tk(m>G809nuEaS(cphg5)eY2n&KF$xF^CDhNgt1rZPhB?y>B#c+*yRYc4Q z^_p|e;hO#4_f&W9%>KOp=lOUZPMvz|RMn}fx5D&x07cotxX74phvp;*)O-l1$MKlI zR_YC(n{VpR*96^XxcPzJ5Hcg%aPvdmv2Q>FZMgZ7o(*RB-7ehxSm(_N5#i=1`e3+r z8E$^68}14U^11o7K5$6@`CI!px;uoB!3vu%xAP({?*n2@&C@E$CG!1hJH={29oS(+cP8cn1W1xha4a$__sDYc0G4PH-sz^R{pPT7;^U8R@ z&3E)o8m}Wqj|JR(Pfxdf#OLPc`X(%UV&nfL`cn4}at*PBo4@JPaI*Dngqwfpw%3G+ zaPu$ycE=DAZYuYQ%X|dfWDDaWWBPeGoFGth92owhaI>0gj-A!rtCt3yWw=@B?m~x} zg)GN#v$nev84cufvyM9-KjhN6S>(PpIz)tdu%FV^klyq)(cH5wHeMGp~#k~fM_7UM`S9f`Z4U$x0ssmBGzdFk1Q=42p2`4om=!8n`)`fj0wEMeb(0&&_oF$;x=Z&06lmt;}~00&eEJ zD=+jBpPMD_*dZYz>t=n|Z4e^D&9?3+j1B)Hfge)B&Gzo$njs?GEOp0X0{S+>%}(w| z-FyVxWDDaW@rNEXCqba*&nxf_qa7$WHOS}YVE2r1LH8MMp6nhxJs5L;Paox8Iw*kr zJ$t>nz7uIcmAcUJ^+}hX?3}U!B*6o7RTLw2Ly6>GAKt4Aox%)yZHBq=Z z*&P|4h1Epi<`lQX1z|?R&8coZEDXL2vTjaux1r;FM7TNK&B95}M}(U*+~0a`xm zb#oC$OY?fJaPvkqh@%E>{=vYrS0aC8Bz2#g>G<@@c)-nJZcd*62UY*rIl}#RlaKh^ z9OqtMFGPf!r@FuG3lZUFxm$H?hzK|5x^u9$VkpQ~;pTjIK~9JWHy65n&him(lP!#k z#QPu7oCJZIm!F|j3C@64>Rg|j=ec)cvoxJ$xOs_ta-CqzQ)b=V;Qlr%fP8LV>JAwi zw@Oh3B;4HY?iyJE z2{*5D^U<1&b#sS1Gu#CHi{9=MbV@omuW^re2@&DuwQidhncUpvS_?uO;pR>5eP@S= zaPww&L%$FaZr`CmXG+{-0XH69U{WbE$#t~ zgyiz~^u6v4okB#oxz8N|M*B9x%>(WO*uH#3xOs#77&aL}z)iLguLgz0`~Tr^f@;kc z7^umzZr<;6^8vR@yP&fSHy?GIX9Z*KubYp#<@k+ZXy9}6aknno>36cMn@8M9V?#u^ z`GmV^d4L#h9(9|7JQ?fev+kYYS=L`SpL6emPXS$po6o!VU<3n5xcP#6_w*1l>*h=D zr#PtkPRY9Yvg=gZ(_e8Pz+v9E5pEuLk744c@9D3)k5sI8!p-;Ht9pdFgqt6@ODf6{ zZhq)~Rbc~TmHOCSjXlAyOSt)oJFuc;SvNm*Ke;M{n>S#z^kS^r!p)*ycyl904cu(U zz~kp8Rb)NWeGaDMJ1gS>Hy?J#*jylH+F@HaPv)feua&2^KJL}jiHTj^Ig|z6S)k*aKB0|pv%o8u93sNaLho7ZpME*Q&D!4V;t+wN zQbk_1imgPrnetYz4Q+&*#ooe`GPv0nqouPjP{Pe`@I#TK25vsjz&j3!uO(CWxtWf4 zs*DHR{Kb6>O?r>X{+|Aun|rN~_}p~7I%t5{_}p~8Bj<*Qa5L$B3IBW>;bwI&dtHbK zH*0zyp^?6ga5K+a5R?NxvW0PxxUmTyB?wf#8Yc`LsW}f>2kwQNsivO!Nz}|cqj%6} zhN5k~Jz%pL`tD|HZ|AMWAQ~vw{9JGE{kb#9XSVhZUb9q)2t`Z1X3YY`P_(1hu76OF zPtk7P2iX36rkSn1yLW!`3P_gE9^O4CRzO10p5DEf{uvbQ?fs7V@6$$>&pzH&m~ZJ6 z?du&mKSX5t?B~5QFO#DEz1s(bHbT*n-pmR@3Pn%$YIF>3grcLo@4ANw6qPFTR%5U9 zYZr=+@oum9K_(O(>phMgCGFVxDF#j74r&WUm*FVHQ3FMnFz`-?RFNl{?o%`!f3q?k zP_(6|yWx<)pE5p0TYI-)PzCWRdZO2NZivX%-o-17gosddpm#eu%g-eg9qgS{fe1y1 zdK-6zHbT+i-XEACk_!}N3*#d3{R1>7L7-+8>@@i}3RnciR6+I**kn`e1Dv7`BjET3n47o89y z!p+rQi|(1+T;mmV4Q+&*7keLV3lZVwC0^P55D{)}@LIubzb+^$b(vRtREP*SH+u6h z@qHWN<|gm=2^rix7o(+zV6_o$KAysTTo^TQGn)ZE>5lx7=}h;znU1flj0fDD<+aB? zl421)H_N@c`+dac<`S>;?o$AG0m4-B&b&1isdsJsd)!}T+K)CTdAvkitg~b;G|&s%usZ% zr$QRlG8Dbe8#Os#gJ&qZ&pSOl8JOjBzt;C@x@5%D_qT9TcBLegdpys#xLGP(W0lLQgcE8w5cN*)ku5>B zW}iRgwZtV3-!&oXUEY~kO?*U%dbf82mY(!8=sn(JwghuP~Po^{5xe)u^;Zv>}F0|BQuRh&u5)r8ssV>b(rS zhagoXi@HzLbiBAS9uW0fZ#tZNlF2?%cY6g1AMuHLqxT%#6&rt_zuBu>KSX2^z0a$H z1D9_jM18L)0I=pRWiCvJFvx^ZKm|Am@*OsK0y5;ijSQGk^X4_Y_%C|L~q^9-vB3ktOv{ z@8eW}wX+OW|MsR24=OfP#l=EwA?Z}LB41YgU=gZ1k%>z(sj4I8*hBnWLe=a@-LSjN z9ZNZp_nL$@Le&!@{VHsbq*BR9(*vQ6P_5(8sQNqxPw&R5K&Uzw z3P%rAoyx%D^WrMRBe6; zYpSjp-JsO+dT=wNqUc z&&c&-LPXZoUXike0b;1yI}*V>GX?on9T0i@>;Q5O2UHyxIkjjyzQ@!1^Q&Rfk6ISR7Prs5&h2-RuyNRdqzh#FaMqw_Y>deT#&KXo)g~8K< zu>}cL=U_wT=z*$P47_R_w#YQ5`&3QGS5(FWs-7769_|*g2%oB5BExZ35X7fy-^dDd zjgQFo-#_wfVTcG-$3|MT4iTa1xX5Un{{37+)l(xq&}<(Os!oiwS?(jCDqDyT2Sdg* zS(u<&wGpVA&^3<$_#S8GRB^Tst93gJqpUi8=V^9CC!2iTbQBIawc4a40Rv!6Z{8$8dy7L0)6tj>Hf`) zrXJ);FlS7^B@OumGOj6O`WD~`s)NqJes3Y8X_Qs(rG{)&z4wAf$va}}y&~_3J)tL3 zjx$H{WE^eky?O_VN&eIv>T6dL?SWyc_d4dW(oI+{$KviON?pT<ktlBv>#qs2TT|D9I!)Jhb^Z5g*m$z1 z_@{iN;0yKeH!d=!4;=;D9~)R|KCIEgr3}0?AXS71U5nP4c%#Vy z-k^Js;XGtW_Ai4ot@#BLRreCw+%OLn_ij1`CHMvNfhqYqgAtrOs@^@ctvU&|{g%|X zl(^vA%S#O;6UR!`dyA%3Xgc7jyi8Lz*Q2Sb7scV-SPlNLZ>ANC5i2uJ_3F`d#AzsS z*cD4H{~b2sfvVS+X{~TWV1to=ch5-kj5kwg@W6*K82t*mFwJpQ?<}T0HW+DRkD&t$ z2`+|@mMXcDX)~s&2IJ3al~Jy0bO)0Lq0bvk@cYc4JM~_ZOf`@)c}o?`e{9eUm-Lcx z=`UL0K~dZmeSw#0#m@E}Z%jY%U3%4E=A9Gp@@<@GgAwAjRF99e`F%Nzrdtoebk1G< z|G`vxyn*$^Nw#V*|0T4Se)xrv!~Cl~UX}xi*XM}71|=p8FbcyN*94NsuL4Wj)tHQH zu6H2b7{4UU%NYD;QKr2?gZ6)Hx6}^0^0eE~Sn-MwD&APX4EvZqa8<-;1G@_P6& ziOLVNtSYShWbt_h;Lzu)fzMeq7_}2}xXGqABijPHF!ll<)wiW*D^SyxGU=47AkQ=z zIx<6R7Bk^qW;mLjA+Dx%VA8}h;MgrD!zgB0L-e%InBmv-3^moX^O!XC2DImGlVLJ5 zY+(Cl=Hm!oy$M9vl8BmiIg@6sL|2epF<3_Rig!`Y1Y__c4Q`?%S6&39 z`gVx0%4{|5Ad|K)M!9F341X}g4%YMGeavtyJ;TLn+A~c0=qPHq&16VzL1*5c#Yp~YEoJNb(#6@&1YzBjpg=eD-J_-i^DlIlCq7QGSTw!SW*v2F`hn zfws!OU}%;9$-pkpju9;{W?+@KWnh>0HQ*Qq(el|0a>`dRNX@O<6u*a@PmjB5-W445 zc?U$^Cz4kUta{EKovKYn0^pBR|;QhOSFDDny>l}{f8X_c>FV3%LSK$l<5AXIEX3iR>zJsK`ko7m7Sbudtbnk3Fe4q4LxqLI6pO_R)F5N}8OQ|HWYKO^KSEkC^?IlydEQGdZUXgW zY0QjfP)CV+cqh~{QE%gTo+2X`$MO|fP=xCb_Bseg*F>f}@2vqmn}}&wYekcS2@q`8 zW`tshy6nd#*T^av(2Ev8JyQlhff*ZFE$!l~VIyl~==cfd$U3p@H6H4@VjCX-^#Va3 zWVsupis(3~mkRebwSl@x&{R`AJlwVudd;qiiW#lvGYiP;x_>ojR*Nst2{%0}NQzpU6 zeiVXH?Tm4TTn~6`g>M}cO$v5G&^MaGi6QD)WZxs-IV=-}&xakyn zfXKJtC3EI{3)H@Tmr{(ToT<*t)69K)ts?dXr0+6UoGc9wGk^fu|f<$sbaMSYf&v5$?DO_TN!wVAXUrl zkhIH$(Z~vjjbt%#kuiNAvLpy38)9v9mK;Oe?t*oX(WtY~@u~t|WV}#L&IZI}<-lbw z_|#D`LqQE>pij(*%6l>JPJ&b|n?uqr6NXO}5Pf1Xagi}S6j>4kl5cPxuauSa-{?2p z4^~h^~4Z-M|X0>GtX;z1bS!z2eniTLVAwB*J zAzaf~S}ZRHsan1RsKumCm0);W0b!|SMmiQQwJa82LWhj$92AtGntTy%G;b|xAr}AY z4ZE?g`>%r9=s#4CmZP?&J&_@&udT zKbGN^4LE6vuOEUI6c^8hZ1Vd&Tx*C~qa!RIOK!tnkGo1Oh+w;KxcF9-Y~dZeyu!6$ zP&S|?25K@CN2rFcTl{&_q*Gn!?^(=OJOHC$B@@`$6P-HnX!0vIxGMGdey`-%>+sHi z=4vmxcQFK`(d;J9)13kP3%6Rhc=|k*%~y?L40Qg9-Jrm>U@!#7fEh6cD;aoaL#o25 zkhIH$Yo|l(XBHC|i9b3+PY_6sp-=6vfNFbC8I5MQF+R2BP6j3zpW2z2&OZYSFf$aq z3qhZl5tSzxc)5^xI~kH_mkHNShv*ZFiHpQ55RfrJAXx@2yL%%@`zi=VbF#Y_pStoe z7W&l9#G?6=Z%~RE3YJ39CuT(DyBK);AywhUkhIH$Yo|l>iN(Z4;`@Kl69kgeFM<=r zEqH?a4kMaVw-eR>;s}~kBB!#iu^#2rll^?pY^e2R@83nWfo%96f<8G7<*YOWV6y@b9(GU< zvWT?22*r1~A^e$LBJQT>MMEALV5Gal;k|3YnIq35#4+x&_TzKjc5XA1-?man3k zPop-udljrE+6$1B%&DPN>#oufqZUB@;2z2QAY@__`})=?c%t5%*dvXUYFog+@g%>( zQqZ=xsKe1G#Xo$F42!7h;;$x*Lep25jlssO%5K6UWtH_q57=dm$6@JK>fQ$sQD@^P znzr5>2_yWwez&CtoR5$8q6OMs2V?=pTibn|Caqx2KXG$9XtdQ_OdnB8sr8Il?nVaQ zR!9}WvZO3#&BUV_7*?v;^Oq{^;w2=okBf|H^q@)*uurh?nG-g1cAf2b~%lP|riA9_18ZAoQb~kxn0;#3G^} zGqI@CxCF7sO)TNOJO!~MCYIw&-h|i_CRWW^yc@BjCRWS&;8et(G_gYG2sSW0=O;C! zocpjB>ZeVto^u$3ub(loM$ThR5PR0dnmM-(N9=jiSFM~ory=&D>8p0mPuLpu%ccz- zodp*o_KJyh$?91hmqL1T#GOO;}{j=Y0h1hjYBhXd9`?!E7WtC#mxa)1ivIdQS+NUbj4?tG8!BbG36uyw8Kl`uL zHrOf0xaluml+2^_D1XdM#8CL86O zTD}IHpqhID$~pw@-mJ5%f{>Cc^$RRlV~)_KTzo^)>RTs)Zo#O9@mTl z;1aP5AspJzz`Gez)hdGYkC16_UOI$ZH(C8olq9!(dF&OB-obzRolkcvlG%wt@(?D| zJ@VJ&CaHtuxlE?JEX~|g7S|Ue9@BI@E)stX1(G0u?>jhzDP#Ic!c^^U=&)w!y{I?J z`S*1wYILwzHpAZLm6@2<{Qj>D+aa6~mnl=1q29?}Y|W@#}RC=OT8RiD{?POvI*|Sk!5NeZ-q)VhLwYUBsrF zSdMea48&%bST*PIs}P%MVzrz)Wr)o(u|nrKyL+~YrJSwjA~x4_cReSYv3YdPE@`AU zBa}Y)7Qap(V+5b$W#ByzsS0nTj#gyCwbLQC{b86TxENp*q%$b-RS?2d?U_;B$%#!R zCo<0&oIvN!Ukn7J;M|Jj$O6)r`$QuwfRTm9^Qg1yY{V9=6w8F}j!=B=) z5w$F<$iwav?Q(QvfY?Pt7X#_~Id&Igql@~Wm}oa|LV!ezR%4fncHe@1%-G}<-GGjd z_IPDRfTW5}UkIe0b%R(rcy1E2V|CV_nl#|Lw$45_EfPwNerc#425uyX~+l5e% zqFb=yM+bg!K>!^r`US*`4(c5GFfervJ7w@FRAEZeR#BUlfQEf>LI7Dsd_*Za{KBvx zyXeqzAR`VQ2yApw3pQ_5n_&TB6^)+`Wb_Y<0>mzwI0i`B63iOEvZ5Q&_t7x}v1J-0 zT6FPVAY-|386>A@%RnHfjJYI0Qdzt|CEDpdjI=%kA*6c-^X*ecEca^$-j9$f@-%f} zNd_Lxz`!ULR`mjSY~wt4nXrx$uOdN0f~tLS9G`Jnjcc1#YCFfK;4oT;2@D-F|GbtU|q%D5`oNr<1VjIH<@%cSLfgc7_j zSWLYKm^OWpimiIE4_<#P6)?q5euK$#m#Wxmjb>L)uCJ;hnO}^Gt?SU(Y^|2ZMc9ag ztRjmWPSsba*Ka_3eu_4B!So(TV^mC4{XwGRv=_TL3zLh5_(d_Nai{)58r8lK^oA0giX20k@aB4H-4AI|+fd z(G8vh65!@)EHfa=c?`UZAywoyrZZzEUjHfLXJy+e-t#O>SC(bDd^8337=0S1^%>cK zxG9h}s_`E|f$@|41l2e{8&<3&J}59I(LKpgzXMb68j92*jq!t)tqZEEKZa@ihHiZL zYMcV30e*EXLDgSLg9Hv1@sl6w^-l)dX|S*v490v8HnD%weNgr9qro=xP<)a*$;4j=?c?__5Yv&Kcf_%gYNhTgIesposD2H|J$oGTiC?li;e-$@JrdG zATKsX6CIqB(J_fq@&W_jv?KlrwDyyT3;j>ExTn$Yu;ouYVDyzGR zSYxNCGh!#1SQFi8Xc3tB%-U6Km#-U5eOH6Kn3&yb!U`Cf33^6_>rT z%1o@KZh(G}>9`!bB|8O!Fp7aU4ibM|rp}Ja#G@G)`}{8%7Rs2Oj7$ltxh;~oTHPK; z+w4VF*2Cz9oJ-fC*yJ&+D%p!ICZo@j-!?}S-zAr*PI8)OFZH9*FZZK4$2Xp|kD?U8+7G^MwhhVg>_mE~JVKr!K}Bcr*iJ zUnO7|7a7xwp(hB~e0bpPl_(;2oZbsvs;Y*TFacG)z`%PIQbq2kF2)%+TFC-@j8(0G zVO%8ctA?H+V0XZr=zts9t=#cC3%XQQy$3)>EVl~-uNNeqil#2c8F(}UV^!}2e0%m5{hofx7Q%8XmeT z7+s|kagi~74KgJN*rhdLucdxVk}9arIJB#nsD16<0S>)!8UZ zT>TSU1Pg|%T^V@2AyuRyb>G!AJaknsx=JVFB4c_0G9?Ju??XFn3yR3yEUpek+_-v$ zcp|QD5mj8>Dyq1;O;mC9N~-!ky28mnxCmDn8L`|?8F*hqs>qAfeOJ@)&{e_cDxHXn z#8&~JCkWUZYAH49S`?9cwYd5#K;!BT@kCtRDXO@7ji}=4wW5lvyQu2vC`(+Oe5q0_ z7_M$+;BALgk+Z1#uBPFktAf#0IuREc)7K(Xf`Hu-JM8U)P(Mh$^mLPgV29MB-{QEH*3{u6ASK^?_88M$~;*)9}z$!RRWTh>MKrfyk5~ zV1EFuDeAFuZxUCBA#Pl~Sv(O}ZxK~oy;W3k^)^w()q_;^{d9!{xNaQYRLcn7RLj8o z22w>{qVBtzhKH^SMpx-XTqNEK3q3)=z7#9a_n?-Qd#AYi8$jdgA@M|9y-QSa^=?tc z)q6x0SMQ~&XP_)`bxOHXEEuj{!N9u;5^sg1?z@_Xhpq}nSLp;^5(OQ0xS04~h#MK8y6;~e;Ra|{oRB`n%Reb`=5?2r7$jyS`D*s?$d3_;O zq%n2h)igYGRWQ0oC*mTppCVI&fc+t~o$XLW?xW)BaKw$PkBKMZ>f@q{t4Bl?SDz47 zTs=xvKR{PVfWP-D#e(7L=M21WAywpM>b|RKc<8ENbd^rTMaJ~c&=Umg%kbOb{gx;q z_bGApcYwy#r^OR-^%+sc)n`Q&SDzDATz#IZo{6%=)dl^OV!?2A3j^v~(Z92(AQdLVF z=ne~U;By>rXbuPFG4Pf^;`%>z=FG&S85kX4$#IeRDiks$2;_bW?Gl`Mt=t^rz}Wzd z11A^<4zmLGz$24!EtnBp^JU=u2&p2kQTH84!$SuIqXR4%A6wLZ4*Z)Hum`R^49e4Nba3EHh+CSVh}@KMU@ZXSK(TS)F#zJg%ggW;Tt+PSdj{SwkSg*fb>D$B zJaj-XI>3_SB5|bxdV)aiyb|1(Qy)d-)-w(`0E`3mjRSoFhy!)Obeh9~B@8^?5u_p$ zsQV72;h_V9(E*km7m2q5K~E6K{TkxIjwm9xk#XQ$0LFpF#(^UM#DPudD4N589~pSR zL8{2x)O`oi@X!Il=m1N`t6v~-cV0a>Ks9#(v_4}{L~b+VfD6Dl(A+rCAAmTpaS3h* zV#IQnG4NJFs>mejz5{7^=zw6XlqJVS#`HPR69jUzCFb=dg z4h$eeI1N<j*E=xb);o2NsyCrf}eNV%};<6`4xicOVT99T1ETuw;CT95SZQgG^Ah z--Z}4g-_%S*LOpgs=7|Xbs|PA_d^EW=a4G$EOjx?z@r%$i(d~z-1Q5I`>G)mRP6yc z^x#i0sA{Ax<^hP~x@IBjXT)-cG4Mu1;`tluVw{0TGcXqalT<|+)8mmTLDhZ`+UaB2 zs!=Va?h<9`Ei99D9zGQ_pAr1Ukb(Ckq>9`^U2w&fJwd>3-3Wh_ zD?<^tZy_U=Tgt%e3W*1ts7tO4Jeq;A&X=W5%9!qrObM#?K4{DF zTg^(2Z7BfjJd0(roj0ykiWaEzCI;T^kSel;y5!2hqZt_MISGbwkuiM_^aKIBM`K)U zMGsoZ8Fe4JLa7G;W;I!j3(K?E_t}Z@P|LIL9gbjbc557TlJm3gZi--`u7$kfT9=cQ zVnJ}N9|LbNq>8kn&O$TsXa+{tSSj9H0Etr;G9{?mHL*^AyBAlyt95mrpNd*9razToc&g36OMf_g%e*g@V%pHe)xBXQqp=~1 z^A969|1j`YK;ryEoz|InGy|g(EDdL1NSuF=DM8id`y=mVFIT(LnUCeJ+BJp|`2Ej< z*)=P6;_qWHLj`RZcpV|}`=9B|S_%K8GOkMgCRBbEO5by21XNRwDyhlhmdAiU@KetU zyoojILST>ofEEX~aC$9D!TAX?rn@0$f~x&Ew6assQPtiu4S1UfXwrB&OJ`EGcX5jo zBj#DwbSd^|OFZ1oh~>^@;4Ow!ks|71oQb!ojH~)X2-TZvsT%XXTaT+< znx)7zYhu+UyeMxFAto3cUcDh6QpWU36p)~r%kPYTz7obY%B*(d*Fb6iB(9*=SYm&< zRH>0jwH&K`C-g&&+4c!1`*#8WTG=1aT)Qsj7yo2PtK-bL!2UOmM>3TG)x`Q&V}^Yd z7JLpAtg>#biWyhTzHa{-cJUg|S^3kH`i4z%th!SN;Fl)!;+h@+-G%27jz#w6cua%d zSndP{-c(3DS;=(fsf5q0jH?dk61sCPYMf`)zRtMl_}$iFHxv78K;k0nSsX*@f0+0X z6RV?=8ZGVhSgqKtVdA??{P9{Oeq_A~8+L}D=*_2(rGL;uM(Yww&&(LEj(KcLT@Kkj zRx8w*K4zV)zUQLYQFe`bL8fp({ZY*sjQsrX-)W0;2KufQ2Nm-hYFuPYzR;5(fCC?V z%B|iCzj*qfz8e3w>u!YiOOd5%R*|i0JZ7`;O}S;&c--CtJgYXwqUttgY|1UH#u1y2 zG;K=#3Ht)*Cvu~!an#md!CnTe1{N09f`KVu;1xrvh)bOnX5#o%Xc|U0=}=rGUc!e= z2?F+yxU_TCWyoEtwYc33DNSefL*46bHqSKSlC&mlkR}+vFSR*3#_!8)-a^xqdvT48 zQf^ZhM}!)i>|aqwQ)$oTHvc-UAED1A;bn{QI2cmlyKaNPi$SW+$AdQ2xDp>!mlW0c z+YsCyfWCR0CEPF?b?pdJ{H3R~Ig>ivhf%oJw(*NtW|muB>f%jFs&rUrvB!S7#J>;7 zw~*UwN|)0@=ytu$>+hxv<1g0;kK?5}Zl{@Hp8Y2Z3YtW7!>-c1X|iV<9KFvjZj4Oe z1wQ6VZ&b(EnRtx7_kjJ*bxbf-NPh98i#25pi2a~_^vuj;3?>_spjAwB2;(C0R2<4q z7=UW-hi$P6??Ubx7a5us0R8_n-Yg&(@9(Jl_~ZSm8;rMj zqdGpxM1Q>H-n;bt;z>B()iICKi|6>VW2+875jVxVas6LJ5=0VgBt98Wm1W@4FjTw} z7F`w>8PoNECk#Nf>kbI6a=OL@tJ`V07=?)zm%wgg@uRfHB#RGS=%p}{A)K*MDdxZs z(#Z1mAfh6d5E{RxG9Jyq=t)Z$#`N`&398+Tu#?r`f?i{drT@cHNR(5ShK`r$e zcugTyn9RM_4vko(EtIa8-SF#p**SrDly9q-!_7kffkn4y3IZS9f!@r8`rSn zT9)&`CZ+N=ay8*W{=O>_+hk(eDaBHhcR5c3IK5|GRfyQx(wcr9ke97Fh~vd!DcL>3 zz@rjdw?>PsJ5Agaw5wDAK^Y-Urt27I-$y2`udd!-=0BJXV0}gXN z4E&aZT>UOISc+_Ux8`6jre&6G#Ox)d6KM4#*4O+s)(IEkwT99oGVNt=DmjA&cjJ(j z_pg!*E9#KMj#o1A2@FiWXT4fpDYgC~rap+7nD^-Adow)1XYF};B>xHPTstGdxF!w2 z&HuQb*swnclJ{&&4j~5Ha$4aESKfJGAiMN zi8n~Y{n^q}jPsrkN|DV-+Nyf}jQuq4^*OZyUWTu$Y4jEbGw&^On0)O03y7KDdryH< zKhhN(O0$RKc0q7H>-`Tbl{Z0dX6A;GH<9OqtQclN-Xu0LizleO$s}_Y4^Vkip2q^cQys1^F@+g%zjV@;KB$YRv2a+uQ;Ln@ECqA?8X^z5XRik>4=bEsBo7sXow4=$xahO!Gy5J{gdbMI=?D~$OU1A#S3anc&^Kjypv8KI8q57T?niN^@ z)vGXJe|i+E@6OPq#JX#5g^3hJq52*UO&VHvB`ZwAo48fq&uFq2PUP3IW~KMCOv6y9 zzD{Qtj=K_uSys=wEXxds>SrzJf~K^#zD0j?ZF8*7O=(Qx(BzeWHZf~WEAg^Jat@n@mQ`xz$2$pjiH zP0If)NR_;tM5d0;4QZ0aRu99J7qSLtr2$Oh29P(>dIv#Qv@a+|+FCj%v>0t2%+Iu- zr>b;AXff96iKQ#O40@qTZ=^-fQ#j47!l{OUel4o>i7;`RwR#JVrs9H`Z~Z@H;`I5` zFlDXFN-}fyx4H(23#>s)Gjo>KVPX%~i91iR)^l!$b#@LDS6KI+3GSrTSvr=9**VC$ z$|}gNlyg~_xZ2u}#EhJmGx3Bb=*@Gjx#Q4sELp+QQFoB@67@%;RRmZB`e3QJ5*2fs7bQ4wDgsJuWp+%dmb=@nK zei9SsoQ0;0wsKCZl(pj&rZ&Lst9je47Uzels`P9oOoM&i4(kyVY3@@u!&bVBiLw#z zwhFNo@<)l^5oWC^{dZ`w&*HQ6X0J92Dchy`e?W^VOI6;@*3Xmwp@{w(EfIr5*05&( zP(mpm0F=A=^B%O`z%r9gOhfLILW{#zr&gI3hTP?$#iLfv*_jrG+?UW|BpxfyZ*6ZW z%Cs=G+#6c-w12@uRN0TTb))p1&~~_;y(rT*To_cT)x)n8+w#Er|JO{FHVQ2A$J=|c zrl(h$Mx1^$Yd#&r_@>nY`&B?3XBfZ3o#WCjN)5 zDz$qBMGmvKjQR(&v}QF9ZOiPjSgF|Tj4m+r9Zs_^xdTkH`O%R7(|Q)EN*9M_Gwe5q z{om45>GsfKfxQaHssB@-oFGacr&(eN>RV}-^!*?8d8W&M4{Y;G?BoA5GU4!~_j|M6 zK@I2F*PrsgYDnw+v0;X-_Gy?3|JViQiLug)LffnC?`Hfj+q7Z0E6i|>efo~f48lYa zroA7BwtMXy9Qe{5sjyA+JhxBK)C2am3;$mkRB7+PHh-P{16J~XEJYx5%#J!3Pp{7bBAdDf;6ZWuE|CdV@htWRG znc<11*xarkv_3em8?uo8{tv!WXvK&3@;BRdAv~+tx6KJydWAxDTtVB}Fv_1{olV_e zRoI=X^a>(QHSDxio&DHy*v{|-a61zZ?!tmp-C2s?rx}UQGVzjYF)wO4ukXX(g|Hok zIe%lKR~wb?wcm$Lx`QDdq*@CRd=}W|wRV;a{vWog zG^f8`bN*}geEbYbFEY)+Qkq?d`IXnvd3JlIS(<}W1GD@uY`#Z1y|l^>t`BVUx;sC@ z^dD_i>FuFeZ>MchrdgVUuhHzKGvHuU3R}X;#_6rvux(iB6X_ z|HD?5{t%eu=Q#(PXPTusn9t+O+$nHyx^q>fNs{JZzrZZNzLRxzW@(ijoEO;U&2`#a z|HBruJ}}GgwC-YVzc*!9+-z`%^{ zP^DFHh!l(bAHR=bCp8kZ95TS;+PLiMWDhY;uame1cprybMPSk~(S1+_|dYrJEZENcZA* z_)hKtyD;_zo;3q5@giIMhp_1uRKX3G_**#L#NUcH)C82UoUS1>umB5hLDCxD#J^~V z%RB@BMA-%Tmfa%6RQs#pcR{hmZ->k^rDgRR0q7nM@1V=EBzHO!m9!sH4dC_GTOh$t zHvzD%_IGCiy2-lz8f>w*3Zw?lo~EqEHzAkBPAxc&cPp_})%dXxd(FqZwMbEo-wG4n z2oi)(jTJ`2l=4=Pz#M7M<2Nn|P2R~c5j!?OHSS82y(h!d4}BB=s!08bOyO0Lf=>=b z@ke(0X}mR_Wlh0Zp;i~Nr2cudOVmPKFVG2b7x%F{=WwA(_kaV@b9vVmFf*rSSIff>yZRt+d4Gb_i$)7Yn9HehoSc! zCK1#ys~S$+1&yrhuH$vE4xMS)o`c!K`e_m_|D!{KKfVvQI$eT<*4DHGay3mxN$NC0 zI!`4S#PvIHD2Emt82<$qxMKq-?neZipo*Ikp?3d!IR3VQXuX0`YXJWwQPAHqf0Izo zfM)2sf|D%T@Z|yn`Z9fh#p%pDjs`TxVX9!T6^GAwzSe19buQvVtc$Q8wFXA2-@+_I zExy{lrw_$(A}JVVRd24;2p^ib0MKyjku{i1J~WF{aD?>&Hnl}Qltk+aMp}GF$2mSU z1^g~J**XJf)*S}wyPAv0E5*RaSnZG-oi6iE_1(^to0}qKyft@xTFTIWF@@8&U^)j$ z?7iJ6&@6vLUk}q~RHU^8G}lR|1}KH}CetX2iHLnEKuL)$Y=9GDZP zi36(dC?*N-=UacKd2NzAEN1ei=_qxv_3my%*Psci?^dR^W$n|k_Mus4JCo^|S4=?4~JdBY&p$O7tEa|=G;D5s^I+%ib{6jy^K0e^bBe;+FN z(!$UL=UDiJ6Hi>Oj1M$JLa+q%QW!uF#VY^NzKMx6t+VK2P5t#H)nO=|*l8_?x= z(q9)Y8QrE!fZhUh^{p7*!cC(iAc>Sv;nYsH7-HF)WKS)d`*@1<)Z5ah%{YZX`Y=xG; z+$3~2M5XWM*1)6j$bz0=IhOY~Bwi@bbXJpzcRnM)3*9h9qmQ{B6ecXIAUFj{mH4xBT`Vob=Ht~Hg?U!;R~!xs^X1iiXjbwrTmvaAu=x5B zER6b>!1L$M0f{h2;YSVwuLh)w=r7;9AeAuR7IhhgD~R{Nb(P)mO+ zr>^fBmeZvR0G(vb?db1Ij-{8eaIO#cyGj+C${R}M&86}UOqVh(Hx2K+C%_B4!U0K9 zogXB42o4l>3qXH~>i7ziT4Lud>}frc58abxZH)C1rhQ=_>uR*rQmtLks_>2#lhNto z%h+ktr>ep`FV7Bu)*}|f;?U=ys&6rC`bt%J*B65Vp!HfhaQ7=%XN*Pbn+Dpd@SbC6 zq@QKM)TOHM-b>LlzQwa+ELHfg8?f~Fz$nySc;DHDA#jYq{U72?ykq#^r6w{Y~P|bR`0@xzrrZ{z|c+r4tK)z@PUJy06fwjr1OE_vAGxi z`vP#$2hL^lA8n3J&!;D^NURKYqc%pnFHBinhU}7B_Q1q$#7nGKuyEdsYH;|C4)~)DuzJ>D zcwv{M>;aQ7M1>9gwP>?Ll=u_5vI0+O!!-Y8Ok@ZlIbDhol19UC?k}FY30aweH&=-Z@e1vnO<(|q8^ukq2 z^*xam_uybvm}~K-M%-CtZ2pC!a0p=X@9c%@R#hBIgJjiV1yddYi3^)rw_;9l`3X{G z1yp@E(PUoLBt?gmEJ0~V)G~*V%6EE6dPu_r_ni8%1?G$_b_pU)vQjCXuP7K zD*c`od@i=|6f4{MCyTsO0*fiu%!lr^v=qc$2lNiFsrzGZ_aFo($^nVJ?qE z^+Xd#aW@wL7$6PT2B714G?bYzD(5P0^@7A>1cZ&sO*gJ7W4bM2stM8{!I_re97}L^ z<0^9Jzu11n9IstJ z^*BxlwVTz&S(tAE#DxVb)fbW4%^&R=LUyW37eFm?4}_3TrO;=!Tb_)0>Sv6miU_sZ zjkUmsa#BMdw^i-d{da{>DmCg#ShaazM+o&uwL1?`+hI-!ttmPM1g+g}Hi%}*vWx2D zy;il`e^M(zbWsm%8?`&UH90_{S^ME(?S_1TV%CAnVBT~W%G5Wby)wF8I^v~;j9Bh} z7oy1r9(3CXa>fP+=1SUi;U@yktspIo;m@q7pjg&vFfxMRRI05+i>cv({|i~ zIXFC?h^AR(#aCF$E~|P2PRUAlhK;zBJYOkhhC8zvcncu$jUnn%UwQq|hxabbc!cyH6IA(&rkHzy4<;+s5A3@wj$-o;4sUj~j zT?)v=KdOwY4ks|%T5N$uhpqFmG4YgSRTzr%{GThpV{kZ5ct1-5Q|7$}- zFr7Y99f8{sp~mzXs5CAzrpE$F5XgNSTD_OS)uIE=_^pUkK~L(U8=SJ9m!p_*)8?Iy zdvfMYJ6+l1PMBHV;4P^xd$Pwm*ck5lcbaKV;y24yhu~QkRl5@Ms1`zb3#i zE)viGK~E6K&7G{&ng5|*E#2`gCMop-)?i)K+AZVtJ5|QnV3k$DnrD~2gcq|pWqh5T zR=JnMwh2x?x~Pqtyc_2#ge(jPa9xfx@%boznAQadpBpjoT0pAETBb8|CLYbelsfg= z#VEF&d-kPxQ<;>a9}7x80|%c@g1Oxpczq%9{4>*~J$RK#8vadX9KS7U!-1ksZa?H> z!|{e53}c1B*wS@^{?*Z#rX5~z4H?t)C}Gr}q-!bh{u9Dfb8m8qCwnR0=EI2P-owCq5K={UQcr*iJUBh9BmzhA~;xA-^>i8caj$!ZD zsWY4jH_gPa$Flucr&ZbGT~KaW96Ykiw)Eu09$yWM;pZi^UFS^L)r+|)?8=XNX`$suTO+0ahQmIYOna{NEaPF!XRA@fazSD8{g@}Bn{TgQ`mVe)I z`Aqw@PW`jd{Hg4MQ|I?Z(Yu^c-9wu{u@9v7IL)sP5k6U-+Ut~~)BJMeGws(ot14_1 z{-yRiFJN4J8~IH80cTL}5RuQcU+-+$37$&r`elv-SH|iiK?T9w6Bu|kAywo{rpo|Y z={O#9;h_2$h{I(tLETLwNX-nK<aw9L1#Hm#l~U7hR2#j3lU+%lg^H_0>rT4nDfexpdj0@;d!S; zj{s5=g$*w_AFZo^gbgn`^RYq&1Q9m8N_dUR zxSC|m!%xxFVdw8b{^1(Pl$9#=sB^&q9~ol(Yckw@+Bt%4f=sf8SY2?MPCe^zA@q^` z;6Un4=eLa^QkPx)wsU4GM4I8KlzP|UBYJ+WSF?e<@1(F92?B1ig*b&m#`M47aDr-X zZ>%mawLsmepL}lq?37#|be7@fpUxTaV9Xy>&r| z2siOWpcf#9o3=iNzBUx|xf#_dOuvA2!p$oBPwYAYB;3UDx3mHhZsO%E6-%7qW>p=- z?@r$-;bxY8uwu;-Zf5JvH9{NVW{y6k09}Iq30A5T^z#@tzZ~Iap`MJjz(<6ewe^?# zLqxb)N6!np@>CE=rBZq;I@`}B+$`4fFy=lY+^nnbL(9xcCER=nqopsH32(^FHe2w6 z3!?@O4q)K%(F_&2mgzn>)A2hh;{i8+bsk>nzx3JX=I_qSU=Vk1Fj2Uvbq}!JM}(W6 zF2f@3Bf`yUy3N865pLGdow02AHp0zX`laz9BHYZ^b(i=E_{bK^w#wuBHWy)V{J3IIS!+xOE6Hv%?OI*sDYawG4Q^C#Aj!z z``k>&hgQY|ZnoFGaP*QF^!wZ_)&0R%L40oZ(AzhJh;Xx)?$o2k^AmQd3eJR$I3~sK~c@?{=aC4nr3+DT73OCQy%WPo`me1aBHY}n z57ZA4;pR3yd2+&qVYcLAh|yvjlJxtWfCUKtO#IbWYp z6@Nct5k5B;>if{~g81A#U9Y?pBq3APuUB#hS zDEh2^5A)cQ+GT6sjzQC>VYQLva|h-eM-3FM$G~d>sUl}E-KS_ezM(Q6P;{RjcmjT) z!kvJk2lN;;TM(b32lbhlbv_~#y+c2_K176~hxOkZLPRL~Z#@AQf&5%T(Z}?cZiom) zkLW5_`Uoh>7UF|skTKl~%}G$ry$`3y@tD6>>J6WpZ|cw21l?!2`GMXLG9%k?^F!US zZ$JZWxcQNu4QBY=F5LWB=gkQb;pQj$V7PV}Zhop8?g|R>x%ss|fTb#fo8RaT$qGog z`K^9ya0MjX{7w&!g^=Oq54!sN&;?mOf7Ek(hKO+UCw&g4hwr#>^Jl&CVsuFwH~)(- z<%KrFP225QB}9aqj@x%nhzK{edvS#g2&7V;+r6Sogqsofho)gJ;bzo5d1MAR+her! zUyI-om(K=eN^#V{&BF}5BakXmgSyYnbi8q8JmBU#`X($-{IE{I&G+Z-$uCkhi-dKhzK|T(rtO8X78PIa`pE;U!Esx*1T)Ynl&?P z&&=LumrIrfon>M(*WH5-HNlc$Vza5c8wCyI$L3LP6;9-mV>8cveNu=>Z05Vg=>cM5 zv%vi?bc`WCHe0&m(*nrfb{4w_htxt6nQ4^>~TR{_c4?B{pBcXgL>SP$V{Q#R0%kLu?+;#5)mGMQ)|s zkIiKKk-B&gn@!yN+bj9bK@gkSZp~Rf;>Tv8J7rXe$h=wPx-CLPVzZMw5o5z&Byb`n zvDw8v)Hp;WHp|>8H~@VeiOufr$9;SRvB?(3gyKvW&50Ap{9z^DVYCZ&^GEoxInq7p z*r5ANY))|ZuL{Q8U(+YL=Zpv-e@&m{o?JUc$-G(a{ulGMKM)d|lij9R5e#BtbBfyw zySJ3sJi&ec^Z@c>bDDc)sO4W+obHYf_rmG~iOm^q*E7R{CN^if%`q|fF37w&%iW2N z^AU;7*=_we=2G|AmZ2Sq&1G&yt&YUz z3U|l3p^n7nN_QrD(yv`&v&LzA)IQP5lKH|sbvF^FeLquZpc=xv}LquY8fmR*}|Amy#KKVu}L8FoRe@m0V`>~mf|5+Cg zV)HEb1&llI(+y&CllyoRAMs=JJh#uJ5Rurtz`YtHA*K8^eXo0M_YjeJ^GbIdBHGuH z*u2`k2g{d_NNir~K8!_15X2^1h*yJx;{E?6Xt`eKiyLVs&14v@?1^3|W5Hj=TOYUdbsQOOHy!oPT#U;;zA(;QJ%7 z`Kdd+*0Ri-pSho2oD!Q?Vzitp%-a&1c}L@iQj8j6vpo~9E2xT`LAf8B$@oQe@gO$u zcPD4zr$}rcg4le({h-=M{MdZb-HM4{bo~A1({3vqvOXg7<{R#tdqPBF^DVckR!3s< z9ryWdp^n7nd#>HyM-Y!}AwKv38g+W1IdQU?kK({S6%&BY|H+Td!*289p!-a0{^5R( z{kI7Nf8PAl<;lK*{Mh`j+ZDl*9Gic+w+;vqiB09T4gGbuj%!?$1-aniOr~YHWpPsTup4oy?4U{&CHwiz0L64cT-|B;hl%B^bv{8 zbnodM=n|m8yqV#392n|IZ02}5(?djJGuL|->!)u=Vza5oH?I2#0!ZcOc@1lq5{b=x zZ_WBpM`E+Us~(yXoBc6bP80(rvH2}d6gg^$&8L}oFM_H_GxC0HCgWY|;z4Zw>b{L8 zy-l%yDd{&i^D-atW7GDILIXs{k4@Km^t2F>*lgf^1^;{)FG zBsR0WMS&f}BU=~~iW{5YQJg^iOR&RmBAN41bogGlnP2LeQ=-=1NdtmDGa=f^y8_W{ zhQ6;^+BFF)oYy}A`+ry@{Uh4W+p_td7ZJLP6^RI-iKKJ z{75rPdtdL2HnosUpZ&Z$delM^qW!%)arpZMO^6Qge#i0e2Z>Cd1HFrJy!nWP=pgUW zGeSf{bg=hICAuUjM2C2{3=4H6M8|t`YXee3bb{BYTc{%;I??;SZ-^j{RDQX)25Y5X zyM*Xu@0QvVG6~Ts9#3ODsa-B5eS|@CZbWEHh%U!gh@*xOUBtv&4yq!LQ0|9lGX8p9 zJP6Ttp3?_6J=rMchiC`yMhvPTeu(z)1}zK`S=xJfxsec&5FPH_g3j_wNr;a0hSnky zqNBZSdqN!v(XrkiI6$NnLX<6x3B~sh(407dOcyInHnxH~f0iGcv%PI)LHC*1T<9&w z>SM;dpNY*%@437HYG7is$}7Xd>UX;=?Tfs_wbx%HHmki6Cj>esHWzyZI1*A~bEP-C zaRB+#XN~vhg|(2x<|>b$9StH_V)G<#)vORQv3auhUo36DQxcn}c)PKp`G~~ksousT zLPTP7jn}p>x+Ez!*Lpds9Kx1Afj+eU?m#OCSVVeEB%9f{2| zy<$Xyk4S88^!8rjBZy75FeWtWG=@iU0`+%b`b>*t-gG9uqmJI!`Iq=1y36Z@or38z z6QX-P6^2n06QcXPiPM8<@Jxta>8%QP24?!a${U0ohTr=VqE~x!FAWeAqStuOVa4)8 zboyU=FpM{O{jsbVXv1HB{WV>FFS^;Q85f{$0yQ@U?f0Hq9H48>x%(}in-)MVOrYN8 zJ#ax#ty$*}c;pm*9aAtHhLkoVr~ z5RpKA*t@q@2hpVRAN76+yWw~V)W^I9M~9^(P#^bVxEhr-i56n$oF6dJOQ4>xPbrQa z0`&kB?=DakiIVpNH5qSO7Y_pUGH*7VdxT;?P%rm#;y&UB>UG|8a94Evb^ZpgSy70{ zBzl)u4;wCDM*{U8?_{hvJ|cm7pZ9i`5RpJVpC1^qOrZYe4c-ty_8&o@{_d@SnnesA-;1Gsygyj?Foy7svS9DDY_;pRGr8I ztRa3W3DxvSv#`64mr%`!@FnuTj)dwFk-@b(h$ofbAX0jDs3W1;F!Dmj5Rp)A6!~&< zN~k`K!E<(FS0JIf5DZ5Tp*oF;Hycz%Zl~N2)nxqfx_A((UwYfGQL36I{80VcJAI0e z_@Vlbt>RdoIw3H2Qa5Pna&oaRy2p3`CTJsOIjAm24;HNgleD2U3-GD_m};?ktuBh z$lsFoiyVo~l0QPS?DvmcGdVvtZxgjEgb`zG#Cc3Us@K*-*h6fBle+m!#q6Hu?+4u@ zZ=7xZio9|5i2jhg%2J65*eErB?N^ve9Bu>lb-w00(GP>({NHS!vkVrcBM;8ND=}D+ zc9$^mYC!S+Ys#g{6ug9Q&=9<+O(58S0_MRk(`U`!>5MAqps#^G`;5ijxn8U0qqMv2 zYKo+rQ~S)t3nQCP)O7oAw9q4LMPnR*x~K~{{R|!AxfQxSQ`(NoA8tv)zF>aGx2@_RgpKzvuG-g*NG=#tY;$>V?yyQ z7VvQb)-3Gumr2E=OvR&uihDsK6?^-%q8ch#z{INt#rH4BvuG-guP-KHtk{Ag+6@|Y zR)EIIT5p52f@P=0JiF;`w0ItejV-<%5~+9rI)ZAb;6obCt#JIt5iQ&c3NCzf42t}Ulml`780qr2>wtF6&%mRI}ubx29syeR6H#O zW5qv7#iaQC6NTbrt>?hScCq3IOvMib6<5P!+kKJd38{X(<>h ztArwc+yce-e?a48XAMH|uAZROSuHz%f_ytZn1?A(&wd^uH5Nkjx-MRaVJkkGvyN3* zZ57{*t|=bC8)2=&Wma*)<;V^+bHj40cs+Wkcn~KftFXo@Ucj z%YmRfuV&)i2&y72D5r0!c+t_sFQUn@FQ8?7fKj`5vY;wDfwDi@-id9YVdf@Zb`oWs zPJ?X9Z*`39w1_D{Z=3GF5w;#=0uNelu)L$N(-$L=S`Lk8=nVZlE zvksarZT?~?+x#j<-pI@tl2=9FP@(k}RC-=EJYt1GpBJTb>p)pa=kajM$V_2ztf)N| zwxV-N`b@!KN{A#!NYO|t@C|CkyGNr(pY!cw_F!TjbT~wT4i$v;c+`3 zQ%^bgn8OJtCL55L!%aiXsR9z`0bB4DIu@@KTSI`yYC(kIA9J=5;9*)Y>K8auFc#im z(PVtYghrj)sA2%JG3Q|dGe*MM&KD{*fJbhNP4-hrTWn(QVP0$I!tW=b=ft5RNB;zj z4)t-A_h91n167gccGhHU(Y(gE>Az(^uITM#S;xHE zj{7j|hjp_z&(LZF^h-JGHIHd}SjuUyd0e*CrJVPg*Vml*N;&a0PiW43rJVVir)y4q zrLz5MARC#|%B{c~%0|%ng5Glpc^ECAFKES7*)`4tRgnaFdJy0#yCl)+**VZ@-sEq! zKmk zrHki6#Dyfq#Ss9L9o>NZ-#Mx(Z-j)_t6}v_V|gmFdc3Om3MrSO|I_l@Ec-WIpenO* z#h2E%!Rj@}@*T81b{Si89*`aQucoU?RkVXPC)=dTRON7hG_xOycN-JUk!7=|A>}HP zqJI)VmN^97r;PqYqrdzcq+B1L2i)W)4)O}d0b#Ajue|6^Z0(CV26}AGD*!q2KSB2w z{MU~7GFlJeCCFem%fW5{lQf$g260Y>6)kXafs3zkRO(yB+KQ*KwxqaOWV#UnxeP^q zgzbD79523B{fVp|UloDG+8&oG%OL5UQspv6agP9&L4gC?P=*V9Qcnd{RbCGnYnzTj zOYx7;KNVSa@JmR!^rsXHLqD*fD!+jq&8$W7bB&4HeG`rF>m_#q|6e9LK#ykjp!luE z#IL@IaS(AsklcGmU_LFD<4RR7g`C9?q1cb6XisGI*s4KH5XI*q<+dT&!dJJU|4)_a zrSf*jX+`1v1SjGjU2qDEmRFt0WUQ)u&DW@g^u@o^sQ4Kg+TrY5OlRpm;6EVCcFcN_h2 z$Z{;NK+0WCl7FjaU{x;O%uUQmP4}Za&X)a5oItW-@N|4klyO zau-*oxcPYxN_n@`IiSX_WEYooW*6)6C$oZ*E|P)w*(k}KPm1?l0McYWOwAW_Rq4oT z=+8yUjZm`pCvpU@;fiLwzn1Kx>NZft0kjVZ4OYX@6UJCyWHF}0kl+AXJ(1b5%UI(! zDD1$$UwHXtxIo06+w;J352QBC+Mc%Z8Z7rEeW;};pKK!*O9se0gSIa`c?9noJ1seq^e3`MWwzp4}&MAn)FQdP4D;-27G>LZrq{qNOd zK$a~?hL<4&^#`E71}s%SrTRu>s?P&ivxgdMjt8xI8(KGk`2reWQ|nI3YWUJ6hR%0@ zek6Q5GS&BhEMr`T@FHZO-V^E^B&z;G^^=gPUI!w>62fLo*D&tZaM)^&M?nspy3JBH z{>{MEYzEA!pb?-_!n2U6t^ko)n{XCkf7X5oK0lBAtHhpR1MmtOPT2o~9llY{gd20% zC~!>I>JN~qxg8g7I$Epl!W`bXBau~W*O294VYl%akoMo=gs~zQMsJ!D7-CMZ(_f=F zUZ=#19_uxai`?;&QSsxCLz%A7;@g@`<;-LS8Kk|$hUT~ zWK;!5aYd+Z3{`N@_%5Xs8;9vpb+V1cz72K}U(A&3OvUQ}`8qoTG6xTN04zUcFAhB% zIQcke4%azw^yHPFY8)KvsAO%=FjK;Mo|D+y)4ZCFfY;-{H_DC2f7RK@;NY(rhLl@? zvjA?!fA!JGsAW3=Z$)-Lq05n}z8+-tK@e;Elx45^;>#(19~u0`dHPVnf_!OHN}C=8 z*l=3_GN)J3-B!Op2L7a8IQePy2Ytm@AVkDc%y|*AI8Qe!z5>@JEYBSJgcs;4j@XAK z5JgON+b)6x8#|mYKPaa;m0ckJ9*XLA%n|s<>hn9Ym}jb7h%i;D<^KZ1bGi1ApCdZ5 zbrEB_e1o1gZ6?m(*1u7WmI#mA8I{Mg84bEhg5 zZmVFy_h2pipp5Ao$Re66b9_-g;A2xn%ZEb5GwJDoUl&o*26eJoPq+9>=mO>@Q3;hwv@Y4pOe?JUEw=LXk!K_`!Lu2sA%bdDi*3YJk&(-&yz?CPHxs{;z}LyZEo(gG|){5NmsN^?gWH%}UUh z@lSagj8(mZj2>701Cr`LKoHy5il2gG&4!xN+-sTAJt5;y3jbU;H87n>$NdPN9XA#Y zneeaLjthD$Ub6}s48FP0SkC4$^i<6*!0bpus|kl4smJ^M_yAPckGDho3I0t#mRGSK zp(H(7^DdOwn@6JZ9Q;dfRUhws1Y=9C3rS+IxIYZ zf6Rw}()hTlBd9gL<^&{E+7996tY#fD)fa%6VJ3Evc+xOe?17lSb^Y@YQ6umn{W{}A z^(B`21OI^!<7?iA7Arp+=(+fp%Bxs8cWJ*PW#8Nj$wQRV1=Ba&4frK?J1iA$ONi~gEHM1dQO}io4OKELQ{wUl5^j=C#O{eSYP~@Z= z;OO({oDzI?Sx;K&T#pwGGAcQJcwd(K$n}#+A3ciuTYPE!t=3t++y#S1}g3 zDnSY+T?;b>2e5(C1*>?jkT`V?mb-ReqOL^eu1dA;eVGMzNIB3Bi%Y;}^#I#Bj*1iQ z94NHEO)GUKK1#M!wVW@P=r0;)sg?`mr@xQzD_hG79-@is@FQi*g}k(tcpsO8T2}G` zPvV%H@Q&lEV_~ge^GdWLv2GC57F7_qI6~mgTcA;WGJ*8X1lChy@fHGyS`(Pv7Uq^* zO5j-R+H~T3+FyDzf%`cdB|2^ZuQ$(sVERd*Cx1UutJ1!FC8BFDyvS1<^(AS*^+tUoQ){EXpQ*D^zrZwYqyCU- z#zuXZY5qnXsfV=RMxDiU?IvBy6u*P&KEha=^f+OhO?s9vX`A#)VKO%9O~T}F(z}I$ znf+w;Z`2Pm9llAw%+!HDpOQiPAExjt7NuaLZpsvRJEp+<`}hQ=@OL&-_`8y6{$^dT z6zOKYjYG3p?={ImlRROPw@mUIle0BH#j3*(o^IC9b&-1q)_0 zLfCTQm3O|;&Z&gq>NrV0!tf$@*d*R0$u%}fu}Qj{WVlI=Gs!}eoMMu5Omdk?_M7AZ zle}n>4^8ruNn9MIsJ4+wTAHMrNro}msOL>ag6@%Dq@jD}R4Kyu^y$Ro3vd;>^i#AA zkFcY4iRTDZy#*jKb0Z=)pYLW!e2ai^3-(aqa6_=o_%Kr9tL|V6dB=U?()nPEc=u=` zzYuH(zFZ`+sRnFEvG5npo!m}*nmO@CAF!Rp82A5fmkkQ&ZG*vf6}xSQgYCwfq7x@} z1>0ThUN!`5&vS34tMw`KFmJiNn*&Is(UU$2vM;Ov+gI3DZNc`-BD!xe*#3ex!e+=l zTG%UhfE^^&--4;h9m3~f5_~ncJ5;Lpj|X;`=zfq6cJvYZu^=r6VK&VjY4bGF9YqAc zBQ$C|t-Yd3<1rw-(0)2nTqfVl#M=(4n#=*EUMifG4B=#r1?iX{Zg?*$fSAyzvlD!r zKq3z(uI@N#!OUyGj^}+gi6yPTPLRgTX$^Lwu!pd=yXC^(%<()%MlOb#%3bt1j9H^F z?=rjAoo&Cr7Vvx`rd=HrRT{Shz;;bViU!PN;>`zDP5OYgoz|fajCR#RXcr5<1WVGc zJp2kkvoWDjXAy*P0*Q((sD6nVne)IdmvFfXmlNF8GN2n5fjwCUKaS(vT_f%KnnAQy zhHhmc*bSn4G){Eg(?mBm4D6YL-b=e%q>40LC~(h_*xTL_>~=x(OL3mt$-Wg`@EQoS z&FvC9qX2L#YM^KAYg!;zYI2VK63(pc)==P&Id&Fmu-h0}+)h6Wxwa;kVV|}XxpwB8 z91ZOkFkp6jBWq%RGzz&6`~}%6%(e57+8vE%J|e86qDzf$0pUo{HH^gDOuP?4Rg=d- zsh0|4Bx)i4{z5Y`p%?}5aRP~-b5UK-|A4hBZc~ccxZTa>cEIkAXp>f7kFBuXV<5an zJK<9&#R827p#XhiK~%n&iMJ9|H8~!XdZ{pcs)gti&BTO8ol{UGP9V{F9jZHe3-Z?Y zAj~>;Kl_|bfcu+X#Au*Z}@%i03MtYc5MM_mJWO092QapM+zn+rnUs0t^} zW8z%|s+yb%+ICvkIxu{zh3Fg2#Dqqj%fQD8B+C1tx~Z%#aUo_hyW%dO){@(mVm9BN zY405fcvdigPht76XB+p@?9&<`H^&TT+&&KTggw{fGVGRY^*obnXivdJYtJ|3n%HkN zMQ(w~M-l9if*=fDh zV5OtSA@gs|?RshVX5in~ELkuNKIz1R7)Gzx-4gyMagIZVdiH+ z_ER|X(=6^f1jX;a5XQ+SUW6MRI|!SLwdlx}X&m|?tHBoUBO9-VYWI%l#RT`M^_o8v z13P6OegJ5*A7-q=JC$NKExncfbWgzk^sLU&OJ-N9^wuU+oMt_+5n+kOe}b@WEQv;x zF!9=fs@4rbsh0}3Nrvb@&BTP_r7I{BCy_cBiP=BBIGsXiu~)@=Hcgo{on)_-!NN~&qJR88Y{pZ2$gU~``}9Gw-(zCSc=-ad-;#ahda?tttIBxw0kEZd zF+%D%tL@z!+RmWaLqS-vcP1(pqDl|0hSmvIGl&uyjj)XOmX4UX2<(RofX19^(D-ra z)vY??bglARcHXA%#?|C)z!6urdfip=w4mA%z|B;3Og2k zR`BBk(4F`d2(wPX*Hb5=d)Aas#wxAKujiaqJ{Y}Zm6u=(Xshk|y7fVAdb@rF7ZFU= zdaG`Dty0B#1GnkDP${^_IFwI^JY+Juf`sRXmfEJz!taVheYMy*P-}tAR(%iJm4>UR z`a=99InS35rI}I4WSjyLnkj(V1!(?OUoD?zDyg>sz&Q@7+$=P%3GV)81~)}B z@pgc!$Wrnwnu@2TV3?ohS1nVH8+8hx9}|kN4}gyousH4Q9?gY3$L^2C&(8JdMf;P! z$TcMEgj$bc;xz|V5&ZC@G!3QVX(B2<{Ac5qGY$dv=26^+eDccGknl-EgwaoMRW>k9XbgH@>Ag7*XTf(ro-71{L_g za@so!85O}LIHhSe6;DgS=uSIU#yU!I)SU0!Yd6}0dhRpzC_4uO;XLF&Nnt;+54nd; zF3m0}MD7uji`y^HK<-hK%dn?!NA59`YiKXI9J$9$u8IBO@yI=4a=G@S*pT3jZ14bI z+p+IjfZWq2*W5mY!FQf9xnld_R>(bTa;@!~$0GN<>8tkkZL^Sj(ezbk`!KdT&da6^ z-Rwo1k$c7DdL{ZFiLi zcS}~`NP7Xs&H3_0DLm1ch*Ux?3-j^^%-{o%OuWxPRb(M~j!-I|mV$9Od6_gSgNhHD zpirFSYp%1@zYCwe)L#AD09%pz4QS2FxDUDT;773T;lM>=&Ij14J= zG46LW99JjyVdZoOvoQ_Ujm3C)dI-eyb4q_?BYKWxod#<;fu-rwC7agZo{w;Ud_8@! zWaHT5cURmzH%3G2NxQh+%Rw@==G5^36tVhQo>}d zKIpL4=)E*=qW$1Ln3@z!maVazdva}uk0~{Ro($W8bfs7b%^t|a8xE=>ZOPM6Dvpor zC1I@kSyUYpijPX5P@I5u2e`$uX0$hJMhCWwYsOX@<`Ddf22l+a+{?s!2vkL`CeNa& zcv=d^iYGxaCKT-lA19E*Z+9-MRIR<~_P>utgJ<~l+J`ccJJIAEyZc<^W|~}@-2&@~ zH_PPW_7%;L^G|#;?6c<}H^;~t+K*g}++34uVjoqGod3K@uKg;z+duKmw|AU|+(Og& z&FysND(Re6SnQmKRQlk%3vr_@GunNUiT6CH%Ds*}T9FDjO@`R^`=J)+WPnkS&LE9C zuM#F}%}v7(RajIqB9->YI6Aj#2@s5eeG|lyMdtdEV;5rrj8vOerP+H!yUfsi&VyK@Nj%exUXe%kOa&kUgbdA}m?(nj)q#$a*Otwj*l|pN=)B`*1DW*W;sCMoPM8d&d?}6^ zzp}jR(D!MRhhxb!NLt?Jy+EdL;xb4^-UY*f95eas0LhnU|I)hiY{ogj;pQaq434+Y zn9=SxOuU~!Rpe>%T4b6X|qNTbeg5X8w^n`8K$8P^<|*K2A& zIRl%~qloYrnUaZI!PSy$V)r}&xn}&>7O%M8jrP|oG`W0dCQxy=v<5#DGoxKza?sur zpenMOJS$1X(^4=Tru+c%<@lF{+f@bg5be0GLl~by1C4XL6La`@bbJFWN1eaWkeJY@ z^BiFU7C(Pha48B$tC}6#8o&QTA`eML7jeFjhoqu%z{^8Y(Z%wR)OtivY&pxy^HR|z z^1Rf2qcKpeIFTj#oPjEr^16ysjwqETzl7Yg_(#)TX5zg8ikXITR$T{QR~J`>y9xc$ z(o)ft-(Z^5-p8=ueMvLT@1bn=VijF|??7Cxl?o{F#cxu)aG8p(anS6#;v!xV*FP`P zD!QR-iCJ2;`D{67V)KdT1Q(q8ukggUs0H;eybg^#b9O&e&#dUHq7lMlw-?=b(Nw@onHLhbzucT~}L6s>Iu(d8pY1}&E^Ey}?7>fTczy7J8Pf=**8 zQ?!LV_Z7Wn4(6NX~E!LPJV!aqIJaUR>0gm;i z0#AjS-Gi)zRWAfkOfJkhJLv`w@i=004W=0c%IQqJ&7dlBGvzFpiWfaa{FHP{#rmIu z!I9#RLLKK!5AKj7J(|sPKOpNiH!)9Wm6_4in>yI`)Ei< zmEeSytqZCunoQZjb0HhM2D<=hfL|RgsG=Gw#Ido6O}Gymk^fb=hzixMp)mOiL=*cb z*#}j07ZrA*hho#*QGciKCKdR>``Fz1nAauzO;?ycEc$~A=Prjr1-j#J6q>O2b{9jT z>bpx)TiD9ri=PCZ;+L`*g1p3<7Vm0LK*z+(7#A4$(mb@c{)w6jHb3?j?=})FVxU=X z?9bV&jW>aC*zZ89vGrr(Jp`&+Uk*yWRJctt1oP&MC+g5zOepq$;Nt}F>^{ONCN%22 zN00s(F+;pY=GGYPhwU{U!o~SpEvlf4YEu9tkZyp zdHOOxo7P|tCbjhCng#Lk;09B%BBZbIvl$Ie+=A>%KijZDV}xRQjbFBjEXmxstOL@9u=3`+ZrW0UxbQza?meb1&WE;WFZCr4BQr-QSsb zx*^?ug*>ZF#nVzS^frsKM%h_l>2XE?z>{^LQ6~aZakAEQaR0dgmmQAi>2w1xRiA<5 zg#uJDhl#fkR7J*;7v&T@Ed`_bI27^Y6lm000vac4@ii~+V7sIFo6~{!^T(m0lI41#KsyebCKxVYt zi-~tMD4yLWFUl!+S_($bDTuxrUW|3X=Db;cw-=)nx$|G~uj8dODIAkRutalAMo z38Q;-A|@2??f@SrV4dAasUho7I&*`#`YS-=>S^MMxO%#<;_4Z~imPV|E3TeJ)|mxc z;_BMVaTg^s+C7(vcOj^XoJ`(#D+v!>6^yRZ3EaI48g(v3p*UHqtTFCp9s(1Yo5j_= zkQi6b7Ei?0Ey9Yc=LjpVZWUHs-A2|)hb?jSPpk_x3|D(I@dkjZNK5j*t4Vn1s$g`F zPQ-*pona^xCt!U5?!*gVBJ(_Pbu{wE)$_#@arFXW#nm0cimN+?6<04L>)b_Gc<_(R z!&OFRwEGzo?;B7Rd6B&DY7!p0Di~d*6EUH9rv&&o0c%SWrQ~_3%uB@8{{S?u?h;SL z)!o91tCtEZu3jdrxVnd|GaI(V)#>NpH)v*X=K>S&B2X1Mg}m=-5+1rL7+s|kxVr-s z_b#ANoUGLiE9@;JU?Ov`xVjG#ixostB1%sN5Gc2dI(!?8iuRZ8JntB(mQu0BrIxreSW0RGyGhxeG#?iWnF??6@L zW%9nONqFe0V04d8;B&vA_+S=joUFAK=MEpVgNe+i#MR#c8dskdPsG({gcVnx6;@n* zPFQjEd9u!2*b-M44aRSn%xL!lCf+5WDzb*W?`jerx+)mmqZ2Wq_z4b$;smT7Sktb> zB_^HulDK*mB*xX3#S?M$6=B8ISA`WbZkWZg9}{mdsEV{A z@4K3Whpq}nSLsAdXw(^rLU97t$KXa!rK@j>tK*P2uD&Inh^uc4E3UpHthoBFu;S`_ zWSx6aR$Lu-ky12_Uj34Z_dO`~f8>2vlkm`0!RRWThzX54zkrVuu(n}4@V&BarF~n#nn%R6<0qa>&$~KarL_n`0bh*oGdf(c7dwMTJpZDNqFe0 zV04vE#DqqjD^Ms-!0L&KYSQ~~4xcarQ;_5fTimTrWE3SS=)@i^= zj{(rX6CR^wM!Wr)ctb!{q?EkxY7!p0Di~d*6EUIKWuZ`P6 z{v@7=tA~XZSAP~(T>V8@arIZS&V6)+uAb5zZ=z#HyI(Q!ICHDWtK@xGlkm`0!RRWT zhzZ3m3w)eF=G=VTN^~|%WX5%~4Ly|l6KLr)52E^79Ow%Tao`JVZ>SCjDw%joL2><` zJWHnHc)MQ`Mh9p)CN%1-LZLW;%+J7`jXkf<%rFj|3cxsUgmK^yD_{>iFdf%|nZdPS zCf-k=D)Ksczp^AebU-jVK+E_%E+|$R&^Xylz8ZhXE||z{XdL(psBz#(<3N9Chyxv$ z;N>*T;C7zfq@Fb-rH z2OeYv?19Tp$FqdYX!koN-p`;a@&X$Pdw0Pj=-|LtAUC#x ziOhWCze!vMsAmzU$kEzD^52PWRHpephfdEbE~Jaj-XIzY=Yp}0~3K29LB zvQViri(n$NxpBY-U>qni4h#Yy4m3klQymU0W#aKBC>5DX-gh7g4;>JU4$w00s0NKX zYe3^ouBL*92F2@f3*jFr-I zOlZ_m&EWun%thb^PKJrh*2V!BfN`LWabO4labVk0+z!Nyc9%2pR)ea@H1fU!NqFdh zV03_%V?v|OI`DAs-pmDO+J0Qbm;5to%vCcv8QdRG1 zxK6~3c0Xd`eF3T>&ypAA6g({jqxnrxj0uf8-+_-4u!dpNgP&kf)p)0X8z7GB+G^C# zjCRK`@g{+)NO$t0oPwvNV65t}R7Dzfjzgh1S?gYKtERA36WdAMc$t@T0d2C*L&xLD zX9m9*GVz`ORgoLXOQ{q*Ed^se)1ep>ir@dh#|c;+it(ddIZQMtZzlljtOro)oZ1C< zbu**gGA3ScP!%a4FQroOv=oeWzASZ;Mx6mD6enw432p_>)pUa??F3+*r_d(bdEI)Y zsDV1KXX4!gsv;MVmr^NsS_;N`hC(qWH0s;|K2E^uSAvVJ=t13JPP6;YSLz;siB@ZH zVR;_=K0SUM*ahi#jzzLCy#qEn4XV-)mLjQknxL$>)@!IzGz8ZMGx0`(sz`hCG@6R1 zrC@Z8mBxf(mxV%c0#;+p)8FmI74L?Ckn>`3JL@>fUac2>@QJ8C<&eNcrHUor810L8mYDW~~VyyTMrZ#X0=n8w(2I$GJBLk2d zZE{Y+YlB=fYTKiSgN!i`gQVG?BQorF6uCG0eWI-39N8Hv~HG<`QT5eIs>33qp>9o`yXbo|6$^-1jYV`JhfBtv=od^ z&>Hr@pxFPQP@JsQ8b1Qw$zE=Fp*A{LFG340hV?5R9S7FfQH70ZZbcOMJ%{_(;;r<&vw%JFBU&8j!s+#}g8dU{ z)aiqgakADU;L49dM>TxgG~gW~2$PZ(v`$gO_i&37GxA*{RkDrzBnm$C1ummRtByBO z!ZtVjWXfv9OHl54;Hr}`_Gv1r;_RE4GXNC#KY_-{T5}MVH(8_jnj;Kl6Y?UbSb zUAB;kw**v0^2m#FD&Da!u8KwxYCcn|MwQ=h!qqN^R^%{irJE66oHc?F1qO##d=?z{ zJc)-jFc2r3*$d8mQ3K^h<+}56Yr%AR0#{HQEw#Q{rqp;ywXM5!M?W;0ZyhngzY_pZ z%@9Bft!6mB_>&>E_y+Pui>wE+J(5EiP-D!0jpkSvW5VY^K`U`xeH?KG?CUPCV-;`o zoX(!56kluvX|tKbaHa{qps@$Q>BapB$0Ge)Jexvq@K_HMZziaUOr)G;>fm$h;;QRu zgl=1i8Y^|vea1!G@3yX&Q#f!7gp2jF*oM;oPoKlS+JB#SffWRI#OCn{xR!J@IAQDHG14~zJ|UGSR+g< ztOWy;!^A59RS}mwD@?`HQZTwnhhjpbPD>Pu6R>{5rJaknqI8oE;&y9DO6Ltm-J8q{ z4x|ZZCpBSXY2es8sSOH3)(;zrxVZmEkcLZj{0e^5uMwC7xlzfL<3&}RnW z)+M;NA5!@4bVTAsK~>LJgElp~5U-RKiR$@X2woI`zIu!nuAPLsb_EiD>M3hOQCGYK zqtRuSg)?F~vfLx3F5Z-+%Ep8mS6D9>`u73(8ghG0*$Qe%xLsrM`n$1V{N)^Bo^i>V#Q%4@x)MXu>oH=>MPbrh#C*zbEgH z_aEf_@s4x`?~nHvz@1yz-yHA5JS%||j z@fJxi-c3TsB2LZeP|;BfbZ9{_%c zpz<4G1$SS9Mx72Q87G^$2i%F>VW-g!tJ(cn*17^HUAqBC+zyL}kW<52=v|u@xc7n? zJa53ny8%>1wvlJaR6H#OW2Lkl6N>x)!N&<$cO%x`#l=F|g=HBrYf0HuYW;-yHG8c- zVk16?Dm@~Hy{t`zCsE-bHfdS^Dm<&U4iR>{kiy3>Fxj4dZ9yGr(E&>D#gUlx(7Ah4 zJW$;=FOOtDrcbj{1jaRK0B-)r^~9D#5FlC4w&M_Du(jPDSGclXWNVOha-brEnvL4u zrtkPdhBV=GP!;J!Ic?OzM-p$5g!@NJe^JhQKCmK-nY2|M{WI3ntbbQD3F0z*l~3{8 z7|g7<8N-an0ly+Jvj<#}gBLQ>6>Lh=$KrND#JqgEA#1AK%*+KN>jdr(5>XrlS<~3W z1h*eq(;3VOZlJPe$o`3oPS%Oe2%ubZvS!vJ%dJ$_EV`KBPAY3QHzWz3@Mq28L#~NC z+Q8VnhGh2>ou5tiAlU`^U{_`^wQs21gFh0jx%wGhI?_MSSzj-OLlZvuq> zc@s3KRCSG`pY-g>5McJ(ky^|wL0vmj<^C8{>girM^C142K%57xh9@I_U4v-<;cQ-LsU+47{vM zL%ouL0faCprsSzm@2x;jdZBi< zDfv89`5;BbI2lJHrAgVJ2U01^gUHm;vn5p$Z1or%@)E4UUTGLbTmZ7h>vxg#M*9LY z($=zyP-BwbpPi~9LshmV)R?0CW9mw_K`&IA zTT^kt9B)HDqHuQAEF7|WYhh~1A-Z=UT%<=VOD$P;6ovg*C+&?it$rV0C2O1h1f!I!qRLuP zS~M6fI!|xtTgUoP3M)=QQzq$*6YCW1HiOa@xP3M2BHi|kP^!vKrC=8Hvv%nRVA9;D zZicOF4~4Q2U#@ep6!N6R?+7#3lsy<~T&Y)I6|B`}B4xYOkPoRbW0}gjLH|7cZ%hnv z&=OHNpvScS8w+K808sAc&$?H?iD@P|Fimg|4K)tw?(I`GOmHs1I{;69rg z5Ef!!-+wa>3)8tSeAzu{jZuT zD-JZWkF)k-PEW2hDR2f;t<7u<<6F8d)~g_Jq-{lWDdhtz*+2ibB-Ms#+IfLO)`$8u zglTdu)JSgHU7_wb`T-1avTjn--U`(mYt!FOI5w|n(yOdA>xZ0FLrG05rP@^(n5-kL z_qpxzCwE!SYW2#-hk997BOJBKeuV{D5C@a1AAJmfD%O@O7{Uz2HyZ@#@QlnoD zbw^k|;{Twl%B-UUlVhw4CjO0DQnN}z-EwORW-2y2r3*~>j-}dHTmhz8Ij8@FNmaHa zRGVYHHRgYvk0YMGxtZR<>ry7zve@a+jhjk(jh5rcvsfGnq*~U=!V(a@k|D>BV47Y~`F11$e zN-ZFfD8#h)lTdfBm4OXkvLm&+NuFm844Qhiwezh1tAHvS5a?!auzti${`ba{JYNb8=)^P!YI zN1saGpHO452Uk(;^{H^M+&*qqs#=nRR|aa?_3hrvQ`PD^_;jF~ zb%Nb%?LX+MvL6Gr>@0hKn^d(V2l?eay>JE`oNZrR=O9UPaB!fOU1TRNNwrqj!OB24 zYoXmm|AQ`$`amtayM5)_RJ9}r@21)egmuPPaf*gt^ZrW&7b&RT6hh*fU` z35XkC;c8$@aSrESi!QRNZ;gKS}+QG7(9gE8b#u~3Kerm@xuuK+=~L< znt>te@d+-j=N!oUZWP`^^3>Hh0U)aJYV}o?Ryj}4-xMG^@3undJaa{LfLM9+Ux&`K z&tN4trJTHJF}#WYxi&omBrUIM9!fpm16R`6Cv4|rYpZRDsVt7qb)h0MBJq-8}{F~di>bAC9C&NQdU zA~SZ19-{&u<<9xJC$4M%ufhjZ*v2vZt9-LEUj;Q~N9hORfGvGslJDW@bk-`J+Z;ph zJIp{(V{}98xO0m2K8%K~yY{4J7Y=4yeRvu!|D(@>AK%C7?q@^LLC?BcuBOQ-Nu7pB z=ixn_lnA!(Ut{sx2C~g_%JeY)B#|>jo8Kgq zJ*+kQE@!Bw4qq-XY!KzcG!JLKQF&M!Y^HKX>KJ^+^R;%D`U{aCr8iHv(Pej|&F z*7NEq)!&C=*pcLn(MPsXYMc+9un5pt{lHorOg=P^hu}E<0v5H!KGXoM%Neivj*fLc zGz0OSGeMt(J?kz54O+uV)`0ufM?r7t~KTMjxcGzhzCM1v^aD+3Zw#m!pFuQb z#?S=&Sooyr+^ym*J8EJDO5WTTF6MTbwCEzLLSy1Ope>Kad)sm+PTIaUKz9ONfhYZ) z+@+H`_6pD&fv&j;!<)N(QUpOF7A$_R?J~T_a$)WT6JLkMSDjeLC*@n0L7}|E6lj(6 zCv^)iYMg*aMk>&?xqsLVameNVmxa0djoyviUq4FDX}}K5#cj(lfcc}rcPNIB(wgZe z?({)c0)1g4JQ|N8=n2}<-d~_9QcgLmNyU4f6yUjTC}E8r>+xtobvutboD_2LTD8UC zjb-#P=Y!n1);Ym0NUFro&do5jjH$w_H*&Ldga2T2kee;9=0md@+>UD?xjCAzAHl@v z{2F-v+&Tmij#2o*@40EO5vYprV{e+aQt^I*<)RCWHY(+ZD{fx^#oQjc%kCMdWr)sb z=DUXJblD<6L-oRL{<>sqXE}{?ez@CJs=!p zC3pZ1=TY9WR?^6IgKDbK=+_3_{6Gh8I;HCtCC%5zrfGIPo zt5xo^XY|A8hQ-E|8Ovs?+~=B920({9Yf$9*HSosQm|vxGU)YVK)z2?ljxK%icuZyn z=y2h1lz8d9)&Vf(#MyII?rVGI;CBF1$;{NG!t~m{!W4 zhKr}6Ozw|Al*`0m6+ae3_9v5dtm57bti$}KBW4Dx_)Q$s1+R2!xKZ@_=!yY5)IAQ7r>pM@ur%Iln&gBV{xILj6kSr+|305 z3XtL20C+r)2Agri@>s>KUZ8l4fUse?=*Aq&Lb_(V=T_2D}!FLjBFqy zv;{Qg%oAH+@r@otBwqFFkP?nMeDPOIXw=zGMFWtvUOpaYY(L=`Z(5Z92zCffTQ|dA zm~R5ag$12I2$`mB9_k%JR(`!+fZAqW9YRiiKKiU_y9qc>{eo%vd4$?uj=8{xGV(`1 zVyUJbhU^KU{QQX*LaXCFyF#d6e&^ExbsA%b(AvCX5TH#v&qtscTUK5X-fPvg%co5O z#L4T2Wus}=x2Fe4TH-2r*t8{IpqRLNE7VK(z@~Ep+AE{ms~cWg$c%R1VB)<8sv-}Q zmkvq6(^4>Y>MrzNOlZ{k1cl-RteI2sdZ8onDArN!C+2{E_-5=nkLq;nq6%ytd!T8$ zyx@GTtn&KTVwbF(p3o6@8l0gN3&WlHOuR*)Dl&n*7)-&_QZTynC0vLJjXKLwC{7@= zD~4~ShC6vT=`Nix1?SzWHKywRz;PrvchNjIQT9Bg1{1_xluW$wpephr#+pp9nxoDVd5^y!o#cR74y4=Tzr&cWUStS^*HZgU4o_Ie|4ycNT-iv$KiHF zuu|CUsa}c`H_WQ6mq7}6LBPQM#peph#d9j>=r=?)@Ybq3DLh<|`_&9;g z%;`#<{09AM=N{K~no=)d4tDZ7xaGWlr^^s1#DAxC9ww;i3IEeuQDVT&1AcQUuklv;DqI4m2=>j%D5mXQX5fl`q zgB`DkUIoPl*ejN6?_IIrwex@9Z+185jItJC#W;&J#h-7h>Vl zS}?Z*4_-G&y#LI2sSma?Nx;9Wh~wI#CLG9X?RG~xRy^VJzMkK=be*bycQnc=Ou|!=FqSm{hS4Za@RIL*2BUs3y~?z8Fpl}b8cs)8nO@z77oQoxi_biG7eT7X2hHdD?VQJ*cu>G=-w#)3%TRYQs(0baI_JXa-cyIzX;HUz%V6{E!A&egd*Vu2J zt`u>t$GncQwP3B?d$7L{)oRR{3jwXO$88OvQS~t#7F=t;jG@P*8&!WFkoESU{1AB< z!$-k&_IWJ>WX#=IUleSxzi1L>H0BgCEx6uJ9bOI;`13J)}cu^Ji5c+wF!ohREe;;es9Zv~xq`tU5q;+834EpwU&qZu=$l zi{D5Yn}O`Hdv^&Du2>89+8efDzLC7alE9% zPW3Smhl6;G#EGqdz>go0_IA#xPA0onrr|g?92@u1Er|si61sPd}4KLb_ItGv$BW!rd z{$yD>By4!uo{8}_Ac(Nx6}w}b5Hf5yZl8?>l<$UI zY!cbwsvHcVVNk1Q9!zcDc(8NcC4WHV*nuQ1&M-_Z+_l|^!u;Cl~{R=}x z*zm2r`-*@Kweosm{}1$*b8DGTiyTmey@sxy&Vx4xQbitRJgqC>uU5p>SbZKYqzew) zr+WLB20+FyQU#COSM2eTzWU$e;O?{b5lnJqlJ2Y9;##2Kd7HzykL(5q3f{JVTN@&^ zc*4DFUz{Hz4S2%6Z}SC1Kh^7LKt8ndF_j7eZnB0^k=UgX)rk?v&{OfL$3`f-;H1yZ zpY6iEL1USb>QDQ^Xwc^o!_B|!F>?dRGTc06Z(k9lGb5F9HqHtW;U?Z^^a8|i({i3h zTN{e`+)Q!uamEL%6K+;={=}RaK*CKd-b>3N;U>10DIektH!C}-xN1)1X52YcKIRBF z)1390p^b1e-8nlanVY9MFQVK0e1x01&Nz$(iQKH|e7!qFgqx>3=Y>r<3ItLG`OZc( zwx3G4S>T+9KKBvfW-aGI)Xa=j!p)1(TTVAj12SYa+W-Z<1`bAe@G3)M{}aah+)Tu0 zSHuHu{%Sw6$ltQs=jQMBt6SOs!p@nAtKz&blPCp z@NI;fHJn#QhKO)8+o?6rN5DGTdzK zw95@>;B)g#hm`jzWw_bK*_I!qGu&+J3@x8Tgq!W0wV0($M;LClcZ#=#8JTgjtMggS z0P@GpZqAW}K~lKc-5IRQt%RFBoIkpUkl|)er$PDYA>(E*C##%^!p+{!ML30xQ=^2N zeVo;pIupmuzRn1&I(!@9<_KrVzz~sf^K55Dafk>v&vCYw+kil-V3acer@5bxaC5Y? z5f?)~BHSF~q@Iz)%^K(}=YwhJBu=LhWXWCwH+S&h-3qB9zcSwEW+EP=O(Gs}vxU^#HGxlZM#L7%6XadV!t z1S3llH|IOMt_d4iR(R(-*S880;pPIT85V4&BMdheI!`VOGcw$~#CdaK0QuZp?6g0# z91?CWalT3`hlHC;oog_r_@k@g=4DP+`K&73T;^N`=KEX_ZeH#z!1aia2sf8IJ4YmQ zbA@y9)uD}WbDi_uk`NJYUhCY_HbjJ*>z!?=oS(CBbA$8O#t;#1Zgln(g@|zTdS~4F zByR3UZ#kD>bQNxn#*o5Z12;SH;B|w<{wIw0Ihcs=t%wKQoavla89!?>3!j^_od?nI zg81CLz*)38M1-3cIU_F(5#i=l&YKHDM7X)idHbpm5pJ$_s$g{Ua~5u{aoYCw5pa_= zjEcndA3TZ?sC*ih?K&mnZ4Aqg?t)sd&8O&gC#8STW`?4-I-6l(x<1cP^fu=UEDQ`( z$qb*jJIi+m>CEtXhf}v-hzLdRbf)YG5JS1NIi$lmz^xw`)ZGr;LMaYBB+2te=iazAL7!7TNq6eKvaQY?=pNE`Z zKw6({LeXQgTY!%UMW1r`Qj(7dMW1$7Hx3b@=(Elf7#e*Wq3CnYvhqc*Q1p4{1DwZC zpnb8q2}w5`o#x2CB^*9)!a2uY14TdN!TTIiMOsn!DVm7)u80Q|-R1N;4Hu|zC!pva zXE>@Yh)>ad&c!(Ed_*YvFXyS1AtDq#?3`L1B0|x}oYA<2<);#gKH+@rhKNw~h*RkX z9|1*KL+ttjnd*EChhtPT7GcO8iSrkac=_CX+xc>7(0qoQA33W-W~3Qze(bdB7SO;k z-2B9u3TF7tF2m=iP8QAr9}#YT=Ijf{F2l{wow{3tjC^i>>+Hc$mBh{OoR(F}A>rl; z=bb*~kZ|*Rrw=9>KcV5~k4`nz(sx0I&!3zbokB#odD6Kw9wNfcpPfaklDYX`eCIE; z5pG&;t4bjv+_c?p+e1XS>A0)PZG@Yi+o8Nkgqsof$C5CWa5KdnJSd5qKccssgIMOv z@L6Y=QtUNwb1@GdKaP(5Zy4`$GZFu+A|7z_J?C}|Py8%Uz|9YwGRsGNZhq<9j$u!1 z{7a&*oi0JDzFN5Xn{)2u&_=lVhjYfwAtK!T%Xzm|hzK{8dvuMDfRC&pKHvt4UCL0M z7}bob7?xiaZdP^8va_0d6Pj^zf?FE{gYSZj zn-ksZ(QrN@+$?kBSjqW_aC4ITTbE>RPIgz9PYS}#xo)NMQBt@$&poGZn2&ICzB|3# zM!31a-FR(iBivl*PC!fgr3*I~xwSB|C(P+3=q=}`h3F*C>9?Um>@{%n01w_lNEL}u z_qmyf=T*c5ZuWP%ZT>Q(4Y)bbJ+aP5d~TlOURygvgqx$>-*$zFaC4elc|?c^H)puh zF}6z1eYJ3NraLP=M1-5O-L9AT2)M}_Mn$GNkHO&>fs8&E;gN z#xmTz+8um)(C7JP++6McHYI?3ZeHW|?H8mo>&-RpvP(lmxVhF{UoAikH`lov;Xx8N zuXo?VsO1lTX1#fXTPd#`l5umByLC`GB;4HWW?vXWhMPCJlfy~Czv=DHL!%^e^Je$8 zwjm6 zFiRwI^B(t{>yx;76usrFMb(6xe+H;=mOa6uQ+W+SVwiCgpOcysWaO_mBVOHbO!m2%;@!M0u=3~hO5V|oa!9zD>RpXV z)u*fBX3TppJkbm{D|@Tpx$mZMGw!WNQzmjV&3krZGB?w`W?e%Y;bxAPGcH7go4MZe zn0Nhrgqt-z?icSP3V#K8Ue)rcM7WvnEx9bT5pEWEv(HN6<|*`+a||P}aPvD{C|6A1mSkH-B;8L6vS~7XGcI-`tE_e8lIb?VXMah>d?OCK5A8?a3#Mbzbsm?}t6r)=CMyxQL zNJd>`)@ujcEGY5JB~b(K!Y)CZ8H%3aZO8mzy1s*%+M9cqp%V?1VJ_EOcz2;#`*>%SBSO)B-rB99jZk!e_Xkc8Nd;Q6hEb7tW)Ibg5y*HP zGfg&@g1TU$&&@J#ZE4VahMP0I^D+AvvUD`uJkNU}FMz5TZqD>dF|qp1E>rs~@8tRr z5pK@*dXEVZ!_7HfL6;ySpPLK4vg!fk51)&?BR7;o!p#djel#^;uyFH2?}CXTWVm^; z_gDF)jBxW3ZwqF$L~btjt~xD5gquseM&MN9)V|cqX&2fEH&=O|TpuFB&8xj(GebnU zx!P+2xBap}AXTu&t2rb@gqv%<^Kjz(Hp0zy-tVK6xY-`PeQ)m@;m$8-lBm4`W8_0P|!Z_nK=Qv z)LgsYz-mRF86N!4icd;GX z2vHyNERcW?-V9QaV~qESnuxzu5f6xZi&qBcmN5&TsN1}pn2-2G zz0G?8?uv~+&)?zIDhd%9L?84jVZr6w2vHAu7h}fp5h3cs-a9QqM2LFW<5wTV21I2I zqayJ=9(WWZP`UcIc+bnpsE!M%vD4vZ!Dl{EKlg6j9JHAs>UZ8tNM@MR!VvX@H)U4< zr5U1r@4YuUNN48xAH0W9QX)}*^wPqsWkb}Tyq~WNGO`R&fAhNIOftpUe*{GR-CF=R z4f@<)r%sKR5%mx6xrPC%obfWG{^@<1A7IV3q3S8GY(VIWjHxPe08>aJRdwWROc{w( zwIgHZB~#UjOv4=F+Xz+DBDKQi8YNUsk8lfo-$tl9;5m1#i#D?CGsZKGf6Qi2(&}yX?)P{crEhAz^L>ZN zh(-bAuSGjXs$rGnca03Dog#aOhlmWOog>3$2Z-Tlmk4*SHPrJt+B5R*;sCM_2ORAc z8C4vhhrSLt+B-51!-Pq$IvS4liSU!V2J2eIaI|0KUvqPY;Wb>2| zk>PZ3%j~(TS1w%Lh;4Xj!CR zy)cz0C!(z zv_G7-jSRTlM|_TUi!4Obh>g$D9+BsBLqs?_BGRa7hzLi|i44WE-%lkR9Tn+_YWs+A zbWEh#0v`b{SwlRS4VmgZ2ajS@E7#i(&FOs)u24R02{)}Z&{i(RVxZQ3dr%slO+UbA zlq|dodo@G%(~_@@mf$FD)dk8y2DJMa58g3I6(OuwBBNxycvOHFHV6_NV1nWWjJOI3 zYCY^n_%Hp`)mtz?*LrGang58ODMzVJdS`n})jCVNRk8Hb#@x-O?$w1v&6stn^CqgB z>U;zl6`ATh4?ISo_hC${8aZq0W@sx>zOMaBJ=VPT2SLqcGuhh5Wi#2+Iw9sYriu^7 zDx&u5uOO@V$%athc$a8L3|O__#7v-^{s>DO9l$8{F$4G{ClB5UNEMk(U5ZS?ifoO~_c9NgL0#6)1$tD9_KBuU^S_9*mGpV~hTzZRN4B z?LMzaD{;ZMm+cWG5j#^A6=I33E77#)Gg--|tgc5>Rn#xE>hp28WGiMPR;DA1rqOiZ zxyZ2pb@R3PUBi^EidHeM$za3{I@KX5&b$*@w1)-GIPYtEd^yf<%MCQ$xF4p| z@9Xh5rqbed_0h8|RcGcas4q+KGb4v9qjT{gK}dW^Q1m0nF=l|x0u#UonJ|}PfM6uI zTA7f7E2y_H2UrsyYyw^(q|2)B29?%VhOT0-)AAjNN%tcBIh3XN62!;&*Fz`&fS?{W z`41ijPNBhGL>$Eb)I$hNI|?!V3WzuTsM{Fz5du@bO+8I+=Y+X=72mb=TDsxYKyj2$~uWu@8N1_hf(^hSkQFgKx1uu>CPHn*lu z0$J{v6~Wd3FGWXMWf!c_Ds>^lWs5~^4>e)aq)8tm%mzCFM~6K04-HlW5e@L4&|nWB z9UF{M*^CMsEJVTv3z49~UO-|x&V==uxV*s_l%j$LvoWgkBQXhmKk?VS{-Q@sIvvrh z!#Jc{hktbVw+QM%YEo-IYAfKElB0(BQSSrJ!wW`1s$n4CIf#pqf#)rSR&}dV`LJju zRx`;z!rEGwqGHTu)(_X?GjKxyZR-e|7anGAvul!_+vH3iH0RD;2yB;=Vc4AW8Q3X- z;nUwk226h;QZB{+R2x&pqgVgjt{n(v|x$S>qb2gf^&m-p5|A}qw$Nqwtzmj8z ztLZZk+YqH#hb+|=|5Hm@?ogIHV9IlTL={9#ew`Qw^XV)73~An(Ny=SChKCUQ4NSWu z<_gCC7lFyuHia27VmSWGGknX>kmjqIBq_r_^mw&TA%!v;vg#-#a6 zOp=u0SUmj>aC)G3u@B4tHsp`eD?CL5rHW~df_+s;q~`{nlFwoqHXRV z(N&DEjZfGE8@50~=H*SRE|8s0o_rDASnUyx4i~-vd)Y?ixJkhYuJ0j*>iJh~Fqu5v6X~(rkyy2=Tv|{`y{7-!dfyqZ8^nhtE z;Q;EqgF{O&t9l*To~P`=2dEP*Te^fQN5lndiPohBdi^6rHlaT2sT-A&9V>pAjqE>u zln%;JES;l=Up#dYR-tRZhn$$(KIF5XuKovs zsh>co>1B|A;Qs{hpBd-jidbE8F`yT*5?VYJt6^=j9ipc11I(N@!<#MmFVAU8Cenp) zT?D2!V@_&HdmL!HmG=D^agIdH{T>-YnTe|APNLoBHYjvqf}QBbPE@tzD%i=cAi4Sk z93S&oh2|fomOKj++1H|2k3;lh6->}8OZ8_O-BPS+ss~)Ec^2vVWxJ-YE zSlMr)i8d9J9#)eYZ$SZwdl5OeeOw6oo@6wgZ``rhenLz-Voa}1A;e&22&qZ){Y*Ln zy957Vxu3~6Ka+_-mxd`M69!j=5L~<-wz6qP>qHk5&$NHRf@SSPGVFoNaxOy<)99q< z{HT1uE0dy@G{aroUx&l2n_i2UwX>RkP2QAfGO^}q-gQhV30VH}J z|5Mu{Ftt0yAc)ChAT(Js9SZloGL6fSUdUXr)fIDH$Sk2V%Z0sf5nVRCicv1%R*$mv zOi%qjO6kHk?UPQ#WqRz`GNpTJZr*`jU(A_F_mZ7;Q2izRNkw+18LkH)@u3PCU@S5z zMwk?XF8LiLp1{d>sqVrR)yN>HDa>grlJCL))HVpn2oxgaBhc{6HHRQQ09BgM9fsVx zE1~*o$prvq+m?y?FmkJg&E)mag|dR1sJVo@6mOrS@W~Re)-6=ab<3@|%Yx2wbna&A zjVW-2t?P|s3*O#Vf{yJxj?Cr4x;Fgp0~8n5yj;OX5D2IUFKe{y1(bvrbIEJ)^+5zL zaMTLT6{%j!uHU5Tf*4yG6#|DL7H8&2R6{1m9;&6WX}KZQWQ>j?Zni}Noa zFb9K`jz5pxPwJnw5;KE+?$VX4zPNZhUCl*)XA zpAju7&4GHp`2^z^sBY#0>usbdxaa~DQ84a8$Pp9pO0e!Q1g-rdS^+&VkDEtzoC*1s z0s6BiI`x9|fdg2D>CX2+8epZqF@=+LziV8zQr{{10MQ>2eURuci9SU1k3=6P`bp78 zh#slLe9jR)OY~8qmxw+_^!B2U6MdlQ=ZZd2^ogP`6n&EDD@C6o`WDfriM~(t8KOTX z`b^PZ6@9kopNT$K^j}4vFM2eUel8Hbrs#`AZ!G$SqIVMgV$lbSzF71!(U*$8Q1r{7 zuhNxD(EO|PS~6yp-eC?0%;70>c-tI)WUIC!gdV;KzEAZ1qCYD71ERky`a#h@ z68*5~KZ*W?=1)U05I;5zSI#B*7{j6t2l)641ZGwP5T9@rGS25~f${Hn zs$e4xs3)sJt;OeH<6pOiT6p79s5eiATEqtz;`xP8o9?0Q%0*C{Ne-tl$Gd0nWt;ea z+CyzFnccnvYKvtG=)K*cwv>Du_JZ1q&*Q|;Z3(rtk+pv5lra#)Oiy{lj>JO@CVa}al|D11P|WRkgCQl zkhDvN@u~B22&+*hq+>GU;l z1#aTO+YYH}EQD+{wrK?z^(u!@FD8uPU+R^IdNEsUx(12we=?G4eEMn>KiBlkdZ_0M zU3T9L^&;uet7bvHSUNw35zbvA_4=ke)TPpO3k#tx6Wh+X&~Yyp+h|XyR|v}cx$bHy zA_ePJ_Zs2ex@J(<37TJmU3kuDdn=kC{Whf-tZf(D=>>r6(}F*e?5%@Pi3vIOE87uj z00YFO*jXsS=JRg|#q6{z5o%;Y={DbMvm2YutgG5Dp~LJZCa#A4abJX*$}OA1Tssf9 zZtP~pG9L_Ursz`jFCo|ybPYX`$%B^*scL9Q+9kv2iE@ao&1|9~(F;ftBM|>N7sa({ zhOo60g29;G%I0r0c5ARrYJL0l2%XurzSI*wouQbZ`eF$B#DpmPHXgivkgCQ8NZKXC z@TnZ4Ps}DNGSxW%Jw_nj{8ALx`3O|2{_WT-3qi;3XkW7ua3|AhJolO_npAgSLN92F z;+pW_wS-hPav*7!48x0Zh+Z(8s7SODlEeta`Ld1OO<1xVLxepjw?5GS%!PXPxv;X1 zKrrao!|lF%0gov6t)-$#^{o)}jizwoSsuKXAytk0AsdZtSpkM`5bSsCD}tN->ykPq24%1w1k6z-KVg*=5GP6#Mcj2u(8G8M8-X zoUkXGP`X{0wVq-^RqYWNXzi&cT@Cv`H4&O-Lb>RGQpIAcFGsPgB#TES@8Q9_A5zu0 z36gfnFe+INv69RNuS`OwI){)XMm1g+qp>~jIfShacjEE@!4!M8?NtUm$9SRabc`If zj2!r-8$PvCOi(=w3Fs3OqVR4!c)cN2jV6$^ONQZ7IYd90O;lv6GZ0B)1mbV;JYFOt z>BAU&8WqYEH+wMD+H@&CY&Fy(8NMDWgj$CLD%jf>Zpmxnlu$P7c*0}x}8Xb9v4Ba_YTzU~ zf+n)=rZ+nFHFF$+6>M6=3_#X$2nJKq>f6t@0ql?C>RLUw>^zm$z;Mc`btYCUOi_I- z1gp)IsNX6cymgSO!2(FyCBqF9Ay$pqL`9}L*F%pHh!3YzE%rdQviISAeQ~Opaq0}t zY-oJnspcl=)VdHOGE-Fl34%^BB}&id!K(wQ8bl#!mkc*dgyB;Kg4*Z@W>&c;)E4foP*WyBZT%9_R~A5R{~6WY zSWKpO`IBmm*-+0);klH`g8RNr^#1iw$5tWw0M&`jsqXfmPTAr>ExZNx4(DM+NZ%w&>zjK)y@_luI05%`{GLkqh(;5x z)8dukRMRtLQI^icPd`qSUtmjr=1r;>6heLWJF4Gzhx+RCRKKHo{9~$JvHVJZ?Kh|; z8ZDPL(pvj3cI`&U?Ast%uy+Lt7NJTG;Pg%#V_lA@wYmmI*%)rb=|=0ddI=C{W6#GG zP3!;y@$^iknzfUL8Zry&M_&VtIzK?hu47-^H6HIWn>Bu<9@Y*ye99{R4F<^OHANkO zHp~C9@Lv3C&<}z^C;yw#L(n`+h7F$!--g{j7{w0jj#jdU6=SVvtN8k6O11c^4oH$d z6{*6TW7XhkCyY540i>rLaa|TW8v*s*Ur4UDk4E+y`=iU>COmf2a|L$GMY}i_+hG=1 zfb4A1BouyA$eX=lVmB{b>h;Y8r1G=L?p`llw0$gK8iVO2v~y@TNAT zis0To?kOUpWIQDa!}DvkaMseBZAcUqnd;O>TJE5Z?>azR0WV_CZFZY8V0k+cw1%Da z1VVT4`E5+`b|HSAa`qYDQk>%uPI)sjz zP*r>GHiV9uP!0Q|Q3yR{Lb>)4EDo?Shm??SKR6AcXHBTKeHfkZJZD1n>?i6Y^t=f* zurmc&DxAvj8RW?|_2kO6$f zhzIX;NEMkuojsI{rzBzQPCnn3DxHd5xsfQw{x$bJDnE#CH(`UjdjVUK%2k+~m(Dxg z;aLr`Ze_$DjLNcyB(;ZjGcY5fL?yO9eO9!AoJlzA)^m9Zf z1S5Kq1f42Nan3s_dbtEss_-c`r;^?*!5G%ttrZut)l&e_*{wLjq1`-qcR;Edd62YA zhOyo*hcGd)c+Qpbo`%PZVUOOyfBKzGcgmw>^6;bkGMes@za}+F9i*PYXu3;tiAI*I z5KeXIIBw2EraJ!u5;N+LHet$C=PANet@dcJ257w$Z;1WaPGmJS7%UrL#`NSq3!k;k zgq?KTeylr~2-WV&gVzgEMH*3OM#(t76qA6l=;u*%R3vsrMxq!2>wai+WX@<}=8UGS z7w3#M%$Qy93o1l26mWK*+ZR4lkt=!j0F#cVN@jQ4?RX8hd&q1KTkFA#@TOn zMuo@w<=Tfc5IWa{9J}>ogeI6!id_fuh&R!MV)pi02>BPG>Gsu=5SnD-s@hL(Mrg7L z)v!+=hR_rf%C%o(bNd&e`S!-k5t?BdzqXym(0O#uDy-+M$5Gng1g?UgU_iT1^WeP* zsd8_lj#?zcH4`D${SlbOI2fQ8q%kN{o!1CcwI-+F)hkRY>5=p7K3J_pX3hnIUa;>% zbYzyfm*d#=FaSnon|h?!TNfiVXOUROoDMjOuU&A(y_f;*G7ftnL8{1b>MSG~Pf5b? zJp`64=L;OCUs2~R_?haC0%`XpW*1}Q2*ZpBe%F6#~CZKM)xRqhjVcix- z`=oRqwkCv9@^35z)T41$2&Ly|qv2D|nuU(?6Xxgl#)**9GrM^Rb9PdBNc9XLoaucn;^==L}#Y1RlJfAXVg9>YVJ8@suPCjACY$ zuYkuE)^lrwb(GkE01+{&)~cvdvzOo=YNeX?)8nxiJ)H>8kr5dP73`5v4ZF=4glh4N z5f<)#K7{&LDm0;dX97@hw`38Xqhvt4yx`Z~Q;;fh5p@=ljHe`FI8FH#zis%JiQ82L zQ^0oIVM@mYn{_TDS6G{ z+B0D^i{nMS;|Qp7!p9%j0Ci3(NEg2h42qu5wDBvp0-c*r^x=N!sQMhp;_X)eoyWTx z&M-ttm0v;VdHkblukzsi2NEL<<5_eCoR9P-;i_;8q5syk@R0Af7$&v%33BkhVm7r8 zGOlcnO1X@P;{I|YuKwd-aFVV z3$^zPD^+xYQA_J0YFnQ^LCvK}i_+1*x*Z9yi%*Q3Mq?_Iw2m&DHA$uJorE!m6w`I} zH)COZ$Ae&i0LD&PTH1rrFtJkd0v%tHhx%4NSJS}e7fWKT`alH-YPG}qoUK}YB?P?$#2eX9jkD-&}y-cXYUS18MJ|@(_9x)%GekRn=u6`v#LrtiWJqkC|;=@d+ zu~P@_AgAL3%$95vbixoGymKH`q&;;uR5G5Dgt5*4l5U|)b;co4jA}-sD!B9C0!!Pp zIXeCbS|R9K=4wWx&8wVfh~PXw=v3ipo;KePrc~LAK`rfk&4l>nvdU=8 z2x$xaV0x8vS0lL44_2*G9aKzPYcM;Cc<_u`}OdhhS!A5!?0_ysRYgr0fudgG!FwH2MINFq#z{D8$qamqMJSCOPrzBx4>O(1tGSxW? ziDFc(51_4Rfh;mEsx=?0g}w;KUswWeTufKuX{STIMAZ72b}|-=+MzwvC8B;Z73xx| z&cBgXTpd4DDP{~;KjXps22w>{qRv8+@suQt?$L>;Nc@BeJx0K~I#a10mm+n>GI8}6 zfX3C!#S?LLxv1jm3Q@(?D?}AnucYcsL|)?R(rrpHW4LrJ58e%sDsnM(-_-;>bX73A zN++TsQ=OZUC`Q04t&T0HdLWC8RpROn#28nv7Ei?0)uM{4*N7^vt`SvST}#zTLtf(Q zpO_+;Fih&fM!;HKL#ZLRAd8F}#noQ{8dq-;PsG(NqKd0Giz=?(BC5E$m8w&Qyu{UU*Wk4f z2DH1L2X7Okid;h7cQpYIT@{S3(ut_ZROc2XiV?6{VTQe@H?qjsA+GL3jB$0Rcp|Ru z5>;H?EvmS>M^tfjFI9&-iHfTYFxW6-xZ0ivuPdaA)T8dZnt+F{3PxAyL{uamgF>Ph z0qY}ZB`8N{+%B&6N7%S}hj=2c-YKfMdY7o;>fNG>tNW-r578A8VCOkXF=M#;1rOeL zkSg*Db>GzlJaknsx=JUaB2%4{&|?IwYcK-+0BY%sd&Sk?02){KiznjheWHr12SgQD z?-x~EeSoSn33-XDbX73AN++TsQ=P3y6eD1@#)7N* zO~@kSA#rsVVvMT?#S?M$kf`G7!=j3-kBBO+9;WJ?hP=ep!*Q&t8Nf#oc<{PGsz@<) z-_-;>bX73AN++TsF`pt)jDYnqv@Ok%MaJXe>Hvg|t51k0;_8#4imOLN6<3dnDy|-* z>KvpiB*3X1ctw-}yqeF0cLGvHUZw84nt+F{3PxAy1io1Zi5Ku8V^pm*xOVukF|x>b zMqK?JpmFtC@kCsGPE>LAc~QmH7ep0TU!>|xMqc9TtnPRsgaPet;K92QQbm?f_gziE zLstc(dvqcy5g%G4t8Y+s zGB{_lReP1<;RrKl0}GM$^@|#MOZa z8&}^JPsG)CL={)x6;)h)PgHUBeX7nOq!m{OZc>UFqgB7+!TTN(>p$wgs|k4Ms$g`L zPDDkfI{$?pBVet?a^#1)$Rgt-arF;?#?_C-6LIwuQN`6yMHN>+6IEROoT@Vgd5Nnh zn&Jm?25_;=gLf08iY%q>yPAN9t_nt1=|of{cD+NQ7y+vd2CAMTkVVE<;_4p67+1d* zPsG)4L={)R6;)jQPE>LA1XZUB2R#y?(-}%JW4PLh2d@XDij+|IT}{A4R|TW1bOKMP zKw_1JL@}z?r_gHR>Plz)D6S4d*tq(Wcp|Qz6jfaPSyXZLzoLq(zfg4^rYm&ylGfNx zg#qn;&4b60TSZ=@?z@_Rhpq}n_vl1aBvx6_V+1lL=PT9iYGjcS)3uhJsnnl9OU8PL zs;tF<4zLghzQpo|=5XLV9=v&wxc^U`DU)%0{4xQf1I#%p67T6CQH(&w=g_XknpbC} z8wVBxFb_fo5}+qB$Ix#e;V~q>7wP-FF}X4;>JUg)(Q{tA$K; zE<&Oh)r>Epy}unHi&1u5myEFb>o-4s-z^4tz8S@0c>6-8npX3n5ixBz50` z1Uz&=Fgn1Tv2O-ss&fe>NCyYLhPbmnvdG9c4qOJnI8b05cmjYp@ap+W(Hsu^z=QV- zq>8*v-FF}X4;>JUg)--;NZhG_9wU%(UZGM~6d{X@+QtDJfN`M6IM5A%I8Y0$ra2s# z$Aib`j8tSab>D#mJaj-XI>4NxB2%3u&|?HLzJ)l{3Rz^-GY(u1z&KEB95@0%99V~j zqB$J+i3jgDNELaPy6->&9y%Zx9bnE;k*SWV4F?Eh%!1Z+II_rSU>tA(7zY{}2YLVy z2iDHR<3J4HJG4A_7eT7XSn9q533%v$V03^vM@8Z-VCXRd87CmFUV$t!nivOG05A?T zH4YpDAP$^$F5ahPK)XNl;QaxqBJWf89Z0}K2Lz)7%sDDD)v?g)F#;KLpz%xXI-|L9 zAOgTR(84&-lMLZ$s3Q1rn*r@E*ULk9$-1I#%pGSyiIJw_no2Z)Or zA&ZPw#(^sV7zbJ#2c8BX4y?Qx(>4Rz{e=hbFGv;nkhBbb=t1HG z+>kM4wxR`fl}WW8z7DT51B};Sf*Z?I*!F3$kx-|lJum==8EH+i(5W&r?LY|* zvz;19E3UOYODSdq*ShoI^?_88Ce)c}GMz#n5&;a`k+1^0NX4t)gIQ+}kXt1rWi>#C!3*TM(| z2e@j&ko7nU<4Ywq>^^oQG=<%F8SLcOkuC`JGa)DLHAJWut?hojAo`mZGg9m?zzlnU zF^kzYZn@b5w@DW1cqprdVk=bN0>QezfFtU2oCohMNL6D$B<+%6Jd{-qvGJdRS;2y- zNSEp`%cw}~_X<5m0H0z*1K?9^kXZi`rfN+G7v_&fx~j994w;6Qm{*Kk*dh2vT|UNx zKVj;0ftB>e>J+Sh7{L062X7%H)<4u~os6d>VJw)rVGRt4^$!xos9Fv1Bj5vU<*GN> zGcnv%z1c7V*Z<6zO|x(dejkGw3TVcI*9sEX|BPqS3ixLgaaDMV(6r6SefyDtP)$Cn zusX9_kP7_Z$xh{XeLdw$U{C&t8V9y;`ZDB#^%Ep^eMZU{RqIJ;!_G!SRei@);9Vl1 zN$~>a&Zw&I;}ItYWP5v6yq5Ys<9yev!ov(!B^=onbQjEE!cX zwoTOO0*U9JAY)XmNucE&Sgz>IsZIpCWP7YJ_P$_1yEAz3=0aivZt7y3j5n)@tD?Sy zYERHA^Stj@;%=A2T;w#XuWJ#WlhvCLBMc6&_@X?Xc@hs7A%hszjJ9y*%SABG9HyI( zTneSdQ@DegInVlfzEXn_t8Lw)HQFI_s&(36|49Hqi+TW>Vb#L<#h(mm^%@h-vL3_o zNKR!y)iM5MPO>&*z-LFnDt=pKoN)zg>lSZd7SDV^XHUda;H;9ZYfb2hD^2JH)ja@C zTdqgg7irhx^$&WZ-O)UF6ChP&2;-Ti0zSDSu3BDB=-wG9@jP8~r*YBto2}(GMs{6| z$T|9XEJNvk82KC!;F;gBH?TS8Hc- zQg^k=VqI#n%kI}rP-bGEwbtD(N47((%-TVsutWV`P49#B{P&-<#X19R*Myyl^BZbZ zWU72pGe!UlKGZIwS`%FHbVYfYk6E?W!u$D1QWDR@UN6{_1dfz&%F2Aw+73Kk6Ma$n zdL}I46qb3!q9Y|G)Q?(MKtGccUFI>%`3CmVVVM|MSPD8OhX=0!QbkC%olu3e>Zs;e>p~&mq}V}qM2cy^(Qh4szh_cuF?ZE*?v77 zeb6c>M(N;%Hf5<+Z!+>}w%$SOy`2@(izjXM_@yBBA?w)1$9ga#;FXVpN;=Ly-NQX#P86!v2<+pucOPxS+pZxCD3D8Fq`M zEX}e?JA@Y7t#2?%vJ!zsOe`i5@%#JMUO^tlfrS3Pie`R)zgCHv7!wxh_xEm^`2GF5 z8}zq$qgp-1NWZ`3*}KH_;z`)w)o>mqX3zd*!&V+}CLW4+qt1U3h!KgglBp6IV;;CQ z3^dhYH%CRLI<{ka+Fg)y2#VEYlcD9s$J`O<|mA4bxJlh!K5 z6zD=4;iY^8ROD(xBbQdhQ<5-x(inz#0Ut6(wL>0evP=%>nM<|vALc@$oV`FP#-NlU z9=sAr75RbjGLa?WZ6dTGo_T4ILUq)9B0lr70Prb-!tX>bc={4D)oF^9F{&9`p`F_r z`DAXiYCVE!ttEhxrOR-}ZM1j_Ig3~dy=zzp&t5Qq_YHXP?toO0wbYq18Ba;VSSWLj zip2B(&|?HF?y>wHZbmsZT3K)4cZ{)B5tDUs(_1iLWS*C~~?mZJ$5@({1LxS=VwkfSm&3n{yFbEVb$05@}hReOO)`mYm%q zJb2GSs>m3|(+AWh5uZ~LS4FD{x%tR?@?t&;({7<*33piH{izeEX%Se1I37Bwh>oX6??vRA~lclcp#WErt!85O>>m;4sI- zz;9W|6}6?od?d@dD;?)zLSmUl%v@4BnpQtye9c~}PrC~5&r6HQX)kkA;e|9ffJIu? zzYDJ{FGC_*-N4AB=$LFzzdo%(Y|(zk9>STJ_4u_rk~~nYHE)k(AJvyzNfE|1sQ@1S z$Nj{*JwTAG=Nq#N(b?K=f;(JUFS9lXIyo?rPR&N?@6dPcek4`+0#ZfJU_A4vfcGI@ zCjs}*mQG@v^`rgg@!g*K`D~OSt*5R$aNvv5EZROI%>G97Hx{q&yO=x^ARJU63d1n{8ORk~`(e z?`7nHQHcEE!W0yXbmfsRGBRrhB2U^|D?~Q?f{~R5Bl6d`AcI0x%NW{8mkmb*M!${8 z$;=egvN=s2iNd6kZi`FK#A3z7*mWCDyVyk7<>)(c=3&JxeNB6hLUp?^G|AH+)Gjw+ zdwLYA+m_IzP~W$s+(fdXP~8rPCUy0FRmx4|d1?yP?F*XhfD_rL>nVw?ET>^8R5!Z~ z49~d%hH>4g7V|RQp}Ol?ZBdn``UKjWW1Fqpl+c*O%epzVEAASAIQ9Il6m}Pn4kHc+ z5v8nR@zOBjxx|Qswk+NonjHUo6EoHnKNH%$9oR`Ll#e#WUxX$fCYcx~W2mH5Df^2c zR?_k$GG(->OOrTj-5;mCkTqB<^<)$$fUH6KJsjGhenB=;*V5^s#ZbL3JJ~|Is&sW| zF+z93(3O}6y-=mM(W2AYT4jyaxf2Wl{Zdrv(J*qNUa|p8Q*ptZZ#_O{WZBG#IA!&k z!sL`abh{vOmhL@2Ic4eTjO@rV@#HDSdY;>1nQg+zh5CVu!JULMOGhv=EgdN@(m81r zQl1}1F44OYnUwNcMxIt5t$DegaSm#ZAuAXk5m0E31 zj%@WEBd^81>g+G|VKiURL190uR+ZcPCRuCsr|6|b6IEKDu|?fcqxE`OhYGo$#mMQG zpejRk`neU7wi?gaI(U3FYm;uYB8*j~iy1Ky_E|USN0Fs@PTh1{=~hO{M7&MsVk+cC ziQf=rtSNmgwAiID+8xZ*W*}v~RF98nF@C@&!P7 znm_B1ehb4)A~6lQ&k8LL>()(@EeyG*g%*$N^u@^*hTK=vVh~;{&TeXL$V;{`r92Q? zbh3WIKvdC>gmI(vz0h`ml{P2YHXImKsqW|(ifOr5(f^vM(t3eK_DE|7#`MHO6NuBD zW(~{Gjc@Bln6CojNZpDiGnOx`WdHoz+~hn=)z$|FSs&@kLDR%iXpva82SeL$^`q$G zMB9X_y&al4*2=#faBSYuq*qxf)(<(!86{M$gl4>ax)6bStgiKbR%fmv1|L=mRGpN6(OtaL2+ z5*;bGP4GOUYf#la*7aBZUkOxcm%uiAne`(^^1shK!Sne+f~@T*b9JTt7`X`sl7o%MpGQrUjOm2I7uMF1f zhAgDNf5CS)t@!d@_Ik_8MK_nv+hzqUtwNz%@e?U}DvYux>BZFjQH9N^O0OegSH(JqytUUYtqGa1}NLHn1g=U5J5j4f$W~oZ~+@~q|9_ty*$cbjsg3>Cb z8)@dk!L0iBNI08lmQd(pff+U*Z-X%+(X3)Uz6flyn%eXF{DZA3P4D5Coc)G16PH1W zStdAGO0%6fzp`4{&u>aLOK@;PV3z%rm5Ie@Vr~^3Tp8GAb+CVe>EGI_(tAR)F7_FD z$z}--zCp8BE`)?vm^n|d?RnkSo8bg(3_&FW|Ow*J9Zl@1Ec2HC%@ zNj6Jx@B*5>F&YjIvqxT#Y?k2QuD~q2vfb|dWV4D6J{#C(jj`J<{RdlB`eR_0on`N9 zm~58dU^bU8GseTgGJA7{lO(~x?txi$ksZG=Ik$=qo)_3=&9GbOf3U?_ADCsgws$Q} zHcN2uA)1W`t+VFYC;FMYABn4C{{()AWZ=&fqg3bd7Q8=7nd-cZvSJ3HioGbYoQsM~b-rUHfpp#rVq*E-&QAC} zq~OR!Xt09$r&GSgv9zEs)-ZSpzX6iOco!<_P~wLZ0C*M!x-}kMbmphHxt_B>??hkh zLh{TWTmTT&TIF3}X_fQr)Rh6E^X@H#&2!sl2Z)t7^$plO{~Ts=lgh~(8?{u<3k}-@ zNJ`$!DMyY|`_Fe}+^qy$VMRl7H6t88cMQD|ZwJNQZ*=u+_cpxfOk%B7@mIYoA`G{ipDU8cSUkO+n<6T+3Bb8)_4{lkF`RL zwq!}sa@y8Ah;IGvwJY#_Wd_~VQnRAn4DeO%oF7i2G0i2i#F>1Gj?#dya_9Wq2KTl9 z*Wg1MtYsgb8n#NQE+BkH)sQ$VtR@^!D^v<2U z57x2`EnBcN8|jl{ar++)68!i+K)1dc5l!{PJ#sfqdP&MOLK;uSc!)ah!J%|ouw(oU zF7U(#P&|(aI7Sr@B|`0RY5;!QK(KaBsqV?2ByxIa^P7aSdp1DZ<(#Ey!_5VHc4K@` z&C{8?8~1F8#Z*oo9fi-_-?&BP83^~)S7APC3XD|0lS%sNDV3D!)cNOJn?Y7Lbd z=tE;>0UDqmU5b;*ho$N71FG8)MhWj{>OT{_HqkBT zGJ0JZa-FN+-)86=O>%nG;J~*bL%{myWZtv1Y zIk34*e~SSwD8b}Yhc*LrBaA#b%XO#S3Gs~bT*iZOJVu@IeL&9~sJu$?>6uPD{ttvf z0~})<%3`!iCvQwttR=%FjUVpLFd5^AhcQgL_~A(mlPi9B0mG~j|5?=aIK~(mTLFQ$ zOsKBMiGf#5pmyjvNGW>ak)r>BQ@p@6S7x+Yl1!Y8bFqRzj>TQ<}X zen#`|4sbEI#n4%sXbOuV{6tgT&e*ptcgWCnO9PZ&=Ujj{{hi!-Lz}e?&^v)HxeMK! zyKZO%B#|5}e!}M#e79{z?uH?6z~bvOSjMNr*35^&u%;tmHH<&0TiB>^FkTs%j;781 z!>)=`F841c=IqyR3qq&(tso2_RoH;Jcx)LNVEm|Z0?Bf3R18{kL7sGLABynd}L6_#kOj5pqrf0#vBiFV_N3~ zs~{;7KRegL(9(Y> zl|L`p+Bu(@b9{KnRjR-gURMflD22NuksW9H56q#w=PFk#KyGsBZ>)s*+?q2}lsiN~k;I24;r&qTLfDz+o&sMq5ujr^0KXst> zi1FB9Hur@Z=LJC12Nog8i%Z~*Z-I{l<-W89XR9Bcbv~N(S4AAt3UP$rE`UU|o z;@q;yD);rRlkhu$DP+R=b5-seb>OZK@JFHCHxI*61H|WJ3`{BEPs8=bB2Dg(KMa$B z!K!yOir`Ns=vejIkyt1B!9`I^I!RanF772Aezp+1g*^8plt#cxW_Kbisif0TU(m=r}9ZTEC_&$2r# z3#cFxhOp!;86*iJ(OtkL2T>$0u(L~6L{JnIBnTpc5+wa9VpdF;P!tu+SqvEQH)6oR zJLgt)PtSnwe{a99LZ5rYR&If+7IF6 zQMs>O^(M<=$82{D8)vmX7zp$2hE;u`ZWR@+)<02$&&5_AVwbT`rE%sEU*jTs^!$@G zJTcU!HPv3Hp$YbCG{^6}u4W*m-L_yYPPPYO$&)leD`y14Y4-YdzEHQ4CjhJUDr&q) zy3Mp7!9Fyl_yd7(uD#?mUl=YfA1a&zKT>&t{Z(V*ceU?p{WD7+#8@^g_c?U?hVi#+?MFh z&xT!Vh@4m|-(kV+7O5fIi{o^RX)ysr)3zeja`9fPDlNaP=p(9HXPh>wwEA$gk7Q(T zLkp|a;R_VAx8DHu1{+~h-HHCn>~?5_mlpECcHd*-9Y$cPej`52P*8d&cFC4% z4;^Vv`9+q+!f4I}Cf-!UR&)UKVlV~INWs{gZ_$J-i8Ix76p9fj*9y}&(?)Zu?Xp{* z4HsPPUfYJN?gAVuLG7V=Zlav=_$oC){ECu^*B`MJeT{N4kcuBk$E{XnS!@ALfz|ff zi*RD%#a{#uuVPg6|1IR^qpXoUdkxOV)t z1_Ox^DEAR^wcY?%t8I6Nt-(PljHIfz(<$h(5@v>8QaBsG$tk>KwiOvVyYLdr89Mut zLR`|R2cau{e*$|WT0!4GXX1T>*owZwyjV`bGg2_NYXlUtB*yc9$j1njD>vG*E_;vd zYT^!SJPIFXg%4KMnz;qMe`ghNHP{8E;PWB{uj9pRP61zMr>t`PK3RS2d{njOZutkX zuR=;=*nq2vkV%_gz=dfIfM|1FCSGI2R&)X7ES!pGq+pgc{I&$lws7Yy!<)*)ih9+}wt~5xn0Vb0d}Mjxjsz7ep`O+^^zuoDp}7!_{NKHu!0) z;JFU4TaX1FMG97T;ldtv8l2%bHL1JM8L_b|b^EWPZtGsqwaWc92CuLvk8FIYGyGAk z!1yxf{i^s#FL2u)`8K>$e7VzmfZ58~*2s1<0j+RGZw#Q}_2E$BE1lP{cy+nq^>+hV z<@ApS$P-wA@f)4ORz5QF?tVa4J6|^q42?Viqw$-Z%t1-0CeHEkwa#Ijs%0~Y7F>$+ zdHiMv?k#{?;4~9o=TybL0;4s&B`aL-JW$K8aClWvD!##Sw+2XEc<%VE&bYM!ay2Z( zZ*y|zq5Bte2!>DT4rHSBVsy%_1G3%eeQtno&llg}tlj{gO6}?m&I3K;>HR?k!Q8S;yb6e|=uygL0_`x4 z$6Pq61_N>E24f^n>;*)bioD2@I8#-Dr5J&7+s9g#tg859h7FH9Gq5WTv*9_X3n-^Y z+16~>=k!Fc{DBuXJntMt^TKR+!71n%Ai{?I&ic!JM6=;V=gsxLp@?R~L8ozNAF@UY z8xA=~7A7HK!)wkIcqpGB!iLwK&g}z8v*Ar=2(}=mQNo6|oJpXcL4*x&JGE{O5MjeR z&W+Fsv*BH5?Ky#tu;FuOKirJ5BWyV0TmqUHMA-0!)2n%aU~sJXQKxq_K!gq7Ifv&2 zh_K@v<)M1|5Y4{oGxHZZy#HDC_ zuXCce*<1s;XqFX!#<^y@LHgQ{j7D=0IQwv#kQ?%S?GD&Y$6s;i2o16g9EgA59A6$F zHMrnDaxRMpNJB2T!ww(OGo{`x1LRXDj+2of;3j*BT`1yA^#~dqW47G6@Gh@6Mvvmh z3^#vuYVPm{OM9xnojF=rPSXz>-dmx6Wia`Nl3Vfm$M{YoaSa}m5J-lFgLT+<4K<* z+$^J3oe}5=H*?gGvoItWAKz1zm5);zJHpM%YBYR7n44A9(QN@D+^nh!gP|M_0$K66 zT7$thrG%T+RUziwAi~WWY7cs*J(Y0t3Cxzd2JS()*?cuFxG-zrU{59{^H1juFoO%eOQ19H!G&6QQjA1uwy zw(6Y9J`D^v+bL4sP)c*Nz1kG_%V}g?L4=!EtJ?=-NJ89Pq%ONY&=GE~ zP~Tq>Ai~X+>b4F6BHUc1HlcIIvT$>?`e#jm2shWL?YRLW+`LJRUX{YlUol%so{-}? zeZ-}BKMrOM+`N*BcMW1I`Zg!ga5Id5laBk`oTAE>#{bV~!f&Qwd$q8NeF zWfj_%QLZZ7@>5%pjc+m(-K;V$@W)J3bf;Pe4L$YMG)4cTzQzP+4HSEw&S_NXCAk_bf~RR@zUO(^=9dU67WBt+52)$bs!A)8S21$o}yAVSgo zijVaeL@4^ATG}K)grW!3vv7?@M=1KTTA1AQ3PoR0pI{w(QoEemZ^oplG4M9xKG$Q- zan?Z5T1>q9h^^=x$_+)s_|kOTr|4GIt1K>1(Hx(m+tna+TM$Fh-Rd%|I)eyB?^XMk z1c*>{uR5_bK!l=Cs}Z;fWJ(D|pH)ZQ01=ArQ>E4#1QcZt@j)`gnW`ze6JxgA9_${6 zVg1_i_YF5cP~Xh=hfj0!Gqp5eMj6e`&sCf5J`I%S<`Fdk%rL_)-26hFIVnJdn_sHk zf$!4X{7Ti?=o>QJ{IA*$SCzue?^UbvNl3W)gZi*f5)y9ysQP3Ekmlyk>hvi=6U2S~ zq9%6<5aH%AbtRUEX}ECnS2gQ83`vNazu`-HfsSx9;|vI~nd$%<93xP!01SUkxOtkZx1FcEx0LvUrMX$z z-G~9zWXaLotm1A!K@AyhR&}S~LN3hBYVJE128eJo?$#~iBbuAl-G88?4H<6Mar-R2lvg9tY}xVM7Q1`%$aZd$vF4=A1szUDn%& z%sKr+_p+pm62DpC{sX^lCPKJ5$gP4if<`nq2fH1xdrRTwNcWSgeaLWgl)E+1GB*}S zyZwW`ur*S+d6C=dnxLTO=EZI;I0n-M@tc>pH(}rmBHSG7W@9I35aH&f?(uUmBq6^! z&Rv>3DF`kmT#xF|8eQsXh^2PHDQP$^XzWc)pgBWfO zbywC35aH%<_xRQT5pGU&OJlnub__QsyOZEs4In35nml+1=Pb2?;mX zxs}kH6u-IN9T%Jg%uR2%7=se#=B@5q9RftSd7In3F^1$~1plVDYflYygqwG`d*%g* zaPv-g>3IPn+`P;6l9x@w&AZ*2%K{zY=5F@|oF&5CyvH4SQwldrVYbw3a1X-GzXssV zROlzTc_R~V9bzl`4dsTLVf^oO+~?-C?jg)Of2ZqnbBX&xMS~b_u5vqG7$CyU)$Vr8 zgp@Mp^eyhrwgDo3bE}&VMjIXB=63fnoW2Yq+}!Cti<68X;3j*BSA!zP`~T6M7_;T- zW1>cj-+a_?^D(zW3xBXQH=l7EW&3k({N}UnL|kKN8W?Uq=hi?!%^-{4+~OO!r`E(U-9&{hV4Em68^N{=C*Z|Ug^L6(t zY*bC7#BaXgI!=Iy-+a@3Y-xZ9H{Wt!#KI4A^KJL3q`wnxe(J949F!7ne&!Y@?FctN zcfU*O2sgiQufRFMv`4u4rQ0iMS^VZ#?w9LQxVaUxrKZ4d3pcBE#Xm|hYv5*6CSEJV zR&){NhMQsh=5*ZW=9BKAGx4uTY#)4XKIMKo%^-%GFS<9t@r#bxZys>#W62ss{N{V^ z`x^s9xcPxQC8;Ca{K!4HJkSwt9(J9k1_2-0LwxW7ai;2k?!=faw+{<@9vpxj|HW|g zm|Lr^KYW^-f4N^{|E+0Y{N~>-FZMNLxcQIU3S>=a<>`8aMSUsq64C1xaoTPt_l$0W_j-@+Glixo2Pqa76yoL zvx0X7oisYa%`?5Jz8&z9Jl*IoBUE zP0_Qx&0w>h`cC@P-ojgeNz_m|eYxJ!`+I|5PM_Lac@5(MA{1>c@A%YnrYYLSYk>`Q z3Pn45pW*apn5IwdoxDYjl90I1&fY`ql8{iei}x^=zbU9Gdam~;*1sW%xX*6hI;=N? z2t~Vl`xXU=Q1m?S%|Z-Gh@w5bdwK>sLec)-xFjKkq654$+5|d6(ShENodN_rvf>5a z6*yO#+J&NnynB)tWJ1xw9xr1&sa}cY)eM(dpOzlpBhM z@psa3pQ24X)e%2>a!|}rw3&AoCRGqa(RN<<$pIp#_6}a|rG29&MEpP1)pXTOd zZ#vFCdd@p*ZWem4R`a3qnwwL+);O`6VV6_;RPR{w{)=#Pn%8@zucNtHPNOSWt?;o7nOrwOGmwOvhMHo6p59i?ar9W-;-~BF6jgDL32<<0a|1&&}~( zOPoh4(}dyXM6bp+gBWfWd(CbO5aH%@?=zfSrIgurF7)o}8z92XtG#2`>lz*5<~3ej zFu@?g&Bfl9TMPnjvWHm`XQ~QlQH((8HE^F9(Q>=4!FSX#`gZ&lL(%nK2kaE|m}!b` z@vMMG6*Wa~_Xdvk+2Co4ZuMpdI|J=Lw|U*M!!V;S6y5HPyVXZDMR$0w;*4b|I{L&$ zOye%E3r;H?gs9JWhsOqp5cOH_ z@uUveWX1P+KLx`uT!{L-H?eC_N{IS`mxa4gAtzcBQ>T7{qZgu%yxp=mcOdHhOuRja zt!O6mhNxk@N;>Wn^)_!T8uuKRW1}{@{(@>O*BTQGfJ49_N?SME%Ko6g7p3`mtf^{6AH*rdG)|~$M~@~iScIxhbYwAxCPY;gorrUYDJ4`b6Ri;p z*Kna~PLwZ^H#$PqveEOBI^dHPFCT5NJlw;9ieKeXoIW(5vpcI|AyZ+IzrXb(S0=x0;;lySrTWeNoY}wK6ipYN=(-sD)<6TSfJjv~{!+Fg?YLyG9G9`G}_Kxlz6bHpQp*jD9rFhn&4WReME;*YnZGkNQ;Y9UYC%=;Bsq zP1Qb8e!Es<-O6jK_KV(|@GI6-y&(GIga8q$=113!4-ld1fatOH7@81OFN`*V>j+bI zboA0$0U}hrDB2Y(J51Fv(HoOG;FA@EqFdXiP<19IPo0lb zkWh6JPRN`+P&Jc@mxI`fj;7pDHH;Uh<33f}MSntb&!P!K)eg}->=gttRP7#}iJ>t_ zheC9qNA#7-0U}f#9BtezK!mD8qZeZLZ%PSOhetc3+XfM;j*K>+VGvN2J;aBD5ofA1 z(4rW#rR##KF;(tq06$^R9Iqa=%Xh?wgsbC=Hs~^b^Ie|L^H(or^QmDzOgarqqnW69OH-|1flKa_lszpg^lo$Gn@5ViQYXdR@| zm~)Z2i3hg3fr+;Tu@&va{1O;S#p@0B@tO_&0xMXcUV?(fC{W`GBXBurwpGX8Fb?Sc z+sB$8H|lyIi?L*;dRIE~8R9I(I8*He9%J_6>##?$QE+*kcDn#ZuE6lr=L`p;Xf!PAl5=i`PC2hb zWv_;9kA3G3+uDw^3+BhJ`x_2w_3)oYtnm>JrQIvrp|P#``@HPVaP76)u-(}Yvtw;D zu`S8IW+Srg;>>=EU*gwlpB#jaG6;3A0@{gH>+$F;cHi3sw99>{KD%%|vR&K23F%Qf zm!qV5FE>N;-MzNO&VdUnu zT)g12)S*=~{gmgb^*~L3jE8+brt96|~qqE&Vt(_G`qi3Ko z%>FK|ma3vLDbSc{zp*W~mRh2*G|*US?@!aHFB*3T8h6=k(`sod8ixXn7wqfPH2Byd zUIGRP=PCiJtHtzh1^dNibL+}IK;HxgL})^KeZ`dK~t z1;QGUW_S)eObGcvM2|UvMz_dSJ5x2}1$eY4Pup0vHu}1?HlLeDzd+UM@w~5%W8cZcINhd5aq6oj7%H+pgL_Vx1FzBYxj<{F%DF%))!Ih z6UcK9ME0bqNjDkc{jXFj!cgY^6xoRmgh#aXRtm4oi&(jt&Ypj3mDTzH)rPXFI!;UU zK~I_XJ)su;muijJ$KFoWv=-4{TCKBq{`j4SCOB88&LG}|O5yY8qcPVyaac)dX?F_G zLHl!eI{8TGX?;X7 z&}_y2;0c@~@cVPbnd(gxjOi>-9g(iMNjB^@TprhM?zF-4+O?bW$z7aaRV7H|Ouq{c zA5+b?-Se4v{SaHx=FGEbDvqyIgfLcl7*%FToT&z)P>ew2QRGUb;=a1#zJA54XqX#6 z?{?dw8Y*~-iT6BWD|!d>ESierqrM@G6%T=8mc*IrW#nT7A}!WpIAK}U9`97yfF6(M zoU_LOt$aRKgRePKB z!$wrR&9C@s8fK4k(H^Ryg8P_wk07?98<=O&R6HXEV`aUem?d$hdJ_2K_=+u1)16r?}rh#&5^nx#yoh>)d^;*j2nS0}U ztz>V^eRRFn)XpxCYlV7kWSe{;d}+P5^djoKThIp*_#b$_%A0XuyET}2brIwHCzP|2 zRJ>lo$LpPM3Rv~73$Wh45pE=`dbbCHe!hVHv2yoPu;Nds3}}S2fgYr@S-q9}0cGot zLpEpv{JFGEH_giZJCKcO2^j~#H_X0Txm9_a;TK%F)GM~JG1Sv7hIPLt*}tG%y?Gts z!&w5aTF}*6y?OGDVyf*PvuK1{rfU5nADeNu-LXPrR_RG3Z(*1Q(37omk6l5j0gkr@;SJN;cU&DsAvvI3h9+{rq30WMkbUFDNx862Wfqf0dH0 zbdNA0uM$7{LzxF5bOB5s4=>WCRiEj*o<9GUk3FQ}I_w znTr2q&s6-kCEf#qo8Fm1*G55G)k3J#{oOQaVac^gC5A} zrt`?QVyvjJ74kf%g(S&NS%sq@=B50<_n8_nCVgClJPqcc0eyATJ5$`hXdsgUYuf!r zBM;J>LK=C}_ymwy2&VDVJ~i40f#tp+Lm~DGMEe-fKa<+ib8w2_9fi@*oGaQhf{C&V zX3m0d%N@X529XspYkEg$^VY(AXm0rz?crpeX!G>L`wY9G`PRQ^kLAq-YDX-%?2%Zf z{`ZPm+I+8=pN7unSB=U~l#`SGX0hDE(cdlRWlpyKb}`MUcTiT&NFA|+U7ic@?^q^Y zS;SWK2g><5qf|WjezE9+guHIeRBTC>#Q6Uw%Et&~DlXY9iSZT)!Wv+cHZm? zIMwD(%;twGd&Bp;&)Dk3-6@!cTqLavqyrRv7`xotEl2@_^NuoQ7zK={_6w9aCBRDAe z9#OHoH3XNz0kBF)s5Y3YwQx|sQ7G4AEE)FkS2-r& z@{vD;{1u}{&0zj5`;6lFUjvFvt36I#cVyj+n3thu)a&RZcb4MZP zkGt_uC#*uw8~17_74IiLypV&-4Z4<#^PGC~!`zRvi`IObQ)o}P7mS}PbVcPCnLM&% zOx7w~3q9`U!?joMx)!S=wgsY0MTPk`C&ymb9(%l*A#;+~<|JzsehEG9|HI~{zq%do z<-@|u!-RkN(y15TVk-FyZ;8L~+5wCQ3-1Q0dPScr?NOs9Te-{2+Nfy7`H73S>2-Jm z>~A5dLhJBr$libz;+0T$(MLFltmszsm864w0p5)eu0~cW zwf9kwx>9{Oyi$4FxiA;iaaXPx5L#UWLaWQt$R zX*xZ!kS+b*)ZhTGiV&_rJAQy=5JJX{;|Exqf>b)u2;nfDc>PpZg6ep=b`qTihv;PT zLZ`tI7SVJX9GQ*0rqkfaJmkZ4qJ434)2H1DEjlQ);LBG|O_2Rm@(J>yPmuTTK&gNr zuckVvgT8}O&>~-Mfc-59VZJPZOdJ&ON~rt)&p{QTv^Xe~eu$P+DRZ9>hbTj}C#V{x z%nsNQ2Za_?VJpNz<%Jy-&(4cwCMy0UA9Ho_farOC^8C zzxQYSVO&#<4`%!q-z9vB_KQn+6)piGJjD}Hq!nxte+Z$dGY#h#^+H0IP#|eu(HO%0 zi>5HiE182Nk&mL{5>PCkW>e?4uMdajmuiEl8lK;4VMkm71dk$whu2En4ym{VNSH8{YlB7|$uE&*T}gphIL5&+hwAaw$1gm8EQd2^)j z8q~ylF(VV6Mrnjk}W;|&OO324FgL+J!r zfE@^~7E0Mvv-1|(a=nmg`y~1JZk(w=l7+ThF_f`=nq)&Do&aXIAcSeM0y6Ogz$>6i z@dTjB|8=KQ!ktQD7K)N4ccJJ#G@DA301nZFY7bL2Oq07|hm*+a&tel~vHO<{FF{J0 zRE4BELTD!ClA$)Rdc+M)h9S?fyULbphSTg(7_CGDM6BatNai7g>ky($1~?TVWL^`6 z+KVViC5jJ+iNdXdp2(Wm1M}b1yHPOu`oBzMEt_h=MCJw)x#J$o!e-c?$oj!VzKvdR zBEN@O=QXq`wC5a(LUmz}_)LVN<}{vP)By?C`}vaQ6%8cZzi2d*ypqXC5?xS~6ImL? z%F=A=LxrcH7ZjvUqz{KDk~cOBXQMjaM?Go9j|r`K zlb01gCc+|m#gB>1Ltd}=F_DGHhgUr9YoheIA3rT$i5o@e=(sojg(#hEss%*p5)kDO zZm{i666L&rC>8`H$^|fcF+!Lq3n9ygJ>qX86b+;C{Gzc)NR%Q;^NKDf+`nislf07E zND>oKltd|HF`7*!N&tt5LbX{`4HIP(?2ss|{(Xe-BwC5bAtg~hg5(nxO(V(|z`iDK zh;kOjjbmqs(%Zg=ZLNZcb<~8UBSN?iAxcAlO%OunHBqR29tEjH@!>F0crUwfGiu_k z^OJ}&K139g7ov=hu!ttg_{etTHBrV#?nFLJ6x!EBnf@R?B>|#LL&Khb^IwQE%%)mE zl;HtUjz54O-6e@~Q9zV>5RfQ$!|XHcbI7CI3E3RjBiq*=YWiIj@J42L9?f2N$^ANF)g^=8e5UxXray`Hs5JKiPQK-F*f>fgT zaF{6k_eJ4LsEPkAIf*ERA)=VP5T!7}BAO_Lk%P!{3g(x#^ss%)u6%eH+;KNCxTpkdm|3jK6W!{S5Ke6a@h$wGDwgm-=--J+f7meo^ zJ%ofrc}CK_qE`v`FM6LzUdfk85|5!MiP8wgn$c`3Q35zb6sonMYM3ZL!wx5r)!%{; zoky(G1^7Ke z$h;;BwLRENBZ?1)iNgO_75;*n_z$v^h*BIPipdL6iX$wdiBcT-19?r9;>bV9hlxV_ znkdiju`K?CttlFI%{%`>l$AEs0-~%6h|&k}?@6Mp4Tv%qLq(4=6=oN*&mp4x1K9x- zB>o#h(OWd0UvwA=iE>oZyrSO;_b*b93Q=;9B#xjciLw;MR?uuJQ35zb6soPIYM3aM zVVaZ3>iTAr4*!k6dw)~h5w{1tb*$JKhcwjGAl$BlNX}Qim-?#%B)BYJP+0J-{2<^7>$|JP+MUth4P77%5BK$KgbKogTh zc_kpq%czhl7~W7VUPGj2t{>iJin+p5_*)5lI9ilBHX{IfJt7-7$k|- zC`zLAMX`LEO(jYIhloP8!BhF0_;ZB9si=;>d^m|H z3qnLOc_GSz2#aWx2t}M#{;yB|5ArY&8aruNp91(SLU>rMxyOL8*=CM@ve}=+GDPIT-;h>>^dw^* zz)}cdV{$W*+Hnd}=g5b{bHslw6uym`_@i$~X}=-=G(sM%4MV_BCJs=H ze?*sl+OqgN@X>%T_%MCUud>Hnhmmq3e46VTd(^0lty~pZXmJ%yHZ$Nw^qr>S#PFwZ z)ryup3|r42_@kLv2?598J%Gn32susR>1P1HKnRb)+`j;@NoG9DMcCHFN5+H0E`i4{=epi%V>gkaEiKrjrpp9J_6LdjShXkxyALz+FQ z?}q@sLEWS~!9U@?0m2TLfou_(0ZWNGh&U-fL0THplZ^cd!9QunWFV=1Izrk&`fzw4 z`KyY;BGj~}G&qC*iCt`E-oj%m_B%v+-M{r5zQBor?hKpHe|)NeF1B*JMfl4P{Cvcm zFuFy!v?D8WuC`n7R{-52{JltI#Uw+^^Zc2Z^Zm0h4cS%pK`Qn(lOW9QBL@p@{w686 zZ$!HmL-c+=(GzFG0vovq4P45OAI5=|=mVHjM`$fVFm;n4_z@}u@238rIJnk!_sN<| zTmx}M~w?Ozu?JX3fE@U4L@vrbGDtR+Wy-hsEXNSnj@@T~B z)u4?0T#ZNeRd|3AKhke6k2P8`vZ1go1V7Ni)Y*&h%l)l9o;pvm9g#IWCYcM_Ek3c3 zVv#hf-_%$XKfM}id_G32$?xQ_Fp8~Oo5^rwryxsmThpF^>O_Qt=xx2j;QY^E%k$cpi1&CHTDV;3y6IYha$r3O1MG5vYHf@Yw7mm`=JvJ=vl&{)xZ_>BCsEchgQ&O=qk%l z_GVfcw%|ix-xE)10r)!(1-XK%W4JpaoW$Sy02?8M`J32aO0mR{Q4YB7j{LRdx*xu1S@Vir|2!yKuZ=-$+Qxel5Cc*B8=w6DGq)c278F~B|@V%5Jz5NR~{F+dRt9y+p$_`SN zG$r2t9bjJ)PiX;|QXXS2-X7!K4dEoFGzEAzLYOIuo~9H_j5<}Rz5oZLm%74~x(I^A zsY*=*I4!Nz+{FOM2E*`2BBV*;C1Yy^BzGd5)b4cvHz0)DEexmj{S>4!+=s&q7pGkR z0De_{V+y&oQ{J6)%Dc5w9st!7XxL$xZ~M7Wyc8f%ygZY(&h^l5 z_T9|ur;)5zFt1yTt!zl@A)I8Z0>DZLVOuh<)NV#W>b&}JXkO>rf1(!qeVnEmtY((m z&x?@v&;n$~m@Ix*Xak9Ha%0rfo6^Xumc=JKN29W)U!+f-aT-7SPQy&tF@M4m*T5v5 z!VVOFn(gJ1Ow0qy86kQff_psdb}*YOD3k$4^DIQHK`ngQua2U0VOY)fGUl1-q+i9=_ z##XWsvv{z8(K1AG=}p-c2>wu5iM=Sr&fX04eoE4>7B>UjiV*H>;#X7ZAOt_0s?@sx zKS(RJ#NI25N`4b?x^oK}mFR?s)&C9MiWq^Ds`mhvLI_tc+@yA#f>dt$aA>RxSreaM z4Q&;1f25dCt8!?OpTfL296d2hUb8GdC7g!}?*A%nVg{LssgpV}b!1|2jb!Lq&!3q& z(+=T!0u?Q^i}0jUZWE(8IWY(VR&@iad5(R#5eJD@K*?L8>k$0Oy4JoGVmp8Cg8-jF zSZv<~;97eR;XF(+-OK?9-arVs87r|3CdrMjAn?$iQ*nc`pAr1(ti%T>#mPAxC7L3f zG&xlPR;Rg;6H1grYgno?1fx$?swcocX{DCfzbCoT*4YmmiDAZ2A#|@jm7y5`XQvqw zZcuwU1*zQd;V?H?6CYm=al>4gR2D*9hwBt)0j?^l+g52_)_!*-4r<7O@4b4zfnf(* z_M*yrzD{F{oO*EYqPL?jnf?8LAD>uA3b384iaavCJ5n3f(2AGBgX|+%!Wn z;?!PALF$P6@JS@DzZHAWm|c7J>Fi1XS$cd@e&yPV|R%j^6Zn9~i#J4^HBVtKh9 z@1{UG-Wf1h9>E{)V%AmxKsAJt6F5L$=O7V318f+T)6ZNz0rp{m&{)qM3xMr4OugC3 zd>gj*8C!*rT#Im$tr-AkBZO^frUJZyg4A)N5yGKyD`ZW41wzQxnC;IlNcbKIHmvE< zw88AZP;Qju{>R~44sf8(Ge`VOMo91S_G!qX;GKaZuD95uPzA$ww-~G83XX6zgG0{EcEGA!Lz*#K+^HBtdmfP5`G( zj=rh39PMAJ9CXIXrWi1i(Qu!)fR-@>bHPEhWChZAJyU2VUHM~iXDIl^tG zk6?@=T?GZJAp|4c%~&%d{c14MO;H`mL50Z(|4KnB^q_(n>j@~xAz+~^iKmWr0H1QK zm!JSUchXp|0=S0OQpfr`RK^!>>9Ov&nZw7&#Bv+)39hNt_~>RMKE`{UeVJS!w&1z? zGI3-rd8WQz|F@zQou6e*`}G4n=LMU)QB{lYImkuZaTr;VQFM=_v7*N$ElxChAG;B# zKMU2j5sIu2In-9-dV~6C2ep}axS9c3&QXa9$0gx z!SrBw-Np8PRCulZhEzNGTKi*U>_LfLFh~De7N$<8IT`-M%Yb=#MW_Pdlsg`YuOa6D zhR=p5kK)je2&$pR5>$R6@No!5^KfA2mt2daWEG-f-jNvv$we$FcVw($-aedy8>D2uRxm!08Bv zwv9j1v|SEp72#Cc2C$)R4YXuhK-iLdR$9`Gy#g>9OK3ac6hb6! zftZYa2BO0hhZuVZGBWlE@ZS(l&DifD`H>|}ASp&jXY5tLwx*R5#$FHbhSUQ1 zUz^?G6VT)(yhkCosamyDzgp}d)ZYA>*!kzt~jKF~XlU;EN7(o5{-*8kFsVd~> zh91US1W@dAv?hYql;q>UN)!VoAx;NW1Hs=yCRRc~N)T*I{ge?;JODALy*otxD5j$l zH&sM8MIT%W70@$X2=NT6ggn!CD9(ANYy@R#^E{RqLrSfBFR&K)g9zc7lsVZ9a4QRi z&rh)~Xhx>2>%!s4{yZdg-7mE-`4sKlz#mXUs?1qsK z5$p?RlEbx*%5dc2WdIlBKnmnpvAa+(Q}J7>%k1w0BR_rx*2<{DKB#k&tGT)f{woc#+_LW}o5 zka6)+c8tZ-7VqD{Vl0zVt5y6NdQ$^pC2p6|-0` zq^c~|;|p=Sl4I9gMM%ltp`4i#t zC!_$&bBRX0FF};ecwI{EB@W-`ReOotx2tK@aPj`JTVPy$#2WZst^s(n81-%2jWO}c zA-1BwQcmquJR=38W1+Pyi8ED26pay>Z(l@Pbl|nuvh|Uv7u<{e(poke+q6rOrQUUR z$s{P2Oh>fXo{t#F8YK8DydEiEkEZvNszDNPAJUe*HSHG&IVnG2*h>8>6EYHqn2-rf@{2ike?S<8@RZ|| zcn>DnnLnZRH%C7hs^VT@SVqi}`Ey`Q3Tnf1Rfh zD4wkR2KxdY|Ic}vL#=3AOZ>KE=rd#m4nALH4(5ogc46!+VktU>AQ7On6Q z*g3aFknK?bv{_L-WY5HgGNZ*qRA_=tMx&kc8BuR$^_O$ z2|RocG^RBoQ06)U3#d`lk-*-D1jaUo(ZmG=hBhMbBWo!hP2kCG1ez}dP*OyoAO1OH zXa7Wv=?e%H^&{}g4H2vH`KtinbMuH-*x8FV0qR94dv#Yl@KFCAk@9ji``{KloZU%e zJ4ajA8SlK0mNaO67P8YLm!lC4zD9S?m=QUGGS%nKMitdZ&q2J>z9j<*(z}>OR@zT8 zRV(d7Ofy#6pE1o@X&+-6Uuj26A?>`S@y@Gb@) zz!dEr%M|UM$uxeWU8(`n8|~$si5u-LI(bkh`*rexPL4BKZI5e%Bm>`zI)Rb3ZnR%* zDJ2i7>6-Cb3}7gFoO>1ly&uPavY5d4$o_d`UhZD9JIMco)i11)bE@ zNn4%t(#bHLOxDTeI$5TZ+jO#9Cr|0*HJyB>lV5b=VrilgXXvDkPTJ_Cr%smYzWZ_Y2_#+*)L4Atfmca{ZWk!>Ny?%0BC%Y~pq_I>9e+e+*<>V<3@z7#WiOeUj7$cBfZ4;``mmXZa z1KIxkX-jsZKC%O(GnY0*cA#YUZa}s`vUhVnhsexj!C$#kH^O2>{emiRINu%Xd@>*K z1R}a$%`B=^_y`gEbs7ZdKqV$#9I;jL7(|UnHA{ohuOx(ivEUMDO24XMuT8UA5@)K~ z5XJ~(Pg;uV6MAM=Av;~@vh7x6=gNdGo{H>cGWjtqfA0TweSv`@xM$pG;cd1m7F%;Ql!o3yEkzFBZyaC?narPdxDYERCW%00tBP^dgg-8c)I7~Ogb8z+ zYFS0+^S(H0whX7;NX^PlHKa~+tr-Wynpks&sh0|)O-YDtqM0m-GgS)|i4n+daV4tj+6~8%9f)|S zoX*a&C4jr=QRCWcVNs>R0z_;DRZ-n8Cf@yst%^4zrd}$HRwN;|f@ZQL#wZ~lBar6K<4bNZUP&tE~zB>R9PPVO;MU@Iwp~ALN6^-b{ z#LGi$Rcwj4@u*g5Fxr-c*fyHM7XT1vssa>=F`He`8P$zob=hm-$(%_=5Jl?!jt69L z7ZMPdZ9 z>%bd3#l3MHc^nZBGn{FThehNR=~h@y4m^h=o&(>SLYvxHEKuPlL~IiaqVi{$c>57s z6?Y+~UMh?>B_XznX7D`##F^?<#4%>G-{(4>C7$#NIG<)Uff-;%*a;)?07vO#xb^Q&S@ilg|74nG=e?Z61QrwEK zv3ujR)2LWu4f^Hd;9Z+r_XcfiApeQYlGS^nO?LLvm`1O|6+gpj35e?Tn856t^(?D- z1!>vANyt`P2m6tK5bML!6VLvW-Tnf3>ZQVs!VtSgGg%U6 zswfJ^2xJdpqgqzLabyW19%htjt{ZhW&t({V)2J5uP}P`IfCfRi!X=2+X8&!AY%MvbZ=Qf`uAKijGFw|t`k!Ob{e*1kp2)Ub$kSiOrO39ufavQpknK2@*=ilAT4`HPs%WW{}lGW*af zWJj%F_F-l(xtG~(@K8D9Hz;JQ!}I184)___u{)5RGLqTaV0ccV0V{s%0%YflBWbc2 z*(=3m+yM`pvp~){OJ^Z_J+Dl%hr*}iEEP{PwiU9=Wv~1r?iA;&mfbc#lbo|gEWFqo z*_*^dAv{9P&9a%kwHLDM$@c0$pm}!oJ*9A7ZOWZlc4;)K#o4kA%VFUcyRd!P%)T^; z+1WLbJy6K(kMMapZ}egIduHDp!)&)<$i6iT*#%h!uO+pkj%v z1`p1K*2u^&f1_~D8J5-Z92tm#*yOeRtb>&8ia1sdqk5B#=TWVAofd2DNAaJ95x}|B zdmzo;brD{@s5kV{x_EifS$uJR%qF_)0 z%__KK01OtKhXINd)Ef%#ZmqN5#61OFk?S0O$F*|aN8#Wi5kJ_r>*M!9-vI>0oq`)& zEA|o&tnb>xinS4(Qub!}z8$zf!*DCKdoIEY{4hEy0!~^l4rXqSV0O;Oth0#na* zfI*d24@T7LE^JB!1*~r{{&+;(aW;0PZvR!(ZH)%w?d(Hv0$5%i*~n7IdlbttvdnqE zs$~(k?daQWfGl@A* zoT|9=Hjvkn6|Q$4sO4Aa@f+un4G#ZzsGH!`tq9~+XWZHV;YUs*w>i1`mzo zWTP{%Q=s$rX+SnRjcy5$t1!ZmEzZO-0mAR`Ms9cJCUr3AR%DxV2=iiU=SNN>+nwI$ z28jHJVu!OD^qL{HXEb9%H+g!0JT@*^sVkXeUW3@m>dCxJpdH3zDHvWDI1+l<+rSk& zQhFltWhP81v6NeyTq>Q5C`XYhWhKs0OQBMlfLp<}tWKj@?lD7<$DJ9a{T6G2Jm++Q zWj*k=CdfXgCpzlSg%IR<=O7H4z6(KKa0)sGh!AAIv;J})i3&kpblzO=8;WRx9CR9Y z_8}`O1Ucj!fsgRnAOv~MnX)1Y2|-?WI=2rXO^`R8A=!R~njmjElfcL@LEd(1-5el7 zkawILp%W&^yUyBk0v#d9=gxk3IAcc$a>Tg=%rS@%8h$Vbj)@c?PaHF(%r&>%qg72L?DPQ0%{z)kkBti(C09=cPSfO{W?>UEr!?Z`31 z&0n3GJN&`Y-2B^_ljYBORCDtmXCyqgCQC#+uM^H@xYsZ@Ewu(`6N3mhZPmf^5zWnr zdJ$u73~6p=sQ4HkGTbbs{+^M9gqxXaeCs46+{{w*l3q`9v$V==;#a7-nXMjAx*>61 zWz?!O0v+LIjv8`SDmTljgP1nc72#%OH5xwOAi~Wm>gcur5pGshg~3pw-s%}1DIK8e`MD#N_tW*D!L zj{DsF!+CNRPJ$F0ZvN@K0R{qZ5SQl zW<~Y-umBNmR#G*J4FYbmhh-(sQO}`8r3qy3c^>~a@!Wz;+_nZI>_{`E&#%puRmmSS zP0_aMoXS2M3`N_?7l2YI+Fosn`{nfcwS&4ad3q6wo}-rI{H5nZQ?#S1x5>9{+-EoS zWfdPX6z#6|g?yz@^gK1dPHG87d#Jz83m{F=o~mJTmB{(EmpU^^NTFzNH5V({kVGij zM=kB1O3}V*F!m!xM<_a24a^S^q395`2s<02BNQE~HYat!BP%joku&j{6jCsk&lQR!9?u zqODaAkX8^w(a!4Tr2!%o?W)c@CqRUvd1?`Cm{LN~{;G3cfCxngsv{tz(GiLks3Vvd zK|oRVu&l&6YCNo!CXij8p5Jr-h*{QalaY-~G!&hr_6BpPDVk8FoB30pp}lCax&nSC zg`y>D>#|_1Go3)Gp(bF5Hwp;~|iU`Qeqy-Lj(6(B;P(GpBr z#yOZMq3DQ9@p}Xw*riS|$#hGTq8Bo6C>qAcr{g|Fr>L?hn1kR`beh_OffvM3bhetc zE#sSg$hh){H?Di0@TEDJ?%P#t<31QcZt%SxQ1ve2T^ z1hUJLq8aXb%=1%Qk&SFJ6y2;cF7U@pQ*@_V2Ms;-)ig!_qrSe_hf3)a{T=G+ZGJiJ zMekH~`UQwk^e#1ii;rlE?oy?*eM5$#_p2W!`;ejN1L}+FNk}OApxRh52?<3XQk^af zAWhLn)S>o%h5AIlM-54mL@4^GI+*lqLea<6lM_-Y`ndWXq%~v{ioT#GGzk!)=zg`g zSAYmbUsOwzIzrI{>REV5V@D|ZvRatj0t-c7QJ-KPhfeerFliZwF-$_y^;mP9HBfXj zlgu56t*qZEHxv!yS=0&RK1H{xUS+XmpxAiP?P?IZEr_A$Zgm+}ok4`6_p1F%0z@df zSDjcIAVSfn)rjcYMrgC~As+rj`Z-DWfU+xoXqhXM@rdJ)$OnAZGN%i+-WboD?8J(J$5R zz=dgwex>Sc^bHw`{#R|k-iHiDzgMlwCn2He59-4{Nk}OAqw0gjm*Pc#R;N!1njl{E z7d5#{fCxp8sVgzPrr|=-U)8MZQYreIdJOwowj2B%Pi2t^&Y`{n=fP3 zb2}x6L?{|{e{K+z5{hQH1Nx^>l#jb*ECio~qO}Vwi?arbc4v~=8?lvj3+0B2VSHCQ z?o;$*bqBmu0ZkZ+exf*bf*6W^qwawBGl)?1s5;j#b($>{J+8)#3v`5{f2p%?4G^K| zKkB140U{K&+~;pF2q?-PmX$b1<)cNV31nY07F#3N{S;T9uL(s@bM;>IboZ7Lf6O#R zE4v#pu6pWoG)1ep8?aC`WGGtIoq~(JFh#4m?_3xlLeaQe7j z{WE;XP_(Z5V2>mu6s_m(9+8BEqV?U4;G?!>PV^1k8(aAmYA@QzecK5Tp=e{b)#3mV ziZ*faQ=XJd`KE3;T*8DY+TLxBF%DC-gL^B8Z4ja8Iqr<4j!?9d`y}Sm=mj_1>xU1|GijKgfWz@z*2}SS4I^e8|Ip-)D$sm#hRKNsEkRXC0h&kXBF`=T8L`8fm z>JxL$sOU4GetVy)?zwk z&cdTIB+5RFfpQ|=DiqdmJKS`77>V}u77q`4QA>1yw|7x6^k$(S=w068Pj`luW6;MW^W4t|~l@$?*j`jN2FR>Dd zj`Nya6;gVkAMX`nVl^(vEIPs4f+ibABs$S6i|w6ZM52?t-#a8rbh5X$WQmZ4ey$fS znKNY;o#zd&5tbtoo$p;-Vj~h=;BDRz+K5Ci^~R$oP3^8?17{lBhl&J#h7UgBNCnI%}Ng$k?3r%<7I|{MA<^@JQ1cV4o?|E zuK<_r)v+R6@lLf28PVpgUW0nc+T7{cvqBru=Dpq%%R)x9d7rno zbI6D`@Av$YYbnv@gI@LPLmScNUhfzdi$rZcHqU1>hh=GES-826?u!c3pnddDgn#%Ob+*LqOMh&DHQcVZ+Yms#O= zdv`Yr8JRx!c>SPgVs7w%rK(OyS+nLYlMLw*}@D7(^W%wRE9)ZeymJIyhC}G zHCCq2Cyhi8cr6Nc2^2|HP2e5`E44 z0=rk^f=r*UdoC6Z!-z!R@D5<3Zy1s2DepMW|HPa1Z+g#`OnV~HkGySd!(1ZKkG**% z<%mQ-@xCpw5s7~0EyvPe>Jo{5?sYFIS*Fh~ywA5KNwf_HEhPm5B@(UL9>3#f#Eu^4 zA@w9eE0#}eB$~)KEX@ZJea0IC^}fSoBhhEQk7gUjNc6aO1Ll9R$+ktJFL|}bhm1_0 z|MA}088RZ#)85Py8(~U$E`BSC& zK%&2T@1jY|ScH-2?;gLeC5(}%>sLVo3?mZt{39zvMkJc$e}iSo*oZ{S`Ds^%j7YSC z|0x=2Y(%0t{;Z%JNR%zikT6{>f=6XYl)YKcqN&v^tNU)a>D2c1by6LFafhJKv_u>F zyA}sS-$pO=jr=Pxh*}Mq`cl5J|L2Y%pI+#j_;vC_MkHG7*QpaQTB1$;M%ZQRf{a94 z`yXR54CY7qlV=-$b=?w57W%gSqs>bwk!U;rG0Xx<67AssfoZ_VPiE1M{x+O%i4yJP zA6XqTGK+Th-vp}AtMqU>@Ua4X=)dV z4)Gr4)qUXVM*A8uELrS=0M6i_Y?YF1bY`5}ob$7#-MXiO%s0a6;&Uj6^T> zCsqh3Gm9?tk8CZWM52p)zE{ZTF(MLO>@S)SQhF9$>i@Mgs8G+Mm-#!ez9mX@nSV`2 z$cRLj`}Nu+OLT>w+bXmXiC*V_x+P>pqHFxYGebrsy4JrCZkxJ9qBr=J2ZoGDbe%r~ z=fANLiLUqm7?mW^A`Du}57jY9yiPitkH>c~YLMu|JfuF3(27NgjYJdqywZFi(J6jo zEGLJUY$Q6(uXcxFj6~=8^=}Osk?1A<$5>+}m)VP6=|9{nWJIE?{GS(vj7ano`FYYNR-`-Su`c$4aU+q6TNRcHyep=_giA$p!-ZqbhmGX zGODO0db>YxY@h~TOLULF2+o_n7Kz^Bcfx+dFe1@A{mHikjF#wK{wr9xj6}=*y%YBr z9`M`Y%-7VF_)SqcnMfb>7xoL-cfjf$>0bZEIRU#u3-ux2O9`m+wNM}SpWPHxtA)DH zzW}#CjBBzZeZ*giNyRWC)cyY5mnRGLQGcl$+K5n}^H&ZF84>F9{s$#zstEOv|5S+$ z)MPnF{2#+^@I|Oc{b}vPazv=d{21<3CCsHSV(3z~osXfSP)Fa6+ld%E2z4Y6sTU!{ z-#?jdgqp}7F3kr*z15!x=Vq`7Bh=gc+_+(kQ19_yfxBX3cBJ?D)y@kUnMCo!-!Cy_TOzBG9uK2{vtRgHV`UXm?0tl{t1uDkSJT>JKVWfo?Q#?mbw^j zI-eV%e&OG|E$A~X)bIUQuMUR3u@>qXf6AVKO4CC9!GC{pkWVl7Kl)Fu3K;H0NP>`dA`n%ux%7Aju1w#G9UjR3?d|&?S@4w5-jC#(0xo*H(s=Q38fBK*0 z2V5gOOOGkn`P-k^H>g-k)r#!L5|SuYJMvA*<%>wwjf|d`EL9bmhBd_G5~-#|s)gO< zi&WDiAEHx@jYu^k!WUN=Mx>e*seNb2h*Yy9uQmu7k!tzK*SPdekm`I4UP`B$7%WP4 zI(7*hJxDdeLuwg>R%{g0jZ_o)*`@hFs$cu-@4|!qEW$|jTYuG1!x*Xl;_txZB{oK? zzxu~|hm1%y63Igs8yk^oG*UYjG9uMj`d z%&F}ncMS;{k!t(M;MoDArP?79!FiT6r*@0Hw=AICgMn1LM@FKvwc%6W1XAr08GBX0 zT5Yvddq!TwmPT84%+gZr9r@SXpkgi6K9L`$hK$Ur{UY0@gp5daK;-A`$xcv=)IeL)lzj#P}451ZEAvRJ?OJFC&~Ka2X+9(2NpR5b{qjp1YC|zXbtYMfj+| z)r2nyyo&H0fmaiLEASe^zXh%#_{y zJa;EyzQEfF8w$LOu(QDX2!{#WOE_KNKEh=JA0b>Pa6jQLfsYaH6L^5|h`^@^-xByV z;a38mAv`DWAYoZW&z>dB7kG%Ug-7-nVK0F%5snpjl5n2D*9lh%e1mX{z*B^G3w(?4 zfWXs)uL%5r@FRhr5dJLi3&Iqi6@NomN#M7Hbp(D#*jnHj!oC8}5?&k-xzcmZJx zffo|?5?G&bjKD^Om#4CXri2>>wj{hmU|Yh+1$HESQD7&+cLjDP{9a&JLI+Et=k_El zC$KMJk-&k3Ed&lF>@9F4;aGvA24Znq2xk+%EpR^JHv$(D{w;7RVMaP_FC(lja2a7^fh!2R3S3DzLg3Ye zGX<_8yjCvXR$l|grIAh0Cs=)6Emk2yVc)h^0gtrO&m2jWH zbA(3)TI&J-BTx~3BhVxKOQ284A2nevA*?1aPS{9b8N$v2%MuP1m_|5FU^?Maff_qsHz|Mqc1$H6ybLd%D!ioaB5!Mpe zldxwc8uTR`EpQ;=9Dzd#R|*_SxLM#R!n*{HCVWERSi+YDP9Xe1;1t521WqUPb6MML z!W@C~32O_ygs_#s1%!PBE+iZ$a4F$DftL}k61a?Ti@@cCcMDuW_@uzg311etlJI+M z^*r}#Lc22I8p3RW>j-NIypgb(z)gfb1a2lAC2%X@Y=PSeuN1hGaI?VM3GWto7vTYc z_Ys~Dct7C>0v{m!QQ%%eRfV4IBP=iQ5yB#Y`w5#1e3Y=Kz{dzj3w)e#w!i~~8*oAD zxd#bv7kG&9QGv$@j|+T>@U*~}3BMC~g3!um2`34&1insqzQDH#n+ZHk*i+yKgkuDL zLO4g@r-WAu{ETpuz%K~z6!;C{;{v}Wd{N+cgzpOcp748tX9(>AdiDchmcX-wjjNIU zm9UGzbA-bMS{ndo2vmg21$u<*1^R@$1*Q=07Z@jeL0~%JX@S{<-wUirh+p)g;yl7^ zft3l*7g&X`sla@~?g9%5M+!WTaHhcX30DZLLAXI+5#j9uYZC4kScmYfLRNes;a371 z5&kK#DPj6~G-yf4TS%VUim;Ku)`Xn}wj~@Uup{9tfn5n#3G7L@RbXGjdj$?8d`jRT z!dCP58LL`GhYDyoB&wfeQ$~7r2nnDPmzu2`dU*L0C`VO2YO6uO=KUa1G%UfolmD z3%s6ijlgw;w+OtEaIe5kgwF}wO!&IMErg#5+)DVXz?%qDYtpmrgmr2W?j&q2@OHv} z0`DT6An-oI1p@CUyjtJ`gxdt}CA?qYKEme(K1TSqzypNe3Oqjj=9+%51`!bb$Y4ro352JXyR-%Q4z#_e`1 zEcsXYK;n;m=it(E9z=1WQ_p>V0j%qj!D;BW!=Ejj20Er(_bJGyjCIzrnr_t=h;`MmTJAAyl%4K6R@+^LO^(x3$LhF4=Oflz$LhKju10K- zj@5HV;_|~8tYa6bZm3D_q%4?-KkPDMdn9d#8l?DL`6%en;}C05aGF&eRIgC&;dJ~;=m z>N=LMenV;EZ|#MaH3cT{YbFo=e1ujcgP4^h^C?Lj?y1y=U2FU=OW;|l`bnR(DbtZN zs+xj~s_qEmeGsJT$0(y}B$;st()I6rV`>xpiAoq#ia%)|PV`pYU zOV#5zivRs8S{BXVC%*dy|M6i7`2Q*~vnKN?NgVEQspT+?N*GgkMY0tq;Y@My-GJV> zL+0hW?HZtEd1TndpS3}(vUUSM;R7pf{524sGGcp|@Zc{&Xhnt+v!G-?C5c1F=%-I& z>R0iGVN6|)ym3ND;cmuicoFySaa%ORYX!A?3~pwbXZ4iT6C z0{-**#8d7Iwb|X>TTU=Wf1!hrR-Gi=w7!6 zv3I^g$2iqHyKOM1`KN!7SeMNApjQ8Ow`c?oAJ{%kx@HttL%G)ugGok@et;b(5Pl4m zM$V7G#?3#1j{UN?l+n|jhH>-1E-RS_s(Zo8aOPl}S_LGAjg7JWLPV^{^TZsXWIiQ{ z<8Y?JCMJU#Q=cMJoa39Se{ENWu5t>J^O@GoV3Df-tY3z;vX3M&4Tb2UYJrXuW<3wI z4+6cSh3G zZ^y;>KtM#=^&1cV-w3V9!%SyoXm0|alEkqEFTk)|d6hK{+4ypzbl?2NN=E`>?Ju6Pmq(2Y)p}D>99k1ts$-NgS(Ag(1X>Fs9ZZj1xM% zZ8%3(gbVeGP@nC>xTzPBA{GCNexMmD_>BkuZ-iFlV`64a=2Mb5R<<67Q3=t0Eb?&@ zc|QZq$A@N8#=38}M}xTyaD4toAFBhaD%yQA$+Vd25=Q70R>=VnlT7ska+Tl`s>5CEDW18(B zL}*2LBiCjn$$Ux@hxaqFW;tKrC;f`53JCEwC<%`sj1xK)F?aJdo_1=}e5WOPr^SQq zaN>f+`*!kuEHSAqkM$22C%^YxFs;7A5~6KXKF{&g*8Zq~Ny%S64NRL&Sgf>7dj8$$ z_|&#=mAA(dWG2_2u>bruFnJ7wh;^uURb+O1Nf zkZPNMKi1>a?q6ROP_z zSQj;ul7HQ9Fhkd=fJx8a)E&&QA!`CAKZ76ZNo`gcBdyM$4@7h?<9sWWvG;26;9rQ) zilh*WO6){FC5eNgSXiq5-C9iXFA7l!W2y-f;v}4%nEwiHL2YIX5yM+XOgg4h^nAXU8vL-i)huf}ML6*{89COs&OpKBM(&u=8$0cdMt6 zB#n739WR#3M8x)5@Zh&YXhq&&I;$?le^HvZs;RQD`fm-#ie360W)$1+i4y$&ET(#O zrcIn<#g;tP5$~Im3YcP&+cSCkd@HtGq1mOA3nw%A7yM;2c4d>AdKI#L&R069z$!BC z^s%XUgSc=l?YG{8MqV|sEuQRUR7|bHe+kC!Cw5)gxp;>i3Nb}7r*^0CO&V3c8ui`q zRtKyV=xW<%m{4CKKLlxa#Vask8#z}0Y*c_j(0#I{Y273vsg8qa6}F_&4II^*A0D8$ zPPRXWjVc_%q!l%gbX(7!LCd8}3om6-D+*xGRU3m&V=kTbJbU7-NmlHxNjN<@dD`dO z-;ROteNUiHA+#M{GX)*ojME_=Z&JhVgJVnTg%fd&38Y)mfHQH01Bi;OT0%haW+I@! z=mvK!@fh}Pr~yKGf(QQ~LMu`py0V!unJ?tq3hm3%@Ije&myN@l!%&Cqy~vDKwLW25 z$NuM&*9FqXDjFXY81HHltRntxNh*o=2#hIoUvd=gVCo~i;bO0vn=Om23#ux7nrZtt zAg%9mESS;&QyojN3g4$eybTNnJl+1E4EU!gdp6FH_>iw6x_=UVunG%ku!TJ|#_RP@ z2JLAuIu8burvi%nbyw&+Vsytp7%Zp3jv^S$Jacn$3u|hA&T;TbepwDB z7@v)`zf2Q%06L~jv0i1ZT2;~BvKQGja0lSe{biayj2fVU3Vf9#d$r;Z2srFjV1uD8 zDz3xk%No z`ijYofUJ61c>5`K|9NS1?2KosV_R`O8b`b(Q{qAA%s zQAOG%w(f;^_9#qMX$wp=J^P}yh+b-<+1VA)M`;U9-ipdc4RRhV!THsQ5!-9dgWndR z6{$i@50m+nB#up1x5=PkwZ~a$515Ew zd%TtQpslYkx-f=oZJZ2Nu?!8NnMpdGPIQy8Q+*t4!uo zk~m0*Sy`i8)?rRmJwQYyjHw8Uij#200{ylLuMNs*p_&3q)vG7tCtZx#-XtFU=?JYz zUt%#%;!~11_Ej8)Q3+#eE^wTL!)LDETZkeuhpXMdQdKru!URVJoxPq;v$_`jFb43 zB#y=NN6}FUW2!4M#Ys3H0bOC;|HTOIfAQddixBs}h*?Q8pOVDURXP!s5cj`;<0PCl zlgLdc8n# z^#+0B>N-M|hO)%fKd~UPV7S_f2fqVCD^i2l^lAbhx+)x9r4zUuK^RlrkSR{+d<1mS zCKQpmQC#hfxOVkM@kCtRBv4%4EKpqCB2Zl2N~oToD?IsoR>hC-8L_=Dc<{eNXhr@_ zY+Oy?Lsx~PdvqcyVN9I`j+1cKRXM~Zg!cJV}9-6K$3y+fe5dZ$2f^)5oiA9;(bbuihmV7S_v2frgiD^f&kTutCZ zSB0aibRsHYOm#=5I0@%tpxUU%&b(J#?Sr^>^*-@LT)khQxcY!VarHrg;_6;P^(0-P z0B#>{Su7Z?e#wLXJwhw;8nJOTfe&33j;_*)sDv@~GjN=Qb3JCDA0aI}^I>uIcaYlE zed39@`iMYrb-zGy^-+Q1>SKgz61R|ab=)+(;hzz_;hzV88$v6xjM%uEz=y61M_1`Y zR6=}X0h!_?oMyRrqvUoJk@=*!x(6xR)dS**xcZbparJ3|;_5R3#npp^Dg$MSs|Rt3 zz=Gi_@9f%sCxlj{Cb4lffe&33j;_*)sDxNgktt5X`2=W3BNUPOytvvIaqa3M@kCrb zEKpoMB2ZjCDo|WKMyL+Z753`iyYaa-Mr`jZ9{e*1t;p-d#?=HqbX7RIN++Tc#?&vs zaT3lA*wlV>0gA|cQC$54q;~Zs@kCsGS)jOjLZG<%ia>GoB%zv&vc%O{o$<9cMr>~r z5B|*vt;lj><7xsQx+)x9r4zV6g)pXWL#8;P(;VyE-PKS;=4;~W9Z1oxzAm1Kt8WMt zS5FBPSKkyUuD(U6GP!25SGyNuC#)CHwmkTq5n7R2#KzSGK6F($x<@CX62??dWQvn; zJ_YJMimtvRuJ%J*yLwtY5m(<8D6YOIP+Waqpt$-0p?V5=#npZ{;Zx6y*xuJX_&*@T z{*TzWn!tyy3P)GzL{!3<`Y&*tgtHFYksoWIh|G`0)pH=VtDlG`;_9aY#nsOQimRUs z6j#3>R8vrvxO%2OUg*q-?QQ14-;U6VtROb7Ch(!F!qHVa5tT5eb|F)ogwp~ORkxui zBJ*o;^-iQ{SHBTY#MN&FimTrV6j#3&D6XC%R9T$#D1deianpto+iS;z-vyx+sZDHL zP2fXUg`=x`8=Av`89ey&5L%HT#LSt@rzCN7fF97OIFP`H4hTmF zSaMXtm|B8NaS~Zy0e!FwMPydg4y*v79mvrRJjV*y1GlcitJE2>y)!)czaX?C{~Y2yx)!{`egUBepk(2mexp zR%8URaUg*Y9T1KVu;i$OF?AVmoJ7_)2>7gwotdv4xB`TBpg=ot2!uHB`X!b{b2#uL z5B{$Rtq7kK3miz`LkEPT11vczVNCr694C=A12-hDIuAu;7HS7v5ZZzBv;&<$hy&H2 zbeh9~c|7=w5L%H@#HI%l_|O62=m1NON{HtYfa4^xzC-X-QxuU|q#fW7gR}!RwF5^$ zhy&}oQBewS|5B^^Wt;k2j#(@MrbU-*dz>=d9 z#*{iA4v@&=qf2YAK@piPwF6NQ+JRQufgT{lfdjMjBVllWKXSGGyw{^B#h3xVvX(^;P?UrK(nAaG!_~+xvtE|0{%6I`t4gwqY19{gx_bwI!86OELxz>Vjlcf2(3r~vE)kPQ<6B=`MT7} zFs3>nQ=HJ*1GE6wYIfGpIzq6{%UCAcdCwJ=MGMq|v#4Zb&;v}33n5WO|#vSkM zR_@91xYgaB4DJPI$M(Z}8y1gV4HQA41wC(-$UE?EDvC zmbPFj^2HR3j7k_&{0(@VL`)4q2Sg>r{+Bcf=VEAK{wUhO~H1x#0nka<>V%rt+ zF(3R1Q`G@hG8$`Bu>WBM`yU?sOA%uKLrm*rJ|&5x6D$pTV1(HJAXA*s;oEl}V=rfK zb!TF_%f3Y`0@wd6m|b(}4m_FzGgQ!k2fryoT>mqjSxfPsm*%Z%f0LTF4W;io(hpFV zV^yob;ufTWKk#$A627KAPMGtP3J z!}du2qzUJ_g~@zM z5=S@bP*lR0s)0;#63$uN+Szska#yS`Zr4Fdttp*R_qFm}aovP92~AilP0)T{?{IXq z-#0jXwxbr;;_~aH+*;lh!0VmgP)99k&jyDNV5n#5GevmAT+8|ksqkGjz`;*NXtg*M zw5j}7$D~*-&V=Mm0cp%*EaC1!sB3$WVy2$rx=d>F1V-Uj#~EkNEU%o@#iwPg;y$6p zF6Z^?<^dIBAitE+fFO?GX8 zqfa;mHG}n8ys?_T&BWvEy#vnsIGvL6izhAZaVszvJ>?u*nw*TmWMksAiYX3ZRKl1_ zZva{ogjt_7#4NlMxyxUpWtt22|Ic`{fMC3TAU5NDj@XQMq!F+g@2|kChfs-(_s_U0 z$wVr~yCM&M6@*rcBTT1;WxOTDYVkoxa=a7G|6ocu-jWiGcV$!;jQ1;-;SM|FUQMaX zW?jW?LW^C_w^$_Eh`=H)7L&-B@xHrzP=P=4Set2E<%2Tja)zv%_z zE#6p7Utppc@4@j>`NflPyvyM{N-Un^%Z^Re-wBAS{~{766K5l1k{D+hxHSwmrZ~(| z31g}dd|VTRt+pfJET_tkvRhx2iBTABa|&!d6c?rC$Jl&2Ud@M*4B@18_y_|dwnrn| z--U=3Swm{Xiqd>a5=T!ifMHDCg)mOorYcsl@|@7iudvmBSPCbGVGHn(C{j?%c|7>F z5n7QSnJx=i65k?18}j8Z4{}&-?eZk92nZt)RDM57iAoq#^^r49B5NnmMa@u7`OQv+ zXRxd_0a0tkl{n)zJ3NKdLe@g>>Yk6MiWsrIJ9zN#Luf_T5i@5ppOVC}^(;9mVNCrC zI8MTO5?Xs7H=|U=rp{aVJI0u7q~t8Ee=8=8N)02J8E9eK^&9K~(X`JLJQ+{j+3tb$ zcnD~n?C)%_+6Ky@d01>Gx=&LH|LH_ER}j9)_DrcqsQ#2vygVr_s}rs!@zIZ z$Q8Dv!F*)Pc_1B%PRK0Fh+a#IN73pm=GRIq?2KzHOSfE3ds&;REvCVKY|?TbuYPq& z9g^5|D-(}mU@H0co6}0A7Vcx}Q#ccIp5L%L$pfpI&D$fDj@m1+C-^_ENdqirGVUkV zz%EhcoT$Sg#CF_vFT@?LoPRS5qAC|AGN_eM`@0+g+xwUY|4W2cq#@H;Mk&50`STNa zbGEb-*oOO=((R%X$==&-mzL+sYXwPuX(8$QjN3K}IUhf}AmIVg`3mIb$j23~r!u#>xJP zi%!l(ss~uEIXUB_gxpHyOrVPy+)3q3BxuW*5B64x_Po>jFvZl*;Ih$rXU+q!A( zlw^OHiTg()@kjo`f)14=o@8RqbR_=l?kttq;7cY(2O#mccMu|%RBAPeqo3@FLy&;k zZ*y`sy#zIBM3ZM?Fp1hNamkrjt(a)LPD5xHp8&gD`+l5x*m28P)81!bby^&nRJA`W zEHPn!`V6d2J3^D{_9KvZP>K}A!0L1`G^t@fl2u~DvC@wWclwehyWvEoDmI@94H{hH zuW{OK0mI>2VOZ8~SFOa*>TJ(yiKf)I&!E3Kx4CwU+BBx{a&8F}kCIGex+#jI zk%zO@x`IVAbW46 zWD9y~6|W5~hT82gbtRTTFRbEwXwhyMPjfpD^8&SGYO#ushKUpG<(qH zPMkRbr>uQL_2isg>{dbIEW5}2lCY^*p!3I$MN^m)egl#m}82QJ>?* zLz$SCj+{&E+_X|TF9{Qu+jk%_Ddz?zX4FD&uC%8Q5B7Sd*aw-o^&TW%Wq)yTsl=C< z$X#L%es#PpIkD;YOx%Eb)s?=o52E{m0Sd?2YFehXG09nHe}+*?G_i_nG4;I8XwgRd z$~L7+@5;oBFT)8m$WFhgRMw{Bn0h`QU(LD6uD3c&wThQ9VFK)Pw%gBQko5!9rmZ`f zC=2mzb{>{OUX++I)u(OobD_l^d&wQaTCFEiS?aocOp9^zt(^PpU&j7J5nU8oA_n{H zK6U<~gkt`POCB@NdCGnV(@df;wYa;676sY@5)u)1jGiuKmXe$8Bf4%1Lp4%uOyRp=q^gb_WI~C&T%W+b%P& z$#Pa=SKL3e%W=x%tW9i#nCYfo8Jbmb(u)3vS>jOgS8BTcn$A}{{vks`qfdplJ)Gw8 z|6ywtJMDua`#75h{)1UUvucL6gPoz6sS+k#SQ3X2+nZcRE|H{(oh#iaP|hm9BJt!c6|pg(rAEKgf{t zsPi5+-~XJUWLsCfC(Llbd7+euOS!K*^HiAOS*Lv|?UiH*kyRXlV6=FSI(57?PE1JU-1#UhDe(jo*W8NpqN4lu9{gPh z%Tbu~cP9FkQR!~yBiQg-C|FNJIY_gt;)2e`Hm9n4$$81P;goC@cMZ*|yL?yYKNe{f z^SMu5^Fz*ySdkOWqz9!}iZ|2DgM&G>+!1g#(JZ0T=K`}zhnyCeBNEL@x8uveHmANj zujl`;wTjbu!OEH|z2(frWl&;~2@V$1>~@@AIZfRYHzk`TI5<8qtMs)~9-Gm`(n>pc zZD5d zUkYq>QX?I?pY8b8=~= z9h?!^=1g}RW4`zwLwsXkR;ii0r&K!<9DI^y;~?vtdG49s`tCt7GXhV4Q&(Jj&;{yLz!4wvTfoTIxft0iTggb zSc$pVNx13@Empe61}0mSlqc=u^ZqEqnEE&Bife)} zrg&Q^Dq&20&qNYscrS>Vp2uQ`H^+6u|BM7a? zO-yHr$$X0k0=`-&{7FM{SS^l)WY>W7Uu7}HpE70rAMl}{vl{;Ddzz_^0fINa4K#{!X~sT<352`hUx)MGO88xY`1z&Ex-2Ml<_${MNSGBIk;aEsK3_ zd%6RyEMD8suVPfQ1NYVvRYPTms-eFANj1H;l&FRo)T4BV_ggN4GWsJG>KMv{KN_JG zd4=glH3@u+PXb<4BPmvkze19#(dJWGOmQw|mq0aNp9(IX=d&WKxG58jYJUGa*oK(I zK}HVpNDHHyv(J^vzCTPH=dAqlpR&J23!|FB zCzAX&BmO%rjB1X4n^b|Z$it`ws(Jc@pcZMKv1m;TqngKX_9V2?Sd68GQO!8$o8xPH z31x(;+4wo09+y7S9cZP!!@XKsFP0EhYjBA3E_YNh#0zmi;8{0dXLEo2iT^WvDkOJb z{uxw|`{JF;EQ>6(k-x~Xt=yNUUK=oW{=?N_^YX6Q0psLPeG4`xUTzjJDt}DOv2tIj z+ah36@@Gy#u9MAihhCSQo27wbSw9@`)USEo3!`0V&dw$6KhMZ zZ{G};Aa%F#({aS3c%U2aE})xu7G-S(P;uLB6;j=Ev9Zg|visIDe-ywC;O>8-?A%JW zQ!nJK#y7+7+yeWa8!YQKU0O!_exM%Z@{!hTDJtkOb%JFVeb5(>J(YXP_8y|CRrFiP zy=6H6QKVQ!nJ7XVzY`?LB2?5kOn5g)V2*^hOB4+aP2Nv35j%Qi70so|?g4P~6Jug- zr50{v3Qz6a&-bNZai^c!TkToKI9y;iwSanX@Nh6{a=F$ENC4E=I_DRS=Me!QRnSxKg%I>?0tib zhrK$|SUR^5<7ph`=vuw)?0GOQvTwhgH_w~QrX_nZx1Rm;7(8#3Nm{Skee7mykWk;A zaHrgYmr;^Bbs(LG_xT`8RJFm_m7xU(Miy%iEZvN$r$EOEqXOGBf}^xA%q_ON^6!|r zU2Oe_Ov~+B2Yr{@)us(!mC=>Y^XGQ6xd*@>I^C{yvk>oTx0Up`+qleh#CzG-U=uqD z9QAuYv-Gy7z>@`ris51+w~t+}E`IcFsL``P^|hZ}fiuKVQ+QtWvtM0gS$7yJD;-pS z`{tNs?Kjjo?2K{;*o$$Y`>Lio?SpviHwwTHu^S;bI$cgCtJ4Xl+*cbZBkbuT5>k47 z#}uBExf3}^V(*_qfx7p5l|?l=eNss}d)K5l4AUoO? zyVta^fQ!R4alqlmk8O#EiXsTC8ymvOd;|5?>bIL4V6e-c4VohIbVuA&0lEE|j`-r?;H;b2(Xbe>A8d{G4%mSM z*RKfJm%uK->p@iBynzi`2JA;*mp_2v&09Y(QqHhW1g*Pumu*eY+ccoe5d46sA?x^T z&<*opF{u7f)H8_B;ow!XA0heKi}8ArymM|gPPx3ln3+pj?;VK!T_iD;%?`}NB^oxs zm_M@5;H=BD&2$r2^H7TP-SqN&d>IkjV>!0p2%#0Zj_Ir>nQ!r6z~^~k3Tu=X{rN1x zYI=+|oD}l#KD{}>x@7b*=YzbsZRc9%B222pvnoT-!ag(cBAL7#JNq}R_<5D&os4K! z_9N{P&6Pi#Vq#Qv*%>@VU%4E!DP6X`PCWQMSbL-s(^*zB-&VLhbb+=;r8&ba>yc?N z%xi8p-Z2ifbg|Q`8P_nK&c{TV*VUfh)T~Rct?mgbf6~MA#Jcj4Qu#$v`EyK{GHow` zZ}Dcp=e2?Zl47;^k>ox&kk>jO%@ox%6|UJAVCBtgXFppBSWjz%?N4#q=XJDiMoVq0 zz6V+5{p-@P_`#R>GGxNU@mAi$8`1)ze!sb}*!LBrYAmKqTxjJz@^z1ZsDA|=*#8FR z8EsMjUc4zc@6qGvVUuOn`1w}eW7nf+jKzr|ww3qz-I#g|F%VN_-V@96LgF}yCqKbP z$yods1Cn=uKmRa9MgtH}tq)zVUwt16eR@#S(4sPC@4RQe#VDIBy_x-ukIviZ-~#Ug03G`;}D(T5Pul^(0#>M{_=IyVl9M;Cy2;k-*i z;sLC{dB@j6lse0hakFPzc_&u4#WU}^*T>DDXyv_9aYjJYe{3PLoLmlXjK$QMR^F>S z7KQOym!M1kJ#u+K)Zf}2IbPdXCm@DgG;y+(_vX$?mbFw@GX9deR^D6Z!(Bu0FUfgt zAB3Zt$e4cxo}jDE=SgaeVgLVB10l{Jr^eA3qGxqfIW<~QSU+EjnFuq3Q{x?+=6Szx z5_77@of;qWO!%*kraN6*6(gEv>q#ct>ADEY&&#(t4LQ{-I^E;9Azs~n0~6;+2dZ@J zl&D55gk+d}88VsBKC*w3z0 zB}mj>(awwW(6iHmyPZk!Z4&Fb}e$lk?miEjJ@DAyV)t6JW@_L5pqF_`3JY(%&- zsLB+dLiGiSqj=X72pAwOCT20!95~J#NJNMiK?&|hT0<_n_`MOrn3_VGFisi7d8WmA zj>UO)m7$l+BOAyF%K{r!JESZ?f@n)n^)l}aDOHeVH8 z3k;QB(EG4sRj%JRNI0^t3WmEgGQK)EAodypp_dVPg=uwA zb2QB!RB$7{OE9R+-B6XKX2V9@$y#k$%nWyK;laNhp%uBBSPD$yQ<6BklMlnFgfVpw zaGXTe#TQ`}v*AwF2kgcTD?qdVvTaP&3&7({P~Wq7?%>=h_&qU6+q;|x|0;x5Btk3& zB=eO@^H!72q^`gcSoNU28VeII{v6xq`K15YDSxq$bEJ>G8S8P?Lw3z8{>g@hP&$1i z?29)g0>;#Xa5gGoOsxeICy|vk9#`?NL#tKqbceqPI*OiDRqu8OwcCJVhE15U$g+pc zn6SulhAo;g!E%Q!nlJ;Gbn0u^O52~t-iW23?KwR7RS{Ydmsmp+i((sj z%dW>=Mkz)87L>dg8y{?ESi*cMd9jq7K`iY_<_k;nxVESa2dXynI>RG296x--FqQ-u zTe?ot{7EIIXcv_bzkfnvoJ3635}IL5tsqU9^%>AFc)HiF+Rm@lryMG4FBd)PX(UMZ zq~T(XR%paGJorB%v?8a7C1(K&Y(^0I4up2OtP%6s?+vLcjV6YwC%rk+E&*0$i6NM zuwbn_;z{VS;ClC+D!3m2-nK`*iMh34o!bK!y0Q_qtx?S{1-0HCyECLl)LI2F5jDKvZoe#Gv>J}P zZ(s+Z3v#p?PP+Bl29z~Q)bOhN>6ImvsNvu4Ow6x=W<(9Ixoum7lvcwV?l4?;8mB}J zr`(GnKf{O`-gFCb5n>oo!&~l+ut`+I+wNBEql}HH;S=|T&LJae_|%;MnHU>U!)I>y z1|fsau?oI%dqhG;)bOqQ!Qzk+HGJpZaaEv(3jAPmIgFNiZz=|fvdD#0IBFQ`ojmw= zAhaUCFkOG%If;+bCXu&B+cR(>U2xF-yN9_n05fi(Rq(uf)t!dvX+J&|?!M$6!6GMr zPUva#^Ueh)+@D8>48KHPaN7NSUC8kB&IRweOY=j9pLZ_!z~!%!O*wC3Gh6VHn~$Yb z80e8Lj7k_&_rc*fiL555@HJe%*abfuZT{j`zboi0JyZSZF2?+IFfCdZsF?o+_DhM4M@9WBJfVw3)7kWB1za`d|I0=)u5Y0 zMzq;Vt?L;uTAQs^&D+9)^t{MZRZfW#MVmd;l3syRBSf1$)mki_iSuSJHMDzZBlG4^HLzdEh&G3*)ipy# zv^iYuDzSlptb&oMFHZABZH`i#uMHW|=4h4LFiD%eFj}fS+9BGEph%7yw8{4&*#3J6 ztw=p$qs>IVU1>hhW@FVJTQ7boD$r)J>H@V2W3<^;-Ly7jM4RnZ=T;#j+U%=Vr-qDZ zv%hNFH)KSc1J$QcqA6LlIaqxP$Ap14*+RVV8DUI)0zOWdH51d{zjNYgaFrv*(>aWcq zBlG5Fb?12@Bih`e#%@f~=9d^P^{+V?B+i?oCgH*jqXuox=fPi$(25*qy3uAL|88kM z(B@2)Q3fyaVG(BDoUNWf#|vY$xkxSC7BZsEC2GXwAtTznM!mftWJH_SsngeljA(PM z%EIhsN)~P2pj!4Y4D`qrMkS1?74RrdA~gfsb~`0212-F<-2+%~n~~@)mC`5ZGcD1( z)izk@p|7eXdXM^Yd_YCDMDJCrN>(O-8z2}}DL44N7=AA>}RZf}5_aTqm7v;q%)WrS8_2Gfm16ZsXT`9Pw3RQC)_ zU~ngp=$&c^nk|fx=w7uHXPse0qW@AaV751mNc5okdu_;wM4wZm;F7Tsi5^nlV460J zNc4z`ZZ!-f$`;~*EQB#t9eLw~S@&OxyDT_=?SglVHczXsRs`LrwfV7H8!97BYx5J; zv{N7hrM3B~nhIr@ZWnESrgAP08PVqFYHv7qX>ER?YU~UOGTQu3-HE9xNt@rRCRrtv zX!DGEw`U0@+WbNF#3GY4eg34%%?w?T>GQ0b-Y#TBn?I||ae5fXMVr5|oTO&4+pLA4h0KqQpjRwDw{2o-G%@5T?$1p~lU#WXB z?TL-KB>F~m2y*qbMVr5?izbIQqRn%v;VmH}+Wbqs*ED2Ao0fO<2E#y)Y++Qwn0f{d z$4O*$Ta2Y$w3+ScZD%>}W}Iqz7_>I?yq)M!J?80Jo0YvC$gL@(%_`nZT*xJAv#R&j zppX%5=6gkH0i(59;Qa*~U69dc4UeA*G!oO7>qXxFE+v#`v!=IqR0$>8tmW;55KTrs zZ`Sc{Y!Xzc=gqp_n{LR6HtTs!t_c~@<^|qu7^K8`^FlAPIJ6OMw(uIDb4_zan=QRt zplHL0Hd}cMN^C@%ZMQ&Il$YC2I?_4Yx+R%`W^vg*7QN%(vm4k=FP$0UzoSeK!`Snc$Kjt zXhv&usMiv^w-|0@po})J_j>gX^6AU<8@wwo4;j(sI&WjSfYI7q?`>WZ z6lCVjE#5omu%vl&s~4?WLWwqS@^)h73#>$&+q_C>lA*LVw|kSrMZnzj_U55ej21+j zw|J*ohKy+QR{+3WX!Bn0iDe-p+Pu$O+c{)JoA-M@y4Tbt+I-NfetpP@ zHurkRuu3Fq^C55emLzSS!)U3)s7KZxdAD~6i;OVPBU^|M9w3aVjc87sFst$vmNj-e{403UX!C&AvQf}kTAR;%b;|~0 zZsyHH-ZWfeXc-u79`>r?+%TOi^X3t649+OSh&GRU>#=RpjMnBcuQtS^3o_a~;XNGg zWzD?#iuVY73WO-yJn21(5ez8N=Bpn6Xk{p^&DXpyuu(NG$h`Tw=ayR2-|!A#GjD7} zo2R_vIPnwL^f$d{OXfS#=11PPwqY*O=EvT=l5#|wpLpMv*oZbi^Oj>xFm;JGKli$q zlq~b+7vAUFlC-%Mqou~-G#71FZI68#Mh)7m&V$cChFg(EOgGw0P76sj>wRz6_68mpG=4Rgf)B9yw zKpAcRbp>4D_@eMlM>(FHzZASbW;hb!=nd0AaTVQ3@ z^r(Lnr+kt&Q~fnqRFkwB_umgsG(B&Y@vnpD#!Z*rui>zPS$3+-=Je? zBihXMbH|2^Xfw}0acRhiHY@x5$b>0bv{}{9hE@zC+RXQtV=xRO+AQ#AcTLh}BN(VZ zuf!m6zxh2b6gg_p<}*C_hY?zla>PcPiF{FMKG5c`-n$(w>m-xSt)$<*%v%j(wCVa) z&;YS9^QPw?K@P*nyqV>HgN4X2qRn!C8k{wZXtRRw~+mS|JIQJ0_~Bhl9W$5{RX@yXrJHva0mC6r8`ZT&}^ zmr#wAWfipZAH(UNB+(B3AG<;qWcuvrZ^QX!Bq0**y`fkZFxRcqw)k!6U~W} z$odr>Qwdu^yI_LR=0ty8anPY!o74SEu=?mRZ>zOA!+)h}KxJud&h(41u$n=a>2sF< zbIJV|(dKNw$LPRDYjciYfHOgtZM1o*Ke0kUndx((e`IS3CE8r%Zyr%Xi8dGeizbAW zUfP%Xe_;b-oDywb=I_9YmZ;5T{xumPBidZ<*Mp`Km-ZEYZmZBnw0WKX>HkOBdw^F_ zd|~4=yLR?T0(*lAoMN}dT-LCgD661A=J=BM2djeK)`~Cpdg5-sHmu@sHh0o zJNDlFffcdq_r7O#H+Lg`-~XTI$;_GeoH=u5=FIHO?%tj20z`aswL4;FfQWCdaht(x zuPpJ+wQjXx0V2M+&YgjQ@5zX7u6O?!6Y|Zu=q;xMI!b)==^9G0*WjCfGjg5F>6^ny zd%l^B7nQ|*-<;yM!gZuPGW)(c)vdYHLpo&)PDl*>mIp6&h7grAv-(2C|Hy}X7 zH!pU7UKk+ao0qut;0azX@y*NJ?KgM`e3Layl`zdI2aD1Pl-q#mGbLJK8?F~K(fT^? z2G2z|yB)AnFl}aBbi1npH_9?Dy2Bkd&i4k_xackJLKyG0wYca`w=MVPLcY&I{`yThX**>~#j5z8& zZY0Hr>KI48&wb)rzgTmf-|IHTEe_8#nMCh*FT`x(A>ybHxVPbIob0F%x)<7kj5z9( z?#i%=g_oLF0Dvo;4eY8{t-lXylxjzQYaJD$=VRve`K#w@;5jPEYqmm}k%IG@h zb8IKXQP16>6#EX2dMhLMPJ}A@7x|u}CgTapB;&rL-sDb#ar?;jCedwfPP&J9j(WTM z63i7D&rx@~HS+^R9Q9#06$>s;MjUm&d*K-YB98i)`+lnc5l21X@~9Ze1xIBKQzcAu z?t?|?1j<$U7QgdyD)dKdjGYEE^S<;P^(*&=O@5mhNBz!yu z|NJvfX4F637aIGha>j|L{^fpA!^c``#znASDlVYlD!949m2>Rg-}Izk?*-=GX6+e+;`Rgx$Ae~15X%T zzN;R0FCOI~o~xd8w_x%T8P8RJb&m`T5OLLLG#5?m$%w0_MjNIDh`4H6^e@c2o{YF^ zEPAM>hrm@?!&C{=oO4l~bOIH4)9bw2urIH5)T~7dqE*-Ujb(haQ}p4jey4la`_9o( zO?=2(i*|`t!YV1*N4rLMjSLX+(QeTZB|c(&w0ks)0T!A}&xn4o#E0wyzK`~eo>SjP zA3f&#Xus$U*N=;ZSQM0~U`+6_ZG*+<7muPK!gADtNesC4oaADt8(STD#W zK3WvLrG3apC!p7ymgq3?(P_96v-jYmCmFeaB2>}-q&*)^#>bY$eIIQX{SoFyF+6=A z?GPQb(nCBS?HOHwrV$y>M|($K%ncCn(NWPR%>zVybaZq$mi=BX@zHalT~KWg5g$D_ z+TuJ9fse9=crhCx&Od`i=_Je5+Y8Dm%m?s1hJoH@jeoeAQcP>S+%yC)eqRJSj{iL; zEmiIpzUw}*D%pc3k#i8}%lMys2@)he$A8g!Bqnb|@VlPUxtovOp$+>Iz+(HL)3)fp2YXymcwyQsAX8f`Wg}& zUW0Un3#ttM9&ec=Z4TyI$%DHx`1$S%7xV2p`A~O-Rq~;3IiTwjzHpzxk118SlxmzO z5XfM>;4K_|$OMi)WaR#iP(|M+%|gO>N(e&-@q@a(damPFB22%mry6;4Md~^9Wqkhv2z5=v=oi6Y z*bwO#T9WE8#7#%!OebkI$9Avn*RT;VQXPhA&P4JIIg2E%N)@#53#8@i zG<%YU;`Fg&=i=Ls6q_+K^&t$)N7$7!W*+7cJw)2TM@Y^ZJGNNqSNI*188fTwgv2p^ zB4!5gsY)LwE`Jl&Z^aj=QC#@@ z@Gnz~nmr5f%Z^fWHY1b0e&te`&?vCV7n0fDN6h>)$jtVfU1mQ84Zl*uF43@m>74t7 zShjS|V?yjRI@5l~4{GpVI;UkIRT=;P*4Z4}kQx!_d=?t4^`lC9T(1;sJRah6spJME zCf|{a+>b=j;|!i9@1tbiH%LtS-9x4zzto8YmHlf@RkKH;ye>50s8nI^QdP1QklKbH z{~*V6_%AAl#KejS^oYrMi1zr5hDa2(LNK|T2k)bNecWR#+9`Oy=+_ zcgR!K65zQZRbDG~_ZeYDg!@t6SCoMp8>||YTuesL-1hn%#-<{l6;?%f7IXNjMtQ2J zW;+>FRoY4c99BbkU9uY9YN16`aoAVmwbE8&(Qcm=Rz-L(bNCh=^He#1TB;uYODpHK zQp{(B6%npPd0$ZqR@$Rr6P0u)V?3)i9f2x26Fk~WypX(bwF5X@1mS^{_KTS26+smX z$w(^V$QB%hiXv74e~r8qEPf4wl4@Y>^jMq8+C$dE2qwRh48My+i4EZ|JoGvWe^0qT zJY+4A$jv}1Az)dT5vfk3X)@9l3I0v)0fKs@;DJaKjWVpc*R!|*C~g)2vUgC`LW-?b6oUPPX!B28$!d75TyYU zG**DLHN`;V1(TR$iyd+&?AbTM+DWE zA;WthDXeM7F(fAbLYYBouC;?gs(2@)D!0dlTy}y?VJFD*9*U2G=GjAr!<3%Z@j+De zWv+#=aw-J*E?||;V~o;y?n&{_NN+6gGcg5qJg8|34}`Ibc`fGo4@t$%;~FgcfaW4h z6|*rvJe9!9o&aamIap~~vUW?m#AM?{$5SK1dMDsGC;a@LdO6+koBBxt^MAr3FMG1Z zb^Li;+GQ8XS&CS*Lzv$%HNs43SUHm)D}5dbmCjF*rt@p4#he*=R7#RwRm{ne#|DMK z1iG0AbQzE-G!0MUDsBLpCm0zHQ{eE(j$+Pk?aFY9Cjq<*HXCuKXkD?Y*~glSgi1d^ z>-f#oV$Oj4zxPu@wY@A%(#dAH6~@r_`Q345pU^|hvUCwI7;9?VI>k*;@{gRTn%^%7Q}P8PmnzVnHzio zSx@`Ozt{8cBKJDx<{n`#_Xl&iHxNBJ+E&f*U%D^IL#ht`|E;In?RbblJ=_QD##R@PbVNk@N8{l^{W7r`Qzm0mEA?otpwxau1Tc-0X$) zyZA4?+Ifq(13n`>!4p10d4Gcc(^Etxf0B`O+4MF90V}ME@E6Idy5rF!ZK9egmZz%p zvKhc(HH4#-_AR>7Q$rQ4d^O<>LBI;DB3v_B)tjEG9sp;CRC%p5)Mtbh5k8ypzD+gp zc!E`8HWgtsQE+3TsHiZ^{V;SIrl zpA}X`_#kum7X9U^s)#q{+Tg#ma$YM{^BG}9g!3uyE6T=9#LE|z3?(CJwLT6!wjlA@ zez~U8>tleaVHv|DJ8-j`u z=4FrQtrQM61VnBk5^M;FTu&re*93^a#+3~L^+>^`OL&ZB*$|wI;yN zf(szZOXdR*dx)Z?+DbNn$IIcPz#k_sX+vKTq<8;8mXy~7sYJzo_kuQPl9sh6ng|#6sA2e^4Y-Q3ab;4XoQ0pFO`_*VHkE9+n znViEw-opRH#l%KTW{*CP^c(n3?$Ka}cPZrfack3?=2_o_HvzH?m13(t_(#Vil~Dyq zJ^Uw^k&ARb{!dlLqT)R`$BbxS=6GN+ZJ#tZpKlN_x_Eao-=+?hyP>(iHvqdT?I zynW7F$gS?iY!B8ZWZum}E=FSFdgdLZO1=koJLu}EwpxY%qWh63dICYoO<=tRqCMbF zWPL)`F$8mdMPRSryL66o4~acX=OjSr!E~u=KK*?iBl-<{-^UL(&&p_Tp!itIXX$3rulqAg0phSy5RZ#pf8kN-UaKh zmCRmj=;06GhQbn|u@ju5vX|N1B^lLAMa+qBF^nhTfy2*;}M>QMBbSoWy`s!>Amok!6>JLt^v1QRqDDj@#&F^ z<+*bQO+mPB$w?^ZCafJK`{KWJZ{#Cow2X*X5;%8FLDY{WQa8Wnx zDdlj1o_ZYw??~g|GFJ8Uty)rzz1GK^39-J1JYL!X;l21T*@dEL@#9E5kN;AOeWa|# zC2t@L%cb~>%+eo;IU^8Q>$@-0%0+4dQhEeN%`pgbzuy&>^~S%ff4n=QDG=g1W(4qa z$dh%93_d2u5(?Ht0TMWWfOu;nRXiIC`EC28>Fk25ZG3`%uBLa-kUKd!^W<~ukoped z*UPnQR+T}BnLQ(QKMr&#p;u&_Pja@9m9s(4p%UjXq~z&k4(@bN1)g61%*g!%p^AP; zn(D%MN(iH4vba1XB3ld$pn{3faiW zy%C{`oCbIyTQgkKIpTWOz&%yqKO?g^K{3ZP3ujFFL(_2~Io0O-w>XDwmj$Ed*LjJlL;;h*_ z5Pcv2MF)_87R*J@fvTF0yA1d*dIO1xA0ohI_86j?KI0@3Me1S9?=b`cTm^}uJO+&s zl-SV6r6Bo@s8802C0zjb0lyQV?u3URArAxsByj%#@!Y?p5Shn7eh@MaXXYX#ie@vo z5P@2zo3X0xK;sg}2QYIWwSbcT2vQ|Gq2xM9tOI;2S=*R@H-iTesFK4FcnTDm4^rR- z^4?V!nIMKM1X8iJu@^IR^1ytKscg{_q*$)iq(8 z^8V`jQcn?;6oeIxl&7k>J|nD%aBa%_ieB*)QORgB%39RfXM`0I?oD}5(M38PzCaBw z#>R3jZwQPxXFaSRRMHwZ`&jX*5V(TbSWM~OB!I((5S~wI-`b^~8mhS0SChO~y3S{W z6%oFP^1h-&o+2uFfsC*{0UTCC_~9fqlUXHZKjEuLw&iV~5mrL@W6FEBn6*&~S}hO% zrE8-AxfE9o^N?gLnwV=NveGCVjE?{@&Rwz&lG~AwQgKS&iG(~P@e#8p8tFeIxeFP1 z6;4375;L6QDy)h*E4zvleB6@yC^b4K7f?dC$Xlc0H&G2DAn!MWk#E~gN1ELm<9 za~8PzR07|M26^O={jE6Dj0^Vk#!BfI&6N&T)tm#?1QwZx3B{KJAV6+P|U%8Z|Q<*EpPmr1=CuZY8FguWx-U;asOti?A4{RSC`6O zZDgHCl)A62Z;^Sjv1l+rISXmF?t&(-S)Lb_k~ToeDF!r)Jux1MiA4yo#+XdbMxZzP zoFa1YUDdf1D2J71###Jix8<^6*jwTOYSGV-kTa6j=w>J?k_fJ0vcSVjIg4d;yGGVh zdeCCoBnBzjCa#ffA|@;Dz@CMcck!RRJ9-J}xA33rKmHDEQN8`RuQvpCZq^BuzD+Dx zEQ&W9#e>Xcbc=ir7xgXfjVzx$?l&A$I%$iT&J%Ga6al5`J<#{E=$zPsf`inATPB@2yDU1=D*FVKty8 zIFA~UabT}LrN|214Kia6;Q9mp9+8o)qSO-IA-DQ(@_1!erYrPv%$b=Pbf)Ci zLu5aE5Uf}5e~R8%xCz!h$3e{~m@M#>@+Zgm7(Dx^4E^pM3*arvh#KAg1HFJ1gImLy2Z zxfbgyE_sQv+LGdn{S|rrun-JcJ zXyssdI^_{Ww+>YHbg>DMjbwj9Wh=N+A31@3|4Ty&(c<0EecQqwt>Rfe0Lq-id3gv_qMz zc`NK0t!acW;GL$>vn~bF(Zf0S>+2BVEAJ-(nG^45glgS`BFC`&&)KJ6gXJ{E6H`4o zbaWot2%D3(@P&ZEQ6Z-l=~s0o7`A7b>bagA9$BQ{)B~~O2{;3Glf#8}wRkzOqpsCJcgqP}!RoejdC6w{kGwe$h}ApK<+Qy!$ovUI3TtR}ofO3G@oR99Nk7%RAyRBQL|~d0cir zy937_PJ5qu^(5xKy%X|I|CYcPuvTY$yb2OC{vqI2A#fHhBK2k_o&<2k0s=^;sT1 z&BGUa_*%xWcN=5admrN(SL)P;h_BS^*q&GF?IwD_M9-M$Jrn)TXss@4gD3^RgZxL~ z?@IkrE6MqhiPn+3PT!52Y7zUbt0HQhenRN?gnmuvkA(hQ=+A`yMd+`DPQ~;Qv5yIz zBlPz|Hx~K?==FLyXx%Ylmt5~6HHE285qlm|>+~X#`&II+75Y!ms2inXTMn8N?qrx+ z$Xtoe-zQ=_Z%0(@kz}q7Zas2`MeGE*Zzpp#xb4XuAF*qY`%5yHc?Xg^J!01*x6;!| z|x-p)7vn+MC=Qt@_U6| zCe7ktvd}#u_W4L%sd-!)dboj!+MB4qiN=^{riqrCXq}0+ndn{ zT1v<=QGFA&Gf_VionxXICR)O1wcc_zBDm(Gm@RP9i0*etsh_KY9*I*Os{i^rW*na3 zhv-V(4m^m=MAYYYPvo=@-^PM15E(;}*u@Bg>A14GO7AZO{D+R%N3M=whPxO1t;aAj zujV0x)hk*>xOxRTZlaFM^_z$$;iBRRU1-0bEOgKa#Si0dAJ;BM(|G5{KBAEs@*8YDD7Kyp*}+iim2h`tE^G>H z?MKCz>lKJzU~$HbyCW~*QW^-A7@=K=J}VX4?Jf>%MdMy;gkC`O3@=tjQ)PD!Zlwj9 z9yUThBI;Hu)Y09Ptm#7|ROJY6-E9ptJ!awRU#iIg7lwC0bZlE7)XpA()(VQNZ-fdF zUHnKOlpX1gL?ATK2(3c&3QF({|I8_$Y|~r{W&DOVw`@ zCefd<7>d^96S9nBZ9&$0c_qjji$Uh|r|uawYJqIdFCk}Kem=++qTwH0!lS42^Nbnq zbOPB@l-+@CcC;1O2O0PE0@+&hHtq|u4Zre`F&HQ*V&%TRg){_e5%UCj;ns z5N2nj(2`Dfk$mMmke!8W&;(?chluW&4YI4Cl}kW&6Y`b~AbU#j_iO~&dx{O&`B>*g z`$!SL!G`D=BKt{skOS{Q@m8g0u@OTuCEDNSkKm#Mh+q}jq{-N3iXvIxA>dLe9}L`* zZOF)Nju7v3A*5UwZk7yTxx|b#ELbj4Ek1XSFwH3dGo55c^=&AAu+(6}E|5dGmB^UW z0OU}q%;ZKOhY5LL3&;^d-kl2aEa|zlg&=2L294Hn1WYcAPO?8<2Dq4rsaJDFk*vcA zSg*ejqXPDGtXC>R)${{EO~y7a1EXH05bDK@bMY_rs*bu)ZK{N6PI)LwCy+614T_&* zdgf}7^Tl0uV!0h%BprI$ERYvU=co4rxm4#DY9v2fV@P| zN2zy>6p@07HhQJ_-uf0G*9%&sA!eM@x5FlD!ShNnSvykSPUHb@Knb*ry{isV4Nc0i zU%MHpMoWd4VrQd-NMplGx65COR1=d**emBE)s#0TtXdWAR~jJI%A?3m_dZHAf7f}t)az=<=K$dip z87Fg5T>I;hw$fg}OUOv3N7~q2Sx4I9Cq`21J8+jM(yj-r#z{P|>2$>mS)U`IP0WbG zGZ?v55UQqsflnFP5UQrj5mGJ;!-`UfR!~i#%PU|k;RDPD3hrijRp zT+~0~9n6oBvz~!~)%Zm`KS0unjI;;r0z9hJw$_RwSy714Hj2WC(;2yK5vr!AA#5_X zbr~48l|r2-8VsyvuQXzRaYF%GfA%6mr-ske_}4fmG)+%KmW#vPY&W)v)0SLAmzIc!|Kw zuK{E{hMB8TExA6H3cexZh-EKN16ln5^jo!G!JF+!E^Ay(E{BazBZA4X z%4;7gMUkw(5wP`Jf`Mjk$H?u1P-Ry_NVzavH5tNXgBjVf!DWMLQyqqBPA@RiNoKqX zGnzCPG8Y%JN_BU=0JQfako9`dh0;r)tnKv~AV=*$Z5uB~Uh8KBOs14?U_aj;us5Nr zYxSH-GgSFT#<`p-7ho1-j;xmuutLlU%l}~H>Q`BzFF;c+3|CEtXf)NNN{Az%kTIP= z#z-2~stVH9NHVH7Hr>Qs!G(BOa0BoAoFEeu$5#TSqprI;gF~+%cuc^K{hyxtI9@AKsGt+8IZ9v zK(?CBt76JzkZs!#eeFDuod%NJIU8j6i6pb&ScyKfNS0&41Ghbi|~w#L2eKY&-Md(ooJYWv7WeI*4Q`p z1-Y5tUjBOr9hGrUDkjKgT(D)tU{ur7Wp$Qd=4TtwKK@W9@mv>@3o%0_o*zN-hh89G zZ$xADtmU8@&44wLVfK@lG9$x% zYZ_rBMMjvEoFVsOK4K=6dMP9KN`%-2k*1VphiZrt6v;`z$GQxieODi$jDE-&F$oS@vh zHJzHZ_z;^IcaO)5SLk>IRldish4TZ=Vz>0W6*u^y4Ce7cf_7UW#32@>S!5Vb31Jv( z%*qmFtXVL6DHO*fOgQbqj1#cr*H(2fg{3sHpE?g-)0_x>x9d!#T9}k$+mB)vY-3U> z_8B?gbuuZu7n6-tXOl|Uk5fw*ld5QUq?WEGm1Q5Ug;Y0_%C#4jvs6lVld54q`!q`E zVN$j27u!Ix=LWH*p8YCQy-cdUUA;Y0eN3u>eFW~C($}OK+80+ss=rA!vPaEBYM@Cq zwyRu<)Nqq(VxNOcOv(t8YU=PeYtroJO~PPiLPxeUa&JS3%{}S4Xs9rr62jQPRG9Yg zVLU5x6HXVjb4JB1o^X!92?bazwId-kbEtR^* zIDd*$4l-ilT-<|=LIjpDpLSzN;NBQ%stw~QA&lnig&`KpXb5AjNqy9=yawewX39}^ z4(7I%rZUc760;>eD8bZogiL)FG2f*yAvnrye$`iuRmsNF6b$Ec?@Q zkb1_Xa_vKy?^B;OsT%gfQ;~Y!q-xs-)*UC3xHukJ5kb1+UI%IZ*Pn7G8a&48JxHeG(<9?DPq^UMptkqAf2IqmGnkk;dIQbshRqBNpIH9 zGa#hCJuXlxubkAYE+e-wLKXd(d=`fKCgCX|j5YWLf|aW{85=QvxeHCCMs(&5SXEB0 z_Z2Q0ghqEYSCF)GR97UU`ejKv6_(-Bo0_6|V;Q%QD(uHKH#Jo|Fac9@*4=pWK#Q~I zfX_*|oG~;ZhE}GbRWAdJaA61pDA_cZ+Jp_2d|;7qXn0J*gp&)2IDv#SMqq{s=XAm(txce2!&4o*nOQ6~ zr$RKCGY1^$D1NMmVyNg=M($38Dtb9-W)0&hA&iB!fgs!yVZzysFix`C<~00jXNGDN z8E3!U4eOCYuUz{;CQ{=~%CXxPAvM9IQf&TAKQhsz((Riu?jn;+Dq*jljMQY4s%SsG z38^BJ%Cb)zfz%X}%C(Q~K&sfJYSjyr`TJUAT|4JkxX}LA{JY_5;v-hxz&SuVeuKH&$T)dD;MwV&+%Z0qlDBj!kj~fQDq&<2dAFhA)4RNZzBNdV zyoDt|y6$N1BVF?T7!Rb|15JEnSAgl^2W5&=DK&4vwJyDPQ><+~C{eR28a}2;Q@?}&CD9z2v5Mk$-Jr^L}zhm zWp)__QpQH+zH33w&ccE)b2%D2KA(9rFWCxoP7|V!4MYtZaLi|RS_O1&mkOxNM6jeX zuO;vXE)Z1a6GkpiD#7C(@>z5ld~I1=)w+YwFLf;yTktJr6z%>54eoDLQ~O!+Ce2o{ zMUVDS>K`e99FP4q+0*B#*iugKW!d?0*rrd;(kiy1b$v7aYnStt2_9n+nYX$av2T#h zZ%O%$x1*AmOzMKRU{XX?{#im}*%7-U4nL$4PZe_-bMlu^sM@6{Z|z&%@qQ$lTDuIB z%FEwQp*~pb#;$%2MxR>f2!*6gu4~gcBqYVL6IK4F6k5w(z2Uy0X3e5q7wZ(2|2J97 z>Vmbce}BK`(xmyPp?`HpI>0TLTe?;@ve&tm7*?uZk8EUt&;(-$B;V2jY7((`sFf#P+`1} z$58d_1z0~{SQZYFBfkf^_rv|;1L|+U&1yQES5*Ea@*cPfyg^HG!ITPk#ZiOGUqylR z&JY;-ShrIN+)9BGjF9-qZ=$Asl5J4=M<{R|S|~m?GT>AKUsK>*JoJkf6{F_j{>DDj zhWX{#I9JVwz%(?+DFo_JU`ss+%>4d_a19$6eD<@zLv|^PF36knDdk(+L(wqh3(Qqk zHLQ;MCdO+D*h6o!RQWceLBa>Jc=wvEn!OPLyZvdz=-THPxvwBpRqsaV-Q`Y#bCMy< zeC7ri_KA?jJ`rKUc@tsWkeupb4#R}=En!2N6$KX;X*-Khq?M3+WY#!1{%_avEyeau z8_?pCs~|xJ?3>KUosLjN2ay)x5S|jkSZ+E5V-jM51|270@f*+|oDUV5qn+)brKpPN zI5JSwD~#MX5vu4Tq(wM{UX0Ku4qnEye?30SQw;U&~u)GG6ACk|SQs?-G_ z6Zn!RBexqu6|F;BghO~r2xC#7NKp(EP9J27le9htwW<|VWG>2@hxu^;(wQ$UMQ|Za z$t-^wg2h5Mz~IYVB4p=IAeRdHc`?XkB%OzlS4=G&j&HCrp(9^1a*rca(N{>bkT9MS z!e}0ih)I}megYjQV6CoRKVi)O94C^3Wxw{sr%+Vwl>Ik=q@iiq<9VnVN(LrV2(=X+%uI zgmVTm#R*uSfEs@-RAgQ)rVd2fn0k#^BBov|q?o!vNHO&~A;r{yh?MO~M0H1*54nA|_$N>5EKp0@kOX8loJXd54&KCep^#-C~KDdZ&Rm#L zsdo!0rtTr>JVI0G06Ru2Ma3}nYew#O2vzho(w?bFcwnkvG?hlgBuqFzgN_rhuEY%V zBV0>o-Y2I14$zpoS1b`z?-x=`eLzSt^+6%U)O{qK$J6iKz#0S)^i^%6oO%?TJuD>y!3OO~M0H1*3U1A|_$N>4!{l0@i1swzPzb z%%{ZEK}Z`@4~ivX>eE7ssfUCVQx6L%rXC^b?58PofPb*LqGFi(4I}q^gev+vY0uOo zJTO%-no1*L5+aJVuZgKU z!7--3E|!R?ZwM)-9u-ndeN#v=^(~T4Ca;-n)xHJz@PWC2c46f9La3q*NPDIx;en}w z(Nr3Nr#lD}PJd*Ile9huHE;|~eOF8!jI=TJJ+VYgeP2j1^#dWr)DMLeQ$Hffq~fur3ogSeKFe140#jgS2OA5+0Z;7|o**F$ojSFQDTDtaVt9{8$$%GCvhl{{(1E z{Y)$oQ$H6{O#MPgG4)F!#ni7zI#ZxaO#Qw&wrEV~$OcC4W`ubDLE1Al2@gyajHc3v zn1l)EW@L&Ju-apyI%5=6Wd2V~y%ii|>M^lIOg%27nEI`dV(NE7imBg|bSiMtqXTq3 z9Uog^LPxqXa(g3G(T1cwQ1#djg?~ zzD3$IAPEl)5R3*;b4)^9WkAOXWbnYu-kYH!v!XHJAE3s7O2&Y$kPrh}%)zS>Oz6lg zM(%uscpI6tXFw7j7$6u8pyrr_31<;9#R+751L~ujp&~QO7_bb0F(BI*@FWXh3*2)-!pPgB2>|LNP7k(;ei2y(Ew_WNr+JfI!+*C8m84Mg;0^1YYfl;i~-e*0o?(J z0iO=RFR7W(k=cyg1qfC2Y|@?qNqAs@U^IZ5V-hBu#h~K^GL9j*vjJ3O)-VPv2Ve}y zGX@+4AO^fXA3rHzLPvgNPzyQH$05!)X#Pf8}aRM3NB6ze7 zRAkmO2CM{N45)7mI0QfpSdWIHI1D(!$o(Cmihe-aGav~M3=oV4P%~cnK$vh;Z5Ti@ zV-~0$BcUR*kue|wz!=cj7|&9v7|i%lJLL)!B{9Y$0STR z7lDow$oL+?>QzvY*~}QQ3V<=7xiR1f05PD?cpR+61a3bua{olAq92j=3`oKQ0|cW1 z)EtvA;aKSPIDw4WppK7*ip-YAfG7ZCKr3Uw8T1eiLlwo7FD7(k0V8)YLKQ6}?HQ1S z2L=d61E@JBVZvDfI!++tM+A$SKt*O7W5A^Vi~((p0nY*u11`T2mu)6=NpnniI~ul<Ji zAXL#8NsDj@PYGcx>T(FiBuqHpgN_rh&cLDvH=R+`5GRidAolAr+{GgUMV-mW9gYw` z;vp@pYua1?7btdW$B-)uYAQYXtia1KU36FTw~Blj7E zDtaer$rZv=LKw>#2f>(x3FjryaROHJdP==G0xBwuXe0p3Oa&-qj%kHg3z^W70!D5} zgesaxT5^T(ln}-;Uzai&CYZ_KynVS+lt7txFmmrf zsG`@BmRun`C4{jY9x)V?FyTB1I!?gqQXel)p#^cqPZp2g*$*(Y!BV^=Hid0pNzRIz zT4~=PAk!-~$3myV%t~@TREd*?ykc61KDZgngpTxLKk{3Gta1m zRA)YCaqef~Y`4?aW7!8$7gBj?UU5wBI@pbZeOxtW%6bZg@fRamPJg=z+SeK2-P^Xic1LQUNjaHrW29!)8`i)G zvHn4(I7zD!9((L#D_7iT&%|_B@kZkj*#A>8n`Xflypjnq6wrc^+Xf-_|Ku}k8T`w# zxT^IJp{bjo{pLf1K^i@(Ru!r{uN?6GKX)y~8|W#Q0(<%=)YzAW(aWI)>nDT>rxS9< zNm@^X8gUjHs^a^m0v`~8uh&11+R3W;k&Zmegq(J+>aQa`oQzLBMuc9XRg1gGVVx^} zF=`PU%Fp*QaCN#-_GK7Vakfp&>5eer97Px>X-$S(?#6OOS1xvBP8$a2o9_GVS<>1 z3Fmw$h!e=@0As#6AHtPK=$2MPorUJjee<1Dk z_n)M_{*JZ;?e+IJz@2;8-t6z6u`9_07yX^Z$UP0AYJZ4)`mpr3a8&z`0+9WkEdB>M zL4OO!@9%0T&hPJ+7UK>((~d^zvJ$>Tx=2hW;`R4!eSICqfTaGu zjACAY^9@YjMi%My_fCp<{rx7~KqhfxjcW4@nO=X7NH3FLED8F%62?)odiF0HHf>Nl z9D5$Y`>#mEiNsmSgfQdOfm_2s6ArsMCSk&<4LoiDk{vfA;4J4<9-}*r&qObrt2qUB z8ih@1<*}OYJ3I3rBwaXp9mWU~Izl1s-i(Bbt|oN$va)ze2%{xUA((J>A&iskTpd@k z%AC+EFVoID)Ivu&>pc8Q4;++|&&X|vP(^~1}p1vT-I6xXt-*@b(EqwRPSWu z?nbDh>qs+a7*7ddtUWcyBuqH>f{qig_|2vdaWl%vYGb{H=NMxv;;Nl}Ve^|XVN^Xm zikU&a>ZF^uxCKC)Gp8uU_dT?>_pisAdmX)tZznyx5vlbi<=Fg|SoT$14dC78%uTsS zEs@&vYK^?C%^oZ-4xnsUeTb3!JVF&cmweh#2Im=3AzbCJArz?r)f?U$<-dpXCUvQN z9v(kC##R$Znu zE>p_1hzxtVHr2X-0uNx3mi~pz3$Sj9ZkUf@F z%;X9xdmNoPlMATqLY_gK$%{_*c&8soUURZ1q>|)PDtjVL%;ZWcdlDBUncVPaPv&n! zGaqaWWm9?#0J(=~@damse1PQCWgvTuCTHc+B2oG1JEHmqFfJEhtAol*V3Ibi;HK?=q^3@T;vG&Y?*9n7EYt!0=k zz9utuD44&!ix9b_P}Mpe?W8A-1Ov0*hHy4>32NPvB9EgTvQu>jY&nyQ6%ixXb0p=` zCqgbq--(fj6}R*?Ukg#sjKhD zAoWGqSLR*Ro?laBJB+A$n&yx6{0f)a>ltmghv4Xq5RB`tHA@9mFFmURs?uD4kM`!= zX6yD1DNM)9zR_2x>i6(L3_a7T#=Gl}2^a@_#&zgvRexE)cp;flYMZLRD-e0()FNIP z&joVt`Et?S-rMaIA?F&(Pz%m{pN*p7Mw74Rqa?TH!OZ84LLpiS^Got|-dZnH| z8rEXU@~cvCH<=r62lEpB)wD9q=gH(MktaZG3Nzb$N9I+yS6%fReE`kpcTmvJs!gnu zCz8ERe}P^~7EuKa$j$GC8eOedbS|U451G>zV*m};iScE!wkagH4t|Q7eZ6k7D&VSu zC1gy5eD-Gj1UlKgnd>#-Rx;&6yiMogQpin-*AQmd7Cae9+@crl^sm)sB9%*B?@uXF zI8SBo)+fiELPc)}H4%Zm`pibB&`?l^0(^ft`%(QaEJ$`t%s(?}f9ZJUK9jB`&7 zB%acVC1DBU+^Z=u1i$F3+T6OfdRW4gvM-S6YW<3dsH`1H^F{&B6*bxhS>IbqTtWlV$k|tfbn7hV( z2T|-8rvB`)R?fx$p;8sh3B)E_@1bMMYEuQ*2NJWaMOaRil`t!af~P5#J{RSkZ`JDg zALY5G$^Yq8?A+#!x_XAB{22!A&#b}Sl%y76NE^fQ}UGA^fjkD1G%>t?5EK2d`N>#76tlZG` z(X4=_RT!u?JR4XSL#XOxy@a$ktFSp$!8Jtein!9o?46KjJ%bg%J!J0LiV3NbJrDcS z5c5ScSKowjk!8Pq3!V$%aunqJolLhH3f*pf0-2(`RP09CI&*6%kT(Y#Fv`WDSibY^xb_4rt7@I7XROpkwSk;48 zd(IK13#5P5<7;0wySY8L|9{A;f&@3LEV=4i)=X@Jl2s-dSU|BI7+=|K>=&;OizOL2 z!56FgKdUkpqsiKWR`DA8a$h#PvwZ@ce@ah3=AA$pS>_F zmSo^9zF5_m-En?ctgM00`?A^R+8vhthpa02$rr1dZSQFu7E3a)Dwi+Q3t`|SdsCS~ zl4M{nU#x1r9ls&0t*n7FeA(>jb}RiKvKaNgSk<=nEoJJFWFQZp(}i&B?78;$1I^u! z{cAUK$3(90| zVOcXRn(^X=Q}b9r1D-6Gs|;39Ig{Q56R#a;m{)7HLKg+YLxiG z+&1ge>tWnW>nM+}aF5E$s-m^5TI4ZZ-LB>t7jHAw?PeW7CVAdfx4UF;E<$0lbKd(H ze&`1-w${%va$iBHqSup8jbXg~T|Qp7Cmv}?4%Plh0QT`g_dTj9_?(>ef53*p)+*R* z?rDC>f>eQpX;I(#8kobZoWITG4ZkKc%<5!r{vFJb)`{;t8@&Pxx(3YARv$2VjrHwk zU#o(1DKY0yWIxwBbf8T3WdXC$TKCMUvfoSz?f~mfw)+1VvfDi_H9JTN?#}8?wX#t& zX+y6Gjl>s};IBvP&a_T^;FluR^K_)3U*!j=b>~?Bz}A23Xg~@6z_jjpR_BLKp`)#S z9Y5l%yU<$xDSqV5rt=z5WpHml?=;VAc6}N48hUo%HT17jdCjP=O1*{|oCj$RZ@7<# zXN&jQ;>t%#rK;39rZWQOIeUA zXhWvwHNXGkFGD=$a56owne;Z!z+oPvTNNw_n4_)O)BX(?Q}A(=i3Nh~m7<9dj5a1i-s) zpsgo{;1T~9czBnyH}88Ckn`NFOYlBCQ20jPLJNndJYRgdkLbMnYC-0On@fDe$}4^g zGB3W+)<>MYv1yjdd8u)GA4$oZIR&|1ZihScMsp%>V$=e6DS zeWY{xhZ`|*_1Rhnd0l-7Ch;bItH;ujPQ?q|m`!OW-bGnc1yH)SI|fkS94zc|D(FEC zyoUm~yW96K=+3FCttJ7cTHOGZgO_X zaW}Va0^l8YlXHh0ck|W@uoP|8AIAdd`e{(0*{C^3b>uy2RrPBJ*jpavegclF-!Wjk z>oeqfRexN-c;9C*N9ht()n5^ad>9fDIk|?`-$Ie?Ls6s8JQ44%YyM;8a2Ck&pFv1&&~cV(2WA?*oXg&xI&qeZcN?*`U&>7rS}f^EF3tC!qT|4(e<9ebOfBk zQ*kbY>**akc%QxX4V2_L*Evn}&tqXVdK7LT?J`KWT@6NaJ@Hn#TQ9vNWtu>Q@J$(H zi8-C&1*w!^$H;XZ=W96IF{<#}cEE9x_!K0_&SPOHq@P%Z!Q??xI0OglR~9PuiU(Cdxj94h4XD+}9#n`$RL)R+ z0rtdy8mQ-oLs9Y@dB8{NmdK4pmvN_h{zlI3hTxp7r=Oj~8JG< zRPR5xtjrJKs-B%Fqa4UA*WY4-^Gh&#R#9e^=xQJ4Eq=;R^UK~4PU>^M}Gl&9zK!c z-$AfLsA@%Hcdcy1)%utfRFn@bI<%}zhGuFeK+ zG^33X zQEUtj(U&g5k+3vbM@ksE=dtu?3Hj6&#=8iXizYDAD742}O5Hydg1PNSu)7>21b_u(bE0q`t=M?S-v%9Hp79g@4BzZCI+ zj1~YMT_2dR zjeU{hwW}NXz^L()id62KTPNd_b*7LB^XI7Cx9Y%L58y-R+_w+FPy=Mn!yK62kguN9 z8_V|pX$V4$AgkWtG$c=$q+`|VNXPp5e#}pp8LWEmVwmTi;&52YHn9Z04VE*W6>AiE1r62Ufg>w#fbN^C}=C``LhQFiWYPn<(*M z3=)}|FHK`_YGkr8b72uc_8)A8N;=lMl&xC7NzM~+;@pP%E{rKoKS5^JPWAkOBDY{6 zmfKvT@uL~|4)mpzl&PP%* zcf!JIbw7a}nYXTmc*A!=I_WS{dbdLx9O=RYj&xz?;jsxoHr_7og1!~~8PV&vY7P(@pi76oCvXIWgeo=s>uE`ik#=vBBd zag~IVd^w)Xb5VJ?A!B5a-hk_I^@F9uB5S~sONe;&6Z$T!Ucch986V5&$agrIG zCSVu;I()VIt@ha`0jHuRo$9yQBf4G%HKQlaScrH2W=veDtkDZ+OjP#hg%f9BOZR`6 z`|>!OtN;J^`@WZJn`zwzw_fC`g{r9_%$35?Jp0DM+&N;7h-sgSJdvWVPP|E&1 z=0?XZ`pxRgg}kF(Uw*85$!tJyJ!yJ9TXI)-LVW)L#0Y^@ z_dbO`V7pmcS9{dv!T4DL1 zu}CK2mFz@}d98q=6bVz^bcjX>)YyX9;rST&8;9*$o$)%s#+CF$%Bsaxx5kxiUfbi+ zsMbWBcNcDM##QPXq(@LCPxX?WSDV#}0oLLB{)EQM~py91<0CctIS=BViaCjqhh_oe+x6B|daNbF~+ZnUaAU8lm+C5IQV)!D8 zW81?gbO%!A3_RQL{E4$z+ESAluQZX%9MgEWt=9xx0tayy8*EVK&xMFz;j@{L>Ly;VO(v1LDIVaU2f; zvQae#$KfCzq2omM<*;ASFH$7L_dg&PAyDI$ah7%VCna zfXwlRZ{-b}obypC1zE})HapwFk?0LuoI#xpBHr+-bJx@WQQolCc^5MXr6{DlVY_ou zmjJRxh&SwTzPLUPi8s9EOu+c6Ef^u*@V3(>!$8U#-gSoJx>Fk^-teAt1>8>~;tlUR zO>q&T5%Go(oO$3$^o9?eg_uWa9`T0HombB@h4{4~NK z55Nb~b~(S77^De1+{aE)V}rC|huh=u0cNe|{pvtIa~k7RDhPa&CB*x05#s%~FgU_! zjZ2W>+qitO(|*#v`LmP$U{G1gH~)0_0rvx_0ox8M-~7uNfm5V{LdrLfI!kX1Q{j(qriEmbM$99NA;+s|7;`k7! zd^5$Zf~#ijFXEdKcYS=!5#Oxt&aGp3#5Ysjp$(FKvxd7J&6en!4c$>_GL49Dp5T7{ zfI-AJ8@b~jGzhBCN^9)SM`dd%@y#@MJeoiw;+sv}wJ2HBv8-gJ<35dt;- zg!jyYE7)nLy6P<2&b8_Xm8E?14EL;tfg5PwJk$L?HGs5lX1Mn@4&;1lXm+#KQ#>}L@1&7tm%n7?Q* z6W<)>E{*fRfvmLQZWg+EqHkX8&cE3p;+rGfD*sFJ&BzHwU_3z!SA*@y$W*7cfi^_$Eu3B4Mgq9mR#{^G3JmR>LE{S?YclGl=-+?e0C8VQW3&n{(ZJQ8!-X3{EBq7b z+BXyNO5{nz1K*tB)=0raz9ehkoanAa#S5Z+^BQ;ZB7=x;Uh7_Tok7GmXSp917({&Y z7I)VygNSd=c57jD)0)LMZ*x2K(g=K$B}|bJ*MG1mLZE65Oxx{BH9BFj;l*W$rroPu zbg5gZZ%}8-MIUk(fkQQYRJrKG?!ij~sIoe>KjPjHKeLI8KI)!$L7-{4xaec<*!u!R zx#;6=N+eLEUG!=95c*7#i>`9_rNtp}(P!MUx^YNcbhUeSk%83k`K-GmBgjx)gsgRk z#+^i5be+3BKBS3@KIgu0d9sVHcYlS`YG)G{-6C%z(TKR{t1cgUOmxw$?(CBdA}+ek zeHlZe<`EZt-Mv0O=@l1!!~GQfxan9liaNEgMx(jYu0onFdRIHkVynSL&*8z(L}-N< zlCE7b5r3pS9=PZ-w`UDppu(KMMVGsSQEWl9i>`2s(CaiJF8ZYVDn@&ah>LD;k79_` zh`8uW?!_=kBjTbjyI*?-5f|O$R$izPxF}1A8@3SQE$fhtFk0h-LR@j9|JrFgwQufn zznm6SpYqMU?rh^3)s=64?sn`RxPhyD^9%QKc!sWa@y&g1y(HpB`Muj4CmAiMeDeqQxCzDt89sk>uk30N z@y(yy>(D*4;o_S=yOVE8_RU}1tr*fYkN9TD>sZ+!;+u}weW^iY_;kHn;yiF5E6w-L zj#r8JX4w0owUH9vtmF;opX8eZ&{}RoG?e&e^FfxyR)cST%!B_qLMwb4LJtH<0RMi*Nq!W{)vE;+sd@|J`j6 z@y);7k2@MfeADta-=-1xBTJYfAztwTgChiLTr~x!cJa;Ho|<+Z=PgE8Q_Y}!v!Pdp z3RP{Ms(kYVZwaIoq2KDf{z;+u`V7C0Yk-LiO-=KTd8rAYhci5@># zs31M46hw3R~J`&vy*o>JX#~-n`e0iaUSu_v%MG4keWw)vx|4W z>8``YH@kXs?Ihp)4z1;`xdu+eaq~%Z0Ja)@a|#dsG=x@oJL%dt6Y;&}@xV9hdM})! zzUUhGW_@q+O&Za@neGkgV-OiPn|WSygNSeb&l`xg*$EqPAtkQlZsz*~U=sy5f> z^nu=-UIC=f=@)uM@gYja%|YH@7`Jsph;I(|PQV#KA!^(l;&sC8P3hLYIl}w&h5*vO zInrBZxU3Q4o1?t`W-e^0rKC%|_A`y3^36-VrWi`K2{LYu_7R1KT1vO}&4pg& zXdDvXywfYgnJ?gyadVMZA4SrT^3A)vG3F$o7rniF6khv+_~zZ-dz}m-zIl(=?xbYj zEc5JK!y~@=h_|-bAmW>kdb7_ni1_AXo{#F)d5Ld6;ibPPeR4cfr22b=o(d^E#atRF?A1jb7VG(B^vFeAyd^YYgQE+BaYE znxJp!hLCY{lQ$AQN+aT%o4wM408zfV#cK`cQHr#0zTrJ(=Cay1-}F|&Chc`<+}!T1 zMhgaz_~s7pnH&Qt-+bHSR}{4gGH$-(Ipxmj?|RS8Hay~+?|EC%@e|MK?|U!C$2;-O z&%8xljFkB1UN1kcM||^h@0&P}_~t$@hI4|pM|^X?*E6nJeDi>}e^HWeZbWOjx1yVi zZ${6tEVdea^8z0Hfe5Ye{iJK(OvG20#{=Jd!5fTmlQ(??zWJi}8LpBA(Z0FWyKSjK zWZc~5wYtZ#MMbC^U%p z<_SK(N1-)~Z$|yv@D+`SZ#MR0Xbg>rZ>ISZGn0ICBpBQlXejZ`?{J~WR)cST$%B6g zp%w1Jxc1FNd_Z|T@XcSn-QDnkZIbml{dceCJsQ!z>G+LM0O8T&rsr>hghs?SYx!Se zkkg3x=5c=Y>kT5ldA$Dx%Ak3~H|zPifgboHOPC@dzJCNfLZIqm%rM+=jhUFJ^}G*e zrnUCfB~crH%DF+EDHr{pzto&E&sL}Q)BNdZMCA=N)#du>{+~+%Idy7p@3(1e5OL8C z@&;tp9?C^K`ls~>6loXj?C-_tPkWkL?L6DRv27d@7wzJ&J~Ix9i+1(bp!+Ae=(+wM zON|LKe0K8}p}%RD5Et$4Z@SSS;-csI?~YG)(H{QF^9_%!pT zw5Pukm8GS`MSJ_1aYS770>7lp@Q90M`A52G1TM-Frbw9T-ihKw2-HZw8I^~rpq(~a z`(}<`(jll&<(pUfSL5uX+PsVM&GG)5(EzHYd~<@|At#VizM1R)6kmT4-<;_88WHd) z-<;&9p(iNa+BXaRoZ|yX51*6$O$+0Y_~teK{EOm{_~sPx%zS^j;CH3Hvc2~#9Ybx(&y5du}`WB9BTuCWd0iwUTGJ8iLc z(YyRkm?@|_Q!aX+Zy7hLt6cPcf8eOV8+_%W%lvC#ysm4ReLmoK#|%Rw;-bs_F?R=u za?uC-Hj{1!M5YEPlj=I_}atx0+>P!BN zp#~90-RSR$_f&Dzm;Lo|9(a?Lw#h$is$sY|>Sll3IYy5->K4B$R->AZMboH3v@4p< zO+{siqmH;AkJBb-u0Y8ugw`mp~d z%oQH(sE_(hni)hKb**0+6E4joj{2NmbiP5vQJ?pBpKcIw)D1qrDkD;GRF*JB!c_NT zSQH^p_4se`oR?dp5VbM#3YeL;UpwjnfAONA&Xl8m=kK^FX!_HYqaO0dE(@UQ%2B`f zKN%Cqsj>91zwQQuh@<}CS2tJ7%29vxf1Vd83MohZ-9PX80CJ85j{1jR05g^QzW&$I zqnF5tdc=RdZGc+tB{HP`>F;YCV5iy2Rgd~PS;iC@Q?2kbIE5s-svZ71e!+4>Z#a|_ z9+98ys&053&LLV#T(x?*iK(vP;;N}(equxOh^y8JpBLv5SFIIpz1;AKtJV(hXlD>{ z)jHv?aFv_js$Zh<+;x}(iK||TL6WTpSDng(e?3Ag{5I*@RTJ@jO4D!lQ6zP~uh><)gjB{G_+Sy46xXdO`TfydYyWoc0ZWf4Mc30%u~j9(**72meHbR=ALK?W2kK&E@gHN6!o& zhPmyiLJy~%!dWvkqJ6Y`xDZt%JlaQlgx_dr5b@C=;ge1^i1_HR@P(N6Ybo*3;o&YQ zwnoH9M}*rIXas)A65_^egsE;@SQKHjYKy1we4CqnE+)#aud%Hb(as(pZ*Ic?_o>@$ zc%L>S!)X$St96x(TbKR}CFgj2&4QbS znUXa4Xh^aS(BS9u;P*vng~yUkEy;Ms^Z<_z^a2Sk>sc8O7|KvX83tVmZ;|M*kvtm< zVA2S$FJ5FJ_n&#An6K4g4~bnTfSBz~-&BtHCyCB_6yP$i-Ve6CN!t!2>*IuE_h|sh zab8svk|i|64kTX7`kmlaeXksGAccSdXVQF$&<}6 z#XIv2TRkNZ5Fa6NDBGmi`xVcwu$=;fMsFkW-d)IZjc2ow@Hm%Ly)>_FP39U+ zuAk5#(c8VJp;9U^lj(nmkIh0yCnX3u?r!NeOKH$~bV7RIzab?-p zd+n2Kvq87w~EVOy*N3k4w|!D2NY zPSRc1P39^kmmVzM$9YY2dC6R>$)yL2rs%<%%TMOoO)foH%-v&jg_F4)wz(cGzW6*o zSR`|`B$pm6n!j&`fy&8TeaWQ3wfG1VZU895u_>?Ol2# z7&z+w{=IF@23hsXj}lJeJJm`2IOHS!@?{L&%oP1{A`gB6LMzPYbZlx##xr^cc=S{B zJ|)4ai|Tln*}p*~`lV+xbNHJuXn#Y=iKa-1=YOFoLLhqp=Cog7&@*M03PqX!sh}yp zCl&NMX!^&3{zZd%7s-hj<(U%-G?WK_Btk1(hjCrd1U%#P0GEO)N<{@_<|wEz#0yF^ z#bt=+pP?zjX!a>s0(kWq+o}{joIGKaSz#SNZ&fhR*WHJ?$T$e9a{Z(la0*YeKYLW8 zW@Nvp#{7)7vW)lRbzZA54M!Q*@!-FR&0M{;;j|4bEejO^9wxZ#3_Jv2To$f7@w{N8z-*^WWsfNGrq&&RT+2 zY&Nn@tKIB^mfhm`mo2OLxyOAhNvFkYc-p>sH=h3a3az?5A5gZ|prgMs{#C0hxbKxt6}bftwR9w&$#v_pwb+8cy=qxGK+sZG@Ze8Ei0>bhPR+@9%ku-g z`6Gcq5d~Ui8^YrOL3N<(gPfXgj=ZPy(pk||tJytdkRG<`o}EbyRXsy$ zJoRlg+hrKm_lLDo5~UqqH}3mV$ZG!LL5wHzprD8EyP?~nbFej1B*gpA;A0U5Fq-|y zGRrE%RIhGytNr&rQ#&-q^qEXqt$5pJF=X{ZRx94o>B^2;-FVkls~cF&xDXd?(f4#3 zs~2N%X%>B7r)xWPABC^ggbk_>zAlPXzk9=$e)k6Z16ytCA={#%Xq}Zj_^T0G;eDi2 zOER8e-LLWJPD4=_6j4L@#8BjdLdYFDku28|pWBzfdKMM$p<$L*hoL0OwZs8C&8$jj zVgZSAE%CK|eOS+91If804qtRv|TCuIto&7E}B!5K&InR=%>T zob05KINAT8N}Q}N^ieMyV-64gJcL%b7vt2DjAx7s@Mt?Uijqj2G_HY2G$Uj)^MD~f zX(XEBGE8+BK~sd$%XdDC49hUxXfP|OFShyU681TKewa&&&xabUGAFX$8*J+yC{X1) zSCvmrWZgnM3%j+jA0g$Nvfj3s0m|_y5B`3Hmh4y9)RK&6bf+Bg==m^TNvM<8wWP>| z@q*ANdbVSGheao|R1?NNBN3Ci;;+o7$4VnLAoTS^!4%=2rCx`;)nmVr8WLLc=)X(- zC3&6jU|`|Jp<>K7)O6&Z^Ku_!UIUC&b}017ze`mSsaZy9Y-rqnkV+M)7mU>S(1geS zJ+C?<^^=jx4=sB5-=!LgRO^R=+L#>L_aADbiAY^yq^5@MT>kHQsVjm7MrwK}8xzQX ztNFLt%A?m%suz9jhLBBf4m?hGm~P*ap&C{Z(nk%%M1@+x^3M$_)Aw#IABNPp4T*Vy z>SDf$kfV62%lij$gG(ibycs6d<$VQsky;K;LvV)?Ber#v1Ad>%S@Y=Iwb3S43Y4u;Oc%#B)YufiNy zpH`3Cjlj2|JF$3i3;|ZX)nlU(_#qU=qTVqC*h;tvGy=bd-hh?I5MWbUJ(@ic6#CE5 z9mg)Ty38D81VT;`R-=!RgM8n;{cH-{h1J{i4?{CBGo%2Ts={iL4`Y1;yR7yvQ*6Bj zu~cUaR__0!*dG*o2vwDy>D2$_*kUpvliWr(Tmi9ZaIa`X$EKqO&J;|g2a!Q8gD-Vv zVbxWNjmu!oTVZL$t#V3?w;JK9-btB!)5a;LTtNG1MXVhyobR9=sZxwHUd!MIU#PhBujBXS;{Z zHSh3A*z=E$aZd#|rLc#;o@nSrgr?)2D?pFXj&D7M<=G%B+D?bQEuzs)`h;bh=w8b3EzWbUHJXdHknHzpm50LzxF??{=Ne3S}NQWux!az&rpKkmGX=ECjHD&Awj)cLA8mdOx6n zG5~K8IH-a90er)Y@Gmv+Ab{Tqe5HX$0dykpwFXuINWsJ+`i%yj1`y`m2j6O74S+Ma ziTIrco&(T;Iu2=I1ArC;zSqFZ0P4RDk;59;Vu$KxW6#FNS-ACh%-EwV9WJA^zK#9n zNk^`^m#;!s;=;~%aK16pue|X*`1uH}@C&3<3#I}Ic*chT9{m~X!-^tPfs8*5Opj-KzXLZ?fjj?N(U5>$C~n2UF!%IQ%mSf3uV z>^n%j!i}Q8gG z!#W$gWWUK*BjUGJtR^jZNvMft9x0q?rnd@L(lZs?Yc4vOWx_<0 z-lP181+;oR7Klcxc|+0Z$$l(RmPUPpcJvz*9SJ+5H9VUoMzxDox=Hl8v0r!z`mE^1 zY(?|^vu*JV&`#t|kucRwLvbPsU^IId1Dtg$MNd#Wn4%g@Qui)wuD1bIwLs&94a+o- zcDOS^loogk(?{w-O@GFNe*mEszK3yYNyamt5AbL+w1AReH3mD*iy;zi<=M;}l_3ne zGEf+zDH5i--y$9%kR5s+FQi??V$3?0i+%1^H)s92B{--50AW?YTN7Mtw#(}>HJHtj z4_3KXt<{B1--Mol+)$`WJopiWR`^!ZsWBPPcp$)|^V~o}+^xe#Qo3QCHoDM#2Sd; z#Y3pw^n3gVaI=sWcmJdKyACqxb-d z|BQ-H4~L({z;oC^LMgf996AmHOd)89 z8jZe67>&LbgWaE*El+qa?y)WE!AR4O2Y)a^D;!~*T9WaMwgDbJgb_$dBo4P>h(v#M zZDx)N7KZq6OEkr0nCe~(O%X=3KYtMq)Z(HkHQFP2555gwEX^}|W-sjaM6-Nz1+^dh zR?&X)>U4e!L@vS}^{2*%V}6=18#$;7=&3gAJBYJ>h47K9bhdaG^G0u=O19{fWH zt#I`Xh*L{4p3ySEql2+QuOws$&gf$(7a2;q`DBNy$dfV>g&FBj#AJ*fj;(dcm;2kk z`andPVY}3yjxnM_Hszi@c92)LR>t^0;|^5WHq$EO9Y|ubgWmBw3OvWt;uZdtnE3_y zlf@dHN?R7}0yWpSS%YXrDP=G^b|J${tp7Z}2d0%`8%9UXTfQtgQ^@})vs>wZg6!nG zdl)B^_{$k;zXVgp-Al=5DLL66h`W_>7q9y_DXa;RZ4d8xo9dV0J~6qh4hkhj9%{Gz z4O(vS3o&A_eo!W5Cwb|NRGT6po_~hEhyobJ{x__N(CqAWh&ntf$1ETm_9h}~%2Y&S;5B_F^c>a-bYDvahE(!3aeFA~R{&o>0qMLl1 zd81UKG2Y*Zrnn4K-PaLD7`^H-wt0)#4H=p8)xixJ}achV`Cj5p08j!`h$>!f#rQSbqgi;sd$Zwr|E#x@6opkgxP zpZ_ScX||S}Wg#@@fL&MyA=&m4^cjA9@R6(>TBCy>Mf)F%)qfeR8z*6n=c2|~3}Ar+ zt!kKVV;DwW03S=#CD(!ktY&@4b?ykLx%3fSrv6<`zF`XUy`$l}P5Yh7_N z`PtafB6yv00~rOc>`Th+q{M8xP(apBIlh?m32c<0YtBZj7HJvpm@?fc z)0;A-4dAuX+M!fGNk)|--*C?R0rwSZ?cpTOxEqaMLiSZ`vjx4k7{!&6*p=dKhI7%m zfs5lQh9u4e#XpmM8y#y&1anSpag`)?rMMM)sBqqUCOEalRg*YP^(m(qKa?^XX!iXD zm_2Ll)skcgDxaI6SRb5$#XYS)C5bhzUWCM*F^-WZMZ#3~UgQ{20HZ0gTa`U%3s#9R z&ubXHL*1Xmc^Rh>b$g+io&=*Br5DKUL#_>W8JSOlvrrZT*l-^FY=l<09^;fu#xpt+ zXFk#U3`J~~j&PaX6C%;OZJQaQ7l_LE&`dPNWti%Yg{BCjm%sa(WlhA!b)`nV{7SXW zuAunq*V|U3Au~U#KwLai0^x7^5c%=u{6-@Olc@2UuJ_x~^Z+giX;Qn1O-Y+X^^zj!`PeU3oI~5n0dV1(3>aoU8A(O-Q zD7gqzNqrXZlbN0((`nd?ZZxm!%Vwe(PGs^cYM}{s>BA6OP=ND`&c0Hj5W5`HDH5i- z`;kvX0gR@~IwKak(4VsBZ^J{b+b~yZ)J2UY1Y|6kfMM}3u)AG>Nay+x7t$-4u)Wnh z`0Ekk{pXC6I~mWI9N>+*8A{^#F&-j~GHsigz*|IRFn;u6KA9+`&8xyjpL~dR(^rM5 zE(KB~#7n2Z7a@=xeG@l-uC}de(X*3xure?H00UK~*`AV%sUl~0{9=kwertqQcsS|Ql8k2*1bDPBmf)3ybeD`f3}v99 z$i}{ptHA^EaU!ZVpfN5DA0lXKqH)^`YOQo$_ZE0HY*!VE)}AiJm)1cblDGvJmqZHs!~I){1ie?@48pJ1F?lJSf;0zA41j-w>v)qI(K z3q+zz9h;e>iiIKQRjDq~6baFd5RVY3v0%Gp9omSj(q9kPeIA>m{1A_O1_H6rg-Wu( zk|jL&_aU^x{TL^AIec_^-0Eca;Zod3;TzCMcEZj;+)2KHMzs_s_Ya`1X+w&HsqRCF zM+oG;iGWX7hbFE)#j=>PCvC>yfafIXeO83e1Lyq={BitCYB^S@wqw~B=C2{^;QW_( z$g=Y4?ob@5piZxdBex$o_{?@H-VRrj4Q*KLeJx)&3XF}r?wJkc~EIu zM{<^x`v;DEhCERyug+VRMVS@g-Jo2gQsxx!4pscqH2*pr`8;|O|9b!_GYY)36#oj% z{}qmWL_LY$e;Xf&1fc}H%M||}&EEhdKDD02-yR@kR)F_Y#h;2K%i9Y_KFFTLe;Gi^ z90G6J@lxI{n*UlH`S^Mg|9pUyIR(6(6#qoc{|JtJnmvhs6F|yz0dH@`U#9s#!;#Om zC-7fg@HIg6nO|^t@sxnZ6dcBF2Zw3%j%8747L?to6mBOutC0G}02z;eKJ}o`R&FNv z`CNPjx#Ud-jrz(UaZu@MkEGVM8p!%2UGqTX)AJSSdKon8I|PX{>PkgUkLwBpNx?sE z*B%i0jD1DAQs2cZ(LwJ5iCIe58*yEOfn1!Vs~PzDBz}S}E3XScDk=f%Vx^=$lJtZN zapW`kN&FK5Ql<>NPb&VNNZS3a+#7J@)A>pKWdJF&0laT1{wYY3|3w`6n7HC+s@#aj zM{M&B0H=~Y5bj@3YV2XM4$gm?2aI@C-cuZ-Kz*wsj@)y>!3WP1bNWvsUOoh=eh<|4 zuP>R`MiQAf;vp-)l{&PSgOzt5j^rN&-nagpKX(my`P{oQj43$qOcwhC#Hno$wEU_x zJw`IxcllLg*u6#qGze=3fAfNh9e)UPvYMKkTNU4`=R1r zs`+>0$mi^n_`BOfyEIxXl#NPrSWvqsdbt?X-pAaCH_beRwG=38Q z5P+2F0^UiAza5g~ACDuS!B6792_R*rf%jI$pN%B>m*B`p@{{=20HjO_c<)mDw`=}) zaOA`J3H-r`m*;+HSrjdU$U!Ccl8DK;wi?KK{Nv+CWAO74{)%*Efku6YAaTYCQY8^2 z^|%%Wl7fF+*OeghLH~+$-31!;b%DezrE3_HTGwD87bodj10r7sP?4?!piy55BtBHS z9zas-S`Or~Bwc@k$d?8r=)yGUBfOajggs#WN+~%kO03+rAo2A9N&J}rDRT(Cp+-^} zO_1a`buo^7kw6mvWPp@O1#c6@-yccxFT;_K*(-jgY&EC)G+|Elsh-vGLHfL}z(a+n zK+!&>Y&yjT=ikahR{lac6msU*2lN>J1)TR4aMlL}ZLlgz1&2U*AS%}XqkB1DScOfZSoFzde%nAS>@WO|lw0);aj2V+EwUG${-4 zq9ju8t03_SeU%?m$EYJdgP&J@7rX*|Wl%IIP4anwVuSNn@Q{`NoE!>yu2>JA@9;0+ znWBK_2`I?Y3PwS=PLpFRmSmux_tQxQk#d2o!tBSv}E!Dd6 zr0PIVy%o_3ywa)pOlw3ZQjI$wfm~d5e$ciyGJ#Kg^WeXU&H~Nh;Y|DYCxh#G(rs(SAQe<+&;UXHi3nip|J31Z zIas-Cape0X5?nj6E4>RcvnYY;7nS;Dlvcq`7wv~% zrf+f%^rzCyq7SKbv-6i|DNe)cMY_6!J67~5%-DCCdP8cUrY`_b!3d&f0iB@HTd3<=BGk6#=;gsZXR?B62bkRO~?UnTV6^R0?+^L3o*zycBP&8(7DH zN^A&OCm~UAErR@+2<-j^a|zsoz$#pca5tEKB;z_H3b!XBA0bijIfB>%Xr--W-a}?% zt3h=BTfq4161#WKr2Mae1HNONaXh*PZla~fN&*t zQ4S{&-gA{(7xh^uBj{&L;rgN!Jvg@~;=MZt6sGLy_F1bftKN2w=-1mLM_z(>Ul6Rw zUJRd+D!8uBy&UO<9Re|?pl}n&GwgXtOkRb7xm{?wy><;Fgr?imVvKVg3}fpeKyANk zi#vgBhlb_SOFnF$tTA^xzyTuykSS#I(nuKaGvbBa0}4~Nbgg>T9kon$BTL7YxcaOl zE-ROgbIlp$KswEt<-v;q-iA{g3UbYjIB66Tm~IzKJR5O!dW!spaUu6nq`6nG#xkZ* zlMit-buyPPr`x>};%WC2=b3c6y^m**$*gTF@&NV_bLm>uIt7}fwGu|f-0wlYIJxe1 zGd)X^ZXr6-%H#?{(E+}P0Z-W|3ne}=C3B-a3i0+&p_!VqX@d4^p3r{H*?u$a61MA! zWU@j(LWqktcC9IO`yH|@Dp9kB8JR7DS;GzSS;LJ>PYz}cGvl*{o2bU!hCpTwQ*br& z8xyv7ln3A2hrGg{GtNws@k&XUZkAM+mZV6S>Q;q(gh1$i#5#Ws6?&GFinN~P#O+O- z<;3kxoaIoBTZBODZS$vPJ;a3VJ;8&&3ZWIA$GD#5B;aP2Bbc$5mZZ20Q{8n4BaG@9 zP^1@W4DtPM!YcY1qpZagL2;`i0a_fobwBo_;ZH%k{0fRH=j?bn=fvCPws<*9=&@=x zS4uVRXarKu0o!r$$As-I;K5&l&fuJyz)lbb3*7QTDe;f29Q$#)>Z5f%LaBxpGQxiWMDs7wJPf z{cCYi0XD+Y4?7&RFiR;edI{TM=|AdfoLgM<9&YkV|5>MRFD`O90sKwNACMAUYNh`n zyIW3aX>oD(Enqkz>Da_C)#PR*+H@NJdU7)pFqe#80JMd077|wMZophSC-e^C5lC3E zRe-s`cWMjAYL9=xb|kFWHo)BJAan-dkCCuqdjWHKuQ#B6ge|UR#eN6OeGWnc2}iK% zZ^in4g<|8>SOjP~VNMifl4y|RNn#-?_sXsu<>8A;&WAtXZRzdxmq$~_lK^BH)vIvk0vY3G^-hdxd z{YGZ-0TP7=5|P71+#_+G{0I_G>8-`r*>w?{Wj95Lxfv{82X&_+^*L1iL3J5O6!bt) zI3f`qi^MED4Y8w8)80ls!E9qTIm3+5wHuoOYz zvl^a6cq8H05nN|~h;Wwu1wyBEX7Mchd&KOlSSM(rZPe6-BE~kWkT|jPl5v`r3$ckX zt>{MFL!5q8h7lNjv%URW%neD{X`%C_xT?2*P+WB3GZ=5GyPTgnrPHKyjl*-`8aOgF z_99er>R+XmW2NFRQ-3Sg6$)9@rhqOZoLp4GmlFPmqW&?}6!k=CVv#7)jw0oXN~~it zj>ek^DF^5GnV`%jH3f-+;}OV(g@N_Nel^(XIt#(Np6qm;*nL2oLWJlOL{CEEI=dr6 zM$evXLRshlcM9WtIL19-F z5PL^kXW@%ymGDonE>`1^@{}gPn~`QN5)EQ5ybKatBwnC}Pl4bWNx}v(!UhS1uY~Y) z6eAacGw{#96$v}5V7?UnDNtE-QXZmeDf&G?S#+X{iIy)qL1EWLe-i?1n5Th1M}c_5 z#Jbo<*!-G7iUi4N~;1{-9)&THdqvgW*9itOW5jGCYYy!E*?#*hv^F zS@k=B|4f=xeSM&;dZGu2malq(!mg{nCj@A@eG-=6@K3NjHV!mq-xPQz{`t(FOU^v> zw+czS5coBJr{Vk$VGeHFKzs{-HMreuSN{>qvKTIlWq7<&MngT^kJm%vk5gmae^5Unpi-Jq)?<>(-5nbjH7m+fYhrfUUyK2;-CMvl(}Fx z4uxN8LMFw2Byuznsr(lZUW!v#c#I1gM7tnz`WZQ~9j^d$2^C5^eg>57NOU^U^6f}a z*b|1&#lY?(bG(RFY$ocv9xU1i!q+6GBT>*6!FBc-wDi10Vit+R2v16cuO)J0B2t1x z!6L$3Uogt!<$4wQvId#w@64Aq7_UDAoBAVin2fAHdiWR6uo7`f*E$7+bQe&Av zS=L*K9S{6O(sm&s4Py|am`FN#Ov4a4frx1sgTxDvk1X~>E7kWS^Y=&;{J|i66hSQp zQ3O_O30T`8Mz%}I+8zmU0V2bQFeh+64NmroYk*-h<$>X-EWrt6^~i5JZPo$1E6szwTktHe}Y^G)BDJ~lX~Occbz>1cE>h?BL|UBLH&swlaVNxfj~MB z;r)b7=P^if)&>sjjGc}eTMRwa+J-f@jGCWdu#UlI1Thy(?;t{^-+z*-b>_kBFcNM*h=Kdwc$ypIaVS5@wH)td<3$r4U7L9 z*tCj4OljYQQZDpf1BJy@`uBz2*ag3-jOT#3)*wBINy94 zu0O#%5X^s3kzV#+MnEt7FB^)uQmQn^kp6skpqVMVn95pY*rF}MP3T+fCrCIIPf9dj zz+FVK@e(A6)81^vpGF)XJO{r7xql(ecdREEty%L)(gnCm6`(eCUrpUJ?Mb*%zj*=U zS`%kZ#hn99vRg7~MGwq_?zLsNB)2;l_!@YX6;rlWKZNS72w&@-A`i*uP6hSM=L24* zY??J5kIC-@tE&B$Ex533Mff0m?tKVO>=a1IhQ=gri`MIJlVnBskZ&$0N110Qap8WM zORahvq99mTkGe!B!trIgtkBa z+bxh%r5VH0td`PDx-ubNtm51^m{bSvNdb@SKjm_2^^mEo%Q3aF;k;J@wa4K>)`r)A zItV$?noE!%&Um&asM{EBwU>~8=UV7}LzY%UlU`pZ2@)nfxK!dx5mzm*n*Ud%*PS2O zuY6RT0@~nE(WRXle73Wz8t3&H_yY|i4 z!n3!K#Ni1|yYq4awTd{Rx5xlU+=8 zXuS0w%vNq4+)OZ`EYQr9zG*1k7lsJG29S3aaH>khj>HABE0KQ`N!&D4nG(2Zh;Py- zM;54aD&nZN5AI^)VXJ#NKrl>o3n3IyQOc(XkozH`HyM+d(s$CdkQaBVyJuP?+>Fw~ z{}@b@YG6$spG=_ZtGj1fs81tAs@;crt6+2pT0Pt2B~PXbx_gLvqlpDihj066|=jFQ$%*a6P_24pIq2Bj;N z;`NloeKD1A>LF6&D9#EpOW;|@KM!hJEXy0nyw4rPG_3kDQP2AB785O zABtd;s-36>@^V?Hbh*A4W`Ro;q0)xevbDg<)^bW8h^d=l7Ra|cuu-M< z$LLP?4G24>cg2cE;qj>SyIh_*c|(i3LuQFQ$%p+WSs}SwsCNIN&Ujur{Ru@IT*Nj= zUny^A!re2mYS6e2!`CpBXcqo@Z{{?>Z{xoY&_Tkxkto=YApZvhSjRhx19naj@;;Z; zGq8SzzrN3U$B#G9khiD!r5pFiPWH+?|hH%WVWm$Ma>Y&aka}L3KYtAesO5v~7_Unf#9j{|tmy_!rX2 zT@J@5hLUl7E#t&1P^MQ_tqL9>?k0LTgYsn>1+$oEiiD}|*&s(0!00uD>e|*o^nosD zp%Z)mt((losRaFGt@IP@Z|Ys!wYsmY*1NWAUFtD?Wv%Wj&lF!PKD^ew2xM&A$~Npe zSprnsv(LHPVMP$%0r^lOqrCk?iFx4Cm*kyH9|vD%e= z-SowUVci!|Z42q#>L#!!0Oulyy8+!#_!=av*oS~;Ahrk4Ucz&bkVQ3v1Q#-uU_Sad zxek&u1qs>SG)M*8fQH6xK()OYKp1sm7eMI*P`-k~L-?258;p$uoy#CqGO$O5f5I|I z>^ji+a6xC_eMoEk0aY#p>|-z?ltcI=B&^sofVq=EC>MXVkUvQ8Bzz3&ohbQRpoBU> z=sqM09z&4-ECPE_!7DgmyY2l{+xozVFKk|e#{X1mT{hQuA3*vuoyJ%y+i`pKb{zJ~ zum1}4{VwPCPH9OoCQp}H>BoDkFvC+LZC$y)7~`&orvlUKdmIa7acW~_Rq?5?>qOdS zD&8O!R6J>EhA$(em#cABRr4w;LuS?r|9FN5sUSl`V}_DNfK-r0S7gBv z|5T_ylUC?E8;h;j5RmwcNe$q#&u*iYl;P2Q;b~*qj+6G`T)|+`mjOFS|X8N{0S2JuGOWW{h?`HN#jbel#|?onA5*O z^y$CwOz@ILl*%2eSOJH^X21snznBVzx$rG?`p1!Me>R|9NEGZtkbf8fCbfUz;FKQ1 zW=|EIz3suVTBy-e5q%mWYpEpz32Y$)rnMUYZ6s{0HHfj+Allm4BnY1eHD5sR0EM%V zC>X}zGHRC%lo0HzL>uFat&`w>1~zNJ1~JR8GS(Yd=SruG{f3;UBa41eJebPoG1D>x zg^wk|tC0YEYDATiti#AItMfP8U4c)8L+M?%6XfY}r}XowbL)8h#Uk7@mZ4F{-i^xIp1hsWdb=!Ig_8bP7)dhrYNEEz>Aod>g9?+zpD03JI*|QRY8V)7#i}Ahu0Z(6EQJ}GinU^+K;x1VSN+Qvb1YaKic%B`pE8k8rp?YNQ5(6A;8+ zg&0dl`h5I@0j}_5P+tgy&LID}4Ei#-2tocB1lW~12^lb7^1gz9+`A28+RGriy{@zK zq2xL{CgCjzv21Ry(B6XERr;%w;^4w1phdenRyX_$mLrkB5&@o0<2n`zr;w1m$!B0w zokUuY(Tuf3nh-HI8YH1FpfjM98C~8;KPz=a#A8(5C5ReuyL#f?g0Af-vtOS zP7>G)0dAy|`S@j zqmwgaQxfh#IJqeeY?_kD|Hv5hjGOJRp?V8^XO?|D>e?Q3ot=(j>>*;&nFQ}1|;LMRT!*T^;$|rV{n|7q#~aj z_8@GsYL>nr4^CoHN@AaZf&DWE;x;mr>z|i{&i*+IwA=6x+FJVOvOwq<{qqedVE-iV zBlyQ#%OIw;404SAd9!`jakyUK(A^(zQ%wIwtq=?@y7eQR>VMVOSAR^6Wz<$Ps)^@e zx`KbX8P!#Qrr;kG$chby0G;lApt~s$-}8*^0*!N@$~~~0f`3JGpF)nRWT;ODGpZWI z_zsbpJDn+Jzp!Fr)@%JDsGhhT6aRST28n0>oX(u2OUZ09H;B&sBb_<9#*(wb%ts!tO3sXL zBA3~rG)O%2Gr-J}lT=7%les~3=7Yh>l9Q{5oE2uiOJ~lEpCp&b+#vDHpV66Q%3O9ShxWoYIsWmC4HD1zWXz0NYLZ5h*<@@GopB#iTKiP8D`u7O}(W}#O9TLxPN`BuG_AqryY7F!4kS6e8pLR=oYy7;SU*hA?k z30yB>iz7qr0bySZ>Yq3(P_K>62goHgWh_&&>o*zeX_ILV*1oPmd@AC21_F!`uBb_H zi_O`&y(j}4NM~?)A=p5Ygx)}sxRuK}$@jy9ymjsE1?Zj~fU3N*HMHI)NpJP=oVB_9 zu2?IaC0m!Ps`+1{BFh0eU zJ!!=KsLpHc{ue>-2`lhIiz10zk>{`@lG_w#`(o?_1^ZredHp-xmVK|ebPT=kHCJsH zbqD*t`vNnV(%VHl)qYZhpJ~mz5;zr~g0;{2vi_NW5?Kf5cjN)vMRPPq8K{0Au8@}F z$Xy2xeydj%Smh+|VEM%6%fZ!~ran=*=6w!ks!WBdtChNiNFu|fJY?lRE(a?wrJ-V+ z2Bt5L!I;|wjQk+5%AP5B>Psx#IfzruA&6JHKukZLWW2d!Fpm68aH3FN9ze>Zg13d@ z@2&Y~;yAQC|5AXIIR(5!6@QWDUyUO_CY+@IEr6661>RYT|544qAIG`n`9mk*bPqxa zc%N1LyEOmtAn~ihN&4FXq|65JZd3f#kYss#;K+{*C-G+kq|A2k?o#}nG=DLUC!h`! z_|2P29tVx0dmz%XuT<-mA|}@hzX1Ice>3IE-3lTrE5)GR}Ub4 z@Q>@N)5x~?>EeoXod+8AO@qX%N|y^rzg=VjkR?gF@wv!>k zitx+8dC!7}xon4?f-EU{7R3hV591*#|1vogvPXRbp5wt&!2VRg-UJ1|gH8q0Kxp3Y z*b0__XLC6Px%Hy9#ZML|*qpeHcpAve;}q!5Q~F&%xJbzBt4Y%Uzm!ZGr%BrZ*Y7V@ zX{p>>Kx(}_$d4&Kikz?Ogogf}tpi>`TB zfkIQtU_y-nQqqr+dL{&eFaB;GFjDpf_(!L?9*|vZ$OA5 z%Dw@it%xi8287;3Jkd0MEjF)u8W=!m46{m=X~js=w3~1&n1>+03;|4gR2|mH!O9&4 z(UldMHYC9`9T(Gvgeam+8xqQ4&Qf(lLgNrmG>u=P&3hOi%`1ahH3mwp)kBh|rQ=v| zGJ^aJ1Td|KIt-8l-r}6P#NNhrtu59d3ylTyfTb$CGzR_+*x@`K!eGc7;CG#wYy@{EY1%6|7VJQfzZ(HeJE#sn z$pP;$gJ|oADyX%o38v||m^L*;5oOxc&{D*eX;VYX5l=LYZ>z}L50K_HhFPV`v_VMH zv{5(~T!|omG6I-3Lmf)wVC8mfZd?3*`QI9JdV*;>E~ZTnQAC+GJ#-f0%CzaBa}ZB7 zjbB^Nn+}lXmBFkUL!{QeN0O%ffnz}!^!!=~U|LiiTFb%8y%$G*Bwd*%=f%YH@N*zj zdt+$rr!?P6N!-r!z9x+VT$)TetVv~nKS?0rb{@N(ZSnK!djQ{g2~CyP+{kGN_TFa8 ze*P$)DY5e#yUmszeVx7uY1U8rD5?pSHonc4_uGu}CE4^gyVsATR+VInntS#lb;)ND ztfkoU3Y%toMQcmfNSc!etZluSk-Ms6Op0Ww)u_`?s zY2II#e)%_;2|1-lic4{UiAS;Jy$nw2AH^lMtnOW<_zxr9c?0C-4p^u3`{J3l+$}Vn z7rQ0)BU~4}zP^~8Sz=G)W8pXG{cMP~u7dQ9D*YwW#dVOLsZ<|CdfpFEJ!|#pG-VA; zll{q?)%N6rNdNI1=(i~Oz2KL}&Tmzw??PI3E@vx!JBwovwNN)iSVOU$jlaGj;uXML zZ9E%LU&0Bijh|{-f8g2WXw_TV^2F45;Klgo^NA_!br#F>$^{xN&=0uX25vs&HxKwH z_{X0lixq&xhlfd8MAAP!O=cb*mWTNad%|N@LU;r^R#Hy_A@&F|VJY{6aD>E!QnqfT zY->2ovBuz^U|UU)Xd6jQNcsoc4*ef(?*U&$v4)NBo^x_e8X*Kw5QIR2ARvUMfTA=h z3X%W@u+Y0oAO{jdAWIblDWOPFq*vtvii#qNqQJ$5Vgsc~5m68n6-BTA=Xqz(oZUl! z``z#RpWknHW}dfAd3Sbpc6N?CZ<^ha1<6}I=x9Ve4uX{pBl7JT2-8TEZ_l~|m2c00 zSVSYgJtHXWb`?*D0AIW;2ELjCVH?()pm7D-cHkFD;|jDOSD>Na;2Jcppb2snnz!&r zEI#-g{Cq6^2fUsK!QU7O!+N|17%=g3J)k;-iy2~3OMSgejVITkK-E%4D`z52)_o=h<*(si&iwOUx8>uy#j%s_kmJw zPFDd6t5T_P0+q)-#Wcdr=|Wr6jRia3nUJ+6*)M-*BCl#1f|gFYen+Gcok!~cl<`#! zNw^88)8Cl(suFpwx zPL2nSVpAOxbG;5L_hhR?GK zIa;(|gxpj}oXYVTSm9PtUiA@$JF<=`2ZBn_>F4U?h8bxFl<;vHcH@vHg$kvHh7mD(zyA?avk< zh2>`$dzZpL+ozo8yPipE9RDW=!}b{d5-Y}A_!9=k@(l2o8W?|vv^)d+%`|q-lmULU zsi-Gpo$=#X@MiQN;-eIP(ygb0NRT=a*GsjD=u-lZ3;#-(%7{A6+s|;J3 zY8a0NvNDRl+f>8&efH*2t>iO4ta_F)d~4g*rv=uK`f3pWDVpURo$o!4hpZ`pxkjy2 zZ*rXm z9RvI|HtjFq@qOI1cWqh{@X8Ui3!rh-+y?j<(ylUU{tBb!dAF+JF?kn~Uk{HpQWeeR z7#0oRO_7tRIM*y-Fh;@AzX#<63;y;&<|3M;lnGSv2Q1SKWXlfriQQ34tvAx@GLYj&lIUfO^!ShCsxai!#zHQ z6id_%lpdspOJtq1^L-fjMbcbjw)jR$GO0hF>TozEtAWN66K_SDqr_c7V-vLo-i|aq zVA6=Ac?|0S_&Jd<4!oa|pPm}z4rFGg^)`s?X-J$*;uY%Yu&yWZNzERvBh}M92OTS@ z$3d`uvrBUjguh92l%`2zRT|gEMyDd76sgw zBjHhmuTZ>0x_H)dXkv3yB!eR1l1R~sb#~)$gWn*<2Ac%R8>H$Y%E*)OGQyXQJe%CE z%1@y~Vs)*JpwMMuBjytr0fux`AG!0uBdliW%3$G#a8C z870$l#q7K4w*^-5J5-H!g~TdK=^C|ugF-qDN!>}hLaiRvwJJ5I*~58LPLmBCk5i9> zU}eHS-FzJgACM>&(;O%(hUl9_BP)iWu-g@r4FOinA>bz|5Vm1W2Tl4F;1vgfrW?)3 zr8C_PY&P+5(a%GKMJMTAlCDtnBkrPW_ONwT^d8XBk9r&g!)l2}VaC>ha+p+|G4UqC z?-9Pto2EjLl|~_RFgT>ra)Gkai2g#k$Vww9>~^KCh5#$=2B@e^HR0S@N9??10-s8n zJ8y)C5xy*MRqs@JqtJSCNZv{UW!{J`CK{PHg2Ha+tpx;_w=KZ8Q^1k8`JnL`>u2D< zlBS9NaA}N8)I-eS`pRpbSC(V+pBsniPi_uKvGuDvWz`_q&v!O&k zXq7hdl3HUi+d9J-3WdLAxgTlFbhR1oI8!~*Ot#c!xS{k#`!mXMCbgJd)b9J^%-GIAoiB+}dUVzY)U;;#+V;Y_u96bcmTSHp&kqB?N zkNHBV=Rop9Fzlsz8Aw{?QHsw2SAG-&Kpc*bk8(M<(YRjvt`Xg~8qq#j4_X_;52`_9 zLu!?;k8&%a?s_9R07tMMt2sUAE(EwCje`WoCEGxHj}m%ZlG_d(+X3w$+#QLW!6Gxo zoZb@O=c5T~$jhR6CZ8y4%=iuUJzttbeaE`cT#nD?`QHcfs^}Rr7vgx1^WZNpQ=XOQ zG`8EW_aV2)er#J~VXtJQpObNF!H*vzzF6X;CgQ(KNw54|XRDo5y zxq5)xh3xKUmfu4)8rDR>tZ3h3*v|$>WJPOSSF}cSMQbEf(NoODP`e#fz>kjb4-m`k zhg5t93IdxT9=6KUo-~2=Az*$ZK&T2~QDtScP`M-2fbd~t)&2(UCeY{#q*WtL=TIX$ zhZ?bSXf=Vbcmf3LQdoHcv%sX-QoPnDVC8LW0PwYB)weNuL?OJ2@D*-h-|1VJ^(r*6 z&!xx+iiG=Ixw8|?cjNpV=b~MYeT?2}djr%wkJK8KO1HYg{do7< z1XVv$o!lW>0v!bpBYKGF6Li^`IE^*u;{2q!6ld&Ii$AyE#=qndY5RsT9PbasNDEXwipDQ$cg~|&*nOhfNpOr_EPSg}pdBnQ8 zaoDd8`@DWFP$rV9uV1_b0gW23Lzi3~heM+V)6r(-}LPad69jkt5FVVzTr z=$sCRQs#6b6i%m7ol}iCZ`QNG&U}(}HrX%Fr`)U;gZ2{XI*%IBd9;3jGTy97T1IA_ zPmS1DW(?epX34dhoR^z*->kXLZK}zRTP@GdJ?dDVEeSO%Szh8`l`eVEi|Ci~ovf0u zStYJ!ShIK?bXy#n9hH5hxOC6JC||oa14~OB_Po*>>`vlCt~q)j+!}{HdUyaZZ)(#3%_JPYZOG_B zNsk%$&4i6iXX8qv-zqh$?iTN=@}jzcM3 zyEGKuK&3^vwqq2^Rg!t*+L^{`xJNqpH)I#>9{U{bq2l&`E0~lHxyL?p5>jFJ*k?W^ zROKF@x!vP)?H+1O`K3Lk++tbgy~?7o6-nS#^4Cwlw?r(IG}vOjzOhW6AeHwBma03br-4;x0h*H=UyW^_YXs< zbn{R+nM%Xmyp2TMkn$lwws>6R^^u@ki_ zw`>fUZaEszI2>-b90DrcaxW-HD5S?q;+FdWeL>jimOCIrwn}|4I9~LQEsSdVK*ey z9EZ3eBckzgH*5@}yqRWzr85r4%`^ifdMM#8IBXAH4fu1wivTSl9MN%VTzjZSbQ^0# zxAB|MN)KHQjcch@d1y)09Q`R7Es}yG>`xkT`;&&XEsbbfb)b~)Q3VRCQ|Z;+gDceY zx^yy)zHpD8;9r_kw0i_R9K@-ymWnI)2zV$Ra*u%LA*90Y5%Ba9s&bEL4`0yg37Qy> zT1JVn)}0-ddyGd87U6Ka$CEZ%lzV7e*gXi%!XfU#h-kdrJ-Wdt-D4?OR^V{B$54>y z9)wrpu-#)PV7kW{K<5ZYxQE8IduT*AnMQPz9fVf8#~;ubgX*{4qb_QW?lBZlkg)D< zG~#v-4QpE((YDf|lK-Q(fT_Du{qID^CO9{X*yDEH8`uzL{t7Kgft*|M(p zz3F)Dz&cDArF)zQ%LN<`_m}~a+}{BIj>C436M*R+O;AZqaYVX@#wJMkB z3s`O_XoVCUVV6h_A#Rt@u(qWUZEGBq$_)i7s#EFJU4mc8A%cQ&w51K|#xWsnwml##FOWfgb2^Ci^afgS}A(yzrvl*$dOWfgkja1tunrN4J z`T^w<$6)bq9ATHp1La1v04YD>D9R-?t-E%K5M;Z=&yWgf_u`S{!%hwT!( z0n;T2#o=(cLm(jp$}-0IhV1e$Y6OT2(JG1u$LW2%uwx zwM%Hk?GhT+wltz`t$|Xy#0e-oO{G_N34Rfl7u&-$7Q-cy;SL){N4P|~x^c91xP*!; zmuTyuG(KTccaFB6;*t!#BW&v_g*0|r{bm$y2KRbuJ%o?j>^PS$7VN>E`YG)MFIc_< zZxq@~T-|9hLO!HkBzDvT5jE-4)uUb{V$x?m^l}G`wkSeJ967Q-opm0t7wt)?D-PTB zR;a1N5L%SmXG{JfsDm35ao+YYJ3bw#9+uO0G$q<4_X0rs6K9qotZBI9U!bT6H>ev9Q5mh zpdKTK!>{R?8W+zrtYY2OYp#>v{hs{V-!-CrP$RYvS~Van^H6Z5$~fE){5?SB1OG5k z#^8u};2#bsm$37Je=}sH^8{f$iTX;R20`3ciiUMAHKMPS6HqGiP*5?MO7#Q(L>q~C z;P;}9cxjP&8U?O?Y4MB3EILBM!=cG}wX4XPmoc@UVT$|9t|A>Jj+y^q;5KFEzln1X z7fIMN{}MN{W`T1vx^uN8nkjo5fN$(=0DjtJV0#4M)VUG4J&OZdh2)bpGdPg}wgLFs z<~Rpxt%4#rvXXn^#h$jrl)Wj#5zow}viVJaqv8=y6%f>h?MGz)eD$5@5f4}T8VLs8 zX2{HO_QT+#(KHyFuMD1GUNUliLJ+*fczQ5EGaYkEA~3R+;rvfgIXLdf!Eq1SR1S_i za&X*p0Xl5s-++Y~SOUWVOG-NcNf;l7AUK-w^x%^WItJ%T%E+qJ3%UJQsHzZT>;9Fbjz=ovX~Bq>+rAa|nWeiNRnrxM02%18fws1YxhD%%63b zKkFfzGJn=#{;a0~-s9TlzXl7lFb1a2EA#!34tF$T+waKIZ+AW8c_Aq-v;i@^ZcV80{-mLK7c zqU>LE*uUr@o3ek=VgI6McRy|aYp^g6V_^HdvfmF$DL=wsK29t@1C(DG|8Ix=zddzlY5Na?g?TW>V#yp1mLEweKf>T8u^0@14OeJM1}s0qDjSM$ zKaV$j{dv4(Q}#Xb&&lfg^LWpP+y4Mqn1?a2{hhMk4@tOR7J^_t<0w9Zj=|ZIGV<;m zU>cb)e+~j8CNR_TowHm9W;(23H}?Hf6KXuL-$MycVHx!=1^cBkyoHOc{CNj)cL!?} z%7Wp7d^)^e?&xM0wP@vlhl^I!LY0Fa*Z&tB^0a_jEL4$yBseTuWJQr|J$%eg&y>Hn z#s`O|WWyNzPq3xdxqRQt-`ijEC?$$ckSFKiw9f!pjIPBFb zQT^1y_y+(zO!x|aXmBU^xPW^)cwQx+djYp>tx4K*q=gskW8-KD^83?mAZ#a5eSbO& z@Fm=|PXIbaSl@&-qHk{+v2Sm)&Ds5NdxO-f@mN0l_F2^Z1*s*B&+m)InCn-2Fg3v% zb>eSO|FqM86KuvW971{*&(Ic}hII;J95bZBY3tz# zj~O)L9y4fISE@$zn4v7Zh+~EZP}q=4^_U@qM2s13g8;`2WNt!%D~=iTO1`{?gR$c* zF1az_|NM!fFS$gy_|+ws=%s|d-Qr;#| z1s9Rath7ktyBxX5%1TNuI$1kb!P^|XT*jxq@~J3)8LzLYWbb?ofUG(L)it#cg?Wz^ z@E#n?u(|=}$0k1lik=8K;+pDc|4GPX@Nv{!4Lmi-r$^1Q9kqsKxNlhRft{C39kA9X zyS`*JqFYxZcI!?trwuZVGBN0ZxNl!dH81ylV;`bE(`X>&x9Wn47so)T&!-88S62Xy z7YAvNlNR=BCWYPh>O5P`c;HjX>QK|qRzuok(!y$(6n3R1mlp=p)5#_m2KLE>I6Z$R zd}lU}u;**U?fDwkb)ymO`6bcT^!&L{IG;+j=ZBC8&#wakdOn#KQQ*Ju{N9h?>u`Af z5%BMx_Wh=U`!1PpRt=wv`Cgd_Kbo?_MjOB#HMYZ0-f z^#k@*XIO1P;J(&PA(u{B$G+BTUHMR;<46fFHd78$lsND3#VHJWnaN%*4N8>?`*Tjqo%P3c1k{p`_-fapbYTx@g8HK zIc7D0%z#?Z`ly$$uT%&2nAf$Sb%=KotfP19xdj@sgpvD+Sg%3-R$R8!)D(x^5A}Xb zO%SvPG#H0HK`_CxN`u0=DN;I7pehpKkJ)4ivZjS62|^J1xCYQL1VY^)-4}=JX&(Qx z+Ya+qJ`PTHBjnmm&LX;z&u9_Cu)TG(myeI|L3w)3yDJNuKSK9*=)L19_XQEsJ;9-Sf|n8@-4oop zCxrZ4>3$ZRdzf$N{r44gPZizFTW@TJx)(TfFYr<#qHw4wUV@&L7o$pb6|8H4tt`q4`9wG z5_*pCWm9Z<;s?k)9b*irpI-FEftV*fwg+lppil`+#Hr$2ouZp<~?1yQ6K zrSX*Ws>j@qOO{0%isDQu{BMdx@&C0*yk-607iq4UI2=W|^$V%QDsS6Gn2GGaJ?p%H=BCz9-f490yvt(SmS>~Fbu?!9WkutoPWP8?L=6}wAQwECvuVr8d_5Y*{J4c`l zul^d&hFdp9u&Eyr;6IHPO>Hnr0DE?np z13PK-68}Hff~T;RRKiFUVkQn}B|L3jK!)E!&DW@^#@bAqf<9lJUAA4Htb zGIl1?BooEu zgcBlEoW_Mwv5c+aG#IER9pe3!icOU57~IMLD&q36Wq5>&Hv%4`VzRB`7BEoFP>8Qk zDlRA$|FKov2afGUsiYU5-pech z8D%7te$Bwfu)wJ#5yJN=1wpcA21hf%Rk_dRNC$O#Q5<&suTwe zG9_0dpq^;$f9|ar7(|m@to(fS1iKL#dLM^+f}LXS1)grtH1si2Y6mzJ!e4Z~3Y_1TyC#a`^vRc-s6CviwRd4TR<-hNmK?n0FyR z1366=zYRsJr|fkcB_qE2lJXR`D3DuIg8;iJ`S861)C{7k%d(;9`#?KgG(F)aG^+aW zgtMes?;``*+6kmZWMoXk@*6zgOdn*uy+iebz<;({~hc3hds zEmA>O}?}gKr{0V;WiYp=7?aYM!x0Q{GNOHDjuua-ac(GgnA<{&flnA(kgM`_div@U73w!B+*Dbk{$7Z-a zHX}f>%RM$jJQhQDY2*yMSyR=xK9p>sJhr3TV><=@hDr=pR-%JX=^XG_oF>Mw=9j}r zcMb4sVf9a{-2$AN_7-loM#(ymUV-esyi7VP@5vVLv4%t2R*XXipj=Pmu%~Wj0_Gk_ zTLHaKIQ&Y*S`AtNX5&x|2{>{}Ac2i{-UdF#zE%bqDM2xS-pD!(0%zq?!CapLm(9xc z06L76@TK7J$%G)BDyssll!e2GHaDBZ%iPFn33xGFSap(2nSN5#9~xA#d#-QUb4>-2 zS~kMcSsWNoR3m?8ur31lU+^|2({tIq?E%AnW{I6!4!bsJ_z-kzI0r(lrPt693x={d zoEoxzg!G&4>^lAS2276ANE+mNDFa_3X?Dz|H@5`x05#HKk)1X+_fTL?a3zrs&=U~ z!6^)IGdN;%q=7o5D2}XO!LdqPVhYPT%2IpjvADY-Jrr^imF#Jf@#eNaNITp@vX-ji zBA;HuABsztwa7;iwOjTg-y@7mm$k^Zo_?fyz)!JaEBkrSXn7_rE|)S@M3Vi}%?NWE z;1q0z6FRB(D(EJGk@XkCKZ?rLGDoiLxa4Y?k0L5p%X}CF+qqhHS+1Ia#+)T0M`Km4 zUPh9+dJAFB`#1%^#0j}Nrh=a&zVAYdy>JRXh7)p?r-F$R7+KZEn?}E)a`l2ES9V--^@5Kg zDpxP~Zed(n@P*5A^%!W(St4>YR^{p_lFZc)2y=eNDd+_ga#dUfk&-bDCJQMuaW z$dw(JTy64EMCEFeZwKR&t4){X$~(a{n6sJ8(MqYSTqK#Ru?Taf;S^ke6LPgu1)C%= zvMNLL6P+u$7@fUF6OgGr5n7um&Bc)9-L9)mN(VgFO$yqinSeibkZ`w~1Jcj1w-@l2 zLXz>BxQ?eV+Q=*Q1m5PoftN`jdRDV6VFujSWFR)(uQov0VsC(=(w@SmYB)FDPbGSB z<8*&nNv5hn-E==MOHB7w+JXDp41Wb7c2zSYGo^=@TbqpP3jLw?6!M~VmcJIbF-psr zsBUh*BbUWjq2GKDcRIt$2h8`QbpdrG9Ql4!wy)-$>k>G*iP|J^Z6K$6vjYuZVY7pm ztS8O$80jG^N1=&>K8nnsrtqCkc8VZ2%Z+1f$F+Pf0ey`W{qdf&w~Ap=_57SiZCaD} z(j?R9g62s?)6`v4bn`5ZXdac;&9m4~CAxVQ`?pBaZl1-i=2_xyo~04Zv&`K*%l+G+ z3UzW0S?AcJDsp)j4!e170F}+t8_+nyS8Sez;AHc>3a-QCbT^NNuiZRjpoz^xk+-NR zqIrnD><3^bYJZgcF~i$_K0SF0pS9HM z%pJDV&bO>7(82*O1%~4Ya)66LhqW05?!!Vb7l-V_B73W7#NJzFFE}|-F%n#($yot4 zlv4#Kyl_1XfEiH(@m+q7*{#2Aqa^-F2^m#eqtWQxtL8kQijaxetA=oS!dIx#dEpxE z15K<^iu_Fj5j9H8psFyAY^{bAi+l?xX{2)N87Z>|GlPHtG%0$iQR>DaK$I$|5| z20||q!$zc&%KR~rzV=g#zOKIZca@}lU48AkuD)?xR|nnK)gk}Gki&JwnWB`#{@zG=3$aP> zJD6xpIci^5D=g~-%D_%<5AuA0C06$&?^9|*=s$o0&jbFB*VS43x*88EJGz%a`H@uj zb*14ec)>s69g7A*6TN^U?^2VaA&3*(KrJ)ks5BMIp)nTVATq0UtL!} z+Se6U2g)*mv-Wj0*|NTc7G75rXoy2!S6F-^PDb!f9APKZi0x$6z{#n%X5eZ`&J{@H zJdYEutNj3&5p`Yttgfs3Awi=go}`4ju099M>*^;!DUgY{t_UX+zCw*o3SU=Sp@}s| zk^j&@M2!;jQB@d6js62EURQNMxs6nPU1`KFa(Q?Xud92&)t#Kq>#8A$G~NeCg=; z5TF`;VFd#9Bxzq*fq*@}lL1_`dy*q2&=9<4CfE01)-6sZNW6v1Wd$mx7UE@U!CQzu zug~%AX0d?!oy z76*0%@nT5Gf0JmWDv*fvDw@_EH1&BMq0%_yBV0zP&9zb`9j#$lf56}>NL2;7Iu85O zlhHGkkG24mN0|GR$p*DtC@6cCk(9&Z3Vu2}?5BO8jjlqG`zYdY72?D)+&HrK9Hi3W zeWO8{K}-2IPf1S5H6ba0BG#G;y2(Q%5gZZ1nV2n*sT(8 zLK?f(Apea6lR(_fR1>aHy;H;0`;MIlid3Mka2{lUPppy~N9|p-bJq-%)})57)7j?O zS(w@aXyOv&rSPbca$Vp8x;k$mKCUGyG>)Fqp?j5NIfiQIzd1wk6I z7a+-sCbEc9wW7(ezJNxqc}zw=QgDPAG^`D2M6Y>_!4=Lmk5!JddM>-V^8H&jq&`#!&FLcrmgoi&kA(Z9myU zuMBGYry%7iOw3<*2AxZ7{|pk-^B>$UsWb3;zHVKCkNQAV$?|H+eQmk+XR>vROH{u<%aY|jk{J}zD3%e7n=jT(Nr?9y-agOSq zCZI?&SPi;+(nt~AlcuqIvW7#)5JZSRiNn*z`LhsU7qtrMwK(i9YA0ZJ ztSG-6+)ch6Ow**0*UBd2@QMZ#wY7kQ<53Y+OC=^9YPi=7fXDG_m@5&O3r zNB;Xmiv8GMpm;YyDzYD24hHsPu^`@o!|uo4aP(s&Ri^A^{n%*;vl=LvK@RE1z5vR8 zjA&b;k^LA!VYlnZ|FkOFL%{n|AY3%7GHC3_#sZ&2nzN@k0ODqV20Xmr;3>FI6LHMk z=iqT9oTkJkB&@AqW!FJ;7g0you^KdX9i+WVn(jI@qOWL;IJ*uCiBi>d^E=40uO|4;Ialm9O9%O8yx#e95ulehR8tPer&m5yv(+I)rHE5lDV zj?3hYXNG@;B<=1i!@m|ubYCSe!7VcUTv@>G>$(pm$%kNce6ojNhW}q8nXG0JI;y9g zeZPURlmCIIDK~J`&>xWOY7R zRqf3&nfL(5sCSN|E*=Tho?+!c75kKvApVHM)u%jxin#!ABm7Q1QH@kjRI4Gy3i}7d zSP<)K#7RTB38+bqq5Q=#mZ_8$~~lN zZ_cfTKwW8#bhwSQT3$2&z*E_YCY5rkaOf!#uDSGf{IH zwf`rn=G@~*sE>_R+(`6s_9uZ%d0Up^kwW-xJcLW7XC6?`%W8ZViQs%n`=1o1Ld5x#R9 z)}PQ%XG{ShjYNktTGu_NN>dkv#w3PIGsS!k&5?{e7s%R>5t8LmuVaZqN=_69rFgt8 zm~J)%hk9vJAkA%Ns5dHB)EAKFUggKwp^uAF6Tz6UDt;8{C++lPeB*f->B1;Aq4ib4 zsKxt{o^Pku6pZ2;uaw16C!x+;xTIjzQci$CJ6laiUp+N7k zP_7x|xW#JX^lwn=z6vTQPJ^5{<^1x^pmO?$l($Ib^iPn}Kcsd6l`jsCfl_G;sO}dB z-onpDhyIv!G#Y(8*wa}(cSNBCK6{F8g8VHPoFG>2Q{KX3qYZ15t-0ZASZami%9>As z`>@UZ1~}ikD)(`4UjjE5=f%B_rz;#e_al+>5Ke~Ge2E&hz6tzO(%hp~@jlXalBT^+ zBewThk3tO{wft7Ek%}YCsu89w}_Ruy=FyJWa0wb+2X}X9S(M7b?OaYa`n_F@5%U|;dJYaB#+6@&RS<8Xf0o6eOgY!JoU<2UWPl^P4~P^WgL}rC za^DCVgK$!&Ms4u+rAB9fbc}OTz&$d>^49>s@HL z#hqQ}8|t4yrV-;Ud@z9nOK&zHiFGY}Z(RyVbsRZ-YmMwAFIU`6fepKiyEBl%4(|JG z?lHjLa&Tvg?s-7ghq<3Nv%y|`yJ4i-tB;vB)xzJ@s#<==8wI){|%h=eqUQ?`RS6+czD&%@X zFcF| zuaoe~Isq|gc3gmokRYh!Gt+0t->;|E^Gj-;JU@8~OF2wurGvEOvTXM;Dh`m|dswYw z$hIAS@Gl)#3m6CZDX!FIKZR%a@1re7`$-z%m~dEV{tCr1%P>N|QXHZF zCB!fmn$h5uZ?i*KD6|{!HPD%@Bgjn54ymNqBp5-97AbNU1Blh%ywF1J8F}pxE9~Fl`A7@f**}Pc;*5HflqH1EIpHKHPj;=UK z9>*4%=UHAEC6AB^y@h5Mh(~-FyU?slusd@9jJeRP&O|;EIg@Zg)ox^f%Da;Ue%^|B z2gbwy?Jy!|7yvTQK^RJ5A>|WDo=Xe0+wc4~*5Q=TnrlI?*AVk69Zc1<_rREwCHt|p z_zy4?BM}wR4F@`g9Z0gr`VgU+KGxii&^iT8d^o5Io(4Env2*##g~_&r^qi(fs)8Kx z%0<&yAyylh=bR?d#yDJan(6kOCJ9Y($bVh7LPV^odPA*bErb&5olq?>WvUNEQroKu z8-Asd+Fso!-Ueg#Zt$?=J)!I?94K`z#kvH?GDr_jlfcM6kC2QG&#uETm+ zcOD!qkzE61>gov{g-XvQn!swWRyJt~;7{D7UN-3n;EL~wb&<+6vc`baaCfN8OgWo1 z;USQ+mjI=TWQb-c@khuAqg!oKPr!w4(ib*q3E;yH5{&)@QnwF6MwxPqZz{BuzZb%v zaDXGb#`C5@O-G=i!cNKh5%OmSPa~jv{lp}0g!kK=$>8dKHO{Qz;C$R|-dV>pK&G;u zP*SKA^+1xvU1yV)0RF^Hde0^u0bFsHWK^V3+>;T5-DWIY6qoCr%CZ&d8;<$y!2i|(wfW3la3n+x3W6wtjCQM@=IXv6J_&ts_PhhmqB`PuL{0V!6^xhtnLuo8IggtUMTOb zGH`D=Ze&jaGwmFK{_FoOHE=tUuyHqo^k9YrM%HG8XNuC=+o4s(jqHP9rsia5Y@xIk zQcuU=GYry$t0ll?fN;P^F28X4;q{o+p{{i3n5Fc5M@b9?>e{3wfWLK<+S{aafE(|T zGTBm#%p)7|S7tDnG9}OyqzUhntQK#w`Y=( z&7ZoC+FSyHPua;f)?ws{8-qR!qdjrR#-J#Nb$PIPc*Z zpz$6~+CtLwn+lESd$>lNZz?DxO6_eMw%W#st*659YmrxZvu({H%Enr-r zzC=lv-9NsCg%dcG|6%>bB69=m|4jR90!?AN*JbvjmHjp9n#fS*?NsI{{J)x!vNmAv zr;_yzv~57|r3Oh%*^gEWRX@Q2M8$=6um3Z6i*L+ zEP-_s7Vy2Q(UJD3=K@Deh!oy)Waw4MF(P++fL#ytthnlSfs=4P;)J5R$4+U)rV??RE>4tnax%$0iLOlk8LnbK#e*Ya(7 zKb~nueF~X-dfZPp%6%6M2OxF{M=r0WlZgC^BgktBy?Sc~7~gh6h+m@bbx0&UjRA%{ zGiPxMeMV-;DSoF`<2f^9Gwj~a4z^9Hcd-c@YBUWQo8!uyFkLHi_dw(k9Fnl zLgpk#&zT?5_#(dCYZHG8Yp7Qm#u5nm_Bv}un672~b%=e9LyYf4RE*E}ABpEGWRP^o>+k_*$djPHTi4>-j5 z7l@p|adqRb(D*IV<_}{PLOFbVm<+=cT*igzTE-hgNti;$J3DSX_sfkZ zLvB2iA+i>S7@vd4avWDTzK+Is@I_pwWVjuTAAwM_&z;7F=~~7wLaZ#r#JCTUk~pqz zyy{jMuNOt*hcBvNlGTsIvgK&uP&WQBE zadqR*iSa*aysW9(dgEpS}j_})#;||l<{*A%J|A@T$rw9JQ^Z5;}GMe5J|ytb>p*WeDuF*{Lmk& z+IvFiZ5-i}3)8iXKMs)vIK=n_L}uf-y7A&~!T5a`!=!Yo^NupU7eaORJBjRkG`DTC(-yfyI{Os^!-?A$S2)o zSbkZo+dJ#Eiop&hJ z#aL{nppngq>{@F@Z$rRhZ->#?Z&>Vn+55XzG`aBPn*SHurdD({Nygi2eriXb!9Cbh zIFxDZ+?r;m9~~t-n$(FtCFFr5<4@-6+UdTdjDyftFPbJjg?+5_x7GB|XE6UIj_~x4 zM)a(NM(kM$YnmI&wJRXX)k(T zG)n9tX&6}R#vgHsL!=n>e+w*fo|DS8W6krn??h{``o<;&*f2Lb^REtCHi zI$AKRWcgvk@SY9H8wO$x&A%oi{D+okz(k)gvLItX?`Q zf}XwQw@5mSEs^)+BZy zLwL7Fs~>2;-hiELfKMh(Z)%=%eK`tGwi!s=h$Bb_{7Xh0sETEZITp|8L%Co`zF9i& z{$}at!0pHd7gUYpi1U}gGFe>LdepOY-3yX5(+m2>p+vt1=*R^p@YtPlQR3ELu)h`a zjIY4yv6sTbe6DVJx+a_b{@FzpqrKs8vnaI8h8R}Tad_k7bhc^ctv1! zUAXL^ui>y6)XgGW*(eB1atRsMCpK*v@RwaQQK(^uLdn2R@b15yU&9W5dv6YI(wD_L zUXJ;h&?YeR=(v1AH^eA5kK<>?dm&EuRv*JZXC8u(`5(W>sGPRoEGF?mNyMe`vs@lC z%$Mys zEFMAjUOngpWVTz_q;r64p9+)k_PIAmwciVAX3C{`?k;E^2b3z(Algfbw+NF0(&U}`Rbv3G+xYchd_$gY{R1yj{khAtpbd@6x)W&96{2+n*<`DRq93##W7z%}(J-41uRIM1F5&i2Sx;i2Odl zFnN_3Qv=~DbLK4)ELXuRD)_ewzEQ!S3|5;1uu{p4{s%u?S;i{!;|3ymLOi=MdplW^G&%2wHZN;C>bKS3#}{CaYk93f8G$s|r3)!9f+A zRlz?hNPIwaR#HJ-6|_)6XBG5QL5>P0sbIbe)-qUO?#4)r)nnpn;u_EBo(SnY%_IU> z86XkV*pxRxT4gTzK!WdjAy{M9#LRyb{!P(utTBHECCb}Q;>j;EULWyQW*x*K_;VkT zcoHuvqP({+h=Rm35>FF}hh`DKL+~LI|7t(AuEa{@DDQT}acPW$3b=gvX$Xt2Ft^V@ zn6$=xXCZl-i0t#vFn*`RCp^peH=^evUK2pS*m@h6Zj?7&;`gj){FLy#gxUNkZ$rVa zd!6w%h$nSjfyKSIy!|oma`pF`29weL>fR4-2VCQffxbA!SZikYd(80HR7qd0T0PPX zN|a52#LsOEgOa8h)tG_5Db7aiDmatR4W~IF3~zl@Q%uf@zE%)PAdu9BnQD-UwCCSA zF&XWzt1?wj#$Y;A^;MFYs$)>1>~fr#DN4fn#|-?R<80J^9cS{nVPq-{F;i4iOwNhE zuMtlmkd(ap6;LE?&yDXGts_$oMgV>Y5c0gbKnHPK&7 zAzJy(l8FA;2+8K3&?s> zG;?z2(~N$SgXmontzHY!rb~&g7=~ywL9ZK%Xmg3K#3dDbx0v5FAJNuq`=k+_5p5$T z{_rE(R(QWHj_7?0VBYgLPE1C}w)1ikL~MH^@M|-#D^MoP8h@l`eCR_gSNr`HU$vM$i5yS)nNfnoZB|}QkXAPnq`LLCgT^-R* zQkecV5$!C|?TZl2l;{SwXE$lNxI9F&hC!p}bDWqQ6Wh;wbPV7@L{z!z8)PZF0VkI0 z1VR+x2L}H0I2*Nh;#{jo{RkN43PUIt1s}vA<*JBsQEf3fC;EOzJb^&cBhz3$TeZw= zL`R6bta=X7d}+`pvk)C6jURt6qL!5F44r6~!(H!n%kS3Yv_2udm+J&rk(DFsa96s_$lRVkN-U$$^^juDJ;*yI=Ep_bo%J zW*n-+lM?MM3k$wm6lc7*_++GNsZ^qOLJ+Cid~)}sl=6Op2J@+>=#(9_JQcl%hRJ-^_@WW2ATm%~+GqX|+n!~6U^q#CzGu2D|p=~jaRWk1A;d7>bU|G~ij z56(vI<2aMg4I@ushtM4XMsTJ; zPdb49(bsJg7(Au1xr~%){N*rH5 zmAz>1gpx@0SIrskeGvVGZ-7cAdaJV3168V&w<|hY-ykJd#(UsKqz0>0`7%FrG7Oq6 z`x#CwB+a9c240Vuem~B}4L<-PpBpacgjh(bDJJJcUpxd82qaZSZ|n<}N7^$TCnlqP zL%sfDfQPAE7~aHbNJ-D(N%56=1I<8zvIB8qo+t?8a~Sv+;%wYt;Y>a^T+RtGPgGM( z&WXMyh$j$8`kL4A5kf5-hYkRrE`v#7j4s&qcf1|eES zI;tg%-Xy)#aokh_Ri$HZpMhxgNxaY1#BD54s~NldVr>y^(3#h1bbmw}B@^9;TVCMK zTNz!2`&^(!J4VakJ{M@yh0$0VZeN4Z`>3~*Jb^Z! z(B%i_iH65uIIuuQ2+!Sv=(BW$q|a~06?MHt_dbGX#g2Gf_q>7=lVfV%C^zof6^Ni4 zFSGA3{?8rpvNLg_pX@{khxmYj|5Kce8&=~?J~v#>3E>7uK^9ow;Hb8kkLN_+S2!my z8h;MGx|y^Ib(@yP`(aWs)MZ*dx%nlsbbFH6$_b3VUyac`+|U9a+{x(qR)~IfBcnet z`guJ@TjDks_@XVMHB7jH|3OdduW7nH&gFaI#Om<#zkB6m)OaNy(e9qxK}y;^7<;nS zcw7XeIX)&Z(lSGF?bc0|dd-}MXccLWt;ky4o7f!jYuck+@s%FMxyGf( zP#>}8pRky;8~4>)n$y|VnE^EKE!iib+BA##IPbB}yce#2OHg6)ZG)_wPtj8K>aezw z%A;~hSDne8t~D}Ux>`;42l4Rm;*FZZ?DOUu6EW$J{dmmrTky}WcnxEkW(>K}U;XfaEKHM!4Sm1(U%FiSiDF#Co$Xl!bJR0rG;mcpavsf_&io%`CVk0g9`1}Q%F675`BXb0~8`%r-ED_{pSO_662=W5vlS9ZBLAss}7wU*0KjBqTs8GpA zSj>+xSrkHg3UUiPB&27uAnlHad6oz=_`5LAZb6Q`5k@`}WRauVj|lSO_At+nKw_33 za!g&6MsAA7c#M|;qEGOq&xOa#Mj~d9lPwu+FCvTI*lc6S_Bz?lJK3%S+gZ#tdk-sZ zOUZVWY-NDx`I6>fGf)N9ZMN-Xi$-F-$^Jljew6njbDQB5Yz&U`sPR6wU@}xDG(#fh zaVHz~XXCZa6q~Il*#?qrv6GG3@^B4qve~wiZ3YtS%`7a!31!1Lifnx46l?^J!FUsU z+7>kCL2x$`G51b5-|@(vMu@^-{jeB`DDA7Y~!44NzgVB4l~DQDf)yy(O$2A7wmAr)*<{RZtv7E$ z#}Y!y2=e;xVI*3R8_{$jp1qhUTW_{Nn}m?2!V`x-OAjGOgl83eJA_mdp7t0OgphN> z)9id0Nfe%G=)^)iT?NTNQ9{UWk?M#}C4^iA5;G9qr+tR)a$Bs&7zvQ&yo<%}ibTu| zCtD)fa0M;3+3q8oMYdO*Y}9rg7G&+V*?N#|71<6t*-C(I4|=PgY_=g}`;crtRIn>= zXD*q>bpV;SF=V?ywi-^hcxan|C1_1-wi#qAhlDX`8}3`i%@{HG%#%lPKf~`saJGE{ zpC)053AR8>&>aw{1Dl?o_FGtP@4* zE|p63zC|rfRSN%nPA&XM%YfJYI?g4N9sP6y2X3_WTfs_ zsaoELF!c0fs#I-XTgaOn_vZA&0u3h2s0j@GQ*br{y%=Xjx$$ThhS8pn3S(d2h4)_m zIA0}*#>hF&Hxq<-0-j19!x)NbvsCYm-aWlArl>%Kb>1}zsY)#+RmOXJccdz3N~*kf zE85GOqEg8|_?XIX4Lm>$1Pk&tgn@rJ&PD*=;NevtjJWY=7l!G%I^e@=F(ZMIC?j@B zA-p0`d?3fKF}{WXV|@4E9Nz(_*q6M>XCTJ+5RqOuB@P-g-0(%k`Q{=&F>;RcjU<(T z=O|)XjiAwYx3_v4!d4VQNqw&&l={vnV;E#ZKEGq&KZCOo_=Itay76ciW*Bik3yd*x zj`RJ3csv2mKxA~$eRw>MD(7v6k#|&iBCO(*cOiA7%7zbfD6qh0{|_cKvY0TVMlkT_ z<7@=FGEPNqJlch!Vk+Yym(_4la>H|+Z!Bcv8TI(^tn&nN5$|8;y}cfuIi4rN+?0J6 zsTcO)@edE{-juhnC*Vevw`d<$_o%!DZ!nDgU_l-zXZkTRMBXltPPJ}4+J&)lo&ckV zHflh6j(?l?x@oZUrri|Ya%chn4t3%Ay#HQ-)VnGb?Y%h#srOVW-uoGx)xT4v61_d) zD*jz6Rmz*a6sg@RRmOYlA*BATQsuon;Z6QMDwXVg9S>Ii4^%4EyL~27AF5O}@4MBJ z`bec}dN-sawO7?un)ju?NPVj6s=oJEJZJeoQ)OuA&6_GOJGdB92k6S4l$PG9E0Oy8G%CiE(#m@m`ZWJH=OxuT=@7itzrtJXK?Fxk zKUvz8xUDkuPU!}g68B~x+OjXB$Ka)bn*!kRChtVWet)0nXy+Y_cJu#`Ai|w}&jS@# zD~qT93INe;ER5+-MZyT|V4N-F#-m*rn==+Xanh)9z7r6NXZyyMq@=$Xv&t?=u4i&L z0!QqPaL?$dVzkOS5@K;EQL3r~j%T#w4#YOYL0|AEn5EvLrxrI!fUB0;UIWQQlPunp zIc6zeAEZl|dn7&IEL9J0Sp7-n2axQ~dXrLP(^2Vub3Dk*XV+#(2FzuW^pzTe3)>%U zzAee%07s*JwNAwZ*W3}QI6&@ zxG?-|Q$K6P&#FfLneTGUPMFL}43VECnc1V0DrtIdh`femW|!K843)c(j`K0&F>;Rc zodpt4AkJ4?V4mZAQPF@I^^8QUCTcG_y0iD46$tMS^@ug|kjhjkpRXhMq}ev(zDgm~ z#ux_vCvY|bgBhnHHy-W6XgU^*a8{h-d{5yVYoQBCAAx+&8>abjBH{bi9h~bN< z2eQ#G82JCe*$5nCoT6?#+J(^={-y|qc}DqhlaFV#{I7@&f6S;E-P60jISSm%w(H%F zdv0`ZmGXHT4M3`oN=18b!p$POuS&&xmsLippGqZqpX!fPf0ZibeQzOB15~Pvw?ZaT z168WL_X}3{AeBn?K0N`cM^$yFdW$pl7>dspk6_q13^-`6zO%l-19`ACI$f<4Mv{ z3RHmuuHb}N_Df)kXD@(OKoqTjbDS>;I^r4iEJthz?i`6Rk9pf+W+!IIzku+D^e;M3 z7TuROq-yBpVuq@mM|+nPAT?~WaK`)c5lUWLV1oR0Cd??(O#gPAjlgWiX~d03yD)qa zP0Mn>ay1 zh7eEkec3>ooW?Cg@%WN?jmO^Ue>j9hCtHJo+%*?BE5(zTycQK7+w^m^twNHM^M(Rx zwxUi5X_|bgH<0G9)CwVEDrMj{5!+%*FoYOprCo$tZq|x0?7M)maO~aX@#aD4Hhh&5 zP(QJ)GG}Ngy3#W#fLhlstD(e7H=yEU+hn1kY{BG8_u@i`ZF@s~4K+<(kNa`#JwHqe zK^v1V!trA7y?GvagF)N-aIY9S$N6prA)bI|3HrZEc;9Nq4Y~e-nuc*ZC?#e!hHGZ=(kjuk zE2463l-M#C(P6{LFb7(vEX=QUsA&L@Bd7ofU*+dz`S>`TN% zWfBr*)a?xX&2Yx7Ht94SfuD-Rjmo|RaQ$A@W5ng2MUP_o+d+fBBh{p&kk)UQ5tqNM zrD5<9!xV~5Zcg%}!;Lu0hhj&PQwNazTNYl7kH7V1br&-I?61`6dYUM)+K)lS=ZvRL zBmew$DCDGmO|e9hNntfoUz9jTKXFqNvJHbuY*mz0*-8D9OgB!3y%}G%z`X)hZTfk3 z*h~G3Ol|Ox6*rr0RWws2G=i#=c@1xIF^M@gqLF$BnP#w6pLq#m0fMH#2Md+jg`_c6 zL0a0bU8v+zrK!0jHK7BnoHRRBX_Qi;Rm^@_{f)Ra{c(A+^E7WV&-4KE3$H`H0E*A> z&<~!$dYh00V zl!*-dQ*kx|*TJt$3cB&sy2MB059i~XjqZhSPhi80dYXbpLOBKz7JV!fAiD$7d*PIZ7TIm(q5SbTDpZBrWC+7M-4{m zVKT(y9vt84&E`ch7|i)lTp{sYP6t%|IP+knRwBbZ)=-bA_C+x?Cqs9>;~y{xQE`8j zKUIgReaJ9t1Q;Gcbriv1kzr9aFbp~OjJt$4D}2}<;I4cb9=af3-$WO?)!PXbQ|vZ% zmo=(aM0pc>n`H2ITI?~3HGByc-~-pEqmo#wWzOToX0HGq(~L@G;IEFeQ8pT9^10y~ zoDjMq^^_myqqZ11$NADA8BZY2$F43$&T+ohgbBpS)JB{PE@D>=fC*2WOazpyRTBST zgVBHa;={}mZ>3;ZF`b1ewFmBAJliCh1M_pYAQ`lizEbqR;=}D^bg3mUQGA4{Y9YSV z!|1At=h(@_QoW}knQJFYmAW2vRQz#Uwv5jY3vwOg=LRto`CIn3!}azTPB)g4O7SKMb-H{u+IZ;u}o$ zgc)Dz@I2&mqfJXF)nqq{yeU))-!^88?Rf8M^oC5BQI{C_O+2rm|7V;g-FUPMgX>U~ z7Ui)HeWLGP05Nio^97(Po`9z(Vt>rV#8ipfeGL&8(@&rwNq~v|4E&GcYy{F77iJe8 z?ZW;)%H9LMilTc1p1E6YF84xmlL&+aNdW1^&_XZLr1#L9w9rccK~RwTilQKjh^Q37 zuGml!6&qsjz4xwI@U`gYXV1>=-Mg1_m4IPP(zv|< za)LnQ86@v7K@*vy>^+dBt89#f3Uu`nGxrUoD*6CrF;2lTN;cqOLO&Sd{ug&8 zXp`3hS1wK<;PFIrYr$Rhe#0ChundgbvsUyS{B7Qa<;!2A4{irLh zP8^2&Uo7DM7c=)eq`3b@nVqEKX(<@pqZ2VnasLZ)f@Or38UUQ5B`u^h6Vx7mBNUpfRpqB%X+?8$}dXFBVZ;y+lNDbrVH99c_uLf8&J6 zhT&=lW^Pxcc(jDF=V}NKTosJ2(g|FSAdTC-P$@w%@-d{dE=LoYTg27=C>vKV6Hmm| z%S9Adw~8pPULm5mx{acJkgo9H?^^>el4n6XUovyQN2;PPQ}$d9;eo4y(LFj5lQeGs z0y#k-vazaCL$5^>nOBLczXLR`?hsGJ)vHAmSFaIKT)kFAadjs}dkWeTS0`Mo6dQ)C zTbQ|5B303IDSNJl@W55U=qjCvNgB7WMWqCRNNZf`+|dV3WbP4HuY<<8dYyP8uI?34 zT-_(4xO%;a;_3|)?F_Uft~NrjVZ(5>BQv)fQWdR7*>g372d)Z6SLsAd(zx9ll@bIZ zpFnDeest!|;_3jDjjOkaC*ta@B8scGi72k#E~2=)pQ8N$T_FLk8>JK*hO1vObALdp zqOVZ)Tn*uYtAf#0IuVmJZXbu7AP~725$GpSOK09CuKoegxO%sEBCg&eqPTiML~-?A z5yjQ}DB4rGg`}$!XW#)c7VrQWGj}^u6+Mr#=V}NKTosJ2(utU)aeF5!B?v^?kgjflCNdurR|leOTzydu7>cyRl(>gorp;qw||A4AP~6(o7#_?qKV9B z#MM6m8dskcPsG*dL=;z_7g1b&K}2!&MT+(`v?Z?2?V%JKhO3t|bFV^*cluKHTn*uY ztAf#0I)VFBNaOY{R7y~cw8eSu#+qm%^A&M*A2i0*SH%-?^)(U2)z?K7SKkm(Tz!+G zoyl`1XSH{cQfwHmc4p@GK#E5SDSNJl@W55U=pLPjNgB8NqEdoDvMb6;H&~_e2y|-xpC_{Xj%<^+SsGgQzR64!RN#l(T>b%9*)8BE|lXvgc|D4_pY!$)h|R8SHGlam!K_i z^;jWZh~gwt3QY+t{$UkXEErJ09~5nrVR_)>B7wIiBv@!QubU8;eo4y(N#JT zlN7rwR7wztd=9BP?_6a5EUpel*|_?Pcp|PI7g1dORYY<1zaomOzfrUwqAPUu+%|Z# zAPd_0mYK`Qt)j0}_FN6&fvbYiRXP!q6uT_Q2?ANu^6`5f7omyFgs!r>Eq+rQXoK-C zHlY=@IM4|e;=tF~-q0Kl%x316B304hlvy(sPfNk*09%ep8n>6CQi4F%myj;Po>ymP z7zfS+U>ryq2M)6X&cGuRl%hF0`ktBl3sMz*ld|VP2oD?(j1I8nn4~z%Ku!?InqGiy z@D4PQnQa_60n|8figBO|EX09k3-GuE3)-2>%w2?3MMqNh90=io1A@^3wj7f*ZZAWn z1c9utA$_J0WzT^S9ylNv9bn5b zNpX}xP7uhNiLhE_BAUp|GY)6~#)0a_fvy0=flmf2MRPbXpP73$QWYId*>fO-2M!2E z2iS5<(ztytU5R4A6<(Q;+{sD4=K-MuN7p+4RnWq~E)&VdM6dDJP0uTqz zJPWVIWI;Q>GIRezs-hoK_8bV|fdhik0k(`M9+1ZE2v$8oF>5}g??$1C%ofIhC;;O? zOXENX(MxV;*3fu;Chl9`}h@(9WmK+^>q^{gr2<_IVCD`(s-kTui*X8`mV&XXm3LRvb4 zqZ-;s`mUw4eL34?pNGfb$Y()2k1=zfLaL&-QkGgNcv=d^ekQ;$CTZM$0dj&sq_Cb+ z&ljVKtl~xju+JDk>2qvLrD%aZi~>h%++p8;ERHW+65@S#vTEG(~#uCo%nH>eGfb5yq&rk+di1WiEo*?KOt4o=cs4% zsd&B5eLTCTUxA+zsG9#!@e1zoW)FK9*HfNS)zPb<&K{e$$@?76^n&l1(2dAr=#1av ztLpT%nqVrNe%?nAR+p|Q^*1Fu={82GCatahy&(=T--S!Fz5+9xf!-Z^%fc-;XOKMa zRx3lkrpZ~TdNmS`^#$Y@&uh%wcaW;4cO&(_lNo~juW1Uz$$tuF>5HeMUfgDrF-hb0 zN01W);`VS%Kul8Xe+d(a%mfz}jzzufxrIY#U?xiIqZKZQ)>ZNm5B`R!-4#}{8XMEF z|6u|9A7<{^NU{H+OzTuUEd`?!Yz=#0q}czUQi5Wn5k8%|kF%V;&6L>8v7y@RS7m4v%4aV+pi-{ zP>f6kEpNegMOU6~MF zQzP3E@VQWED|u5z?Dh*d*Dc?~S-kQKy4qx=e&CQSU1d@)Txmj1ufjpu?VBLwTBKj9 z)Np#Eow3Z^Nk~<6DD|vU4xd&YSFP3%x@#7CoUN;0XI!+rX=}BM%5EE>oUfn9HkAGc z%7>^t1)WrG8rgto#c2(cA5!_twNQSh--Qh)!&AEaHEvb(7cFG9F4Fe2l;vuj!?DPc z-K+U@NO;ZK=ALA_P2*cbKr?>#MveFo;PF&7obH^i8vaeF$D1cA8C zna?`qbX@UtLw}VYja1nL?-#HSitqx)pu8l-+MJz{_bBgrEr)5;pfWTsRWh+FbP`4Z7yL<(zu<`46p$x zW_{WmQFte6SH8f|G#BXqpY>(~{(ApN*<0_wD0}N2Z2{R^@2`Q|cc2ql@8h^C$%Gc` zU6q-8DpJ+%2=(N!thZ=XyAK19>m4@#lbT??MdPn`b#&*i_Y3FZ4m-jl8u;U0^lvWzX$r%*eFM@2#ZEPFCacVVUU{Xq-)1We3?mogAyH`1%W2HqhDcTP zC+g)ymV&p7(uR2D^ZgpCv#v~Fl@E9nLFc!km6)V)yAU-K1hRHQI;#!Zsk}8()tq~qV_7e6&?;6*^Q$;LjXCE{77NiQ_-G|JYsd!on#?iCon51$0PRI!Y z5&ks%2e=t!S8W}66Q5&@&xR&vdEvDP7}c6b5gBNqbz!r;09p?y!ISaiowg2b#zR1x zWPgu`$PR8pX|pNWRuMu`&ZXQ9;H4$W?RhAjC!^`n3UxV}{b%8#Ra$nAFmsIRiUxBbR?sk)kvP}d5(gPdyyPhu0& zkE;0=@p0pU?>--c_wm}tiPuECIr}nksx*Pv)Tvz=Glq8pLU+>-;4tH%@3(B^YPYAs zLR8DSEdz`WRhH9;IhPcTrPVKpuhmxSMeDF5Q#jfoh|9d!*WvdJXmj|KpkrKt=eLySmsV+BwfR z;u2yzuC3E?hb!l0RzcCug^4U`HT3=-S3ot>fjOP%O+(G3`AeocgK;=x7{S!|*IcM2@fbyJ^ zGbu)qTdADMbTP@DRL&G`NRqtZ&zZ_sN+j=XjK)f`Defmay&A;>6ldf^>^7Xo|J^%K z{;X#|vk{%VWy%++%$Wt{acgHeWwWoSj17VE_ji!`ovKy|%#)rn9129gt*O<_DX3Konminb zNldrLC1F)?=Chtn=G8Fsn)RvdZQam!lM-esb?pA(qW&>z(gs#4%1pRc=8@s#oVMD*aMU&!R?=N+ zmKmxZdTx6RrBENkd^5ILx?MvWlXyAT_zkLh-Fy&-p0|{8B-a}oC=UCIA`Y?M%0Tg4 zSW)Jis&_+R^4hP?S~N4T7^e4EOSPbZ)S5kY2VXf? z_gR=)v*=VRJF`zbd5T!iV>{@xU7$Q$-?tpx3H4btg39y^)Lf=>)63Od6ew5deNd*< zyp+mh1I*?cJ!_P|*E2&Yx}C~xH$k~xe>t<9@>wdmOU%Kyj<=^OTmL}irMOpJ?Q4A) z)8{Wxu+FM=#g3jy&L;giRw-6rJRU&={%eYc~RoUP;=N8JsMc-)ywwz z=V}v3PZ7K->KE_uv6=Ry4r!c3T$hTLZc z7Ke2koNB@rhTJm(i^p`vd8rnL+!xVeFuwm;tuS(VjZ_QM%YA`Gm&k7jMB!d&5sDi{ z9|X1oBkA)~ZG*s|igahMQ=FE2pZ33Is;HiCQEhZ&4`O<_(-3ib(5&$kEaSVn3C>qO zab#?@r%}sqmsI=pj|Hi1n4xX)4RSuwYe3U*FXe}JFtGhzKa!DZ8yecXftelI@UH>K z>f(8olNR|YH?^VA&>GTg9~LGj8Tp9YE-$#t>8#AIXmDVc6RC`&HarF~Gecb+n4KC) zuXhr&@KW+yYNr4Ck*}}*mkOalzaH53iL_0e#8wqW&hVQY5V?HlznF!FRX?yTj*LL0 z3I$y`nY)I*18Mdx&j8~ixoc0-q$*kvm`#nmJK%p?Q$<$>7IP!Zu$}s!{s^d|Cuo)^ zMSn{owYs0AKi5q8pT2FiT9McPZDoSx3D0|@u6_^aM{XE-vK~T{KO(5GHF6dXh5sRd zbi)d&=z_p@d*sKdC$kML!#zQTYa&Z`q*f3nN@B+Qd0@LIl7S6h*pV{Zkms4*{GnbS zx#B)08kpA8U-$+{V zTV>U@L?U@9=SQ;xmRVtWL0!#U{=dIVx^h|O{yY3_i1{*Bk~N+$l;!424z-?w$jXjgEll>k#>j?VY8r9ZyaCwwmF4XY2TCBs-g^Du(IcBZ${?eGAP_+$iX6- zU5DcT#%46!T6qUI__jHntY5JB|7xp>?g-4fTFq;unuQ#E zlV-1+0|$FrC2dp9LJr!9)M8fc_sFUisb=LJZ0OtO^tbv%PGYNy1_x$?tv@bFH48bo zlxA;^g@eV`=%uMycg(o`X zU^Q-EW=({HQ>^Xf4w8_AJ$$ojr&*P*N^PyYgR_0xoLN>&#EWpxfh~@D->h02Yj3%6 zgdBW;W)nf{oKovpe{=W4KZ?sDOwoHZ;}>spmRXPDtTz!$=bLdHswjp{q*zqzXFXge z)goxfJBM}(Y$sS3VM7^iE!8%B4xJd(T4a5IEmpV|2ac=0z+#PcbZDwYS-WD}#`t=L zb>sB^%g!A4_&z3rTikxECGU?ijoUAyuY>_8#%rC%d6mbZh^iDAz_wjEqTTuK=*Qa`&^2U+-5mCY1uCu;0^jckl;_)>WFT6pc0^) z^&QvXDcsuyQhldSR=VEJsHHinxvy(yIa^ir9uKfLJLg{P^_I>qBf| zu`kFSpigP6)F2NUHy6-A{m4ojOdeFiLvWCO2`9Dr9+Z^{ zo^^+Tx~~|3o?j~fK3umzZA`ixcdGl9)ZEe#n$ddJ=#ZxW{nYUA&7HzU5_@+S8Z_ar z|6756YMGw1>*@aq^wY}poHi4_Ng>t08p?VAqE+tnz{n$a|CZE=12Y4iIH0-@rAl}| zNBmD;9UmgV|`Q_6WFhc*Ls6GWcewYtl`ke({np&pE599Y53M zE!IbR%qp1&Hlf`CNY&t6%80qSpKz5!njuYn&6l_vEDC(|^uS(p@GV~==5KP~6DBQY z-zna5qK3{y&D%S{#k`io=3dE(hQ-kHfz~}E0(9uG%`1KM3ZRSeO@BMDbXc?YK6)$A z6}RD>nzwma6eN)rA}?c?bM0=eX60Qz^i5cN+njxTUVO2k(T)%hB1tV{?#KO8UendafayE}RSK zOg*c$cV4ozy@-u7K0M$kRbV==E1fr%&NosoZE7ckx7+RGc^%+@XjHog3Em9{@;dsU z7ou9fMpaXsdGosHN2)<~C9DnCpW(32>!z>5Nby5_4rrBk=h+i5>Eg?X$x|k&yt^(< z_kqGe3t(~g*PyCrQ8HzT%Dd;AK0Z*miVhrj4ROX;6yA)NUgq8VGzRHanLBBr%DeAk z%#3I8{BXQg{{9;gdOTn#de1v}US0q^P2hn~v8VDZ{)+|4JH#isJs{Z(z=N9u*9&Xi zjYc0DhROCUsv~;mJ^US3*#r8w0dTkt4i695zZt+IEkQaD_!B4hyhqos4uCZr{$q`C z67(!uHU;qH9Y{OKj1_h`7r@aTEd$`*#Q>f7#&sl4acb;eI# zNE;(2E}WwBUZ^_T2MX_7f+{brfH$7S^f@Z;rK@qYdgZx`Fr_b#K`=8w;kMqW@yeD) zJ}}~}DbrNm8#||B|7bdyv}gf-&Y}+7^#Fb-l=s$QIBJ08!c{mR8uFvzy5mtN@8_S2 zB``$lJ{d>x7gMw&bvuw)$A@7e5g8(N-@##?_bY=KHWrb(pYTZduPJ6kdUe2sMP9l# zK_)xWYbltYm#-Oy@Ltus&TaSG!NTIt;vyIztMvxnp>qvt&&K3uPd;*Prgg8@28u|Pq|7*=u`5eD8%O& zh?9?OfcQG&Z1OMAHSb$SqMEskmakwg@_zUX`$p}I;RL!tlv3T>(&FBVu*lSWs1Z+A z8Jqjj6gB}=|H)Z6MOVb8)K{xkXH)YCNSxPD--cs~;m6mSw-$EaOq0FXh~*XPIUu61 zRzL z^@NrGYvD>mt&3>(3LBcPFNZt+;7vC}sqMB0$KotK9EUtf6L`5eP|njk+WJc4B?G!D z+Cqz`Nw>50{n)dmRKF)sF4G&bePy`%OSG7SIFh$Yf7!%~yC(J({Y>49SHZJ&`fjjI zE(N@Wlgp(d`KiCsZm4~M-iD*mSeO~^r*G^D#YWwDw-@1yx`8cvP!7<|ddDn$|BXxG zHE2dNl@@=sgTUB&sWtIEtsa0Kfn`+#7(5@1vp3gb{hH z;!!W8_!c_1dpzY^pbUC0~uvoKx1}^v;{G4^9hBx z&F6O^1I9}Z(rLmJ@1>-n0VqaZ9fK>jUvP|9Kds;i>=3Fqs)@ZYU$%@J3%Z~?3e_7w z)**l*1+n&knq*!dKz2bs=B#?tAvjLGifIKk2%WwQvA}~e3i>}0QPm53?hK&(f}z`B z)$GuY0P0-OVlANN1271$;>!GyAZYa#(=j3gMe+)6A$?GqHc|*RP$i4;RmDO$ES}6`5TzQ+B`yo;leVnpPND7{of^i~uVD@5? z#_i8hDM27IX)InZgg5EyQ%@h73;FTevFkjw`KY-FtHo_GG+kV98D247T=7Qil9k;K zHsVg!I;B_{?o4Oq&P9sf2%;EQ7~S~>F2p2_+lx>sK_IIYmhWs0cWT_GTQ)}s zu5qW<2-RJH<4CX%vUzTztP-Vq5X4iI%-q39RrF=*rGZrZv+}rVm1MP5I0e=?tk>bh z#9dMZUtYzmn9nWb=A#@V1NBy%k83=x>#zDZ8ybS?^pWBqJdOwvZ}di|F-hb02p|ap zS?@!t{VKRx<9ciKRup2GNxR04R&ke0(afmHvzOwToY|9?s>rCNvnMNS)Y8ebaY<(% zfUS)EA?%IV3da5^GxuwxD*8NSX*mT?OTp;ZSQy46#rOXpCkSL^PEcz3+w`lcGrGxm zrCve|wrdnR#k_x~ig`5X;uvCHr1+I5@QWkGe9xM#vMz;f1MGb48qJ*S1K3v~XJgoa z+cTgOpO50=wI)FLT#uRC1gVOyqMnsg@w5~SyMt>NpxGAAc^BhNWzvfMxZmgIAe^@E^+KxVESc2Wqr&dY~Q$j_)vG8Osu^EnO$*-5rhFw2Mg^ zx9L%W0KV@iQ_B?ZKOsyp>kdf2;z2!Kql?>Mz$xhL3_0c77eFD?lfDpd^I<_d_cC)I zM5>~@C`-*0JS_!dUjt!?mzf~N&0nMmidiKSaiZL+RDOO`XLrQwzVg$&jg-pfUAO$0 z=CwU8jk4$AyqjM^vj#8u7O@!jiW%86Hp4jK6|35vVP#fz7ryw+0>1dn%w2{Q?|-Mv zj#Kfp6bxIS#&_eg&5qkg;cQG&eE%7B69h)z3F&F81jcKqS$QEmG zet#?0vsWT!Q>Q(*IVHjv#`EV_ZLFFn%#tFy{qk?rTU@^d`!(fcPcd zG8|vh;i7sNh{GVBAaN4wkl@1)q%leHbu-jU5XhP`RVj%H1&2H~JZLS(o<7WmC#)`@ zoS9{9*l@(^)y0RDVZ)Qwi*PT@hND(-#{dyFJZ0@T*GCK+p0-}w;Wrd9YK|c=>HoRfgzA`|B z4R2bP!6wXxx2$a)0vln&r`A&ll3qK)hR>|YpoxbF8$P#sHwzFJtqRVZ(RU zhvx){u;F`a-+G@7RciFY`#-Q+_Kj0KTI7N%Ts189OlIzUq$>Id^|UUBzgiwwuhtvb%ocoX<>OQ;2)M}+#w5i{LNS~Kfh;{;saJ6M zq6?0D-2Bz5b%Q@yCQ|)vofG%hJZiZ4k2P+A4@C?&PguLx`SnbsQufxl0V3SQ_ZeLu zG2D#UPh+kP#XN4N+4(r)ebxy#@r_-aGkr+7S-~zTDuaZZc)?6rh%?-*Xjf?JcW5G2 zCHuj$m?PXwx3^RdY=oN`_Q>2+ZYJ#)v1}gigqwNx1jK?cH>=yu1gsi37-i;GM2h#H zQ15XwjL$2N``rB9dU%Q1WoVC^e_F4CLELwMiNa0W?%XRtgqyBij3DmW2sg9sX7d6> zxLMh5hp^$<2sf+RuZ#{5;bt|vW~qmOn;cUM&9?TB89wB3vz@&w->+x5+1?&jb`lY8cCa_$EM*qLaI>Rbe^=0u ziJRT*FRJ^H7dN}xM?yhTxY@%Vf=Tr0D%|X8|J5Ua3^#k(jmi!WiJQIcoH8Z~H~ZMj za0q+s5N`IhH{#S8j+_1L5!iKjHp0yj_Rv8AB5`x1y{>+M2scOByUT1qAXPBN9*D!- zYe%>_*4~PXArBF5jfi-Sp)9o{1Qiq-)l++1uo!-mZ)gyH7d_7lO`+KZd#+HXzv z+xED5p53u+86@0XVSkfe1_?J;+7~0Hcyu+~TxI8!omGXKtL;@_zQ+aO<{Eo3Eyq1NVm)rkr4G`hxR{Q$X z0z|lZg*{V zV}D*y1_?zE*gLD1K|;}c?M}-B$WZit`=xe%hvw9N&>mSv5~1h=_KWerMksp7ei(;u zID9^6{|3@}WD|-WmA3_Wh*0z?n_o)u5TWSP_Qs|GA{2erejK6Evk{6uXRj{X^a@3v zw?D#h96GfR$D-Nt-V%n-9XRH=YM|)H%-k=Ls%UG<9!0}=pYpg*(YBmx-R@hN(} zJsiUp#G~kbdpV9e4-tyqX+O0gK!l=)?GqaVL@4^GJr=jHyjnuh$L((sraeR`dc=-x z^AJ#!Bg9)@kmC1`;BbOs))Iu=(Kvo}!8;x|-?hJ9=}({G<|p>XfEnqAo1faPyZbb- z4L3itr-K>Zv`hH>+|I#K;32}zFYNt6>@wW^(yqJHZ^+~3_xAM&RVm#3!ETjR1_?Kh z+3)o&gM^zu+I?}7@hTc_{%oIuQF<;&`25A5)g?fLo5$_*D+P#f^H+Pxg{j>9ul@9v zz(%+kaazX$M7U`=-FF9waMN}!EVB`Ax=yFEDG_c)ou3;9wS=2#&XB<=-254boN7?TulDZ_9Q z1hTRbmR}ZbW;f+$c4FC!+CR9 zfCxA9oq9MQ8ymyT0_Pvtn1(!V)^+%cUmnFw+^pvu=vf8{H|sn5$Cg3D%?8d+5Yek> zxY@|Ltd-xPiJOg`H>>~=ZZ>gRT@WC`&8E&SEK)dbp6+DgGQ}I5aI>A$43q02!p-*1 zHDI)d2sb-8i_2_;o1L78v5=mPaI>@1D>z)o2sgVpTXYIHFTrZrBQW2>%{y@baMi%g zYRuexq$)a(dXJl7e06!;=Vn#s;nU5pH2B=C<}CS-hj`qq<&5YTAQCrEbDTN>BHV25 z48_{;^Auc22{&6hhpPmLaI?r6fdkO95pK3|KI`Zq;3h{HlQeGE!Eh1;vi2{*8<=*W z-GV+IH~Tv0jPj??aC3;Wf2qIb-Z_1!b8#OZ^3LhQoaJR9O5$d*^AF;-w-Cb3;ZAj& z5e#CuIl^g=-CGJb$2lLZ^&xNDIo{bDSa~-VCpd$Hy|5Z5+??pNS|3z2+??dpMkw`M zkhnS7xdIdCA;QfmP9^N*JVdxT)%l}qDmSM&8_P}#!p#Lv3?%Vt2{%ifQFQ}ExVg}o zS!N^LTOO< z>s}=j)x1lh4bIW39^!Fxi_>vffCx7)cdo}uNGLQRmk`GCjGLr(h^{$v?$KISy813acp>#EOGOQGk!#X2sfW}HsgTscrPEw9CaFkJSp6K-nlE-%X)G1 z1?L|4Cxo3A=nxpVq!&LM2(J;#NcuRBlU zzz?6(-*6r&i+94!kDcwEgIdDPPn^=Sc7&UsI^UJq2sb}>R^XiA^(EZ=!s%Vsvc%0V zoiDbhaB~t?%Wi~)5^mNw1MeDV0q+`T=Kg{dzvfHX<7OBiULNuOxcRs9>kJ?AxcQIM z3SF%>zQ@NSpHtQDH2sd-x+zA09 z+{|;IKRZB#o7G*uFWzfe;jf^En_YG)5pL$YD^>+I!p#DA-kB-fJb~4+k0JsKH-Er| z;+mBxXlDa6cN0<-{g8T(n_>Lt^0?2<-<E6*Run~$5cBhpQ zQYbpat=u}W5sD6Vf9w<>3V#K~?h2eMz21eQ!`(Z|F35zUBitu&MhR^@cVp4)nOI|? z=psZGt{N!Xn3>xgsfwvo?NAQC>? zyLr(75sLP9@4#evwS=O5-80J&p=f`1)6T#~C_2#n3kQhQ0xdbhn51#L4Th5-ko6eO zG}W*b)CH40ZccGG75UR=xH-#RgtLz!OJ~E)+3pK9d??FsbBk8CT0gqurU{+g%HVBzLD?$XHtWVpH9 z{ip0wM!0#ddo|8zVQ!x1UXTnB;pPgr2{;u#wXbw@I|Meu%?sVnt_Tp}=0$GtoB$DS zZgfwF+g@KFkSe&utv)nBgqxe(**Ne$8{y_=_s_8@-0Xfaisb0qr^)C03%l&T6dH!yJUz8zJf;cR9{D9wJ12$bGM6fCy0!yZqG$u>nyz z!kDCZTml{?2vn%@J-+8f zhtdsEe{?^X=GQal`Jdbe&{LSGKfCF{)v_V#FYd3G`3*%3QU7pz;7BsvS%3LN{nK3x zHx2sSKPOI1l!*G5`&?rmRrW*)seikl=lfU-ZK!&}oiZ?RMPjOo9>6IiOjRBI7N?9b zRjuf_(p0M2(HS_0cs4@S^k~gsy2c1qGopM2zGov;O-6f^*$7p$q7APPY=o-W(U+P9 zh)}h1^cyTrh^iZ~3ijv?SS(U?7PbdmJy5keGq)B}6)mOSqiPsmS04AN`i;B!23)XA zL^Y49-??i?c!)>UU)`$_yu`+%>TmAR{sAIXjYjh@#h#5&H5P3c4-lbhJo-1{u4f}u ztr$I0(?dX2ju0>OMjE&4V>k(lSr2SfYH@A&SI{bI_M%16YQW4C8;*929^C0Kx_7?s z6dlpThrGRL=jbWeC3#CD!L&>ChT#Ds!Ssx1@jM?f9PJwA+iMN=JdXB?zJHz%S%-a& z_KuFJ@1qZX>vObEbOOSJsjfO3j`of6CwC3jEz5AUfAr1;e#a)94v79ZJwPO!4vKCs z2@naVL!!rVmm?fbheaDBW`sF9Av$$QfCxt?M$f>^hBM`z+p%+&)&A7SP`iBv_aQ1&<)#v7E!eU7$`{sebl zrrP6Z`{=+m9^!Gdd-QBfjo5e`?HPSOFF=H&Bce?T14KAFDmo0?ey^5rbWF4}hV3E3 z(Q(mci#-IqVbntZiyadX6((gBTYdyIF z%2URVpRV*ketBL^HHBePPziqDd|EMV-a^A4erc&iUs?FchLX=X^5N6Zgl1C(rDpuY zaf96XCZ zmb%$b!g)QG4o*IbvT^tgI&E7>J^qU09jdf@aHusp`$9b$Q~n%*5iS{%T01d7$%`_RT8_@D7Mf#Gux zL;i*3&y4}Pd%^3jGrAi8?f=!?E?DNH^;zsrP2Z1VYZlp=n)@c|S3~_->}u|ZC}p$6 zj_`NZd;~{%bHMV@9L^g*zEtVud^v!b!{wZn6gi(2n^6D(t1=_BB6zlW|b zb;U>)^4-AS0Y1hmM^Pww8Hp|~eIFUBo`ChIku{DjkF2Ix06IS@<`SgMc4o{U|QnN|H!WzdEwg`bbcJH|n>8 zSQT|gv3_qV`AxHhS0kwns4n5_3EzPPbzVoE#~@CIVjq<+Q~55Eg{NJq)I37`Z;C=` z8ziXn6YBJVxF3qYsT@V+WGWZb!P0Mm6#dasz3^YUo4Q+&EIf`R3s7akCkV%|TSA>t zsFMqE2o#r7*#L#o7DyJJi)1{Yvk0#zycr4VEJmF@5U+ybODgZA@(`7C@AwIP{TY1i z1fE7VPo91yj7!MsJ_1ZoGgq=SoOB*I<1A*wQE}00u+u+RiKyHS+6o=wi~p)B*fHo; zAEw8v!Eyv%>`>#kSMha0zMTPC%w`LV^2pq5Q{~^9DI%r&Fg^1oubERncnje-Xof8; zn#5+dAV8nQoBO00raQkyoM?9u?Qcnos2U&OJWL!@CVq!%-mp?wCk#XMs`mSB}&e~b9CHa-626WEsrSs$j+opiY^ z?fV|qszxt-JC(Tit2N@&Ly_EjLO!waC8bF6@o#)$NgF?UMT{S8WYIOmBPaLcRp?b8 zrr++OACJ=h{GZ{+yYPc}*pIeW@xhQEY<$U|NN&Kt@q;DLk9R#k*vO(fIQI3KCuhPk z=v5!4Q|_f718C3pRn-`ZFWwSQS;FaodO)BqTf*hmd*LNy-%D;oaytHvn=E-tIMgaz z!l9O#I`+5dE!xaGxy#KFiBun^&)r9tqmXnyzLi>Iq@x|;p36KvdDJTiY=#ClWq#l8 zynxp(1l*?sOBSHUClHL^EO~y9bm;d|o^#P5`!LHt(lKM81BFM2V)@qzhmGXHDkju7@P1IO0j^!80f%~RtTckLoj1t>Hp&x*!ZG}v~P0q zqyGx%RUf8L9pD(&(*E;bL7l(gAMr4SE4vHAhY}lK@(_}l_&5Hs5b5p&a!_B_r@j`-OqOJJ^8%;Anh=H2{WeKy+`{^e_~!Qv$aD! zJf2VO^l%Ssd`V@TgdT%n#>0{~p37`A9yYS53-P+uPRh}hlQRlq+szT_GteeiGmV9E2t^46D)EP9G~g_F<6XV9xYOh4uEF7tYedv18t zY+_nE?s0L?nSuT09e@5Gd(K(hbI#(1b9xipX5Gf!H+P$AeisyPLG>^3KZ|=!wO}kD z?lcK?JdV?RXs5XpI_@;j1iqfS&`$Gi=(y9|4E$^AQg@nH1KLUWUv`>bqAGWqzd+yW zSJQ3`jz;CdAc&FJJb-2^ahJ7*Xr0z8H0o5Yh6i0`@(;S03+-XjL;#Mj{JIzhd zai@7N@ZYIR-Dy4s=m_BxY|q$$X~%ctcLQN^7)RQd`0hOJ9ps|OE4hG ztkdgn)Z<}X!V5+{aKSPt*(a5Mrq&&fD=ug(RB6I$T~R3QhXlTSiE2E)+1^Gfd3=}f zN)m0p;I&ER04l@dkSopMKo?LGKK|S9G{-;Ndx=UO|0TTAM4Ppsq@Pr7p)#dSUWr}> z^Z+&C_^=7p7$4YP{y$JMK9ulE6m6dEwMpe0teMj0DD?ILP>0nfbL?}>*gr)z#tpW& zoJz)x5?-OA&1bwesjNd~S(}*8WoV%Z(23NnWt*3nHe2s9v4ritNhM=R39nkwW(_Dg zb}Cm3$AW zvsyU*@Lh?FKWuLTm5e_nywXLRPkL=qS(D0?HhCr70BCn=!ttppjwy*xP+UnR<5LN* zggsufqp4Jc+fxf>p&nxw>%2!bV^;~UlHtn`C^=_TUR%DdTt#0G^igWUvF$LbF}AV2 z>IexE+e&y9jW)0M+NAOm)(rb2SJ__x;@`uduzbQGqveq_(Bh zIrLp0!cHwYitply$Sw|d$>w>0I)}%muCPz5d07?>*vF&JugKT95j0XP1}z--UM2GfS&@|H377{*xD z{eO+I74VTFV{B(_<5!O`Eh#aUKg-$+=p_8lVvJSuPY1-}9zu+;YC#Dg##ch$;{Si* zD-}0V5neyFU?=J^zOv3~5va?@S1Nw`-+I5G9^)(PEM>iLe0>K>t|gTXsVwW$i?7Xr zj-w_VU(dt`hK#Rl??EcV@wF+GY?I0rRF<`gW0!aG)&t#5O*p>pKsD~K*q*ka49C~i zUYk@t#+oT@GQK_o^mA&$@%0$0F}||BfowAzU*GWBq%ulnN}FV7I?$HXgyU;BJfpz) z%Jy!dG8|tULdmgHSxjYFn_he!2Xr$v;rO}@)wow@5Su>?g9s>t~ zen(9>zJ7~pjIV63FWU^q*H^qYsjNh0S({#btqin~ns9vWj1M{)U)kO!D#P)$E|eTQ zm4m5FX_N7F6wpP~gyZWHRAYQ)drwhWKE6`1m5OkCYQeLp$N0)R6&EqfJx$xDFKbw0vU)hI*L^59b_>;cb}k9E>D-}xKaoH(~7ugudmZ&yS% zXPnpSb`&$DIQ;=M_8~T^D`w&nUnkAGZa0^xxsP~FuaHl7s>}O*xR+a&jSnB>EyMM6 zKDwTIvhM3i_j>rbr{E%2*VB9hFB({O8S2X$h)>t^Q1`#(>g$2V`_ujEHm*(e>6-8C zrSm)Y!udk+b0M4Bfcm%Lzw{au7T!qbP}+H8#wDlWcXV`6TW=c#C^UG zSgV!#U7)S*!Xnm@mtoI7cpqh=vsbR5$PZTLY$95h7P!~@F_eudFZ&F)api@{Z8Z)l z^*8>*D}p(YL9~@Y=t1Xx_CChYR`c!17}E6fQ2jToff-u|8QY4>`Jvh%&8Bs+jI;pF zcENwyNb9213jhB;(z$D(qAx3|??)qNnAdu5o@G|Fs}%L16?t5qZd!iPw0Qb6=r02g zu$-^u)5{*>3_b{&`v@9(myONhZGbZkjw=`Z+AXT!Reu;vVWn-*)wvoeFKX}usqbtD zQ1`DZwch7Vt zZnWt_yj@Z0X1}5hx#Oh^x3Ws}ae(F4lP>&*ezf=tZOA<&UAPFMZuueXz zEr6ZeRnh6gZp7TC-+dR-f}f3U@`kO0&W!oBX7gbV9w_REUZJoYLgp76i zhzR-X^jjjJnQtlVU#tIN-g}+qv8HYKQ;P!fmdxQ-Pf@JZBRzbkho9@=moSIFyO_h@ zyO`&%*Rh7k*XvD zDRX$YmN{na3g+-A$LlMm+BYx!_zyxzoO0%V%iowS0uN zUdwIb^;+&)Cx4IO9!TvuICCW@U4YA>e7XKEy79R-Om(3=#Kkh1gxX=V#l|p8Rf3k}pe-o+(}Y4j-bu#P;KKi2e7V`$+Uo zrC3ah_O*DXkM<)Hsim4U8GpK>N!5>#@JYNXP-r}b$IPvTR5kq#D%z#Or-vbI3R#hk z$x9z`Dzw>bOj11m24#XkvIcHKL5RBrL9sPO(11sz#?1G2<#!G^u(&5{~N!O z3vszDegc6bxKJaIw&rEVS>|?w`L=?vaOe}V9x1ASJnEoA4-LCo1<2qRRgDVrU6* zT;fX5HLS#3X6_=Ss_7`Cv`dAt5@is#Uu-5ODOLeh5(JXJ=ApZG7or^b8wraEr?tgR zhtuXaZ`3#A;?il`4PN7go$#r-Vuh-2AfZpJh|aBh=u-@-YWh7O+NHwqsSKh|Y$hgY z+)hWu1c79W^U>WIHBgSMM#7@)bha+u0Jw{pH6D8{6iup*MM5uVita98=3atSHC>35 zcBwGDD1+z)n~6z^S%RD(ko*OE7N@(gWbIIhgYz){QuTKv^o^!);xuM%L!_!{2GS@VOm!%&)H+)K08WT7)+c!Z@5JbpQkTR~pX{5}pQX7d8z0^J9vq*|p0YtVlX3U6s%Ff?dW6Y@uz zHPd^+U!8muOPtnz)SYN`AxNCovm3?N>MK>hig@& z*jMEcI8KwQFCgLMI``8bC(g`GB2_t`Lq)q(xLO$EEfCmp4ui7-n~m8_<8~D&6BLs# z!;J=oBIYf{`&#R6C--|UgIKQ>8Ir)cy<(dylMqK-htW13g1V6-NLWluZ(u#!4zL%m z)dsy_%50V1$Z*H5(iS@t)~LD@2?xZQ@cdb3?#oD3&b>%!mkL)4Lv)(W#3aRw?I9-! zB!|nmkeIhe=8d8L^mq$=klq_j(gtA!yt#b#oX#_h-haEd^3$_4PEU<3DVKgJ-|yqw~H zvmw@!{n+;@6PNZ0Y9rtTV@!l;E$Iqg8AH~TV zDel9RWt6jNOJl5G^t`N(`CO3gRX%M)JqK5HFWKc5*Gmt7q&dgptS`Ps`myh8mze8wiQeDJ>n3MdUyP?8` znzEh$-PoZR`-3qZ%>n}=Y;#XT?uk>dKJaFwG}otIHiwN}GeU;Z78@OMG8i0ZWt zzZ-!e*pXX-%v*ttU!=PAG(3o$N`xCfzDYMy@S>EeTJ6T6RP$pgl zC0}`Hh_(EM1?~L7%*6#RcAM}KkI$i#R6H#O!(?D&>S_E}px~(Z&du;JnkeCkqN4pc zz>4W+}63DxQ{tff{xkh7~2vuvb8?L?D9S(@rKpqiJ@#mdTs&3q{?Pr0C8~^>9Qv`;BjD zb_s06x6*33yy2mx9oEw>-=>3063T2g6;DgS=uRd(V;>Fif0^^3Re2-&dB|G|D;F!^ zJhm7*`ta0sC_QdUX;yt4pUxAel(1f%h|&>L%CIJYD$bLplx;28h0;+|s%m{Q2BoJ= zDbG3rHaSn5QoeO?21?JGQf=$-CX}8trFz!m4N!XClp0yL4@BujGgqfucTGm=WiwYT ztmFMqdew}fwKexblwLEX_Q@`%ARKh%id%O#g5vd6D>)d>Y4dI*y>zo)f8hv~bIv(m!~6eJ)jcz-zVE&LzO6p>pHo$*s{RTc zrW*+T9Nh!asMA@Zy6#GhaxcpnBhjq7_hNW^HJmvT&92vKd`Cr(^WQ+g{l_9G;Lvg& z{Id|Mg72ZCT_#*V9m2xI;^)KCX9xRi6`xHF|LJ!j-ASq0h=IBZ)pU=HHK|GCK;46C zy35=|jVvc1p3rnWCSgLa0}>~Y&`-dDn1l&^1z`eiE-s9>KyeT z#g2|NF|9vC3hB1}*!M6Is$IZ?-v}Y@NKp zmWLzF^3aC$Lci(B%$Qy9Gu)*a3b=>|{}P0_NJE)PGx4kpjDP(S=#K zM>k8gh)#&S))U!HwB<$)VgZhxVq!Yd@l?bnnOIh&6e~w`vWaC!b~Qn4iiss67feNL zs)^N&Jh~mRQ%x*C(r_eV(@d-=a)`}cWn#(5*0T|tX_~ufq&8!-=$uXzaUv}tYp(G;E3)%U#O4hU%WPd2NAdO8B{>rPLk_5vN9nq}v7in9jHKzz1i5 zI*ya{vEJ0^^2E>pagzh*1L^uH))Ql+lf6*&8prr22S`?O1=gh+-L_!mGB%0iUNn4- z?k}Tn4U$YQn+v4JHEjZxWMs5h9tj3oW1M1VdAcPW)>!aao^qqr_vI&!o`(q%~IKKYT zA=Ev26Bg$h{XSb4K>LzEgLpOicMg5%*Z3?p$_c|!gvm)e$+oQl4f-r6fShEfGk^>} zC(OuA?q3XK$i6*+jZU^=^@g_{6d+FWq$xl~d^ayZ+~l}XKt?XWsIi45uSeV07}XDp zq(QQh=U)wE^hR*iAc^Fben3tfbwPk6bGn}gq~ihfv_6;J%}L@JjJNxw@4bh4@SjA8 zj}1{4mN@BnRt5$}F|%6h;IWGx++<-L!-Regia15LV_e~bGsv#y>?UJcDD@IFITv-p z>N$r)E2sNth%z>E?%D!zUQP5*&MGu^twl_mvu-EQ`AMSp4@3=`am?o&vli%rwh2^b zBvewF7ZH0F{}?GR@!AloV znWt(lzps~4{EUGk8mm4`^~{B;<_cZ&uj&#NgZjrgj;gu3eT7+t9G~-*3HGswoIO6q z?aP!)N@;(|^{C{!DczxCR7_P#f03~js(F4KJY*&|E2cE=l+2}3gL6>chF6bOiu*#x zXP8!A$rc**#m1-R=BMHG-y7XcBWaUu9a?4>Npb8%Rq`^8Hn3MOyM371IywH&tW?R@ zRIMz7>Z%h?2x=}(T9QEjI$cSC-Rm|7jmA_aX{j@1&Qw+Nx~UkRUmz=|%=uzGjBmUf z3=qKBDVIFB48tM2R{L@XgQ->*@`V#|`DDPgy3&9%ag%!y6P5g}7uBz4JjEPDyFI;kALRI{6sOvSfl(@-|Hmc&c zAj4XHtwL4QuMH~}QmcPpOrraeqNF{wcMODfK*d&^Sd(nFsFG3C9k>X(!7H#}N(F3j z%t4hbr9pN#7!13==ieDzN`tvAU@+>_sA->cA5_WRG}wj~sx{sl@OK7>X)vw`2B%hG z3Y5`d{4;G>@*523|6zox#Z?Gt zmkGB_hv2C>bm4#e4&kI)!i9GIg1?A3fXl} z##9wwY@>;~r>sYGiH+8+TMum%Uux6l>nl-$jDzK%%`=QR-iti=uOU>?J1Nt{Ogt+C zW0h;cFrojDR$-XXZvlx@%ssOXp0q+NKYpXrYN?9fs&bfKGMV_Oz53Z#tFE;K>B41P8JiL^$X0J6k3apqyk0!$%F6Zvgl7Ji*W{?m4UH+ zcEd0xA+F0HX`FyN8Pc0ekwwlJ-377~RToZBfug4K;Lk;fo63~MI0Hv5nSsSvR04)E z2@`rT|L0dJkkNDz7_!5ypt)z08Au7@>+jKv|44@T?4sMJ5V0BN!<;ik>~;*q6(W961#u-s zJrsF~s}o1yk~<@gw~_~cEkYHYPML*d;#nCOU8NH-2^0DPB#IMoOY-np?6Z(MXSKMx z2^!<-+2V<~x<*8Cb*+fv>N*j{)pICnzJo|yU3nGeWMmANn)BedL8zj6l&!02c<8EN zbd^rTBuwZ^B#IMopNDjIA7qhpzPQ>2apUR*;)%GrUPN*ALJ`H)4I+xG8!77R=n855 zJ0>h<3|9~F;J=PgMGsQ8uBPFktAf#0I)T#>gbDpF!Z<~D`4RXf)fQxtvsqmI2%vHG zV(~;=-6Ep6x>ZDRb(@Id>LnEQFytk!p3n%7aWdj~XYt^#L#U!NC|g(4@X%Gk=pLPj zNtn>mFBeb5)g2;=t5=99u3jmkxVn>~{)4WtRVQ4i z6f=gaEqL(TB2>{MC|g(4@X%Gk=qjCvNtnTeF4&~{gFk^)#7Sb#Eq-hh$rIe zZV|=RYef`S_lPL2UPn>yr7Lu`1tuG23|C*_!G8mxiato$x|)WEt_nt1=|oJzgnkcl zoPc|JKCY;8IONoFY8oE8Di~d*6SzK)FrhC*qBupj3@4D^f?7__?c(ZYXpF1-#S?M$4iUxG z10ss6cZw*k-bGRWNmtma6Q^UPN5*iqB@g~l2=THd%GT91Jaknsx<@Bs5+-yiYMageIkmh_lqd5J|LpFdXS>Np03cgoxt@egbCdViQ*L97a{G%WdbMXMRAqa<&CQ^i6`Rf%OZ-aheQ-tUlCDU zeU+lVfv%7M{VJ7W#&GpD9{jfus_4U%t*dEx=&E3Jk50rSOz00F#|gM+;#6TEu3|Vj zhsD)T0UB3d7f;01H$)Uy-xN_?eM>}f^=*oJB=Qnhhg^y$@ELKuvw85(Lx}w!W$S7h z9=a+RU8NH-2@`rF62%F)71%v|TZSxh-V;~1Kx15eUpx_4KM+w|{ZK@4^&=6*)sHD^ zhdU9r>ep>>8fdm9t$FaqAb?cjD@20FA5Piznjh4{v@Kf`ZGm63VDgE zXLQ82W$S7h9=a+RU8NH-39-vUqBwzEh3UWd1;`>N+i9}86Mmio zRrB#a9F95Sz^g2PZS^S@Vw%GNp9eo1p^AP@JyT}lSs54|V9vNrg%G!?kTgy)_bf;k zV9)F1B#Z;~02l{yi~}bE5CKX?w0csq`GYmq5KK<;WtZ||Z5`Nn|)0LFm=_;nDf z=#SJ}2h#A+0m0}1bB;-v(D_IjCy=`i(tRC}MNYYKpaB5mK!tH&JOFWE6B>%&`Z4qO4$IMC8K@HPN(VB-Q@ zl7cxLi1XmrMW~`bQ*Rwe!$SuIqXW!2CSgL?N76Wf+;bsauohY59BCYA1i(1Z#yBt$ zfH=_i6g)b^h~sVG!QX;VMfuQB;6NH4Iv^MwV9qfK6PkBY;skPQHpO+E-a3$mhYkqFLYZ?+ z!h~*!q;Uf75=h76$t|bOU_FT0a@pxR9>1<(#PQDH!C#FK_faW}aR#21fw8D!7{(+_ z=yM^*3Apbfz`X$!HB{dXS&CXY7u#V*9PeWu{4WuzsC<)8j5F{oCmmx^7s5OyVM2co zIZnVGiEF~kMzdDKTT9u+%F(R=N|^`8;(0Mf9B(WS{wWAm^f=0rDg)2Tz*y!lQYOQM zo`ytmitba8o*juS>WpkH0L$FPJlUitx5Lw2j5yx&JotwYs_5O6B~=EVm4UIGSul)A zn9#37juUW?!9H>^&MKTbqgxBWGLPWql4V}MN-0{P%w9bB{Sc~XE6S281JBC9SmrxY zCc}gtj6`vY?rV_p(SlB$sZIEf&Jl>`G+UumooQ_QI@u>7m|o|u!8pvU(*_%zI zXpX~NeJhKmYhCcqjNsZ^Joq0VRM96XGt*2wD+8lDEHow|c3F_)1l)b)*a=^aE8e+X zBhOF5@ajnf*Mf7By>Q{X;ts?jtNTIGyQU~~&hdGOb>rS;izx=+l752_*E_(n}1n|0PV()mTjzo{V(4bJ`4_j+R(Zfn3-jj?*NG`Cuzd z_3H?vH`Zq%h9q#OCJ%lBA@)Di(>fE+%D`AKbHg4OA@)B=8mH(!3h6Gka_%LO*_iHf zuP}_j`9BL`(=6Gc6wOe;(>(b684u3?DKlv`d}Vc96<#-paO+Ko4AMwRC zf#3T>j}+d_nRX7aN54aj16w#<2y5)05GM312;&spaTrk}Pejw?zF{ixCK1r2qBf2W zRk?3F-XunRRzp=(P#!_Wdsg9*C5~#_hZ@#7_d|Xb4zH3l>8gOMqfBNWWuhw1Ok?_W zgb6(dhH;ASpO9|EcE!o7(mR7}pTGqVD$ryeZVTeMID{&C7a=ju#GkH?tC9~1HJ#+B zyjkCzrxc%raeNtO&73BL=N0rPM1{fO)j}kSNtn<%C^1eT_hk&6PnW_tZ=`edNh=|= zdlFYr^A@c?nBrf$xsGV z5A$E%RChZje0CJ_%DFzK)Dex@*6m)!DxUY8Q-88j=ddLr@cwvcA!pa~0qB)^H4}$Yxg|NR&3TV_Ay;y3j|d3g`HO*X>&7=Y&SMy|?x#AW51bIHnk)a?vBrvdsRwv7p!a|z3P z%%vmEn^S(=<%5EqxX|T2;p(-pmk#6X!cx#N`+4y1MyR4!P-cOdcvc2RH|bDJ!h}8u zIZnV`f22~|Hz0MrHsbc90Gm%c4rQO`vU;Wp7o=5Ty;Q;YeWA1~~bE(foE+4?qV=!Q)P8;ScwGCSMzJmw{xYBhe+L7hmEM@U&8CCglXtB$Esn|ZCVlCvk zkILG#7P?*M@*=B@PU|n{2%r6>I<%#kVV?UtG773hbHlF6K{VO54UXRJHm*P-@WL@= zsSfk0e2T4iulv?D)zXV6U7U$4F&EwEK5=@c8lB0?#A%h#>_R*Oj4+}1BGb45DCVBg z7CV)lNS$}Cq3M30|3CfB41)eXkFxFWEtGA4@1$(|do^U;57!T+zkeuE>INX_?^}8B z??k9N<5#|E{Vf{Rd07auzthbxrY7uf(FFZ{fGXSH&z*rQ>@3B5NXpvIvMOH|Zu)t-+n}u^lg_HzE=z5@#h7qKq>STpE^;-5k>l6Z$^d z8GvHfc1J12Sx)Dj>>P7S9T0Gw!zu8X(Ksp18}IN@c^!k1bm7#ESZ5f)vn?=keE!e@ zKi?;G(#q<1RtCn>`9s8n=4IMA#cp>&x&@^>c`F^gfVpsWI&m>JP>eX<{XF=OAXL%w zDa%5Zfp^{+;CW{SDO7jo2+Xp1s{+7M1ce_5>zITI{S@Rlf!vNq<34XkveGFwa0tt>tfZ;KfTSBm@o>CiehG1?& zqMkmWHtBdxY&|k?JpM<>OCsy7ua6EMmzvAGR7p?jhAeYr1qUxrdQLJ44{@nF8|?+uFmj4b#xAZQw5JZXS*2+@yhN^Tvdr1vDhW* z{AXLU3(?t5AFF^4;-{0Ss;4mVKw6J`IzMJNB19mp+* zYfk>8T@<;M%AZUZbGVbrpTZ4E4o~>=r|zM_oh^~sv^V-g+()!3cOb+A6sH$J?DaKT z*x7$M;ve)GU^)WlC5@nRRIfT60_7*4;slfBK-r8+c~({RYE6qWkSG6(t56=flS+O9 zl?TQ``R!@&iw>ofRa6$tgz|^T&T7iGtEj9o49Z^)BMb^v?RQf#h2saa;?~S$hBWP; zp~(ZaU{b^Bf>X})V#UPR_5PZ6*^^;c=-h;nhaI={HSK){s&_6YM=@#Sywfyg!uIqT zsNU^ElVax%P&~**vSOfmpBS2yId|lyOv0y&Rqs_axf)IsG<5hw=AgnUf34G(({Ris zFpN7rnxqWzKFm2?P?a{$*Jy9fZ4syQBQz%Q@~;RoR26RoAcmgpN?~`!kD=mVpg0me ztttw@P06Op>XuLe^lf^e$DLEAodrZ{g6MOty_6b*p8*IFZBLDZ;!!F40yH(5m9V%yFpIk7) zNt{wGX@_5_Eyd%j`IkDa)`nVDS+6T1lVP8Kx$_{hG!IalX|l2-m9h|D!t9IzLYMn=Jb52n_Z+gIfGe4wVnkfRCBy z-{Vx`ZQL!5GA&FgLqdxl z?$7=HYLPZ?R4xr|2fMZBW!i=lgR0yfm|u5j%sl{R(CVs5&)@)MeUj;TL?yj!^DAF@=HwRja-%%-}p5Bh6vsyZg=5f3i*MhJj&%E8Jz5XC@FPN?_`{BDB5QOwjLbUpHh)ZICLz zr4@fwRD7>xDw+cKl0jc+!tz#O;hZBHb)3)H=8-u+481S#ZKX*s99Cfmy+;?rfX}rDvJu;PW)Q z2K}7hA@b~{nPzDY{uY=OeCG1azv;PEcd+=lAj@u%?_v74wyLsUXm)Jms79G)X%5b# z*^8&a!9I~`oifeR9NZC@75w6^Iy%#=x`U4dw)q1i{oQ}CRh6HGWJIu?7fqHkBki1ju*Ikk%nCY2cCXAdOLK5I z%_gF?^A|+E#z^GVkMv!!CH`WX@rSqh%OekA)%yY&24<{>s@xS=6by(wP?~8GPE~dd zeKoY55V-&w%JkeaZKZhY!>?hgMG-zeot}z~gtIJBHfV8beKHUJB!nv3mU`xxiFfW3;N`t>OG8qq&J#nhZvgtU znN8)H)NJ}6${pgag}>&S<}wz9?I4vmy$I!Sx9|_Myg8m#-bLl*zd||6{r)TKqb;!V zzoBxB+ZRe!JMf=`8ish-W_Dq8S&!sYYbKjG_N^LUsR z{2g%lVz=AB{w9x(&P!Lis(hKd>OH&~gY9Y?Q04O6eqlq)noieevWCnKSwnvP9c%cS z`hYb|pa)|i6V{vpW_$%L*zp4o{{Il-)gjbd)}-N`&j@f~jc8QoZ6Qe37<2yycHVw! zENebH6r4QgKnK>mK&55PuYU&H5Uc!>O3Rului-ttbk5|hDiZ?&`Jhla(LMWP-bdDN6?u3uF4wo=UYb|Sd(1|xt%>PKfEN*FVO@vLmVhv2G@oh&;etx|>+tNLS|4!^H9)5MA*%klBl`p24BGV;`; zD4~~$HH|!r%fR(}bKSz5X(In&>^Kvvh&1YqSYH!s7I~sJV*O04d1OrV7U3Ff7ILX`5 zP=(Lznj0W)k{`z{eD;}+0iu)RYvCK3&$UEjn0&I5v!@}|^PTboB#|8T5mLSI5}0Fb zlE+V+Ia3wBcwLjsf(M>$^v%VgnY$wt+ zg!&a;3@Fzb+|1s4!FBe2za#I$`VJpVk^6)ZN42{Qeit@&uHT^4zfEpAJ%<3gldE+9 zZwKQx=IJP;-GI6PuXElQj_;LVClxYHKJiMa-N$_Jgu%HGl*fFww@_^D!{K^z?oFaZ|3bEUGI7<7b zg_TZU-dQf}|zIY4E0k}dbY0Bj|=suru1w!(fg#38h9Fw24S`; ztO|`Rxd-y{pK)MDs1pZN@BLH>?`J!|r+IDE?f*mdCd{>k^PRV^GIR~9pnCsEZEJSR z>CRhusVe)~VdZ+)XTxpuVY9-ycU*OwZ=hAZkD-miB2u`@`4SUcP=d*4Eo}xntuXTx zu5o%?o2IAApF%wt$74)CNO~@Z$R*0svj*+>KLiFB;28fFR&iR@Aa9H+zLjy3#>TH@ zoQ$#Y1B{a{HvSmn8xE5KAYKlBJ53Pz2l5sCGEg09RC)CYUpyxm~#u?V=t#^hHVHm zA7fn<1)dzz_(8YLRi!NF)qHUJ|jp0Jeiks2BMVm%M^DOGNMeVNK<*1oOTZVUl z#pg${j1Na{SO|-eZAPPnr~LKQtgJ&Vc2JO4Mpi@Z?766Mv4 zK66kVzM~B%g(AG+a2{lnGuoK*K~c8j6b2`=QY3B#u0o{-&BpJjiVB>%zhHAvRA1hb ziE7ooqbH(;&i80(OpJOo8-qjixwDj-PL~~TE)V`J0_x(K2D;Ebq&+$LQIrJeVv&d?79@e^S?pi_jvg2r73)!6uw>x|AKnS z6Tit!;hkL+C3sO+I3OC;xdFlbaG>az0JKw7hjvu8#++Bw!+EeiWHYUeaz4PYFY4u7 zhMGF6jR#s4-L_-`-mNdbjGjDYk}A6WqS^t_X2^V4?Em!A02n=O%2HKy$7lTmpv@{e zaNuRkGbWEVH}rE=(Vb7Bg>9yDCM{G&cU_23Rl$Cyr|u0(UM3 z@MOuN5V#pzxuU1mgOn!8=!tXZs-kDtc2{bbY4wQLUm@@EA=o4b}G$@44VjkTzn zt%_dQu`G^{@~$M-4|iaG!p_1iKa62s z^dl!Rw>aA^e~%;KClgJ$eY;j7TH7&`OkKC{GBCd=>2Mlyi}T%n*;gT6?7WPL^JB8o zb+Y>Y#?Ec(+z8Lz;-uSmJi4d|FLZ<6EuP@^JBS z$8W>tKIe6EeIMP-d7r)X7=6llCkpWyPQ*D6o(J&|=h>X!K-Z$rITIBx9}6#DL|YVn z^+7#|-o0!6O(*V9j6PZfJ*?zrT{Y+HUU)skFAjB#M-CSs{Jd}JO~mO zHFs{tnBw#kCT8ta?{8?b8ym5rHqLAiF;J_@_{l7_8#Du)hTAapz;8S{OXpPOk)d*k z)1qOZG+xnARSu=a%MFnHM0_0b?<|&u789KbEB|WYOGX{G(duQbuRA|D2*D)ff~;rv}zx7J^>KZHcM;YXH@WvZ@u`;4E*Z)BqrvYHUQf zGiXGOPonxFiKF;=0st65ht~u_#+!~I$BoFbir+3E#0%*N87+kB6 z#A#5{_)+W-8nkGF#yW&X;8owoy%A~9^5L!_tV>sCd_Kw zh|rN&VJ@&xqVd2-UDcpXpPeC;Y|IanH)wnBO`H@?&>uh+` zm^qkMM|MKhoRN($#>Wpw#`c0$N?*p}xP{7Hs}vK%ohNzlpF^mkw^No3Gw`eojPCS@ zVNAk=ei?F{K3no`#?;&?am;NON& zMcY!A3^MWF)p6B+9-&oO0vjE4)`EPTFI>FB5UpZvKl4hNc`f*0XDim@MvpiZtNzZ0 zhG05 zJ`@_05Z6SJC{7@E{$#lSU;5SBJLy8eFJKPVjoNr4dHqg}qU-Eidy@;lPlp|TpN!roJ!w01 zGi@ue;d1b;0wmv<3o*GqGWH&{d-B4_;fClM;Epry70gb_jgkI1Rs0yKFc**Ov;@$m z$b_9CG`86qKo>>+Gc8Crw%I-)n?H4rII@$ z-tG`7$IP9)B68{_A+iQJB(IE=oT=1AX@aq{djr`S8Qv|l;j0{zyCN+w3z4(Y!pW;6 z(=p&o!;S4*3gnu|@{|plPbII7ynueOHg&cG*%Rr1Y=}IMUQJ#X*|I~asZzQ=ng@=D zJnUy?2!C!(9-+!Pi9q6Rv__ZQC)nXtHr@=Uh6E8=A-`XO?Z*4_B19`+L=0>M0 z)olV2ChxUuxG%Ce7Px2F@Mxq5>`nJLh7FHJjz_I*j~O;R9(f+_*@_Aqo`{S*CPah{ zPev|3BR~uro{GGTHP~e28a6y1Y1KV|)Hq?o3y}|2ryya&eb9rubzqBb}Q5<`Ge)=kCEc*g2po3{5`^tIvW~9 z4LARYjKd;hAlGp7&&V#U&9-ZVn@Vq;6C%P*M|bf9#BkHqPob@CMuwYNI*Ac)Aj{1f z`gg240VLe4si#$@AmL^$eP(KkGu({nnmF&YP6;>T`o7ehBiyX5Hy;t&2sab@#KKH& z=IH0qZ8jg_W|5wNxxgaA%?A4OYePi1*-+2AE<`{el}zfbXl$EGxY=0GLZ4eixYCb}Tow?hdwFM7Zhek(k6SBHXO2+s+LU;pP##Go}q|Bizi_FP;=4!p-`+ z$pVXjkE~%#LcB%;4#x@Pb_07Z1{IuS8*Nt6wp!H>8q09AqwZQ1(7#LGMIrYr zM1-3s>a`UiBHSFKccpAVAe9`e2VfINHjV$x#BE79chzK_q>$cdinXWP1 zT%sQhS8KbbpP^ry9OP}ed8R(5QwkDpuF#*=PC>%WmHI-=DH+^cr3+H4s&I3)UIpe` zb_h4m*1Qpr&doLYn$eluT&qvNAhZ!~Zqi?^2od4tMfytYux&oV&CU8MRL&y8%`N(m ztsx@w=2pF@Bt(Rp+w_FZ8QdI+-qMZGQNqoWr{YcYj5yvqJoq0WRMASxmYeB#zv_6v z&DlC9hWlq!TW-$PccbA2vD{pymu?Rc;pTFE(pe!Q+&ovmwm3wDo9FA-&kYgb=6aor z+0EuG+}xnM^tTAO$r{Ea#QQzqQJg@n9FCi;+%p&A2G(wf$*U|ycj>G_L7N$h?$z62 zVY&{eHNL@4^CKA4(fg`!XC^(h;n=)X08{BQFSiaw)Pr#8Jp z(P#BL7{_T#`!DD;{Sf9Kq3GopbL=%x^lTpd^AM`&f2p?=O~=2ejt3Oot^4I*0z+;A zMfd1YsJ0-MqWkpe7GdHqY8!68uRHV( zXrK)@KhRZRhHZA?=7+jqMu-SEKhpccxyx|#V_mj0$jEZ@OT7nERR%Y|((Q9okZ|*B z{l*C?NVxfpJ^_nN#`O7}&YK;&Ak*jfdS;Ih5pMpV&%*Gqjte(`)JxCLTNn;bvXWY&-M3%b+k_Ww=@7?L>o`K2I2KHt=>}Xc)+Hv!OQ|CvxfBY~;N< zB1D9nNw2(ifEaEz_Wpp4$;fiE%o~~&Kz3;__YU+)LBh=nZ{Nu&NVwU|+X*6?yp)+Y zTX+|@4+=E%W=rptNQekGTY2rz4H4mHYws#_Qu^uokzSq3&_=k~*=vi&wbd1FcJZz_ zKSYF^UA@IA8{uX*?*VkAO(opy?j0Wv*RjIQ9^PgrgPU#8Tl&|fAQ88nw_yOV*TBtt zdGH@XsG@Z!TW+S~CDrkOoB7@YN1D&o1l+9eEj`B~mYc=iXza)jBY(_^GH;f6UTKI3 zH;?j$qi?K@aI>9vuwIA=H!Ho-7=YGBxY^PB;24X5kE~%#Lfq(q!*K$+LowGKbvepT z_P5+T!8>hC(0qoQ!@Pa4H+^o`^x@ux{R7CZ=_9<;Q&W`8nCU48lao#&?0?2Z6ytg~FQsac16TG2qQdYvviC+74A!N8Y$!m(K)Vd(^ z=45Xh8qOlZ%_&|SJ2{I8H>Y~P9-GO{Q@!Tsl&_=kq(3_F6 z5pFK_wq6w42sf8_lhBejXW`~juL)-Mv^D)1w7%ZD9GygNUXKc~*TBuuJow`fs_4zs zTW+S~4_3zmZVvJi1@?xj-F6P~zTRXJ%gr&~MNLCQxH;DQb$5seH>Z2N!T5#YuW)mw zHv@C4MTDEPy*W68wuo?ZuGi}fi-4P~VN61Npb*uG6UhA%7Y2&42XvBWTW+rLZpUJ2 z8q09=0&iHupwE+L-dykfIxT=KH!t)C3=Gnl)AbGB>a#*bxVh2WoEIR5o0~i~dImSQ zd51A;8OU<;60b(16eQfd)Z2-bFR&7BZujb+7D9%bmwTs%i-5i8?JYo~SS|=Ruka3a z2@&Dum0sIcncUpzIdeiA;pPqA-Do~lqTH#ZJ1K*HE{EL9{gVss%SsTmYeDL$<^_Io9B2hpx^nN zZZL12=RJ{c5zEcZ9v`<98#`}q@%Er6EF#>z+S}VPM1-5Wy&+(IDy>rz@7=0!@uM`mYer_U5*YK%W(5yuVp;wb31Q7;!W=y zK$e@2dQDJI+gUPiKIVuMNCBL`a{K0El9yFif=5O97BZEG-^XBi~kJAIla`O+bJ;-94 zUAXzDciXWcBHUDdi;x(Gn~pydr(}j=c1@4^Wzz!4ax=@n;;IxR+^pe0UMB?!H*5MA zU{N)B+5Kj=&sVsmb2H|j56>+k^Jd)NjHa}RaI?1m@2#2KO!#ekg*L*?LcefAhzK`} z{AZVhh;XxkU)4B76#kNp{JLm*Tb6J$>91H7BErqa{@lJ9+`I}&^z_x}By#gBoG7x_ zz|9ss_-zrY=qls$mohvP3xf$^rq5@)Lx#{_jA%#VR zo4NkyScohl+|2W9qfm@ajR_sO;R zX3^DfGuhlXr$jCM(~b?=%uw_we^Zj-qI=B+kXs=kWSI#{Fi5CQnZhM>+zwDP;{t&YKo9T(P91(9YPzS z=y3m=ZXp65spLq1Md~b3C_2i&HFZKJ6dmn9iWMbo`s{^H(=qrc6kUX^5PJ<2eU1nJ zWrTSDC1p#|bi6}#JfLW6Umv5?PK{)iqHX+}(5Zr0igxmQ&kPaSc6RZLq9Gy_?dRW$ z#pucfvXd@II?EluwBA_U17?Uue55wU&f!rx*nEKcXI?2hFn^XLa zl|h3VZqD=mj7I%0LnGoob6X)VYOW>)8`!jht%~K;pSYw|G2=$aC4sD z7$YHrn@jvD^#aIpbE*H>B`HX_xy;{sQVJ4op5`x`972Yhr~7|k1C!3pGyEM`(bBnj zrhjfuh{*K0!fypmr7!I({lc!Hjd1gP|ATEIBHX;dA2~Zjgq!RABjL6!3j|Wh4Ss{+ zAtKz|=+DByw>HAfP5%E*&fwJJF3d`#rF%7-;pMfBrc^o&mYVUpgc}4+Ayl?)&_w=LP6W^BBmjzLyn1rG}`t z`wwmjiZ$m)`~B9q#9>{Nb^Z?jbj&6e5uzUO_hOw%C+eO4>5`Igs4yWwQw~mZ4zCLuG2$tIw3?IcMUoc zEeE33<-xCy5D$h>Z;6_YpHUqThZk#uD{Lze!1m z2vP6$Yhc4=ZG@=z`h0DwMTDsL`){-h5h3b9e_5$TKvdQcuVqG<&`Ed{r&z1rm-wZW z&ixmb)bTUmX7VFT)Q|nkwg+uyi29ZP!Z|_Lw=+cj+Ml*NfNC3}e&fG&YLL#X^WXaS ztO*ez>UVzaE&*bQ`n~_-#X&}vsK5Hhtq!2bZvj#N=P!nvhQ81I@#mitWk&tYf2L)C zDm_uA)ZhINlL25ZkPE{xRdFq5ks2YimTaZar9i5If#HJFe z){Zs_n`^94H4%NMS!g3v&50hDvH_n|GB?_MPiP}lts8xzZHNd}kBEK-dZkgd1v*dv zz8;;$Idvv_k-Z11KEQ+jC_)v@qim^~j+a-*1FC-JZ@LbjC#Kp`^$UN^Xp2~?{^;+( z<%ADFGdfliH5vul#j+`4HhN{O#qZns~ftISrN8da%fFcJ2s`iVHtq9QjJ`bqc zKRRJufU53>swYIBt{Y&zat&1nMsJ%R6l|zEDEduRh{&uuB)WZChzM1OMSsA>j`Ue| zM6@NQj&!O{h)!J^B0|-P(Vpjoh*0&E=*1};@JS^nN8e7(p+eOuQGPSX<}6e_HM+ZV z2321{=jrRf8KLS7EXeFVP<1*F{#=AAdXRcc)pY#D>UcoaPSJ1S?s8^fsoEtv_-u<< zs`id9LDPthrD~t(vqd2yR2>~{)h0xQs$-%fu=}^EgsNks-BE3e2vx^L+b*^UsLC3~ zB*gdM;ZdAGt#VK`Tjw^xMDi{6%*n=4r|vODu4+avWU=dHw$YqCEwv^L5)z^AM5xO(IQ#_psQe=fRC3WGDp z!uOvTalGGo@FUnbspyrInNcQQaaVvBw+Iq^14vc;hl+ENpvnDKVSn&b=Ip@I(&Wi& zumzBZ8%;S#6K6{NB1Xbv5ymvbgsuS>;uQNIf+P=$OQoEqFP5`XP2UMBC9nE!`tnO? z_?(;`&>UiloMG77G<_vb@rRZWU!9M2DyRE-5MTQOCF`}!mwjyzIilOKvPpmiv0Ss{CXg}Q~5h{IOAGJHS6U3 zdYfY|+k5?Q0jetN(}i_6LfP8scvCfH4=PVR0?Oe|K3-sMenTcH%?mDAGrSIyW@qe& zS)OyKS{{>D`S?AoqasaTs+I(pVj}NK4O!dss*Zf`54c!?niG0>K{g~@`C|( zO+MU@Nr(sYkuXjmq1n{#7ijg9%3PII+B;`b6IYe?rN{9i~D1e@EH>1tDJj5#Xi$0tGYhnW3ua5NZclttuH#j7%#XIHkn370?__s$>y$ z?CsLQFE(^lO`^6q_LC~v8XAl|+&t4j{3*GU27F;h>FE0!WaMrfE_sy(2T+mHF>5>h zjX^V~Y#vgdq>52jQ#Kot?GV%VAWY~#kwu(hOvHr1?lo}s9!x^Pr|S}k+fUc=({?$0 z!F`?StcJYGzRpZ}l|A1pR%bTT=J0i6b>?0VQJ;=L+F^MsSKYyghR%(DVTyb!4XIC*b9I4{LpMy|E+fmOPGx3UH0bV*INFa1!zN&ZzwcA+GtY<3O z{F0?AUQPVuw!jzMg$4=noy7SKywcOI=osSW=TapPQYlPWQx{ZW^&RiDl#eCv(m*z?Y1bKJr6pP=wUW8g!xo z-yl}{#5pL!_>g8$Ca*awedZoe#i>$4p%(9NGFqWn2_FzQ#CXTSByV`Xkv^!BdDICp-ro!- z#6eqJ$wi^=<6)TES)CwbX}Xe|X&}V-VsVRViJuE~-;Bgq{%hi|X&}V-@pH^EX(iik z&7p@vj9*{L%-tHarGXIRk8a?eDMIRH3@V4yK#1WwM>YK$i;jjFzEi7p&@Q%FNqmrk zX9JiCQ1h6C34K2Dj2nPrZbRG!cpS^Blea1|_WF+adeMcEwwO`Pc|?;niyXBTcFj+1 z57mYU&71RkD|s6uO(E+a=_C0u4-x5m(8HxIjm3F5>`k53xQOjRby8TM3!)MI1m09gev+1^~@s^FZqHv zU&CBB^FB3t7~rI7=~`mMwp- z9PhpfG&HmCJdJ6-a15WsLUAz(6M6#FaRX4qOHT>VA@@l5HxBj6E?d=_7M%5) zVwmLoay7hPlWLo_(x*>BB@L1dA}|9~ygd(o7lbPMF7?bK6R-GRfR~*UB#=s16fiLp zl${$WSXW=PJ)FAKY_J-8a)C(YRefM$ zDs-dN?Fbl^-6SZtQf0TW-DH(3+sF2lkN%Y1%KT)(E4yt8MSk?BZ2uV)xxp&C1l8b|f+M%{FF`?AQR;0F5rZEAdacT>uqKMm^y z6WUC$2@Z9y?7}c(-5k#p-Sjr<_-2)|H->_7>FJt28|vP>0~2q0x{^<+<2O^vK7AaM z533lK=i@Zk=)M_)#$rnZ<&`v{j$ceE`(-g!!}N5O-9nw?{D85Op0IK(l{vVCSLQiC zVYr!hR+(B#BW+-o`a`Guid4!XNS;VX^Hrtn} z(;l-t`^whUSaitS1*9I9kg`_JER3fNZJ+kk;>#sv zU7b!K-d_snGb%7R-WiWY;xGAko<{@nzia@8qoIwAtIk_O&5%$d!;YDlvDf*Q&}Kx2 zjq3bls5vpze29dq^ZV57N}|LifyNHnN+0uy%p7ISB42D?_9Hs1Y=P-5~fm<|E z9qL~LEx!a%R?B?|g$7!-kE-lJEx$fe*3exI-lq-1v>BjsQfSuRJqs&bbu-oB{Ltc5 z_r0`YXlY&+XxzD-cDHeUd^GY0nlf;wy4}BNw~!-ep?f;mXYEwwmsEU?RljVV`yBe| zFRoPPagq^>E8JmNw5wZ4#Z-q5G~@S*%5HJTbBVPK4tc6Nj0{a4aJyAAQC%E|s@(AD0{1_%+ zwt3KiD$e1bko{Ji?k9v+*+*ltb+SK2X?Sb%Vc>CYGGdw`9*7V_%I@0hl-l|tGOTl2 zlObQ@+A~z<3eVZ8D?DrX`&@H{XKm^V&pKX+HdlDgVK#ak0%6-}uPSvuBaX*AM2^1= zp^7f1%tA8ptPBjU@}=+zO;2JHCiD)Zj1zF%@5L)xK1UXHrZ(ZlqFvDZ^@>!=-}Ea| zDSziO8y!a={3JB_1!Gqr#A;H&Sf_GS_Im1B^J{YdrXGAym=(DcgQY!^3_NEcBP2#5BW% z{s3W|qOA*GgdWoj6WX}}uo1H<(yN%DQ&-)L0_R}sS<+9>$HK|0?ui;&W!2Kk8FA{g zTO4Y{YSgLqaCsfEbx7lG%5KiP0VVzA8g+Bt11LE`zOLS!Hw;P!Xx=es&f5ef12wPH zH{b9hk`IzssyENZq*pRnb2B*Yshfch5!u~z!nAsf4wGx)?xs;yU%}%qQQ`!6wG#i+ zf2PYrX1KVtKQk9W6~LMJpV1VN8Lbg0HH((4!|d_nm#C6aS}y7jMr<}NXW63qPJ8Wk z6m^pBj5O}1UUN=4AJMV;V`MPx^V{M0$(pwTBAc#Rfs~U}$vCN?yJ>Khz6mdFf{x`} z$HGrSWX2Q*^AOBjovvF?cpHPO8Qj9)9t2gN-iW(a5SYsv=JFq^UPmzV%XIi>B9VP* zhA~8D=BFb~5aHjiWinkw#yH+0~!{x(J-{RXLIg?SXitz^#Iv!Py&-dY} zlIJM5SdZ%&o9kbW8%iJnRvpv@J3^=a@kq2|;1!N}!-T~#tS>;S`El58h2So@`$&|^ zlnXDti^WLRaTc?Pw0Ej*!`5s$QFrn9@e{2K@f0hncz4+0{ci~49LF&k+4Ijt{Gska z5sW!Y_VvLhbH=+I)k`_ltgPbvT;zN*{q>%iDNel$U(dPI<)X1@2s=@di9J!2I8Ve~rq!3zw~RRL$Lt zFFaF3m*k88oUj2tq|O8#fS!)7G}$udpvPz7Cgow6L!1PWE3k_5Ugdlax_7z;_R`nr z-%0p1wj);aIfi%#Hr-Forp=Bte$KxU27FnkF<{JDGVU4&9CJ7|&uIXci%u6=#rgin z`H#VdUt%>Wq@z{t7_jy0hjBTx#WT?+_dn|>TIt`I9j}7w_Z>wO$MGic;7>)UqID_L zx*A?q9mfgH0OhI{|BbHs2G-`4m#m?AyC2t0xj1YBUaa8Apbs$#6M81Hj1!o8U_T07 zi!E>QR`(~Yc5+i5E0Q0RmGurS8nGHFD=X~oVVc3sXKip)@ivz?@MSeDzQpBSdw0|5 z({f=^o{i@y$B$p2iZ65NlDlcREOW(|yKGA=Pt$&R9XaeUA56lMI^qC!M^{*F-#L$C za24;BXjMTn6u!Q>+IuKD$Yk&7O~pS_Rbir9r?CayH1E~)(H{SeAb!oBQ|+0K|45V{(69X z!XnKZHFY?aB4;E{_)3=Q8*x=mcAaRI6XU5}=TfulG-CsHOoLtLsYi3qw)Fo{_8m}C z6y5jL-PJwI%xs#)l?||goHI+#L83@lP>GUrPJ)7fpa=pYm_R`UbHMNlW%mNt@6W zNt@8Kk~X1dCv8GkiEfRUT8eApwa<|s;q9%{&6aevza?ETZ8Z)j@@*1aUL6i*65nP6 zoQMD9!JI`)HqdNB*ZG^!iF2N3gU%DL&93u&*>&1mN109M21&BF&NTbe3uJ#f?c96J z29%}V%&Puj0~)6N>jrcNO5w6h%k?ZJbpsm0;RZBB!VPGMq-;Q0*ajAuvH{(R>Q2Qt z(&5{gIsp+i?M}elG7-9uuxy#8Jp-7B*293F#eXmxO#2)O-0-~u@O9c(Z1|?tK#3fi zUxDYMx6Of;G&aYPU?U-UY^JqGF77&+BcF*CyH43!b^_LwctuT^=ee1iKL=S~;o>XH zW^@nZ<|J&{RZtDh_i9qyULxmHdxhCcB?HxL>Jja3$Bu9#guoI<^)_$-Wh* zo7rQta-cr95@OzRs+lz)=8M`OAL;^8yL5)SP}EPRL0v>ue?!-};P1eNE7k$m3mAAM zkSgL*XML%7S_(!_=?{M7g3Qu&ktu`fipw8B&Rw{!*7$*6(Kqb4Ll}+`nH-X{3jVN= zK+xWrb~d-UjUV9F(<(<~DI&~nZ_QdsSM9A;S6MgVT5scn%wdg~whz@@1&eo4;t%+r zaWf(_?uAe@pMuOnEj{o*<2B+RLd?_$E8yt~M6B`|)e+372Qjk=L{(&H%uF4LoRo|V zAu=TynTN=Xvy!cF(tYS(fa3Z=e7;W1cR_m@T@XwmRS^H*%WoA^Nb==3 z`L$N2kgY66FM^Qc@F*@ZU(JZ+UdO<@1yV&eQTL~iBs`o#1Vg*bsUn@I`yuXCqs$}GK#X-2((D!ob_L>`y1K$1(FJ3gVA0=9pm&C(8WQ#2$SJZ}i4#jn#Bc>0pHKAuYSgK}$8A z%S~_gQmXSr&CP>4pC@m+HF60b3UGSQBEW|U47_QODl(8di%Z4RQZNoNt4kM|rRN}1 z1_4_=f)(m+I`w!{0eJVvUF|Hj5GMK#7S2WNZ`@Q&Q&i$H@Zyjva+K+`u7tl+8OPP2 zx--zGC+@<967viCiBb+fcj-~kMb?RzGDBwR1d=lhKs7%6dK_Qz19x(vK6^6WUEZ`6 z;OtgyFllsJ?Lh5=jenKq(RxtxF#A<$HJk=bu?cV1Y=;f?*k)TbKWPR~eC`)=t(CoQ z51@X8vY+2;tE?_m&&97&3sj3~yzr5I*(tVaF(!!I^LUu@5(;qqlP+}>TOmJQYbNSA$leB7CU8`j6KSaqJa zub|;&IP$G^*4!#cK)9Nrz0SIrpXwDlHW(PpWv_10KXiq~87ML{v=Qn_uNbqT|M>#ges zOu+9FS?A*iRs?By{_?oO-+9*5R+4j>3F_q;Av*8GWl_A7jY2CJN{YD zyM)iPn&NOl(DPIYhMQor36_}PJQG}If*VZmfC-*4!8<1S)&$2*kae1rSz>|~Cg@>; zVJ4Vlg2g6SZ-Prra6N-{){)Z@pnJxU-r&rXaR?Rq=dCA>_KSyA89{|}C&c}39%-3{ge}^1i$y?0vOI4_)yrUrd>vm9U z@>zrIE2lxN%?F9Ii)%t{&iBk_Z&(Vog_Ll72-KE*v0e6?ouRgp!fwQU9$stiZ?f;~ z4YiGw+qfUpw!2xv8JM!Xc2e$DxESqq_)A>9xCy`=ivFNNCYXA8EAhCw|^s`#%5wXfKIm#rRzIcC4d{y0zKngR|m0%CZ?U2u12g;3@qYDSMyMVZfw%xPUd-t zH8HU)XYB&Sn({o;u36Q20RyI+nY3!o#{&^-&aWZaH4B|090$6Eu`C9|S}3|ytq?A8 zB5Q8}5)< z`a8%Bs@ZitRJY(bRD0etxLXd`oUuG$QdMFH-Ib|RI}gWalBM!(uXklw5};j+}xp1Ytg0b za`@A_woG3SU`lFThXjgWHxTv5OJ+hg{9~3hJ#K)NloD5;+XGZo@IP=ox(0&Lw2TJMGaUf?bF#X?nm=h49eBYu5-~@$A0g-zbE5Vd47^&9s!K_I)F zPIYOIxP3DOqgfdpjZ>Yt)2eW)vx%mao{1h{j%w>6=oE9J_B$DP_d%*gS3=S*6>gji z(J2;#JDVW0^uv%DRI~ZEoXnC5+@JkW1#0PRs{g?TGqa}bxxU40lUYkv>#L_htt~72 zZmM-;IsZ5lYF*h04aC8a+29lKKf6&As7-1ehML|NYU{EiP}3$uZRZeuX))B!c~tjf zW0={aDb;EqR_00VsYY4xzznMQY=b(s7u9>IPMl12zXx^dd>*nTd!WvW@Zg$s9n{$g zs&&BK%=zz8ef4Cht7M93dOp;1WHPuBb7$siSxq)!o1D2(w%@01g1SlOkV$QzZsA~L z|F940cG*W~p9^(|lyI~^)Jvp~uKQ zwxw*avY7ekFGMq_J{@BpEvpIjnG&i$^oIJfqWT@xS8}QLJRRz*ji5HP&~q85+ZVpT zp}iQg;5rCa?2SUdh)@mhUJk1<_G%<$XXWC~yH3&(!{$K!=&0m<9x~(b6EL`CJQ!#8 zB79sMJP_x-R)<^f0u2W%&p!!>as7&O+tA(FJyS zeQfH$hRtsyqQ+eSW9#EzV1&QXxFXSa9SA)SsJ#Zr91OU&dpQl7!MZmQ91t3fHJ5Zw zsfNjy5!}tnz}o?-A`7T9Ybu_Wf??{LHhZDcZd8}RJ|;4%aVDnX1ng`J-v%CpS;8rB zx?%oz3W=b8=hH5TRX5&f{RL~|arifOAJt%jT5B-yYC)<99#Y5894IIiPfNitSfx0? z=*=EviiwQs2FS}#@nU*_whmsz^$kvkmax2$2))UB9I=~LpieQ6IyE20{ol74-_rEC zuo2%DVQITELS!^nvmV(iprmT#0Gz57s)(<+ln^4a~rXJ-KU?B8k z+mKElp1KCH$4xBFsb3SZCrm8vygVMU!zPyHj02JMlO|TxnZF0IBPLeO`DhekPnlSu za~Nwf-cK(z6g&4%N9-9BtL5-z9{O1mtLHr40I_2x*2uYaFk;V}zG~*&IT5iJO<%Qg zei?|^%cc!&ojK&J;M< z3H`-?q_zRhbc~z+>P5*sObO)2>myNN!&mmQ0CUuTbDxQ{taX9f?xQfc4 zM)ifr6zBNH^kq=f@5h4*mY04fbUTus!_vI0hY(|GHWe7{=DawMF7PEj<>BbVbiImAVHL8=Cwe1Me|N6_4j(LseJSCczbMRwJ=_=Oc z5{>6J8QV_L;}g>WaEjQC5Dx8U;N1kNsue-fE)~v8hH#?^tKWr^L7V0lj$x?lVlWm0pd|j$73R+`VJs*0#W^wLzptEpCU}v z?u-s=gx*W@hB=R3gQA89lVu|;ZeF>GX`Kr@8MXu1A}|x0-IIaW4-#KWrOtv<@w60- zRUbpuF_BR{7@6V(?0cZilQpB6Su>imT^KjLnFVtQenTs0h6)~J;5`PZBG*!9)>J$# z1!Kj-VHgvM_Ct>oD7Y_zp9N>BM&3B*jqYghc)wofPy(?tOiVlNrXV)K#L}EPSVz2x zCKh+DE=6pTiDfw(CnGl5#Hu<^T#ncj6RYObC`W9ni4{7pvb(35Sh2HXEn+iGch_<< z8Jk7t?3(rTHiXg#-{a)-aYiinC1Q?lXJWq3WpN-hOrD7S^T@Z?| zJ#eCXHY1kHG|O8HsUjn&vyxOiEd^7m25Xk%1&-6Nn0^a>Mt!*fNSuKEc2p@&<5pVR zBD*7q+~L-4xcvpFWm!cYR-d$vM}`E5T{LJukWOD>bul)&s3(d^>+FpVkhG$eSf$ds zY{xogY_f{3N5`jiePwch6c;U<3#8jM%>$%s(I003>3%mh%O=;V;#07Kr1iLWL4YW$ z_(?)N4}=9NyZGnXfO-|;3WCX}ba4jyC#`q+<`7CNzM>|eK27sND62Rh9iMj691N77 zvADQD4urJ6`K>~zYthY^@zeT!wLXAuEBXz@OY7eu^r2tzIqZ}H!%&4ONn1rNngTlc ztLy->irSwAWbk=mL3YuB#XwHE?b^Ub7d2t?hP603K&+zECjlA$)4Tw&i^hxqQoaC3 zjbB;O4e0x{5&f`a8YHdgg1taSa^f;bR?+r;Ku#U8F+hqlx^4i{?gNapJ^&%4dltvr z=ZskHw+y_WAywoV>cWx~JS_zSqgYt_dU$MOKet&}M;X<>BOy-Jz96R5TwJ8CRi(Of zbUZerHHh#S8JR$==~{Z(q37_J@x6?YphRq8=TEcY=6-cyh& zvYa|ANyXDrFdU{=z-|xzW#M*J$yBi2ifO_zeKTa7+nt!cm+Bgn9M#9skeJA*evU8! zn;(NOxe}S9vrA8Fgc~4`l5tUcWSGPGBBSd_sB*w(+`Ap>yeLSQu^J4DEn?n`^}B)2 zFDClXAPh?bPGlLK*8yF?OAERjNz&w(5Icr{H0@;u-kXq^X_(HcE8*u<#&O>+AwGs1 zUGgoaNz3C?V;&z-Qnd~;ZPGjyUH)KC+-)fpFvU-Pi^($=s_06MW>-$GEw?HCItM=$ zu4z->EUh>($Mj$XPYv+^mj{l#LcMk!Y$>fvZ$Km0PwI*^M#U7*{fLg;Ui5+t99%5K zFN!&hJGJN1sQP)RZ}aOtl-h=_wmizD`f6{d(Mj0bMYlZ-r~ldLei})iT++62ijh>u zK~%MQ8=ke9qk6@iL(R6(@_6sNs?FQutyOiAv}eG8pykq~wX-n3Rwoi*-}-Gqr!kkw zTF06+XR?Z3HyLxz8Wd&KwZ0h(z;fw=$g>Q}NnQ6F)1{RJT>t(ni()Gbk{2lAoaJ=V!u-mBji7#w5BYIcm3I>Rp47 zIYuxgI8h~APw-VV+purmj--RG&c01?*C+P84dWjX>7!oU=#Z% z*#}koej4yu(%4vc;6E9>MT0SgFqkq8^SZeeLb}5AVeLO@z*j`YW}rL%!Jry@Z&y7S z%;p?YnO+Uk;fin~v-FVvpP{D!H zPS~HbS5Mpk!C}7#p@pp<1Me|N)o2eS?NZ^!$qQzb#G*i6G(gl?Ohy+)iQ6gnk-eBH(Nx| zuqNYG<}H52YcfG)-fD3rXDi;j1b*J;r)A`H!V3m6Zx33bAEaA6T>4*&w<|JYxqmS5 ztg3YT73!=q6;DgS(A&()8f9mJrAPM%5EB{I5fl|CV2^|L-|f6Ds)KF|U8-J(R*SSAdLIZbt@QcSt-b zPF;*s@U#?+RedN`QAYJi$P}k)e*kS=YZQ@KE;oP=L_C9ceJ57Xl?>kXoj6NW-u0b0 zTU6flomeR<@A^)xqN?vhUU7B&aHUuXrJ_YI_qyg=Q*>pKY#@A?*u?$L>uNL)35 z9w%UL%vGw-IVd8rMqK?3pmBArcp|QzE2_AJqy{O{qc~td8lqIgN+Jj5aj9BhP z47^JrRb&Nq-_;~MbX73AN+)6>qxwo@iW9KQPQ(p%eNaT=0&#UOQjDt`#S?LLlc?hA zg`$e9n?)5@w@}rYC`(-Z3+n<4hO3<3T)jk8arIKF`hL2?gMUB~t}-%$2WA;~-$JU$ zi`0Erlkm`0!RRWTh>48qpP|PI*qf>;HS8)Bk+?!!{Vzb{>Q3=QT-_zAxO%0i;_6kR zimSV+>PaX|Tpf3zQY;v*Ze!qG2B{)vQTJUrP8 zp{s(?RXPz98P)xeDNext2wFqbVhA!J zs|UmrarG`y#nrn-6<6;ORb0K7s-BFp#MSZBm14ng^THxHt{%dc zn+3yF{$OBvy&zSjK6T&KBs_FgFuF=7Vj{7gB2%1z{V}v%tx!bbF>!S;;>Oj-#S?M$ z2~ow>!=j3-Pl_t89-*oa(iIZm_+F)0FkJnTf%iS6io8tScQpwQT@{S3(utVJsQwjt zoPfO<=MEn>MG=Xo#nnFm8dskYPsG({MHN?%i7Ku>C#tymJXJjfWr?eEdgDh$Ml5$b z1Mdn*6QjDuFiznjhE24_4 zuZk+Jz9y=;`Z`seKw08yzcT!u%82E5W#ILORFMYMeOHt4&{e_cDxHXljOqc%6enPR z0&UP}6p?sKTs;MGYo6Os~?Le;_4@&imRWBDz1Je zs<`?&RXr7DiL2i?SBeG0)g27HoscTBin{M=5+1rL7+s|kF_BSyH8RBs*c~uY^&N>K z5?_g{*CNHZ`n7l>u6`q`xcaTA;_7#zimTsK)j6E>cvy97iJ#6H!Rvw;czqyMq#Vv4arHlx$C+D2UZw84nuLe03PxAyL`)=hStwm>a`I?B;r=- zn)Z0B0nmnHJtU=D;y@Qzhy!0@dqZDNZ2q zIkb(~^IC~4>(qS*lJL+0!RP=>j)}x7 z13gY4!4C!Y*@+?&RgDA3ff@%+Fb;Hsg*eb+J|6C21aFFF;4OkwkyEMr4kY2B1A@^3 zmW*q)kWsxHnc`FvUqXBTY7~*EW*k@rz&Ma+9C(x!um`R>7w-~a#B#r9;Qb1zB5zXn z9Z14M2LxlKEIB3;M;Y`ufy4|1KoN;z|9y%Zx9bm~Zk+@O;Jx(AotEN)xYomxnE#rU#z&KFbIM54#I8X|v z(;N;gVBqnVAQc%+-FF}f4;>JU4zT2y$f#ZkJx(C;EyROuQADDiabPU~<3N4mz+nL5 zz*ck=&Ede$47}eVRpedjz5_{k=zw5!fF;L7;$=Ox-~fTd9B4g9pol~x7cuabL#oJF>b?U>c<6v&bbuwtL`L;F(BlLW-$QI%hawWqj05Wc z7zdgg2aW&`2TnQz&kZnw=LQ&fe?qFr`_z30lJL+0!RP=>j){zF8>1d4keCPUo6}H4 zqLpzV0>C)X+Bndc4B=s@BKUEe5!@%sz&i_4MaEP29Z14M2Lz)7EIB4Js@Fh|6G;3B zvAhY2NVGK$oCm--(9Sq;6o5Fe;Yuvqj9Bh(47|S~RpdkJz5_{k=zw5!fF;L7MzyX3 z2M8p1b#K%8C?e6(I8X(EaiEiNpg#a{;NTo{)f5i!D`S?o5>iDbQ1=~3!b1lHqXR5C zCNiqeg&rqhzYEcKJgz?F4Ayr;m#R9A#dRV^Ecasu-j|Rna*Vndr{HNR7^~UjDulJB!2&c z9w%TouZJJy%27m4c~b#cXBB`_=jhf-(E@drG4MJ;sz?cS$(4eqrC_Y{WvP=gs(T<) zoT|MK+G3omSvez{3cxzgVwr5`4XbenFC&(FBLnYtNEO*mU2>)1X(<@%ISGa_kx_jQ z^f&>#Ykgd7MGsmz<{gp;0cJE%w0h^hOngKIJFkQQFnGa9wqD;T9O7;s968 z7_%QkWqg*Snlr#@axokpxCVCe>qrm82AP=7@ERjlN^56OKZuiiLggbqUw|3TU}F|{ z99(j9PT3!g>h3>1;oyO3T7pXry*Zd zv&fjpsQv(YoIq5MKnKJ`V*g8+fIS0TSU4K_s?KRXY&v>kL4B0M0kN#oV$27B!BqEv zm5j!wH0*yE!TyJVw*(UVAL_JD#nVzSI>FMg2ZqG{2btnjZGQLoUiNa;OP$%6?y6pC z7=iPD7R;_$vJ1bD!3-6&VBocd#Q8tdnY9xBS!G<+JWhyT>8N`3;ZvZRa#YO|S={0% z@Pof}tH2vrQ_lnT#7}5(U<;>LqZI6)Afvi7a>l9JPe3a_6&+Re9n*k!iGU{c7qfIG zRec|~I58q$c~;OOeB@fmKR)US5AfOfWdSdP_W{jOwK*AWk*W5zc(M6vnybR;$xjL23OI zuAt^Fu)kiY)DWavj@7yy`XP6kojugQ69CZCK7eN0r8vI$lOe5MWyU%7qu3tFp$zCm z%zwF)?aMLYbD&_AaYH(exDxht>({Z0=RRlUPsF#)*(Ap*ozNF&n$Sy5^Z@9N+>dZ9 zGB3iD8uZ3;M>FsyK&r?vrZZ0^d`e|pwOLE(&Y7rjmR0>4do zhSL8q@gXLjfJ$>jHb>P#N9c2=*oD0Y~gTPw&E4yZq>Sp$%t|Nfn}*k_>cnsHEZd_#?ijOuAX z;smhagHMSQn&FJ6C+f?6)Gplu?-#+U zhwnr1vHYVmY$h6QnNQl%&c|4lS;>U#{uj z2jpAG?KNeKX(4pG&gS)ZQ-<-EbA-q7Qf)7znPHy&7YYiRM03Ngvb$-*&rIarZ&L$OgzfoJ7~XmO{M(eNk?n^DiHfY`^bvaWDF)76Q@;Fa|mN1qdE&MjT?Y! z;^UT>g?A%&?)iqM1wj9Q#+wBMOcB}H|3KLk16$>x7BB^+-_3C6oRstd;ZxwCMEopHCm)Mc@*vM!;; z)%G`7B-x0-A}$t_iTLAveZQa#<3Q4QpHDM?ykD)tLW~Kk^v8QYP5kkG%?-v|yiskR zVxm9Za_?Poe(@w6?-OtwB^S@}WyhuuZjYPd-I)FlB5@*dHZm%Sah8Eg!$6~&!yFSC z)wO`f4M4TiP6*C&I(M|y`HTccVT{Eou=7Zql;)1L_|S!32qPK7$y=0S4h$iUEbnSW zRAeKe(^pl-(^4>c(iDbKeH~<+YL_CcWVxKsb5~jVO_oBUoVr*krl6ME47`SrD)J-K zWg$z!J49$hJolU+hw5taj`-Zw0pL>vmEVj~aQ7u-R5wS?IMu{%XlJxTIk`LR(uc9E zwE@s@)fyaeJ8T|8dMRt6ca7`d-U~+Xya5C6CP)?8LY+BN@w60-m9pfRNZkJqJx;)W z09<MRH^l?h&f?{f{3oroc1nVAO&Wlk|8YIBZXXaN z?^sg~AqLx$kErIo$krgL3t%FHnvdGw;RxVqbOzoRkSfxW=`5oXK7e?gB-}q*x`}b# z^Fb-Hm`Phz_g}G|=DjhaTENTjMK|@{!C>aSLk^RVJ$?f*^Lt!fpw!QF1)I{$!MI%z zoX`01BTMCtmYbQmVC0SA{vd-N!^#`WCT4I4l{b!L&fqzJ-gwzRanZ>;L-z;DH79RE z6{@@%kT;PoW^gB!H;EgP44&}kP39w?8T>X^-qfm8`H`)>Y57$7k*&Px#ZY^W;PHQ8 zC*q&<8E6Iq=OuNJWT~FZ!o)AW#0e(rL1J?z$}PdF=MGxb1$pwm*@K-cxl@t-PA1+x z3W-0SnTBeSuOjhzCg#mV;xEqbN{KDLU}BY_Nc`_xkU^!YO&tAXO&Wm&%ziskvzaBR zO)Hu_9D_*}OFo5{RIQj8yIvz`7oP~b0_$cRdDwBwSkq09LiIW`G%2z^s8wOY{`4qR zuU(-@P3x|`6(&*?h3a)EG^uOdl~Z97-o&kXeL<7Ga3a5kH8r`Hg9BR;c1t` zFvIFr%CgLGsNU9`j%Z4A>wEM!=QhXc(2&L?Ufz|VUHzT`h(pgGN?~{X(P6@&Afb#+ ztiLKucs4m9sW0na7n;2C&n9NBssD6n_jX_>y-+dR)c+zh`7p)AI2lJHrAhf;1gVmj z2a&0xLtUC=u+=BykQcHBd!@ci;sTI2#Ci`wC$ujpM%r37BeWQ9-IkwfK~GiLrqE)f z)eTcuavAhOmEAxKepoJVv{g94aMZ6wl|30IPPA5T$JSI_FvnY;kD16%%jHeAHrGte z*~jV>B+jw=FHFr@R)dNBxLh9YJjGnkV>_&~LzuY4x_1S*lT>HfNG9_0a(TTIm)0S4Uob%7IIFhloqdzME!L+PrDPLT)_|$}dR^W&YfYC*rJuw^eoZZZ zxRrHArL1koGqnzGU(LJBYO*d&Rb^*0VIu7Fc3O|1NOPaM8Md{JUw?v1nxqQY}m^ z_l6eT?B6gERrVuk-Y9!7v>j|`&P%loCk9n!b@eO7vfQus|C*_?dVxj$>GodC>B*HQ z5vMoJ8c)JVy=^tYdKC~y+E#lCQ~AJ3{;$8!Pc6eVZChZF_mQ<0G)=CB7RgP!KeYYU zdIUq9Y@5`yw?i{+Z}`Uv$Ke%CdX<-E|5%V(P*T$x(u|+P%geSu;I_-3++{hduqzu9 z+U41~IBJvq5;N1(HKADzJG0)um?gKDPdJ+T>)T)M`iBfjjea$>?Qge_|BJ0Ev%3dH zo@{R)_77%B&8i>TmfIsSQ?c18U0~=tm}Xyd1sH1=ock|Dsux9zhM~*w>x< zZ#5)!{>U)H4*Luo3jad@sfHO;+4-UE<@OJg|IIdO814!)Txs(I&&h=g6GfQzej3{D zwX?9{`)AuE&l5d^re14ba^C-yL6!9gZ1dOHKVc^S=faabUl?S_yT^VvxL|(zkkAaDy{hNUj8=QF2pcbtlMS>EWJXZ+Ag6jKf{?n**crLKdZ1iRoTTv zoT^x9)1CcTa@fvr2XH$RZ`+Lt=>%sX&QDVkk1>(o_RXv2ys;0z3t>45bNFwL*6*-G)r`m>7vMM_%G^^PFw1}3?tnQW*{pIqz6fmdnmY>y{EMwB%j)CTod3E# z8>d0ZMJ72|Mzd>heC4%uj$M{&mgL}sz%2hOI~SYL*D+j(|@#8Ww(cB zJ)D+Bsb)zIzD~23&V++~oT=?o&5|6{n5o4q|G)O?R;gx{9c&ob<_&WC+y7##%7%ny zL!93?rxQu46kA{Qg&gsii&5|747ntRzJDnD#npJl2nZP!0jMH(|zu2m>p8~V| zJm?GoCKb2ef_nOs_`ZSopAKFqbqc@JBxy*QY|XV z729^k*Gru1r~O}cruiz)<0z^hYt8GUlu`X6>WUkHYE<*GQcPr2f5$`uS-cj+%<{XP zlk|H?$>HVbu#$x}DBt2-S~3uO7(9gE2wCF13Ki3o_~8Tq?nQxakH-+T{}dP33l0>0 zKM-#rdHPzM01&k-RkX~uRKYXTHUx-ObZ1T2JbU%r0I`dvy$+jW&tfGvxpdLkn5_z) zYuq6~(u!tJMXu-D;|iLw$toK08FIbwG8{2T@k!%n&Qt|2-Bdq7x|F~$aWRwG5#e>UbEKlV-ht0J|>Fojn|3O+lKh9BAKr}5T! zmN6cCg=!tilG^9ew%$Pu>vylN$Cn)$bvH@NYVT)+k8&6M_zODIoFYq_DW~?6G~lD$ z1;2K{b?yH(_>cx$IEKf|FHounNMV`01Fc8mfNkr*aNom0nXFYhw-$!pcbG&_CtFpq z<1VOYU2_eugSF{E%hnvsCe|-warqw|68!i+*lM>C3C*pE*UHs286~OH24ASz>2|VJYVayPM?YRKNhjXAZuzBrMmf0 z3_Fs7ldTgP<1Q0jc^{XK@RK@(K39ZYS?VOe3lcS1#zy_>?u^}3%nTRhmT zv<{A`Y_k=Hs+YWcUTN5@w!Xy#7t~o{wzL;^g zi2tnW5`=Lk#@9jMDHE#OaA4q36R2JK4pEAp=z?dhzR&V-c+00hX7=hhNDJPz)~yV0 z>gk2=%=&}%fi-Hi^aG2qypti-kOJzMa|=G=C?};1Z5pI}j;q0vfS;Zo*oO+fwlFlo zJ{CS<#}m_ch_~#hVKb2P)-G_du=Vgcm(dg!!_EO(w>#e3Ryb_<)>Q#|3DCuO(q9)Y z7~Y~|fZhyrEw`3ikmTz7NgYxDhVO7qb z)NQ<|aVQ=cnSrh?{L`t5L$2^|X6EWQXcuC~f0CHaVFwoCwq+E6`6K6hWGl4%=_al_ zBPv9nnTto`kp(@$axCvSq>7X?ozlO&2zEhIC4P1;<izJ3G~qy8=M z{JC>LA{?XeBa4BT3#lSmD9U14sd!hx3eg3|8kK$w%e$t-u&}+=de?Z=(#Ogw^fm<>F9Np9*07j0VJ69DR zTh|pY;g>Q-j$b%Q6+TyORsb}=cPX+wzY^Z~7Sm>{!WVYoX!YZB7NJXD9EHiu0L?G$ zha4~Qiz&Xv8Iz`{!q;|B#_s^8k_n6EtHRgoz+E5Uk3xlS9D<_;$XJLuFs&hf8m>1M zc?y5}v0NqwyWW#AM1M9>ZP)8WV*N549f_I2uJ;xW^TJ;_iD6@5*ZYV^!hcLO%kJ9= zCl-a7mYHO#+I^RS`Gv(6ry;v$HM?JY58^egS1@tji)yg>P3!w-3t+XZ0r0}ES#0+m ziy(52w?7sPIZ9R*JtzC1X-S;;TKF|*qM8MqEnh-k6n^&!_KlW1iXG^Mvy|%9o)-6{ z!y;kvrbgUZWo+(4QP>19`49HO3068br9rZ4vxF&+fW(Cjty^$Rary~TWd>Bew$fx@ zO_(&dW`l@9vMRepYQ^GFIMAwbiBfDBK2t#FRN3=k;we_68bPA*iiWD}M_TZ?*uqn- zOzWR4@=gsb##`f7{jY^51+^`s*-I>FnzbG71dTV<3}b4~y*L(US|f1ClQf~1i^IgZ z*3R}pqVbXofGXQYi=*H{;S%dU>_bzs-xVeDG_5|gvPK#SR!M+#S4pEvR6T{HKU z{lv8AuYhOktOH=1oC^2@C#Oqg@=cuuJ(2r->rxzz#=`XQK z)+u>Fw^}=A;`uiYg|TVfi&4CSg*Wnn42(OTZXJhGLVjEx9)1~vFFmq(&{qKTupn+pI8 zkcMjm(D6JP%8VP8$0~01g2ZD4gpJBYH>N40x+P(%anc~pBQ4HjEY71Vi(WF1Y#<{n z3usJFm9n5l@g`kL-oG0aII8*Lub9ZF-bzCQP_vVlT`$ z0ph}fRon}a>Wv@k6hd}!m5zX#B(4o1U0jSltKM`dj#EElT5%DfW_vIf_)u2ypeJlq zy?LMAAyiyE>{3{@IJh%}x)!%O7f{QSoe)}8bSem1z11`j&6H&q)y8|Rs<-~ET7c-H zu2?pzw|Qq=fTU&Yhlkbc@&$?+*KUS+!`&!T--Pzc=yq(2mliT&xoJJgiLV)i8dI% zB^KN%y2WbU5>s%|9hQZux*KpD3Hp8(&rOswRjJ+taTg^6ZwRD{yvTGZAQk_lGOpTW zGuvt`fklU`by%3VOS19sDtg8IZXp*RZ0qN@@^NQnA0ZCT84XaW=&kC?9-Ob zny8%9mQ9?6Q#yS&Y^CiFVQ<7z(DsiRcwa)Q$T8|tatfZ7g3+(hFpP=B^MBCe1QLmH z_>kF~^sA|RdXuqAy?{Ab7d3awdHqh6^JuWjt6RCnIyoM*AfXcedlCRH4f^<*j zLcGm~5zD=Yf%hP!itM2-IaBbo6pVEZh9O>N0*Q;ika4PsshHq?+@Vx)am32$jMse? zish zw|xIF6kq;CN0eM1!%<+DZ|}xw>GT(2`(;hqu5m{1?oQhw+h|+X54I|C{{*~%BL`~9 zCTG+Gm_JG`bl$3=6miQM^BU&Xk}XdEq5ekHQe)aL0kqW_w>yMJHNbROa*^{QrXG`T zRD;`qY;%SbhsZ;iK1wcjX0-{BF}Dr^vfcTjSy<4R<0!P`5+^#M0;-7}O39_p``Bp6 zRu~>k#%`qKG6$1$2(`i@S#r5k16MkHt5L04;ZEnST0w=QYT$q<+2y$VLZlwnosuh^ zDVK)GxhSFJDyR0@xCL6eVASkhKz2LBx`Z}=RRwaj)A))IS&JSn+3QR{BScQB1LPWK zd4&x+U6t&2Uck8cos_s7$hA)Y9wEXVYsq!a_FY(Sq;`D~1J3Iw3{mPS!QAH1L5jH&K>^v(#3>%I*uj~v8vJD%a zcbaq!AT>tV@PhNnnhHqR@S-yt^J_p5VZ%#K*A5|M*zk&TDmGBQQ^JN)-aVCN$J|b-R)alnEM9?{^HZSHfSe zjH|KMESyM}9CD8L_fHLgj9;os9&^@T>mviL`^LfDXPm=WBPUAkZ z9~>xo+xdMSCy=nF zDfLnl)Lrt6&&^+*n%4!LWoD|soHJv=m`4mZ|8~aA4Mx*(sKsg&L^Cq#ss zc%IP<5W`JdA4Ojqiuv43)5SRA1J(&QtLVS5W(JUO6Px$43P`w#SIbmPafX}eI*POA zWNv2Y2P@_r;bx}ZmK)j#H?#Dq1*zQ3*3Vd zpD^9$W->mvG9GaAzs|!;{a04|-2B6N84SA2K|ww@weH$CM1-53F2^M9+Xy$S>K1cD zM7Wu&J7C)IZG@ZE^h>9Qh;TDsmoD%TaFZ>JiHzzTG$&3Vv1^7>7lR5`Npo#h(H2_e z2c2cO*-m#V3~1nUv%MzeeM%W_cF=o@gM5aY9rf^vMMSvSNpHa_Wd_1+o%anyZ(DehzK`#=xb|-h;Z`~J#JeH zHxFR6^jVl)g`1->rEt{1%`ObQUXXbI3DbQJCgayt#shB7*4gR!S(8Qh+?=cLN5>1| zb90$qdU=QlH<#80#M_vbAK3@BWRFkLt99DRL7y3lUav2Qg&F!HL(v=b7uXmWsEV0B zZ`9}R5AvDm^Cn$)P>2XcZ`M=y28f~PEjm3TD9B&h59sf4%=k<*+s?c6rzI7TQ1ouS zyIKV#6un1xSrI~pqW9?+Is_G(laTxMsTCvFqEBf)l;k5q(W81((-0AgKBFJU)acs?MW5AcDmJ}B(PR1p9LJBNfAMk? zl5PYBP0M>rIDPKKF~?B@ML%TVeGaK2ZK?YdO~(6I#siA()BUn>f(my6ie9TnpxJ`> z6unKaz)|NTLeV?)QyW4=D0)aA-xMN3(MR=YT*C5m2}K{*U%Me96g{k~T|2fZ}qj9s#3W5oo5w^A~+iMu-SEf7MGbNaf~#@SVTVM!0FaZL5Tc zaMN*nT^%CAP3>M#VI$o1+%6SeBHWC)KQ#<<2{+T+p+i!*`4dJmEU_ zftGOdcYVf`&_=lVr*3&=hzK|T*6+3r5#gqCpWN&t;3Hdz54b_%EoEph3Na8V2&YS;L);6S-t=7P+qv4-w&Jv0D%8 zv9U4SEOGyajVZ|IW?gqkS^)V=dp-B=J{6E~v%Y)V=n6=<*}&ZmBBpS&k$Z8Qph7cm zHg;cgLPWUP#BFnahzK{Ex_dB4$@6A2H-Xa>zj4CN4sHu{u8#;eJGxhb(LN&F?Bp)4 zun}%{aUaG&`ZmJNu5RD(a2+Mw?B;H>QnX53}YkZ477xs zt=&T>hKO*p%pHjX(6?7bKTNo1=)pgLEIDy1%OYsJ#o$#-uzt7D9?wO|r z-DkKt)V*z4Fy{W6KFqzae*pPw`fzte#S|s;X1V(}=52oR1sBVz@cd?TFo5 z3OC2NADkONJ~zj@`$8-K!s0l0NVpePV}zUI-8SpPjAq`P;MT&#;JYC6=0x`rbexX} zHz&Cn*va{baC5TzdyiCZPH{I?EDFNS`EHepSyH&Uz&)*QSdMUWp*y3(M!31y-EmQ9 zBivl#PC!rkwF@_wx}})elh*Wx7%lzt5)2a8^c&D1jvBamHv{h=q>99;``k>%iz?#* zH&1r?+Wa-h8*uX!_xr6r;&byf_o7-MBHSG1{=P3ngqzdd^pPPV+??soz}zY&5441v zv)wsaAtKzI>-Id$N5D7IzRw=50WZt~Y-94lN5^i4Z=ARithMPOxDd8gEU-Whtpi`2$d8PYm#}E;2UgfrE zlFH59t~DpL5pLe--hXz82sdwXH}wt?;pWY*S8>`T+`QGTd0}WH+`P>_f>k1!o432C zU6R7hCox)j3z{a}{BtN?o`pUGH-|9r__{Y0xsK^RHm*P!kEaY9)sq@2_!zpK#h}m^8ufm2i=aXg3dDBe9Uc}5sbM%Z$9o$?+`#fH=l4z z(N4dUW!^mOjvW~y!p$e$tvDcj-pda%N8E-WPYO4Wxp#(pS%2Pq&b^JDj$3LD|(r|wFu34UF|&ClF^6(!5O`MLYqooHbaFZ>JiNyQQ;c%Ql zV(lt?))f-_QxLN2O!@BF2BiyX+ z@qO_=qVQKzfwu)x zMc!w+KW`@EKUKy9ZvN)JgCi5B30~%!5D{*k=zW4l`ZmJNJa0}=4!Fq{;??+&QN05m#i^!WfgOg9B=E>tp=e9*YOD`t=)0Juy_L5bgJ__HIbCn<{k1E|XO{LhUZdg=5sH?{ z8%oWX8H%>`T46(N3i2u1+4~5~pU*V2w0H5=HLieU`t0i6)4l={igxqvof|@iqCLDn zaQyouk!@#B?{XY(J|YzDqC>shwxNws zbeQ);mk?3-D=GI@Vy*OR7mAMXZm&2Y6N--Xp1_KdwC%hagQjO-jD@0$Ftc#fK+(nw zyq1tEvWDqCMU(LzmGOY0O+DQiw`@7c=2Nt}cQXc65TBy$y<|%duJoFKQ^`yFDzBhZXd~Rb!29Hq5D{)}^vY+4h;Vb0*9>m^b%8*t zWV2U&ScnKWw|KK~;QKbh&8^-aqf@xq8Kb2m7%1W96U9n#)WFTB7 zEh^&yH>Y~7v5vgSWS^VUz0&*Zisw5pFK>KEmQEx%_SC8t=}5AtKy7*ZXBz zhzK{=d-cEsKbLUxd~fd+J_2sCg)xy){R%va6G-2I=`$^on0X$)0*~IeO0MuJy3^~3 zor38zL(#pS3Taf$Q1lva*tmcVo}uVIZyB8T`&uZv-|K}PhK~qEul1%}86bwD*Llxj z#qy`mamROK7;o{qVOcTIn&ZchkCWfoZ}pa*5}@9|bRp^XsrQE%<3AtFS5 z%zJ-QhzL<1_a3aU0h?6GVeiMV8%7CHpY*184|54ok9aX$jY^tCc_~BRwjM*pbN4aV z;Bi`v9f&%gfyawMDsqJBK2ekLw<_ZSQLpkQ!MQao!YAq;uORLtK2dM*o`bt$BNaRks3P#ZkBxJ6ZLcNipzsOGerH)djZ)Db6Ojse(z1)7eJYYs6Tk`O$qXu zb^b^10o0UC)StY}@NC%-^=I$bi-Uq}L)72B-Z+v>b)fsp-Ays4n(|xKYCR`i*z)NFVX3 z`m47Klb6`|RQ=66GAKlZs*y+`y4bf7s#b|KjD?6$H5T~`^R90rR85Z@F7**ml`X^z zy&uT_Y!8 zm*fwPOs3r;*Nq4fnM}J!%I5}%;b@Nt-(G8|=X11gwu&E zBjYelnCz;n;pl(}Ke=nLo;il2gCcj#4=Og(>B*5FriF-1r>8_NpBf@Eoequsf~y?K z)9LU?W6T-J932;#yfj3FqvIpp(X+`MJtJ~)g^h4@V&wgb$x}EwDKe;Dm`gZ1C9&k*;XAj|fM{L|QEN5%7{N z#EsdIQT;4Dic?LmcL16`;~~r-pSHngmFjkS18MeloUv?Jg)Kqp0cS`i?ohv*cPiO< zAa)~T_t2gXjy8v#^jHrlPXR=aJ;%U%1yV)&GMxpb;`Pr6@S2T+439BG{S{0&9~nv? z@)P_=f9hJhFin>}b~&sTg=pW?<=+erS1M7W#0iFRnfgabMMV=*j+X;U?2q(5<&~T1q7t` z7LcZhbOZvaR8a_BQIx1CDkw-%EQpHbLlF>ruh`HJ1q)UzDE8m`p1HfZ8}R!-|9zf& z=FEG}oH^6y)(v2N3$NM)_FVp{y?i+~tD}55_N;C|&$|ozsc^&PT4i-%Ug25Sg6%4H zAIGaxS>5uGU-+ucV7qU)8SKfXNY-O476@k;R&A-E<()0XBBCO4u^ZFAmY~YddrX>c zMsQQyxK5Qijc$$TWc76u$0+rqp(*>RG~zyFJV4X6Gia)uPpEYDE?oW2yQ`DykL%75 zTFJ52Mid6!(J@wGvM6Ln6(*gGl*qNPSQL6j74Avu8f$@m46q=IT_WMKetMske=12 z7PBqJ%eC2a^o%MR98oIoJZg;YW~uCDI=M)%qV?k8 zs(1DJG7!2YWPbAzVATs{u_BFjm7aV0v?Q6mP0Wp6#st?K19G8gBG4G84ofU z4~k^m8WPFaw^b{uA%h7Fe3yVK{{Zq#8jIskS3MXr{!KC_4LGxqC`8tJ8(d>pcIr>F z>uf}cr?E{~;(KYBC7ywbpc*pxfPwD_sPaEeo=IbIyg}x{m{}mGw|`DHs$Y3o=Icz_!x{Ce=Ql42Apw76e4Rq z3of{U86PkiABbdp8x6C>gJGO%$bi@0weL+(oEVX3(pWq`24iNEp%@g37kj~n2n@)? zD!%Z1n3(n_4IM&9YPbh48TZ3JRjVm!xCDj&Ai{?LmTGPTT!Fhi$;qR*$r_}&J{2y= z=!oly6J@Qkhf_BBK7K=BKd771#}|TCPBDeQ--d)`dy$Z!b`$1YO&PyH*Kp%tXmGZT z$a?OitQ(r3;ZsN8s!UO?&^L7(Ex$;Ojw_&1a1J_~nInu#IiFMZ2->ybq?@Y9>RG4= zJ$w2T)o|5nXvlWO^{9dI=B^*$sqsc?M_viU#Z7L!*jm$3y)D599agHvP0^rVv72l# zvAO)=9rk7oYdwvgy^ZyR-fTAvy@u#^GtoMB*73(NnINs~+#265J2!sPzwsuSd~0-r z_GX!U!&d>lgR{D`4+*4${PqGSmOBu^{+)sEIZ)+)mvUN;#T%W7;EnHzB;Z=18dZbi zlA!UNeD>i;Ee8|nq%}SQUoZeKZ_yY*n{dm?=m?T?2O}9=fjxi zS-iM=&?mHyym`r;e)?p`)h8Zj`6j_J>-dNNGlA^k`gDjUIAV4C-wD{Fst^B6&gAfu z<^S`4<{+D+KD?G=5`1Uf{Kx-HAp5O8FGmxcvR?i9eTpz^3W`DT^~s&{;vz4IuKF0uoj5Jfb{{ux9RQp%i0!=5KeoC+Rc)!F=-yv02|dgmZ(w z(tShhDDMZn2i0WZQ4>A~8^aO)^RmgEp#e68e=}{czY81DH z!Vny@AY6o_=mO50BUQ5|EZWXss4DbrG#Z(Zj`wKfi}T%qT!6!M zzOap}y%yNV9_^8${VemH4rI12c)F27jA=yQpJx!eF)egP`!xi7Z5Lg4e)eu;{i=0Tt>KL8E65b z%(7?=B09hHCIls0K;{6PPu<;!l$7R)RWuwFes$dbwgBT)4!Wer7x?cfZ<67&cVFS*(`7ti7 zvYeK^MBV8R;^QF;30THK;f;gBs=_(A#KS6Iiy~I5;jQwTkg&?{hU8&ZKx~yqVYkY2 zq0TCQ4XTH!ZmPUHU{?7NKwlEBtn#lBWtOK^`AG;)QP*4L1*>6+mqk1sNEL1a$RZ@d zPMUFlF`^i$bN<+bexQof-7VdGoP3&(7oNzEu&LUkls%?DjnQu_{I{ z7>%S|apHC9C)m1Ych;NHcNzm@M|lP2zQkd?9#+{=4gq{0hu7;8e!+;^Cn%_cNNGcm zk~SW==sZN=F!FdFd9X3!;BF@zrR@F18-cPRh$a$^ZHOrBHpFhIvmr8}+LY?j5G8Dc zmWXyBB#mG?eow?F;yA4p1_K;QWp69g?YQ1{Efv2C!Z!LCvfpr= z)<$0d{0fJ+OwvZw*05HkjUsSm8!0LKoJX+R;6W6U{ z$EVX$@hT8Hz6to_I8JkX2f%xAoaQ*S4^j}@xgu~?#{&+R?4VFw|3tPS1CX6F6ni6H z**XD(3AL*<$EeH3jVn~y_i*bIE!Dk|A=7-TQll|sE+02;lFEL7yDGclp2e5GSRGd@ z9^@QZJY);LeZm})9n}s;(HL&UMyldP5U_)H2G|ovl@1<--41>W)Ju?*s^?REAtI$K zK-8l7#)XM0`(fGV=P#TLjn{B29ye~L%6{zDawM*RF7cO``c_0r9`PVW`w`JYi(W)v zRrD=-m(gLR#}JhM08&y7x2y}1bRm=1K%}$|NC^iW;Zhzl=-?54#Zyo>Y~3#*uxp*6 zb$@{1XQuKDwc_`XijKx1#T*>Q(bmW*f)sT|#ID%1xTudXk1Z}54hFtXKu}r;BEBXe zbp|cO`bs#NaKzVz4yQAu78e}_gQhuwp!j=a!lwBehE6e)*rp-;Jz-DN zXyoVM@H9;)m}1kc1H6kO**bf6M7IIljKf=@3!ec{4V7Y=W`lh<{8{N*dIhpCahzu9 z5Wx3wcrBT|6~Ge|#5N6$5cV`p!QaS)XZU8UdWZiJ?+83%QPCZNN4z8Oh$ScSl_RiV z2At<@8e>wjnr*xO#SkxDSrX^m1wxg-wR4;3Fis^Gr^c$xWfce;{YJ z<*>EWWceJTI=|=*2~@#^dvJn%CJXbHVbU|jo^OiX9jcWMd5V30jG$_?j;5_S;Cn`(3BC)l#{WRrm|!%r+6(bv9W( zi71NwyaZ~_+@09;;x18FNXyST^RWJkS7GdmyWC;@b!2;#kLwTXquZksW_z^7-5&iQ z+oQsJ&Gu+1%&)@{8EM5EAz%Y<0JsH5m6AqbQ_|x9K%FxPRUf2!!qW;0$vULc3!5;?k{PN*@4`O~)%R z@By=rom&XMK{&GMK#wV2iQ3^zG8`Ee@u)hJj0HHJ-t2~!dlFv!2U5}15(vJdP^QDD z>41wAy(+$~UtIK_Fj%ra69(S?2&VKO5b<^qQd~tFvECA1N;u-}!un|VSvXc`IXBcg z>3$TT5A3i2%^>NA8YpBE_?<+HB^n;eNr{+tazns>lH}9#BrLfLjd2$;k9Mf zKY%AFi0wW!LfF%N%+_Qit_bm#d?tLjx9-0*QDga#pQnj(qfM0jfN7!&kbV{pZxd~U zj7>!R6lKyx%rSx#jYmY9Xa*Qg9`gi16D|8JPq_AtgwM{P|U74POH>r09)elR_ekL0B*+NHc%VAl^!(!p{=oy%*Sz>t*HQ~ zf6n+Ew4jjAS;YT>I&OU@F7QMX)aF(y;tlW)_EKD4M__FMO=`lUDJaCoo z4(XoJ{?Z#)+c~6bWI3t<4sU;X2Qu~-;xAJs{e}5OkfODS$eG41VAx;o6aZ%$yTRy@ zr3VlcKM6zZFKu9?8x6(w7sBlcd-_X%#0TN<^p_w^v5ijxPDDXZYvaEm&=7drcwr8J z={Vf}GDyEok4Cw+nnKbS$7#0O0qlUoYfJhIweu;6?Jp77+h1NoCcNEqdVl%L+h6{& zsOa{Wzr6kBFH7#|RQ8uSWsl%`Ga9=b9{gGFUmE)&&3ijK(%568jotcT)7TFo^>ZwP zXa0T)GB!5xVX$l(oB2hMqRSDH#$E-6jeUavXza~kaPG1bLGe8>#KwLbhCX2?v5igm zJ;I*G{tEGLad;a06s)kZ=fIV?e>3Z`GaN*p}_NcwyO8bQ{~UJjr zY7vdCa&S+jewD@^Ij_+Jxb{7tHyiXQbCS9svQVcWC9igMMals}AbKB+W0)mSab1z-)6*)B`y5;XougU#R>dfHPMjMVCJWah z$?G^)=v(=m*8^y;Gj;K8Tsa3L3> zbq%UEEj=vbLuz~|P3OBCvt?TT#GxY5b$EHy;jXZ-42SFRDp4%%h&-4Nr4w+JErzB7XJkS@0xr9@Hh_7tt%U5 zGjW_&f)Kz295E%B^BO$jQ-56{*^eXUR@AUn_{cJb+U=Up`dM>TaXHkPWC&Cz(b)Tl zlpZDd4n!5-4Ehfa3TNObs`j{yzml2=%K_ZYROcX4+K{9zNp}!w6e=vEf|(*!!S68j zXE;*7jOkflmunRqzz2b6jlG6!t3>1+S}_Lg!Cd&*jcJd`s3NTj@&WQeI!_}l(X@i6 zA@5#dvaOLR?a!V!_D<>rid0-q{E{jhFUG^$cRqpr}q`rxj?4pToBq2l$( zipBp3>Yw3=6n~*YTBcv6oAJioPB+Eq;xCbcnNXn*j?!_66io-gI#W6qq122Gk&j|i zGsSfwSdN29E+T#nBBkr8&i0AIRoch&@+n9_XHM%Qg#b%vEw-04BR*mnQ-Lio3F8q$ z_6)bql1!ZyY=!!sgorw0dKT*`c*zd%D#TY6Lsx;!Ik;CTJ~_G;dA4qRdhN22vY(Jf zGLyk%M%hd{zt}-y*7bcz{4kDaUBB*HbL;v*w5~@Y1$zh;PT~01en^G4sNmN2wMfWH zV4~{qvr278;WO5DG7_+Gr`2`_z${vet?i@8j8Em8+Lp%=X8Ev>%x)rA?h9K#i7Ot^ z>58Q5aA0Tr3ZmEW8q@;Jtu;?sLH^ z7x&I^=n+?F78@d#8+YTb)YbQa*@wrAvwZpq_xa@U(7nd1?=$-O(C1eaS#t^<-X$2dJ;ETnBFO)5k5)g9Mg&_csA`_2ELC#mH#U8 z)UJZxRuxyB^dNUo{{zVN zFp8G_vu@))aJ?VJN^fea?qNqnrs~{<|L4fUpUW2{vQNru2=1!$OJvnqtzX-ZKSzV9 zdz#?N6Be*}D*F$21s=Fc|Ayz)vi~$+->>MqN{_&P$G9*8*g0?yf_Vnd%0I2 z{SwD%BkK^r_i=bfmh7jfeS(76ZEXbh?57Io8UOjmi~#d|Ou;n(`DZ@{WK1v77jMPG zHVdT&R_HpoV3K~BS?@#q2N~IzU9I1uF54^XXal$BW};w&rMc#@wX%*%W98#!_9R5| z3y}>@bFbFnry@x|{@Z=kAs@*Wd6ItYP5SYjvb_tTm+Uzh=_Q3$A7su4*vgTvZF5gA zDYPnk2{vDa7JDMHHoc_C;=^%nFDbU%jrM9?9j2dzspZY0y=0DM_Gvi(l3p^`lK*I^ zK(CQrGS8LwEq)S3VmG0I{W#oi@(y6SOz0rtrx8)b-vMUt`5sU$WEazW<^rG(r}v)X z9!Sl8vJK*=n6B!ce<#2PnAS4`FFJu0&Fyc?tk+?p_$t@VM^HU=COe-4JYL0)*}nr+ zsOu{IjYbH2`x|o#R!7ClZQ8&pHbSKHBs?AI0e>uZTd^yW&yrR&o#&5e4=7Vve@KFS z%o}GTWr$trYCSw^>J zCSs*&coz$EDMxU_9b{GER;Ydgdz(;6e@I0Y{fMX@RrD8w{1Upe7lOBN6fsL&`KioQ zZXG`h(aSg@`Ir4hH7UYGPZ1_o7GWY^EP%uIvnWD!kmWiR6i5dmJq;mfIm*-O&oV-x=+V_divM5QssFI)2*tVo^q@ziOb$~x`Cw?t5bH$kyYr7##)LRYp!u$xYvmR;GW)Dlk*c|1K->FFW9 z@B>dz+Y%OLy@ZDZkbFNZziYC7jMnmt4l)=fTgqo4c!yb^mcH(Y9e7N%?(T<37wiHJ zFPe%c8Jc&2-Ef-J z@XbRl)nJCa?Q-lMtr`@_tA=-Dqt{?2w@=|uRsx;11t#kHYQfF$1v{}DF5FGvs(A#K z^n!BHGX!q&6L{F|%#n3GGOWH5nO@qc|y`*s3=_a8v7)!~)+Ja5zfgu?5(E7h#=g(6*s zeiD9ti>1!$BC;Lhl}di^!zP#(^3uT0u`Y)bx!fQo&$X^Wnz{=YAd9-=F9ltzZ;eNQ z@IHptTD^~{_dzV%Wbzzs=BrKVOhR_!~p`6%0_YR@Y$&yg5VQ z-CX>9hVXX^L-;$7VdizZS}wxt^jfyWb$W{l9x=fSCOB+@-x*x5FKLe;9-qef2Q{m% z)33Falt)akmeRF)!T7PvC8zQk36ErbF7ZVIKK>-scj(gSov5Ne89PKP33|EIraBR2)Cr#iRA+cH}XlQ~C zCg^X1F(#O4g3C>CjR|fy!7dXVFu|K9IBJ5QO%R8n2`7?G(7*)kP0-H-8%^*!gSC3v zCU-&fwg{=XECtZo>`!czI4u6mC5r@AS z1ADS2*epJr6aJwNuw9FZZY=@ZP0-|Gu-%2-b|ctclKlhg!S>;^oMHascU)h|;x`}I zexmzn0@%URUdJ-=G6 zQ0m3PDP9PVJ24?0b2}gYr3nE3e-#wp{|60`4QFgd_CuuvlkNgLj3=Gp(#BxVm%>bK z0(Q8t`!|9eDeV1h&kLmGf|#b_in_jm0&E3gv^;K#{Rvt%ZaNWDu9k`_wHAS}T)PpX z0DBnt_JgY0>p+{0Ygq+Gxhf%)iwPU!kaA_9EHoPw8gQNkA0iMgScB|KP0Qfwb=(~3 zF57WF8@Esz^vWWzmr3J?FzVwLOS!&fCn}ewo0koCndo-Mm58|Iq8sc7c9o!eX?Kle z5q}}rYoza0v;tcpXl5>Me73&uO;ka%x3Gmow4U9_POJ;KF*W#R=w0;@%QZ2_e(Mgz znm_@vcsm6-*!(&mVj(->3dEY3Sfb6Z{@cw}b;@emZ=k{K7DiUvJ~jxkme*jlwX)M~ zJTIc`Rz@=uJ*<_YOSR(R5?g|cztFsS=_eG=o3H1PwTEgNDe4+bltL-H(B_`o4_^3J`VduJ$#n0e3UC#3>FzGC1z0jg@h1KMm{yDBhztAywq z%>;!8oL|6)2!uy=MRsGEU3fiaGP~fcci_+qAdF_(lk6=$0Z)!J;7eFc>?y{*czbyb z#HO0&4B2BaPuQ23Sfbs4rJiPDHSN)uXzl4HU2Xe=I*83Mv2-**o?^DOwt%pZ%pQe& zje+kSP*r;mDD`4t6tWUxA!#Nk6yLu9A0iNLfZ5nC`x>k@_7L`mh{oH+whx2IE-_vx zI}tO7Ei(tc00f`fD<-IwhXnMA36c3E2EOT_s`g+|>cztFsS=`3G=qOW1`RkxND?9& z{;&+$&6k<e_G_o^!0c)*!t{1b??Fu*LCa81kL?p7P?G8 zuf;eIKi>*l?C!r}4}OF8w*y~#7+Gl@bhrb*K@Y&P)1=H`xr2uy^1kMdJ-0&^_)j!b z*6jzMaN!iq=pBKs;^HqvhOs)`)0Mov)2p2W}N#js`EAwM$22)krl1wIYcnh zv%W@2s8VY_2rF!vW)Qg3idLhjGOvrkQ&iphRbVvive$Wuv@SAX> zRZC&hu@;@(U>y5*pM_u>{y{cW4Al<2?-}NB>wGM>Q_=Lvx%N+r`Gq<`)mrj|b5}KG^zF2^u0B9!00xJ_^=q{61dm5T{xhr&@C@L*=_p zwJ}jA>(Y@*F-0v0Dd-eaBKH;yeCdgIErBmmbXnfZA9ZE4pt(!sU6jLJiXBhZi0#!|Rfl@CPZt8{T6wL&M z2Ans*hX{nHTnR7g4tWji4`}bitP9EhS`%!x?99IF0Jfg2>32*An|3;!lte*xIi zmpCvF4FOv&6G`(c!7h<0;~vbgiSj6Xc+GsUSIZ{-Ld+?NYh;l%-9Z<1AO7G{LRn`JY7TYs<{*xT!#fO|UpKsDUGY{8vbxH_C_-CDL` ziA?RkkD75T)Qikhj-1 z4(39dW_N3a(x$tUkNtTU#OfGt9OpQ5etd;SX_}42<6|(o)0~+x58S|2H#mFk=_da*>6uk>{$~_w8vK<_MC~;v`aT5_PmMJwvS$f z*b63>Za<3+0sg8C9$49#_MRDty=-Fj?EPqb=M@ucXg}Q;u~$v3iG6=QVy~OJYGFS# z8L>A_UA3`K4npj0Q-=0-(N&1OV`81c-Ok3@P7k)Yy&ETr&LQq4tn9A#jOvJezzM|4 z?rC3znZ@}~Zh~d^w!5Suc6g`A`XqeZ0n_CR|E+Rgd;O-Vf58IDl8S_&q=PZ`m1EDTPdL6v_ddA3k2 z9v_3TIeDcrAdMPuu0f&@+t*y@sJ`bpT>bP_e+aPUua3_EAeQ(fV$o5J&bo;W=f~Uw zKdaY4&y9~uq(jT#hK&3K*f+U+2RKAFiPPF{^xb=%u&%L>oj5^LfL>fh?^L=|DVF8K6%V4A?y>)x)a=xe)H5ljyHpo3OkRa}z@g(op#kSX zARz+yM?0G^X~21bFj?z7R9F+#Uc7I({nS>N8WEW+n_$iK$+Z=JcQhG#(rmjE@XRA4 zI<6-JUw=^LZ$_SmV)6JGj9I^mtb;;vYK%l70@kD8N@UGwVb+Y6EEm^|YiXEGa0;cM z8Zy|+z;_T-`R^ppq_KE>491K{KoK7R0!8^jLuAuM^_}#3h8PRbsGVr|)s?zT!k5a_K zb-WPEz7J|4P6lWNlpU=A8gLE~CTm?1k9*`;R1*EO?13RvZeb}9w1T}8Vt)v|k!L2cczg_|)H%#q#tZzU zUqRu_8!-v%;zSHx=B8ZhSxD-g| zuduop9VeqF%*3DP8yi95GZtf&itn-x>zL6=%-Dg7kMH`<)CiK9v7i`8x2-KBNY{)% zCIadH2=?G6Re9!6tRV3{9xIC=N@qStsORpeA!TL$TnMOF`iQ8OlNm<+#P=R~Z4`>n zyfqt8pXMo1C^0h?6(8TX2n}U2RGFCrFc9MVrM8JeT{G^(j33|s>s1kGSH>xHy!Zhf zqdxS{T*68jI2>6ROODQH)f~`}ug{7=I^*2Sf#hEiHDqP%o(p8?t~(<-PDV2pZ+NRA z5kzNL*;_)#UhUu-)+l)gN?l@I<8hSgfs}K%4 z_ko7E-3dDUe0XRXEaSg?P!Rl=4`{%7jWAh@9}2B|8xjW!vo36cmo*@f4*>>>IA6#o zoC7l8_ZckszNVRaPf#|cLwzZ`QPtWtBM?XI9!nC8?8}+Bc0+lI+-sD(4+4U3)Hky7i&+&9+ecPO(rqCnzd! z0MX`w10yAuD$Pkm`|8f4A=$9%kTs98~%5r<@66@tl{4U!Gv8V7JRLT$zWCdzJ}R_Losv&tdh68-vtQjrg8| z7!2Yg;380sQWGNBfQYhe$|OZjJ4zoO43`Hr!U-))7s)DT6lITG2U-4N>;j|!Zg#Yw za^_PZgpEb;{3o#yIbGpqDik+?!lUH4uwmm zV_ui;Z>qx7Va}gaxNZ&<3Q!$qP^it?+t?5ag(q%}En#DWm%Io(#xG^D3-S_Ye5jqx z@79L$*e}rVxfv*L^@*Aa_W9W8hT0DVi$0Lm8T)hAYOU2EZ1zVHqG|Us@ErtIO*Vs4 zFBWdl4}6FKZpolK1%(EjBZLVAOR4g7JgR!FjmS!OhIOCBhL^i2e4crXDnPYlFi4N~W zEhJvE3}$P*h*>3}R8x#PuW_O&qGfK>slj2MFx!pB*Vu$fEn$vkLfoyaF%~OA!dy3+ zSYzTEMCZBDnl);nD<;f$)7Ex;$U(}t5TmmVBRcL}2EMMK%6|@ddKinx$6)MPr6^Ot znF1OV8gP0eX^245XW%}@NUWW3uWmM9CETZppkU1=sDzzv#Mf++O1NKhC1)xAdlUTJ z<;ub}IzNvhKM*N}vzKmhxD2=xZw@k|3Y#JLH*VEFK?&p|+WnIl31E1I_>d zL7@T14^trm)_8Egt;1!9vpPEM!AsUFFAcW`ZhzK6z1&!Q*2v)>R0KL816m zHuw+$i+_XiF}6!O=|X1xxEQmV2gRUJeDD=~ zh=A1&W1?L;N|iLm34@oc&h8435gpfwfv-EL^4BLX$}xC+492WJm8?huPG2Mnk+nVn zx3VovBrVLET}P=wh=*TWjJ|OhT?r?g1NL%Z8)I!tS|n_j^S~|^_Ot0=%gH+bL0WNj z!U#O&%!rQrf`RW_Q00GvJTr;K@nLiiM)&$;e%fDaL{u1;2}&l03gS|+ZZ0%%-a zE}n?1D})tSR|+ext`b&Uy@ISW8MegL^38aZoe>>(9RuHbQ02djyz7<+kGd)tU8NI2 zp#kSMBnlC*@@nBx$UZQUbd|We1rp=x)#8b`x<*)W^%`Nt)oX9g@b=!2CgzPf=}`@@O=lW{BM$XUG?BmR|TW1bRsAepX3K0 zB4Dklt<><_VIt{ParHNV#?=ktiMYB^SaJ0>Va3(kg%wvfk#(lPmbg0p8l`9$u3pc; zcQdH+Urye2)q_V}6^yRZiJ;Jcb2}1+2w3g0!agtnCX%*@t6L#4u5J}i#MN!WimTg& z6<6;RR$RS{ti%6S7gw8LvY}zPdL9E`Pf+D=NZxhTgGXHzjIPp&pwNKRABjQ)tfSy^ zk&jNgM_e6(xN-Gf@kCs`Pgrqvr?BGc{lbc?yU03^(-n4rtrsdq!*KOD1K;EZ7oP_hZXV!*G>1479HosPZ==@4D*2 zqpk`@SLsAhDArRX3K6i5f!o*yCXx<{tNDlc_&0tN#^NTs=b8*^9K|>d>2&qG8nP*9?3=fMWkg-gVW3M_m<+?$L>$ z(17zR_z(eWEw&>+Hh_twqvGnH0FA51#1nD#GhxNm&xI9NzYtbj{gSLR4YtJ96D^gZ zVYqrD1K$QvPr)wMX# z1sdYOSJ>WA9S+Q5;41^g^?&kA8H>lqV03_%gF*w&0wf9%Ncs}o)!6guq(tMuA^^sL zvy21#nE`9yz<68>W(3!Q8Tft%RsQ$LyAF8pr~`u00a^|U#VP|nL?DU(8Q*6EOeEDb z4*UbuIB>Rcpc^#AfmWsXtOp}Hu84te4yf{9K;Cu0gGU_@j1JH;uGNADoP|gfBAfIT zxFdJKL{e?zKsf;8K#FnTDQ3VLxP66EREGm682EkxRsIjiyAF8pr~`sAQ(6uR#V7+G zB9K&oX|>h_m`F-D4rlnn5+gdUgn@4!sPc~??>gYYqYem02WUAc zG~iqg9-R&jd;@Y{W0*+FG!85UU>vAx9C#XlIPmry{6`BTI_^gXzEhyef0(@MfCrB{ zAQ&B><)BbpsQ@1$kTfe>sZ}{JkyOt(U;{7?<)F}jvjlvIK+*}2t5?EAQVZk2N&v=zmd1hS0f+;AC*sB_ zBRcLE2EIQ*mH!BN*8vY6bwDsWK+8d)0mnkChX^EXFi~}8v z11|y)2Ug#PWt$NlcZz}UZ&2m`l)USJ2ah@+7#*PHpwNKh)Q1BEl6ZA*&6O~b)X6wd z4S;c=vvFVm0CC`nB6HOg4lE$%TMVlFlgPUcc<`tLg3$q54hju8E5L^cSRaG*n}F*y zHS(QDz)M!0$Kg5=BRcLF1K(Gm%Ks{PQI5gmV=!j58jAR5VbFkc0yIR{>W57aZowd{ zVNP9cfY`3(#mJu#9XEu5Zv?3FcOWmyF?f6oM)M~nE7E{728lvst-atDjAp5ZH_+9{2{`<&Fsu(;z24g^NG(^^F*$_A7M#4mm zkz{kSIjf+6Hbe&ee2{ z(ai;5o|n@m%X#-weCL4?{Erp`-vgk^zmB}5ioxS!Fy_-2iums*P&^q78X{|TZG?-h zs6kz0YSxoCD8>Iq3pZYj3(M13_X(jfU}q#emXBa&LQ8CPY7{0sl8d0&sg1PaTBp8B z(GXng&A>MhRQX$wr_oqEJ_e&Z%rqzzyDTIM$v?E!!aRLq3$A$A>}%zN^&cn={^>$7LwtY~A6W=iK{Rpc3uTW0& zv3R4;BY4d|kpyzrG5c={-oiEBnj`k%e99H#-_Vxg!gbBD>1$yX8Aou{f-&nLGUJOR zwe5j+GgO5=Xc_e6?nn>B2Ah}@_BBN;i`w?!{vbol%NX(Yar6v3->8Lb8<*Vdp_|1- zA|A?Wt5^%QHiEFMuOUQv-eKVT5LDIP4NARO7!PGtLah83pjLP8bfgP7G#L~caQJ`h zAp!ws6e=Jn6#HMo1grw|h1p|~u4Ylo;WJPZWsP8k4We~cCgy{`pz8F1mbAv2c?1Ig?hwzo?3&!V30JpaJJRqzsX@o&h)V0#sDZk4ynRCW3C#XfCZ&RPzWPabm>B zVyH%I$&aAms4IwLFVU*iPD)tjnxBtei2f2u_d3(HHpae)MOBDKgH8`nJpTk5B5O@W zx4akI6`efY@q-t$&o@_!0#w;d2EI~I<s<_G-M5x{*t&(T`uo_pp99ofK z)>vl|E=d_chysJdE53-0XP(5v`7jV7o74%;d^I1+$s=`}G38*|zJM#J$z|3zvy~bK zskU|74ycFZ>DF22yH5fDn%@V|Oe+iHi?W4E;@O5kX063kvA7NW0T!$Ax=#7pW%fL4Y zRQZQf&NNl* zHD)VTYgBlI!k=%4@H2fFI;;#==qsd;d4EzvTI*`ghRPxgn3!lp+EBP7g4&dQBXp8DMF<~y3u;gbgI+B}9{yA$E_;b0? zB|mRD-$Gv+EEy9Eb3wzTG4Ry|RsJ~g%rF*@kHP3B9SRB!I1P{}M8NtPmv(Ns7O88u z6t|l|k~^(8@?LGeE+9p?+EauzQUv4oHS)bF=YU)ddAufXE;XdP-DUCm zyRl*X^ z{=2nGdhw)_o=}dtXs`ABWwBy3CJPgyR={Bs289NkM3gjS0J2HPT4NU8gw)Abnr@l~ z^#7;5X&}d)GmBk@kM=a$I3&Jg$-CrI}Y=m#D@a*0)$BS%`>6NHnGr zaoc-G|A-CafTz8$q?+5_hpN$tQDK&DdvB+T+urZSMcP}uQSD!#&~0yd_RgDLJc+jV z*%(J&^K4&MZ1wze@lbqR(D@aS5RniIi9ZY{OB=W}3^w4fnS(+DPCeiu1CZ^!0fe)h zlRQ?RH!%sVaIxkTc;0B7lqQeUeCfiO4JB#9scV&D3N#^=wC@f?l>cf%W6G=I_%m@2 zMo*eUG2q+<8Y0^z11niFC-mfU?R-Eh>?jw^Rf-bilEc843#$A-QZ5Tw4BpXC9pcGL zA}Lf?%_riMmqq}$iy-s+UA! zgq-=zh2Ax-k7q9!!TSabeD{JX|61})8H>lqV9b=3gF^BAKll&<>v8n8|KehlQ@g$O z9`0j|s|iWUWi4;Vgpu0XkC}lQTDNSq4M6)L)9~7(pMd>Dg;FVNIh$}Jzh^yS6(;7` zd6<%CZko)(*Ral-q_)q6x`IWxr4S;&H(5Sc1Yw z@SKyxvtT!6dlHsPGZC9KImxIod>{z2yT3;t=6o3OTQ+hzov1Jy$x?PEVk~+R%Q9lt zlDx6h`Wf?UYPmk^N~KK6W!THwlzk}`9>FFp0XS)l!Mo8iSa;n(7Zg7`kY>F#R!aRQUE;skL!sI`k;fPyxN>ih{o1-3tZt!d6T6< z)JcPiG-@hx|A;N1F7zV7kHy6v`vPs^^W=Xn@X>^6h5qT-kRjlRre^BNsvVScF?;)Uy>7}njgXv?jc-nyt0iqcY_ zKz(y=vvtQ@DzoFI+!obq)H4EN=$W);9%wW+D%c+pT*4wYDvt_Y@d`Y3+32pQ$~$LP zar1a7s&_b|C$&&H+cY{JRrxeVMTTIb5DFT9!OQ})rFBf=s*V0LWEymKh*$~^Jp zDdu{P?P#7Iqr!RmvCHttfG5wq(G(^mBIQDzmQW?-oTzZI-VR|*%IhdRt1)VGxt@6; zN?x6Lnxf?0PvQEzAzY=uET|%UnL_RoQ&wwrORTW{_Y_`-Yt^Y=>HVm_NCQRNS+%cz zo~x3wR)3CG@~Wu3#+2stMv1Q1%eqvt-j~9H%Q1jP=){RtlD3~fX?;AtnsT#lwlXSJ zd5b8R4E>Z1`T$It=hWS@ZlX{Y;>|i8OCe86+=?)BP2N*cjct12_Q+aYImA_;qtuu% zTczBqe;I!U6MY<%L=<-GAx+L;A&)Nr%G3NQd-aEyX1pEKbnd=Ujs3bqi&zcQxo1Q* z4(h~3u^OgxUrmi+c&#|KrL`_2R>S1-SX85%bqW(vRX;rQM&5s;y7^W@Nvv*kVo-Uy ztD7m7<^DORtEs$(5slO_))vg^-b_6mr#ID_PC+vs*3Gb9MLLd@E$0$S`NB%-FTa<@ z+Au}CKBACvR4+$2_2xniZ_)Ndb-&XG&>_6Ko}wL&syWu`Gfp@*uV~V%lz8jMv{*x) zqUBO;I~peCEb9|)yWDwAma|H|ykSwj6e}5{*6Ww3nW8R>s-0scH2fDeZ+ZEKqshOK z_0`5RB=8jaP*it-b#CZibXA_!Jz{c*wQl$s)I7y%6xAJRjmAvHV#id0>Av|?`-UsP zI4f<%znD~crBSu1*5M(iTT^*AM>UG9h1gD=mY?h(@}8kus0{hdx3YWvOMX66<$pwU zQ?so@XKI;f^LXpMNsmYlORT#t__rK9l|MR~;6`gAhQetbK(b*1m3L)S_ZI7issERZ^^6qtPV1&C{#OE(*CV2vy3G0s zGx?c~dpw^VNs#iW^>O&$5>#&M^0q}2JYl_1r4v_i-&E$IXo3S)_bPp_GC`D6d46;l z(|Mk=hFtV-E>&(udp2c)=W?;Q-8Eo!WWR1Y3%kGBAmv>^Exx>$dc9?(qnRt$ZLm{tnUNxyfsg=ANsTKzZQySZ2;H+28lj&0twbZArj+i67 zYE{c|JffS@(k>hLFS;r(v5%W`>U&lpPJ_HAJr3qkZ7arCN_+d&n`6~H4o-@wrG9NC zV>9ZtR@K4P5#5w7_Rml~qpr$(Agb2GZk-XU=5g>ns=ak79PDFHJ2zI% z^PE_?@%1Kq$MpZDXNs>v97h4?U|U`vB@H-lBCn7E z$OarH^SVWa7g~KGWU(Xuv#nL$#ndSM6Ui^Op50$1 zd3jVg!CL#mnUdc@4W0ounQ9IEF~)D758kW1r>Vhrt((lSQcyCfL$?Zz#^==FyVOkz zt)D-RiDJslnH+o6NPk{O1fdI_S6YN^_G1*3zT6H^l~w zGZm=n&OQgRx*u}wtvhH4XwbO`=0dz`iEkK6*Cc>vm%v*U`M72KIc~IPIl7 z7b!&)y&z+OrB&L?(^p3jo$*jMbY8imID%Li)8B*6tFK_^XHq#CPrX*G0yWA`F2E(`Ym3%1izwS}8Daznz_ zs_m`tJFTw1`&!%_GS1r z{lIO2J`zX`oIY9UMjs-TW~HVb(sB3Fs%rFe6noFbd=El`zYk;^iSmaLfy_URT0{jO zMFdRY`F=yA^P?*NjZqOj7C<$cMU^e*!_#A~ihC6;=Nd|Q6)o+H-SJ8>jn{|@Pr%-? zb|?0doQJ8~@Ch{Q_lH*D5d=o#_A-Ua;inko)&H~~Pogr-B^8mG66X9$1-|;9_De_H z2RU6KiH6p)4gVQ=6`tl~?>A`&=>u$SOYa`xdN{ZXm8HJwq3KQa`q&ZF5M8qj$_@3_ zt-Nm9u7H|t*_h4r$#J+{lqeT%rC#!NhpQoIsVCnlS6`)-Bu_&`Nre~$odmR9A~o1B z?gvqV4&B6?`+!4a@hKFrU7Dk+sb4QGPxs|5th7Gb+{03K-zKQLw7!};{1`>wUX=IK zoc{R*?7mHFAU;rc6nV&QTYVR3;9nUdt(xeqX5n@_22;?e3ts zVhXI5>LZ&?ca0Q5^?H`l=4_VB^ncH;EVA!##5vXLE9$KEL1(dk;^L}02cW2Wg+Vdt zLT9P|4ij7?2V-X>b@FvH%sgo;bhqsuIYqvfB%A+TO8p>G=N6MfNAsRx?C zQ{JFz*Z}gFbJLEpl|7R4$3-MxVk;v8+^T$h8#4GtqiG`NJ#Y^@WPGzwyk$iVzZEI( z?*bRo+m0x@nX1qj{s7Ph-SM5j^x-2a$|LA=KM#vJJG!96(juU zBx1p`Fp6)-AEC`mUpG7+)7dwznaAfNubmBrku66I zl5%Dfi+8*`f~UttCCt&se0;Q^+8?A2Cxvu;hOY#?v5Y$Ae2^Z}IxVtmmMrm@!myE; zq6_h$7Lt6=G<0;7#gYmQRt;Tcd&KUcTiI03oz(TQ2EYnV=FW1>v&t7o=%*Cks!+aj4i z9)~_{G9M+GkCn{#QZ6=ioCojtW&}^~3@QhJAWZeJe_;Rm(VZtMmuwjaO=#_%eF(lu0W6q3aSNK+B<}(AfPIx~i)& zZOVL={_xiWB0$Tfbl{P9FwYo`miP3xRQjVYV)1vA6iu3~(jU79HREc$ItqUg_MaV? zdR$;Qrpoj^i_)XOiv%7&hCP+5@hci6{Ruw#?*eDF0UzuU-7xy(2voMKQ3tbk z`o3?`$}TXt1AzStMpe_c2%m>)cSW;`6xldajgHJvM!K`!D{$i5YeAa)Ug_N zX2&|o2j(#|SPehKFi-!5lNdhqVl_Obn3vKRr`(8nUu$ zTm3_u5zp4|VB+NW-mv+N@B1ekx1PQXo?F?OR^M@GqVxvtTr}S5o66EQ)Eu@}_GGK? zDSFUMbE{-!PqXUwy9t~7@L~4#U34>i48=}=mOh0)!A>Ck6;8zA1FOLv;yfGv6Wula z8_q=81CW`13w4qH{b$%W>bR?cYF~7gQoUwS<56s^(vvhFg2frC(K!xN*aT4g2W#PM zUAA89*#uTTYXkyNQs@DOkY|Dm9OI-*kB35}HORiWv(g*2tZZa<{ z;PWGNPUR^y82(}y!lAm!IT4}piZ!6}vZ(P+9cWyj6ZDxh`b9M+=<(&JYxu-a`%9?y z77b0;>yTrl@Ftt(l=j?$u{cwY!jNaDiF&y`DlFC;&W#9-ms0$^gVcDD-EE%!5B8xk z$v=w<7wXkDBSLR-eG!ruVjf9fs=sXJ&bwyr%gd(h^;_ZDO1&GsO-=>ehI#VUM`+xv zv(Hm%OI3}I4^Shx5E`2>hf7f++sx-E;-a3u1%txK)ZkB}=v~~Fn8NRXU3G!1YU%gr zg^lrEHjr2`HX_^^oI{C^9n~kCIEt?b0e}Kz0Z|J$ZNZ0_0z%NBP`v+7m;hb^!uo?( ztw96MB*J7v>;@r@v=GNwh@&f!UNVhrApNujH0Z1sTVU}wBj}O%G_*rXIN2_QL#fBrh*z_Clmi(}SI(kd;}j6QE{EcSa#6 zGZS@Ir}_C9r*6Xd%nU*;He)Vup~TF=&seHX%RZZ;P-f=v_0Ved#D*x;HM7kMK&^+^ zQK&rQf|`KZOh-pEwycaCdEbZfXGWWUUVzrEse0?L< zaq{$SM#_r7Xy9+bFh=qGH&Gm@pT>WQ59eJ zy?tdBk|4eJ-mBDrh=3qcgb;!xEU2I~L0Y5=C?J9b3l^}V*bp1`-cZ3_ zu=}_1opa~C+1-F&e!tAzIdf;`&b?>m&A#1z%lmgm0at@rkcvGoQ1Ch)nXjg#?|B+M|zY%fN) zEu1S?k~-7;e(xK&8}|!^D1GmZt|kX zeh3xfo(h-Y`DZNP`De`B?~oe7S1C)&Bs?Vv<5&x!m@X-ve+D^3;DXu{4deMyh)i^z zb>ZI0{B?~z*m8}6XRsxj1?k{XpkPB+F6;|>K=weHRvKman zBTup+Mps#59>F#lU2VO84sIm_H_fqcV|R+KwRj^yj&i0kwp}TpGHd(}4UIW>383q& z*RXh1yD{hP1G3H<8r8^SxY9@0TQgeu$k@9F0oh=E)kJqR_7pmeZnDxw#-Um`ZA3R) z$8f3kEw}{N^XT;!wl@v6z-1=7#X4tzhQ_qyfZMG7wfzCdoC8WlZ?K%*8p+4b9lg<- zyjdel&_i^)Rp&~>XeurkQ`i&84r_R4t@97A1JRqThFdkV7#@!9vZf(Ao&);S1#+`B zKdxioFS^Hi6>;%&vbF%Z#p>T(BmAB1=&ja<8}O-o8Qr#-@%B@tq4)xcVECy;U~X@u zMzA_%2_PN>6UXtjC-?}kpkl*Y)}^4I zXQr^>ZL9Y68WA?UW37iyA{*YdHh0uI!iMA4bJ%9QeuNDttcyVt4-qzeZuM)X5je+) zerxp)YDC!Zopo%UMuZLDTYHxIY{;$I7uzkOWmiK8gcj966-EuA{*amb8B%=yoieq{ z;l0Y^#yE2ZUW!H!S*QAYhif1g%{8J=S<7zmkb&ky<6-WL)?r*G}iJadLzsz`m4vy->h1<`p!~2)j!s}bU)@n#m#@MvAD>1lv3P0W!;2pb0Rkl zd*e)v2siN!QrAZmHv{(b@O2V5Q|u@flg~QgW~%)Ut~x#>+{Dj|wvI!>O+3sezQrkS zX4q+X-RT)6J5|^|7~gY*n-%PJXK5YbX2d?fS~52??N<;suOH!Nb$dMa0uK>x*08_b zqY>feIra?g$}u325slg#;cTy!a5KlAftY)Ua5L9_7&B8lm2mTWM9Y3)DuTo!p*bn_SiN&9pPpb`}GSnBHTRN&YkTc;3H?4E-9Y>f$4+@WL1D; z)`JRWw5hGGqRnjMY~NXmn{Dlm)qNUx+-zr)@=4rmZ|{uy?bKDYgFPaC5fN^7wAbP) zr2?V2*~zZAQ+K5H%^vm_HGIh1H+$NL6E;cVW-oh~8P^hS_O}1VR^~BSakH=8Aig|= zoBiynaV82k``h!eggtf$HwW0OdM0yopgpRe))8)wvWE}Rh;Z|Kduct52scODH^p^8 zAR{`)9*kw~jV0W?(B8O0Bf`zGc3Sf!ZmvMI>|xUpByux|E*Uj&vl2768d4*8DeFCM zCgN9?$9-~(S z8WC;|w@-kHUeChK0{a94BM7+38RCoFNb!SYm`;dd)?R45M)RZ7JZ@fUAJV~7+$^>; zn))$MQTyg>djWQqByL`2?_RB)EGN7<_NF!(5pI^)&2V5#^E!Kb2aO0f*V#KUIj?8o<_7!UjT#YdZnSTyqY>fe zCVTw4ByQG4wCo=W5hQZ+!b=Q;Q3E&cVdg%7)CdMCd)!RK&n}Pq+$^*+Gw}Wyt37TO z*$>0ksOM7TNMzThg22sfA8@0MspxOuJp!E%iVH&@x&*xkIIg_~>a4*fj@ zeB=z%B~7yr!lDp?j7%Kc&6F(u63!F5Ax3w46urq#InVc*qUde*7HFu@*Hjd}-TrE# z52dP0`(ArV{K_U2y~EBMBkXtNQS^TMB-V__G zhlHXB>>X9&kWlmiyYuB5QrqW4_N(pv0oAedVf*|zNra-0*ssL5G@h0 zOj{6-qWkR2vFbcTD0;8`+zO2dMGx7hR%t{i`lNj!ZUT9&grZN|-#Qu*iXOI8H+u*u z${FH;JV^0yDoiItG3)Eg@QNGj*NndJaq|QF>xI7i6gNM!S7~NcP~1Fjx9REAz*gKm zVNV4!JhuxsKewx1suAJl7xq5AcPVauY3J?mJMy^sy?qO|sw8gyV7JPSL&D9I_J;%F zkZ|)ydqA3o6gPjiD`DI5jFRp17kheFjR-e?wXeeR@N|Tmzu9xIP3GqB_+>?{Bisx) zZBjKN+_apYH)%w;X*<`(bwD5^>N=g{E)i}9ouBLLR>I8`XV}mrZcak9>_!NbaId50}o-;JXhrCOBzH^{=91?EUbM{>rhlHEwIy*o_kJO5r4V?9@ z`~lUz+0c30(ui=gk<)6qMueMJNZ*s!T_D(Z6*F%Jx9h@7%Xb%x? zc63VOI>OD)&f^HArz70#;`G(ab&PPctFz8b;-(2#+t1_rDcrml3xH7rH&-%quS04C zKV`kg%|!gy^0?2wStG*D*3Kv_Ku<@w+15GH$wR+ZRnm*iF-QS12Yx)T1^7s}d`(}ajFZOLO5W>xoP7PcU6r#8} z%ISd9TM{?NI-e}@A&;BmoZVW>7%SWy?+k4k*Ai}C3FQ4nqxJE`$qQn)$W8J(y55pG`QTpHIAZk9M3 zuhTlh%~EF~Jn4-t+??y=VrNgdrr&^Q*_R*$!p++;Aw~_{%xC5{LW<|#v)}x8WC=easJ$`5#i=ECj-YF>Br;dbmvm+tsWxW zEOch#6|{#4H;bGeS9l2c$QhZ>gDZNm#mzEj<9xp(Z{OVHypLVW z+y2yfbF-6LGY$ziuXlC~jYGoCEza4PSJJ+@&6%t(0^Ut;XEvOY$juv_w>oGkq(<;;${sfp@rLDbpPSb>uOjaJRH@I+70!_= z9^!FxozrQAMueLioLdkHY2{thcR9DU)rjnyyPY9mw5KE7yv2DGmoE^Yol7`{rS199EQv2sfW~%5aHMh~nlEr#{G&v~M1D?$c*kZ{K{`*$j`t(nJnnoK*8zcy=;zJ?Tob&pgqvSD{o*~#zWJr|#g-&) zzKLkrH)16SH*0po+q;MwxH+DgdkIn_c!2dDHxu#a%HuvaA9qG#-{i+8d~QDBd|Koo z9ygzN)?nio9q+vPqI2#NYT_Z_BWIW{ zX_`G9(+LsC`VBkVl{7#4i^t7ho!a@n`xH0-cD^d`WA5#n|2V%*^C6F$|2nNe7SHX% z%~Q_3-8CZIG~5Q77>b+t0WZ9eOyXwH&C`3b$ITS?#+|;FcTG=qpUsLx!p$^yB`&HS zT@^P&?#FteseLoUy%v^xW(qgM?mD>3t)!b_1H6q-s?jFUJ z$m>VAS;OTM`aJ{$GNLuzig37x2sfkdf~z$m+{|%{`Xq647NTXhLp$N-4|t)-sDYb* zGjjuIZv=-@_PCjdPb!c5-2B7&5L3!PW1pLUI$7I2#N(#ro|B^y**6{c@M4V!H?!Su zaUqg^ylZ+Tx56Tg2sbOcCoqnuBiyX&&h+~MH#x&}N%6rZXod)6Y{dz~4rW~s#eTbB zX0*PmUJ^BM=XLjerYPFny$L(53VmmFX>Z|PjUXy0OTAog>Hc$r-%efHTe%IQ8WD=N zmS@7M2q}uTaa-U(okY=2?q|6Cc}!E6_Rj9ohH*%?&o1r*?c$J7w5$6dmcQ3fQM9}J z*G<|4**<%?Td>|dk_bh6x`&r)M7Gaf?wd1`Dcak;r?1u#iVk%r#|bGE9p;|ZM(YSg zhr2&^)(CiHL<`&nxK<`obfkMv`~{g%bd>uHt|$q|&WZ?{{UM?*6rF>k5Tgc)ZfEB1 zMrs6qWxYqyL_CE$iMUVE#;)B7A9}J-?cMEc>fVW<3gS_;o!fJ|Muegr-0DG%2u1t3 z_rO_RE7?8=xP9V?P;`*Hc8AsxiVk-F?%^SzC})^1X_~zk28Re_wOnQxXX7YnMlbfb zImuny+IOGg=5%)su0AT}T@*KGxG&fAp=`y?Lbo+8te)Ft`<&_i8o&P{+$?hYkM(sF zH)pvySP4noEOjSU_91Wkoa-Lm9EXIPF?ZtyaY(p1&y8KIA;rzh-G6bB@Qe~}Ug6$= zD_SBquXLAZYDBoXz-YbD%V?(W*^A>bxwm@a9W-5VB#2xM%;_L&mQ`Uq>c5Z*VVTRnVtu`|NkSbBFlo`#{xe_kHdQvwU>nSRv{?u9M8_q&a8i^DTbHqrg=<=9O;M2LF8y$x5#M4~?6UXITDnxzSJs8&kn~dmT_b2U!F+$X5-D%x)KSI-;S!>by%}E& zW&vMtX6Am4)Cjht>=88)A6OpuiMrjL1mk{XwMW#QZncnyctpM3eHrG8j&}yV!_BRu z5!pl^c2jZS@^pl#kGhxl)rb)FG55ok8WEx%a``(O(h5Z74AUjW?_a>85P^)!-{YH7 zcGhyxWZb1NGx~)`)GytwTYR4>qW<8%dW|3YmWrq+-6^|$sDdKukM75l{dS6|Ke>-A z(TEWBXSYHJA5ld8#rM9Le;Z^-{4hl0#*M;@a&g> z300?~#OQ&lYnZtkkQ%`gtoNvzi2qR@_o@1gTXrjMLb3~ws^7UwMtO)w)!*D3uz87& zN7X;vBZD*|R1F5J!^NJCP&GAJKV2h2)%4&$*mpf0p=w6(aIS}ds+=Ky_zh{Ay%iRP zC}uRgAA72u)dCB*q&CcqwhF2vY3tzGt9+j+s&)!Kyu**ZciHb89M#B&yd!CsU?m)u zya>rwq&Y~2sXsl zkx13?!As_9M5uaEup3r(B2^~@*T;3hCnI`s@K}5g6{=1O4$9Z9gsPK+yW1yG^%exr zo{QtUQ1wz=kQqHtwH-6J3sNJvmh~Q06Y*W;ai6N~fg6pk5<=+P<2$WQB#cwRYwO$;Pmgc5~_{~cEPkgM5sD8*sR1uKu^vPKm3Oj zzyA%3LKHLdLDi6*^%H=faAuC?1kLPD_~Gds`~niDjL&>$^ZWccsV2WQj4xeg7h#Fy zq?ue3{4(hr7Sp|ABzsyJltW&ziv2vN&i9Rv?8E>p;P;=Hx&I=?`yWz|fs^qRlg9WM zEglL*d^8X#e*XzeJ4CU+i^I$3t)Llr9N3D5Sa!MhTSF`0e)a)=!V2bFD_MGgn*7S> z1<(_Nx+7+p05M2qW^N6nMsPOk*-5jdYT!3WXM=isSg{-pav$?5yf6LanK$6_ zlKb4vI0ncE9Mw2za-2SlZbz_1#;!d>gZ>CcDbS-#* z`%4gCPKC8m1e6-gzY7aD>tcOuJlg}JHV6^sd zlV+bm3m)MtDq{hfgGRH%bwdJ1y;1y17M*Sy6Jtc@Jct2*G{t+W!V77uO{^Z*6^$mD zKlBX9H|f#%dxQ!<1GAsCS=Znx9xonVj_=rby}G<>XS8~qwPV?KiaDcqxwfr-WbJcZ zPj1v>T!YZsW^POELm+WS{w+zICPrDn2Kt@^X}4Z!tc=KG7w)%LuMwWBAX zcBVONY=Y7H(Rb?6&pkI&@zZQ5E;T2%Ka-+y@zpLIcXda{du~bq-{8vm^=!0Dvzs9# z>5`_|Pot|4fi#|62Eo5J3_*1}#sR6DO7A1xQ|G74e`@-+M)h@96kEd+7d4v3wi6v_0wt{f=5 z<~P&G>&8LCAv}vauR9;JVK2fVPw4#x+)V>P@5RjA6-bTXR@T#?Wc-qchz})BOZ`fZ zKlNVoTjhbpsylwO&Zu`%R}AwjCJ)4_klNZI%)y*}S+S9K{^5K4M{8}MHOAz6y6)00 zU}R!zqgiiOPJ}gib57j>FZ#98?Ud=Py#Rd8TRFK`K)sn3h@{eRU(=YfQMy=T8u?8e zxPm@41CjJZCHd})G35|7$AW12L$`wFo@T}wG=HGxz5#Id*1hOc)?OfDC20!(*oQHt z7H3)k4@$_N*Ror{U@T#Routk+=JE@Q%4JiAvdu<(k39dt+c3s!<0Q4=w-A;3RP$gT zSabiUSeKsN;UrbQb)%j+0@AW3UD7mrEyf8cfMU8$PEG2JjeJWGzpPQW4;kK=i7@(k zgedPr=^77m$(@hlPBc@DeksoAqj5&R8fWzDv`sPkjX0y<6h;e;-w_(W%|YJfAhM0; zy~pA05xA2gjIN7G(m;^2Co{J{QX?2+Jq_~lqzzVd>fPw;5}4CrqM-60b?Mh+Y^vh#P3ccn^buVJ}ivaA;;iSx?J+ zJSh&M(|(q(lXvzRwIrnNw`r~D8MWduz4S?{-h)B&YMUlq;@Olqw$b`yYDrM*na^TP ztEe`j@kZ~zSt(I%XugBZONCWcPFEF8&FgwFu4=k|Tsd62%{0xfhrU7zpg8GM+zC6> z06)iEcd#r;mgAx9?}ajC|@dp`zOwvp`3uxTjGTg+}xg-+ZCx1JPS%DE%Wh2cPgFs9eka zMxIeCA(X4AdLstSyTCN*63?c@vGM$SYDp-^n@4fMR-qg~B7DPgjMqKV9HfM%(sT?C5=5Rccp(y)9lwDRF#tTApFPM-4pDh2A`a8X3VE zq)UqXpXfED0E&gXknl{LL=@hczj9 zzi4)G9i+ugkl-&wFBBd`C7-FUdS%JPQ;)C-6}}CbKev%sQ}`{wcICj!DxyPk3l3b> zN70nPoN?nW@??k;Jkhv}zkOj&y%$d(7?YqUveFaLDA@$Pp%~~`6WeIi)W$CwmX4ue zLrO1UHgxW-$bLZOulSca&wbKEej>v8&!zd)5ybO_QTPD5=K1F|Ck_E$zbT6w0dOeUS$nvXq5BB$Mq%#$MC5T4il1Zh z2J5~~tm9AZ&9isJ+q2J!=rax2A@uhY{!7n7!5mte!)&k-n}_-~kl#VwcO0`D3P!99 z@K8u60sTyPjKGHo!zaH1ItMc=J`Xb~EV@pNg?zy0~Sq2!*XSMfhSV9ed z`JnI^M9+Hb@Xy5rBzT+W|H z!4LSs*17xfnyy)(=-~&M6DeA_fZ`(bg%#f%NE1F=uW%rwFLCHoX0wFe_Fsq^MuR`f zq-xYSg$xLPfkc5amzn>&)w}&=6z)Mae@!W&jhe+ntnns5@AJ{vN=a=2h3^4;3;T=$ zSu)*^k>XAaCM`3+l5THxAEr@P9t)^uS2sSpx}4pDwVZPvHH^ZRXfZlDC<*44+;o## zeLE1xNzLP{uRyK7!Li%Xp3CeRD7?U6>t&{qGb}S*r6rdm&{VJk!8!p<7_k1r67#1}{#D06|ZDwWE5foQ~AAXA~q1wyS5 zHT44V5w$=@`U_+k8XQLhDrd66e=QIiIe-e@0(l7y`C?B+SY1yl@4@wc7;Ds}Wti-W zAztxHKHOy(3{VmJ=!Q21ur=O+qFGRSfZ5>ECnSqigdTObKyL^BOTR!NP&V9%4S~R| zo9Hh5$G2{cXuoL0+qz?W(0DS#fQDbNvEGn0qWvwG0}bmwHR4|mVo#$}I`1oV_&qy4 z&3Ur7{E4c1n6mG>pU{lIpP8^YjFNwDR{j|b#oU(v?VlFVqkrZ>Zz2BU{+Wdu`iJNu z{Kx&H5j_`;`2IPJ#`MqAX!tA}YyW5@**_ZAeQHGe=Quj0f1X2!N7?C_{qr8GQZZ%U zKjU`e@}sH6k~u2}Y5XW+%w90!0M0Jsc_(95FV>ym>@ur>6?2#@M1lhhxrDzE?<`!l z5}3JZA6{JCMp2zR&b{qA$a0=gB92vjL~e*GB~9?gHUrfJ*1oHP6l5<$7MdxrW)uLZUm{}Os!$1vnw zXmb67cwR^SnYn|J)6j70qoz^6hz}DD&!sp^#IveGEatsOdnvT!OkV8~(_j}kf8Ni` zeHf_`ypb}yOU6@@FdjTPT)L!b_94h20)Zj7;3>ohXw=h<1;Fdd-2H7$;~CW27HVbi ze{m0ksu*M>GxtKIMz9)XYL~+smB)=dGw)K&>6!ieP4AxS6zQiBsmp{Wa?Er|@%$%X zAq7yx59<=3cLEu>`fYq2BWKUc9dZ);J8IOA*DvOe+lToRciBtiHU^(^o4r(i%uas9 zei^UwVLos?`xRt;PqOzLN!X-s2QWm-B(x|zow7bBTv z5d42y8M9haV^4B3ZRPCwM^Qbim+ocO1d5Na|HDjPm4=?#SF-L4!ap(jC$VlV>k>Vn z$1vn#Uicvt)^+itA?L=cO@^cD_a>JS3xzCjf1bU_+}9hY;NMMdq=@BDXw6?*QL*$+ zj6oQ1cgJ#Ib%6Y3Ql-ffj~e7Od9<&W6F{u*4`IywXf6+)ytjKb7A@IFmkcTHS(O|GbqP3#y?Q zC`&1=gWMb(s|Stk@aQklxBwcZTnd4*B3TWkTn*;P*gOo$p#1}-0F-2H$ctQ!C|<%w-}MG>zyBnnqNYM(hVP&VhbiG_23Y$xF#tXhz|V zt4#72GpdLg@%48rsJ5rN^dr{xL-9NfVSDZeUHX0wz_qMMrnC{e6bg(OD|b*Kc|90& zFF@rjsJNSzT#|Fi5RK^NDdQ8qgNokNjKbH^Ki`B;#CtXF^)e~4suv4y*PhJiPw z3co`6%?v1l3lojBoh+;0`%brifgIv}^};ap`4*k(jwLXj@4l5Zf=o7?#PH$P!i4)# zG=~~X%>Ah2dmRzr8>Mcksc-X`BW1+=CW|oOGQ7);w+xz6HVc-Si}-FvGkL4DtaO<< z6!#qSo68%MgJV0%CyaRhVc2OR?D9YFiVLZ%l+fFF{B#PYZ zUPKOezs+puTzYgfl%B?aDLrbA6ralRcsszGSi#f29FLcn({Z1H@5yyRua!ES#;FzN zHw!_Jd7Mw6EV9B(#hVcM^Z0ICpbQ&2ZpKoXcO28A&KmT%J-C(eW zr7NT~beVYtZWrfY$x@(fWbAj$kCt2rD`w%pxCDjbg-otRV#FHWi>IMu=VRq%RQLx4 zx%oQxG`N)aWWfa^c9GZWYP48#daKi6!??yAgaOA3&!0XDix)FKoZQWLrzL+0OL!f# z%-qZ3QdJy)Up~bh?tD4u2Fm&@Gi$N-8dck4nVHTNw}DQy%I;sV%$$h#;qo^sr*?^b z12g}3C+`b+V9Q<$YMRK$pxC4GDA|2BE)AFJVS5s_;5E_Lvh@XK-+?@+) z4nO*k1il53pLj?FmzcZuT2HfQ}GWR9g)AHT-`D=ySp!P+K^a zg&@_!e|g`63lBo+>lab-fCrE71sGR>Kb171;B>o!EbSi;rsZCC31Mc9yt~7 z)AOVC+BY&PpW^qTzQXB-h71Y_3Ba^-7S zKGTb%$5`<&q}4mg z1?EQvZb<20$gluQU6^VPo}Y_!_j#{3yS#uTs<0oy6cqi?@pvjZ=dT4E-raEbNhK=OKEzn`glzx;GWh@bi^;YZr&|0w!x(OG=Io$3Xp z_aUS253)Ei7JbMtszA8~6iaACE()cskl;3OaTnx9tOIm7`xxpkr%v3^*#A&h0IkEo ze`no96k@jkX52I5CI1L>}*r^V%kDMvM z)I6Korw2Ip2YO@}Xn1$(Fvz70GR|^yr@%i%N3*7w&NBMQ|Z#AewL8WEu@0 z#^={qVd8VN?mk>vt~MDB4^*EYAZrK~PDFAR{#8_2LIl~ma2XPInoyHShr_7iC!$pK znN~bC%p!T?=c^YWtHuA7TKpu5diUq7$MA{@)eAAN^<9N2Wo%hcx*Hi6|J^JOE`6BU z$XM-ziXrQv{}z3r84}+ExuDrMd74LUT z^kTC2M!?%#b`L}E2s=^BZZ6;|=$p_{!rG~N*{z2PeOdv%XW>85r$aD0eL4#GQr5}7 zdI~M*)3HD5X+NVu16n#1k9Tu@u?Nc8)lTWERkJ_jEG&U1G(yugp z7j;fsc0?a$jaqhvcc2A7==a~;r-r{3?mdJjv!HwoJ(S`xS$KPM6{`zMcQP9pyABHU zUIr?A;J=jK1DRu8P(cS)1y~*baR+K7*?}6?4%CQtU@8SB=(51>rFQABgg_ z!Xj1ooBm{tckwBL$WHd5@iEmwGZcASsRMG{A}ZX2oF67t{jgO2T(y_ja(O|H50a|u z8$X+=PD1>S3x{F%@As0(&trpv($&a#ecR09$k;!~eueTcP;3mv;!`M;WO_-WnseKxYjJeG*JsSNO>pP-QJcJX*F@+yHF06+FzvZNYz*6}j zG$JO4+uT0ta7)Ka2nxrbj^8`_@7C1t_v>d5djW$fZlA<}d4akf%DjgD35As2uvc9} z9|g?#5egI5@xwJ#h3_4xFnoPb-JdE6;oE>=8NL<3A7q_`uRBnNZ!M5@M0NNyk{mt_ z>+oqrhi?u#W%#zC!<*Qt4xf*lDSXttgW9KuFLob#WC&^aQR*;+r3|5ebR~L%HQp|e z_AFlg|G&$M8dz3xfQ*_IQ1aGT)LUcmGvw$ahQY8!5UwhHC1kInh&6Ts8Q0hkEDkRH zo7u?N6m-T=)rS5!{KrETUuuh?!&pr~{Uqun#HuUCW2_DU|AKWAs~^yUv3eB9<3x3= zG?E-E4eMBGM8_%zLorrI(BV;bs$=CNXNnay-=X&Dv67`mqyJ)k!cr@F_BrLnC_Ff# zU!oV2y>~rKBLCY#uMhrx{sX2{2@N8A2L3~ZKD`Fj*HR_HryDRjefkb?7o&Up2TGrQ z1oRWO&_2~jvQIUveX0@d(>dsrKK&XUo@A%mr#^BfpHlNrYM<`Y*nQ}c{HNj7Y5ZyY zC)%7f9{*3G1;1JF-Za zPbB4^FQ}Ot{cU46{`Jgbvr)q-M}gMGf8xQ3SS|d=XRDFq*=ktNRwMpwjo5CC#OZcN zkA2yzp01C0)759lBWS^c6Sar2#c5NHeGU~;W*n;LP~|kr5M9X{?+od@q+D?fSlNI? zS6um`a)klZ#ebqJh*|iLyFw$$uF$Y{g+}78*oTqmidyKg9(&cU@R9PacpWY13TiiJ zi_=~4BUI>$&Zr(imD5~7bUJIi)pIsn!7tmW)x#223cn;%(jGD$^$N7#$3OT|0Yy1O z4u-%l-z2swnGTSRjzPJ`KxxoZ8sH4M8UnwNldwqDhgtHPnym9qkq02Mn<$zOR$Y{! z$W!D(B{P&x_;-m@#7fZT|Uh0Z)k5%g0X|HX?@DBdh})sS*g zH3mMOb#i5U4lTHev;@+IsNRJ&lFTIyYc6TT=Thu1bh;Ovc14H1*{PKMtNkYWT0y-!$25N{-?0M>#E z1GwZoYy|k10G2X>naQJDaTwN*gg7S=xr#;L@Iw#r7eS z)duxLG)%`TzS>@d4ue${-POT=;%Zxt;TVxNz^AfKBGMWtBhm>-SE4#18cB|bhIK?V zq9ZaDoiZZ*(BWWqsw3hfXIgF498K+C(A4{KjQ@TFckG3zTgUo@)mD=EhH~N|RE!uF zcVc<(eFBrX0N#e)33j3ufc?61Dxq%(Yp3c3P#Y@r>9(ODIR48ofcB{80$|KhfQV?ci>HvGKnb05$w=Y1o_i)F8^^(M|Sn2~IUu7nC+;hWFT@Kqsw& z!qfQIC&{Czr=P9|xDEetKWQY{Pa4*K(unqxfzjxv-RN*HJJo*j5zkM_CrN1Tr}i2A zL|)MDKUvQ!n{15c5IJJL5AYjSB=FTJDS1ozBnp50mgtk%+nzJJ0PThU#Df*F?)Z=U zK_kh2(6IJ{MtnaQu~gVVN6bWzbJ(kPgpYWR&}YmBXu*ROwHL6(Y0ijEfC~L_EvgSw zCGL;G;*VPZ-p7grf5bRJsJMby5VElzjQ5~$EckD&TDs+4!p z+W-kz@5vrNRvn9|Jf94KDSDK%3w{9zTu5O53k$!hiWvywl&X&t&CUjH!Mlj!>)`a&IQH!<)jKA@ZX_2bt&{z}H@M63Y=ymuPrmCB7LyXuU)ba-XLDW3O z+V~CnA?jV_w}F1h8gH$?=#4aZTfjJue}ANc*cNZ3=|GG5&o$xS=8HY(jdTNQcCj`- zlK1}g13(Y5Mvas+;x_c2bN_uzLwk^hue<~|P#b@Rp296!;dA^Q@w3dhn_2+0>8yGX ztG0vKBJF*Mjcq72xzEJ1GpEj+ZPcC0x3t685ucwBzMAMPepx;|sS%nL zFUH6@qZ`8U;UC%0>Y}XH*~}I$Iks+Y8PRxgkRYeFfuz!-EHIX0`i^r8{pXtt*b$tgYW-B{%RHE zlEB#?V2JrK43RT_9?~`D))ZvO?_?fWV?NH@USqz>JY|jf8S}^*^H=84HD)jsd6zY2 zRptxVn)R6*=329p2!XZc5E1OP=EWkUtTjtTh^#eNh!9fytf!`?~EVQ(q(XqlN>A9&dRHpo)&(9~1#tWjpZ+)`Q|Q`uV9t})97B1685Ijq>v9M(O{99F!` z99De899Gm}RM(jOnYnAsam>+oWC-#yvzE$QsjRQc#;9zj%C1(~RyK@$^C7Mi7A~}p zAz?pv5iT=N4U??mNXhD`td+`ot8A3YrmAe7%C1$}HkI9}vd2{RvdWIB>_?RaM#%`- zDyyxsmMZI|vXLsAqOzFER;X;N$_}dRC6yWHOP`s{)|i`_!I7KSA;;7n7$>z)UW6=s zWEvidSpV~nxH{x}X)hBfd>=q~;&R;AiSnoR!asmIPRfsxwLaf7w0f(ctAU5T1MTS?*h1g7bI5iYvbN)D0_`OaLTS#YncR_5q29=7&h;8^}?C=EaNKRYncYAM$?aMxtRjfrMBI(7$LT4<-?JHFZ$8#3JZCt>J~G7rT!?)|_tOdx2StwIf_@ni z7E_!77Qg!M3?zc5yPVZ%ToZ#Tl?Nf=^Hmlj#~1WgFmu-;HL6TPO1)&bY9fReb8JY% zJYuHV>^5D}Gyba(KhS zdA>w0JqB^+m*^}o;1dji;zDPV^~plOQ;Dc~H8rSGxh??CYYcKsU;;CD3R0s=N2HC$ zH7y5YUU3NXV#C+algz6ozH!KI(h_bA&E?ZiF~r0=j%A z#LFf4q5cpT$h^KIi55!eN^3z}B)Z)$fVfz6)B8ePCg?%-yGn*g84Yo@aIdTx#4?Vx~)Vxa1sfNw$;U2y#jF8Mam{v(ZZlg<>!&m3aVnb-gg zf|Pp6Fsz6}w1VBFOA0R?hZO|Ezm#IQp2CtP*dnZ<)iM9@d&LmX&xclEB@z~GYos;s zR=}ecY1>*ERH=Lk652*p7;zmlcQaC>$`wc(jcZj7hHY_(wy_(0{uF7NeIwEk#c)9v z40j=i3vb3wW?lLa(7>z{_+}1@QEQ^Ls|VnV{Q$l&0;NgHycBD3HcFSMaE7c4uuoW% zRViZSan@5*siHLs8?7}}wX0&iR|BPKs#F~TXl-!V%Kb4cC&}S4$x>$S6-bRL6Od9b z8O9{z5GTfN(j`r^7okarKsXP(u{C=g$^qwde4G%)6syQ`v52f$$_m4ZVCS%8=fIQF zU{f1|4Jv<(gf_7u22W?^W+FAJ{Dvy(CBv{O4$&rdlP+nRT^S8S1j6rg9nY1W^s!#} zlt?YP#1##LSeqt=3t&&PIY1Hla z0KU;{2663cRJ@p$n&~#r-|Ni&6@blFSp7jb$uxS`+z##fZF3=iVzOmUU)W@ZpF|kl z4$mG#ua|+SZtr_2zF7~iTq=uYuUrbT=BMaC(CZ7leS_k{<~8Js*8ChI*xz!$!Az)9 zISPOdEIijOmz<{q1PZT2+Iw+$$zF;L9)kzgoa>w6> zPxhik<+^A=qu3Io4`t?#LTWVVh?IKCaKl81MzNc8Nz?4HXc8h2p0pfRh@2asLIWHD zBaI$pXBmAVwtV3eh$)vqY`cl*>m?97-AQo|&WMrjPf@G_jz#($rI^Nn2i`>Sfprka zy-V>yiWmP$agPge$_+Ne9Bi+V8C#D*oOCP1!aWr0g2s{J*&O(-^B^vi-J^iUsTIVv3`Y3J-4Hj(kvek;#EsI!^Zg-ik{)JY z*+;G)unf94_Jg=>5rUI*66TrVds6X+ViO*}!Wl5CW%Dm7M%eiI<+P7aeu%uVonovO z#25Ed{IM6rH`Y`9f#RFDQ|y6LRphNh5bK-pT!jk)4ZmS%nX40q-H{0JHh{~QU6cFuPf4u@wJ6pX|L+9=q| z?W&*`926+1htr=0lOixFTDQeU^Y*Jv<8L&iN$g;w`6g~Nc*q8`${nx--(53b!S}Q4 zeM>#Z>T%q`gELUrWL|@>nfmZxz?;mI_-3Y$i~+L2tazJYCvIekzjoJj=^}zr;rHx}9yB^~%Kp}D#A!}4ln zcpl~tp4xb-y+k$pyM#d-qPHk|I}0EuyMt=KK+Q;<4i6gD;aS_9SQF2E=^HTmF2%F& zzz92lNg729aBL3Lu%1WM0_PCnv3XP$@|+i?RK;pP7NuM)e$-XB9zokcEmexzR{@ph zpw!3GILQKzbj;kpks874DRYoyJS7Q(p$|dtF#gjhI7a%8GFTW4O~C}r4Eqqk4Er^t z;kS{b--opp2xi#FiF}2m!qmdc4BLs=SgX)v8nFW=YAFV$LYmnYJz71jbDMxqz1Rpd zwY#E5>>pAE-=<{2bY?Ph=O8tL=Tm0WWIQDa<6uE3W=I;b=R*z?2%JQ61MXR**ww7A zI6T)dexb^|`Zw$|eT!`Y{7OR+D8j@UN) zY{R$+DzJg=Om{L0M(}dV>^2!sNy2DOn1gYQ`uJb(9JJ0_g>fG9LSa=y1e~XeQAZn| zyBVdYRVl@)hwaXJMwLR=8yBH;Sd}8ycu>W8R+TDR#XC_tqDob)&&HtioGMkf4ueh3 z^QsiJ9-fBMi>g%HIs}|O;15tWI z&7qAo^IDYNRHY7?T`OUC?aqi>_cuVrTUU~|wYpf-GEjPtR1VbYVO@)hhV%XcnRqX& zb2XGcSSqF7Ssyh)>1Hb*ySa00qkw%fTj!$R6`!E9%>F|l_V||KXJDyYcN=u9=wUea ztG8sd0oF9c&G}}RG#+j@M=s&4iluQM3#P-#nC?SJjUYZtWtfamGM44R;~4BMSCL3ndUetZ#FA7Z;5i2d6AU2 znRXKhGWj0!@S#grCb^oKyB?_#?8ABvhRG-3DM=V-FcylH&a$&lA?GWEh~t=SjO|d& zkThcFplO&u;2KD?Qk!IS51W2h61!23XC^U60fV&ZW$z$#_Z<#)0cX zF+)OX$Vw9#Uch|Nmur!0l z1#0En7b6!RoZO6~Aq)5^3uf+4q(+VTlrf8B_?$$Db6*R!Fn0k&L7c%fV&6iTVxUbb z*oezWBxQy*AOunrb_c?%(_IKs%1qLiSB89Sc_~H8@)T>wl_<^XE1DrYf?RCvUTPTU zv0yr^Gu;tLjbJ`y4w8(gBw>b8lOxM|f#I|(!@dJ{M!fU_AYlT5JJa#_BPz5I(D=Nrk>i#z0gNeq6=_cO6|M> zS1zR!iQWdsr*?T0u~kSk8Y=?Q_2#BN(k1%W1R&iG;02Y^S(q~f*NoKe56<=x!_0Y> zP>=g{M>ypDQV6JLb=+`L?Qj+k!#}CL3UF-qpp=}gwE*>QTvbDnoU`Hh)IKv2C{HVz z(;o{VweQ(2G}I+}CoayZ{k~b|L;IqCfOx6>+iM&8c0fR8O`UZPpmjdEaFE zkQr@v1(3nl=#B!>`%8cf*>{VtV@Dftdc&KY=ObqHf=NI|{5;D?0@1M}ffUTfs__Pk z-VWcVj_ikvq(V}n*X{x`ig$bz5{YiWOOe#`N3QgdXeNLBCbjLoh_tI=ej-?4hWV$-ExH2ho6FrF_WD{S2uQoW^<%T@JsZJZ{vwp3v`k_`QwN?-#R& z@6m(%3%jZPAnPX0GScQB?13*1$pEbJs^4by^vjI21$Nr$)ph=6^=~+*r!8t#PhExZ zQ!H4JDtU-QWZvRp-M&e=PHqPDH{Xs)E}PT^pI~NlQ8nuHW|fPhP};R&@Q|H&U9qJy zr_OXL)xd9~q^)_UJ3bl=SDP-=gz@T>QK=6OK56S-fYE1GIzT1y$)+|9laypQ2GOYV zDwWnSs$1_HrjAagYvR&p)cKZG3-eI5bHD(9=Hk*iA=qnnBms6WTjx8CtyI&x=A@aI z7-_d&g5~)Yx-#?3@5Vv-j)%bj0hAsd-HoMS251j&=B0#MS;IC$ZcQa@$N4pJ0m_(Q zQo$OA+nb>_BOqdH&h3bE4OvuW9TKjHL&!mt!_3?lks9@GM@qe9_}oMYY*nxSA~t)= zkThby202V1Vw3k7l1A*W2os3N*)t+nn)E%BIf;n8M9h8#UdY2yuzGlwnfW+2nhL8q znTpS2?%`sS)jXx0Y>47)uV`1iqCx;SXT4%d#T{^cc#f&O5UO|~cpEP9ijj&FR-stx z6)RS(3?GH(dTp!Nw_*fYReWjq77KV!h?&cGDvjVF%Cs;UPf5Z!<%&?mi%q0>u_^MG zNW&Dfmtna|Cx;>VlNdY@MpuGsMi zrhJb-3ws>ei`o6L%Wh)9bZ%hg?m}t=ODS{6WIQDa!!E<798u2r0ZiaKnE=y>eH$vn z6axYD^uG;w!%+QBJ~Bk}!6E7Zfujjo1~@G)y2c z1JXxx(M9HHyC=KlP^@MJhMLXHjUhFH7g84GBpkD32Oh?uszNbC(ulnPa+pBi9VD%) zV^*0L*!v*MP?fsi!)Pp+j`+_#j)D<9LP(U8@RTHsLoJ44hNKbuYsg^&fkj#H7g>}! zKld{1X+HqWe0c$q%V|nxg>#TxA>z4MJkyf z)TJVdsmnwZQ?H?DyXZ?yUAPmkidevpelT;}AvJ>MQ1(nsz_qD@(Nr3dA!)?!f<|Ei zfp;M-?u{-ouN6~!qO43^DVB(-t3(u2SBog7t`Sj8T}#ovho+Eg|6s#n$1wF{X6^~3 zM({bxo~a4AHdQd1N+U8Pjo9Bn4igA0u88kvZa^2A>%`QP0F|lh#S$@fgNS14MiIr- zO(Ke^n2S2B#@ z+tEelRxx!eYLuzl#1b*}1`);78$}dTw~HvI?x1J~(U+Jyezjq+W0=~KncE(z5v)ns zGc^I%rV2(=X+(yk5u0~!!UO{ELAs|uy2#umruITvnR>HWBBt&ZQB2(>3Ydkr?5nR~_5 z9|0;;?+{DG)H_8KQ|}T{Oubt~F?AnB`$F_3rrtc-FxW9ny_T6G~rXCPcOnpE^G4(-;b_)6u zQ!kok80;9PwqoXXKxzb|ls!`uaBZq!G?hkVNE)%bp;4GX;C)Dyx1o#7N5s_LC@WJR z6-&g_gCdHlkBKOzJ}#n|dWfQZA59?vcs63kF!d8=?iWan;0u&JQxkA)s$evgMr25e z>nY?gfxyx#xZ~UcU1UBbrv3y_nfkO?BBnkgqL_MEL^1VQ5yjLa6z#F-OH4h57ewqB zrmke>UWe2OmQeOgO~AFOg3(kOks)cs-i$_J0)eJ@Ir(X0bdmXjn0fS_%U=C%^)C63cDi}?r5gC$3?Cxk3 zCJ^`l(rtLnXlA}HruIQunfiuUBBs76qL})Yh+^v7B8sW+P_*x-DI`F@)`r23Vd|&M z+%J(D!51lerY7LpRKaK}jmVHRVt)@gOdzlf7xqDTNo!`lFQ)zsP?`FHSR$r=D59A9 zk%(gI$0CZU$0*w4_)37L4!Pbi*fC69#mrrY6z4z6o~a4AHdQd1N+U8Pjo8)F@MrizQ;}2@%EA&qWkdzYtMO{gR@chQ7qqlTGn44i-$O4KueB zQX`m4*)uf(*QN?aQ)xtoq!GIZ8iff2K7`bF6uQX#MojICvNH8su|!P$PDC;FdlALd zA4C*WPg1n^(-eBOYjb?`o(0qSjG6ltQX}{hWzWK_#C@#srTy`nAdf3kr4pUm9#NOAv@ zvS(@nu1yt;rqYNENpZ?TqcDN&R2(0Bu0$7^Av1STJA9J`Rr%xa!aXy?6azlt0QA+@ z*oUbO11d0cDI94iuxH%)MH;cIp=p?6_6kTVappBMBg%j%0A)a? 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 diff --git a/lgsm/lib/ubuntu12.04/amd64/libc.so.6 b/lgsm/lib/ubuntu12.04/amd64/libc.so.6 new file mode 100644 index 0000000000000000000000000000000000000000..c83c7057c810e0a5afd501dd9578bd0a853d29d6 GIT binary patch literal 1807032 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

kp~L!b)GmCc`%w`)Wf-DC&Ah); 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 z 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≶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�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%0D*UW@L842^f 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

CM>7$#fKi&NDcSimS6%Db$w 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

81-BRsqncqQ7Cte}~lhNek$6sj9 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%0DZe-DCf)Gp& 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

YmR^;@pnvq^g3uMC5jGfN>c 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 z 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 U@RaamQ*bwa!J!mb1)>f=F1^q}5+QOhM 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

E)_>EQcX`5hgZ&;Mlh6J3_i0cF~e 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 literal 0 HcmV?d00001 diff --git a/lgsm/lib/ubuntu12.04/amd64/libm.so.6 b/lgsm/lib/ubuntu12.04/amd64/libm.so.6 new file mode 100644 index 0000000000000000000000000000000000000000..3ec2d34207edf68a826a81c41b6ebbff023505c8 GIT binary patch literal 1030512 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

*rn&H_xo{^H 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

-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 z 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 z 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%0A>2e5Z7KHSJ>TVl`aOVB7 zUO@;cJAoNe|MdXoLk;s`mguNKbkr+szqRdT;_IcBpeNlxCPE7Dw;`NYy+!!Ls-*k4 z$-G|Syl!WR!{t4dnNl=cyXSW`MY%gs|04PnqB5;1H*il{C^yiW7q~r*8^!KP)0JYm z;Q5D02TnZ_?|n>C!id0^(4i3QsnP@?{pPMYfgPmG@>B_*JRv#u5O=cddYbH#7TW#) z!ZBjHqIk;hYZZh2j9t(9jFei)ib z9YVd67ufXpZMOcd_gGTuCH<+P{r zdh(mx8+JC_F+Df1Ub@wC^vT?+;kJ6GfGjS)Ef_8kCs4N|Ksc9@YkK&*sbz!t9xA+b{`MW5ZJk#pHunXlGrY|n4I>Jbpo*w+r4%}tbW`p}^;NA=m++U*u zxAT3`Z#=$3>nO&+aw(~pN%GY*QGX#xcdU0l!TFRZzB_`&d5KzFe7oZ@+=gi%ZfXtv zA+A=ZzZo7o{$c!!2t&8U5{Z-8W_+&ElBm^dYyIU(wJsH-oG$*TrG#&cFR;)CJK$ly6Z7tFA zDgvEAu!c%Q)Y|>puDK`4#*wc(?E!e9R|?ztaz!j zU4#)HFLykgUy*3%!&k--(*5qZrfLOGpp$biNHwGDoMDJI!IwWGu+n$S2$UaaY((JT z&7%Vg+=VKjC#}8Fh~w+KK9c(2dA0{_)^ut&yrK=P;imP_Ew9Vz_WiUFnsRiBIH$s_ zJQ=-&(Csil)&Cjwi{))+(~|(+S%`%py^7hdB8Ma-!u+0r@5-=a5rbJh;S@YSl37DmAGwby*+=4Pvs=PiiR8Fa! z%-s*Zss-{fR>FCKBcXdqbXq}mBxnw(;)okervF@BS={?`%-!ljx3o|n&3=$D0Xj6_ zKGC<(e|^v5WITSz!oYu=o|Irpg_^}ES!%ySzG%VE(vq8v6SXX9wX z=J;>1d~yU)$=lCy3}c7BuoFa%&rDqwvIf|mzOb!qzNilS z@sZ>Q&t#b|B*4Qd2NJ-Bdx$U9bSV}Gy@iASywpO6o2h9@@Y}O}dEu7KC%4`Rwx>@A z-*;&j3{_Mt9&d1%p^mhL_Ftl57?gC;8?MP?6#4G=0GkSg<%@-{RRY2~ftSJAg$98@ z&oH;x^kO$%NHFQWZ2Cx(PEb07U^;94!Mk8bjvX2M*&P|;-qoGWM_&8eg=Vp@;X=3f!U^GFx<$4nk;5 zRjV0JOSK{*MItj=5L9kSHw zn=$%$=KlNlB_73SQ<@s1FB^HAS({5c3?*WEceo2e>vZTv%J1U&)mLF9STfV?8Z`=9I6rlV~ zapm7n3s-Mp3|;6#XOrKLYbLNdG}_Fwc3aPWBDVE4?&LVB^=1DR3w@i`f9LYr4q9I> z>itCcO=x;FJKTHWYz+3;Fj6p&7Pa5{&8KetJEv|vU#)*^S`SX7^^>p=faxKSK+<}b z8J*Pkm9Lz#?|*Pn+dIIh=+fdy)cBW3o_Xx`Xf_GS|Lw!v1hHh`a z^;=Kf`k+&{ep`F3TRNCLKHNHkAKE4)!MRTA`-YcJ+4px$sSf+TabG)qw{u|fE#cN7 z|Il6SxBin;w|?oVTQ6>}^-nDw6aM<#0nKk^ODtO2 zvcNE}yxO*IdF4IrxBk;pxBmT8w|?g-TJIm*`W}O%Hsiki#Z&hEBNw$D^xa`UTzyw~ zb|Kbg`^=Rkp+_j~3P!YP1Y>1m7&Fb+#7n~`8Ll{Kc*pd1<>Bi8GkK^9BHm%-;X4M+ z@0*V0R%dNw#}_g6#}|aWC?_!DX-(*PlN=@(iw(Em&6TlZ^5eK#KQri~+R<_4qt#o8 zLTPbB-UjJ6OP#cHFZd)}FgzL&`C|qNF1XeVUbs(@)|WqTDWZcRf72auE85$%z7ijG zSN_cSh2g=mG?5#XKjYeOJ^$3L_dj*(g=*c(pX^84X+0u;nvBlfrthnNdCI>3(bd#D z=zF6SR4aeRKNx8}M*fICB!B*+{np2xy7hslZv9qQJ&whzOjQa+TSwxwnrMVGS{$$@BZe8-{j`mx>?bNLgK6UFqX|Hux z{uGB>m;4DCB(>@L#_6Z*`=4FZb};Un@!n|DcPoD;j}5mj`Ez&strwrV^~+A(`cKQQJY^cj9EzQQv#Twtj#6t@}^i`p{Fi{&Tl=9D5RC zg^-q{Y|nqjS>uGzQ4kci_X*T@jOpS1G+PL}6@r_^z!Dda31Q=q$@ZDa#^+9^DXcr@ z^9yb=qA~O^UO}oiT+k{4S&6%3C=1QU)kt4Q8M_5eBSua5%;e_tSko$ta`V}05k}&M z}_=5^WGrF7=e04 zEKbH6B%6?U#P6&NkXA~r(ZUuvP-N^zg-Jc0OH2qoPA>J$T5Dp=R3EGU&~3PHTHB9# zmv!ld0}53C7ry3Ja}j}hWeaER-*b9G=r=AZJE-tpBl(C-!O*xyCDYJhTsKdu&ov#H z&(~9{$=+WejF_I7@K8SQbdKLK*uf6WqE~0tJ7eaW1j44?JgdIt7VSUsLFPGdh6yYi zs9$gmlBI&)f)ZMRRC0>7KVhl`iB#(~)q2mW-$%6_RG1+9=RYzYJ?WvTyQA?af0pss z!%>A(jK^X-sKg;R<6$r+jGVroL3!$2S@3wCYPZ>*bpeS*v>aGDgei%2Qx&06K8WK-AYcF`n$*qp-zbl(<|3RYd zd@DD*x9NO5J-S^Vg5OYRtveH9aDpDlxY!|i8*#Stm6-keo3-;HD`sS$azx;((SZZ5 ziFLf8jX^c`O5QuQz0)!%`L;dG(3gT0K~JUM-68UtPyK5G>qE{uu=0_ic8spOHDLsVB)%U<^8FsfbNI765$mhU@ zoB?x26bHGRo{)%j9Ngv>oc}S#Y^R-nlt8B%<@#cNB$u}Y}C`$zteCc@nWbpeLPKjpFufO;bEnubA8^# z`&Z>;Zt%&gs=tfxYpZ+8b2GQsB%+H(=i%+fY3+F=s$c<^s<%e*<`~u*B6d zFc&|=PQD|smiNC>XRoWy>D;M&8+*Qc*z;XqzKuQK**I7=S045S_Lug79~t|2?wktK z3^gUlJ0^3*#BILJ=F&TT1DdT3KBu~yF~YN1TzXYrBK~TSaP>2$75W+RPdUjRpOZKj zZ=BK#BKxmyN3h37TYPMXnQ%fZTb_bj|0J6JvkAg4?Ck{ocQ4=ik!&MA3@9d^=q%>%PL{cqNsvtCmBbk!7;{m*@3%Di7P+=U0 zGri#y8|=NeDdSRaq?e&d%x|2y3gXnfuzri*Wb%Zk@F#NH`V6KNMN$+)mx)PKXFRr5 zpC3&dFMV=TXb}vRF47^V7V%_vx}RV}JThLR4flm>H#3{GWqg&pr8>$C3OXt{2-F&G zr_Z0E0-B2*%Nat?H2LGgSW0{8jz{^~mfnbVrMg5wV{4~Nl*I0OTPFMvcNGIyc!S%U z{QsuVMO$zzC3Uwzg^0xNXT??`cy@jsf&b)Bw*IqY>krpUo!Po?vGT|053%LcRaez39we6`=N(_+g< z`Xzjr`cE#jb6Nzy?cpm5*Pkle!&l7qH2QNPGn5lht%dktdeetCD5AULUxw?c*Of6O>phMp2TQ2#H#tqKFd38VjuhV9wDvRGhIDmBAQAkR%u);MCT()}d8fJ2}+0 z){zjx6l4%ZkikFz&r48|$Pj|?{r+peXGn5D@4fY2zx#bW4=3-Q_g;JLwbovH?X`pD zvUkR9NYPr1BscRvw_4RM4K?WUk@LoRPI#sQo}8`Yo@Z$o-@#QQzqrb7@Tey*sK{%0 zCG3y40lk*ilvi(_`?+XkJ<0g%B-%XAJUTS!`jf?`KdRWALjSIIc}_xC4%N$> zAaZNcq=qIdqIc0EToKSEc|~+xGALDz-0gR1zg_8(v@5ACyE2}Y(gG^E4k|oA@s*)+ z)R#i#(R-6Y@6j{9@DLe!C0~yXlwOI=Z6nu*baTJC%Yl4jW839|gM9l+0Er)EHNymJSe+P_S=6y4p|8<& z;iQ~Y=KcxhS_LF9IkR(JT?^{DCSS(xxXXj22R^okRW%x6uOyya1xw#kbPHu2qb_v=aTq8ryLj_8 ze=tAl3Rk#GxT{UhkJYJ93CpPoovN8tby=7?Zg-B8>Lw7WIvEunP)5!sj7uoM$PG5# z%GO&nO?lioF98mW$%s~NJ+whj(U1fXv)5Z}*4v8xb|Fp#it{!H%dbN)Fc8$pPqSMJ zb7?tL2N3b<+DI(iZQOc>(HNe|gf^-3deHI4kpu1_dX!*BKSGP>OBD^t;XIG!$%95( zV7v;Jggk4!?}cjIJw;PZ&KVXPI9;))6*9nLF0YnLl;^6aEZy;P&P|<5RR=FKX?$Ps z+^k$K?*(MHY#D_^Et+vn4JF&GYH#FT>(QQ?*XR+BBWS0|dPFaXb98>d?7L~RU7=Fc z6Hy8f?*+xiFX&8CGANg*Nl_)z`^7-`GrUeY&sE(#n(bjuFW%C zn|c|jT9_3v%*xFoI?->>hVXry~4I_Xw{7FcF@KA6Y-pNG9OH z|6es|Q`IxP+g3&WbGIy-!5ps@qhB^b9^~{a(t?_Y@pMwn#c|Es;pWDVNyn+c!%)a# z-n?>-1sZr60QVs?u`m^$RU<;k|9T@XPO4ca0$}bfcLBgI_WadSiq3Qs99HaUg)=q5 zk+I_`g1az^`nPQnhwuF3;kmHvxtlXr-y z%N58{dImmd70tt$7PLwir=jX{MP4GR4q@Cw54a*Je;-9V8zwk9tqY?*aP7|MAYPI7 z9*2zk`$I-8Cv8TA7YP|UD8tqmosOmpW#{le@Vm977bK+X4);pCo3B33^R(SzzuL_` zP%d&IGLh9#N4W(E{XYN5?^d)SO5&_%e^iDe$zc44RX2<3%rC<{hPlY=2!n|44_Srj z56m|H(B(tNAAU)2AN=8`Bqi_%k^L6@;po==5;xFe9dusk8{Ndm` zlk$hH#b3f7ZvD`$nSTR+`2KfV@P~0~IthQc(&G2SANH)FOaC+cp&HF;TmJAD#r}u+ zL!pMzmOorc^#1w76)G6x4=1bfHvHiz#qNhcoUS@pbfQc9;SasZmYg~#;SbM_qs=z_ z;Q__&hd*ptEin97`NRCoME-EJYqK?f2oSwL{!pf_d?WY+l6{OnTrd^@w&4$_DYi9# zFej4cje+8Nm5WC^@*0d!$U}FGKkObuVRj+LIbt%!M#cI#vpDGZgSky9!ky?)=#;i2 z``{1e+(VCynme|A@rTS+P~rXYhx(Od*bjf0r1bv;f2jR{a{J>CQ0Uu{Wx!T5swv&P3%yDUOjErYT1HUHsAh5!h@W>5veb#u3=k2)3pNr)Zlet1U zi7Ee;#T21kNDCaG{LNh3tk+95#Oa!3eQ4ge3&oELsKuR%>ILAYLXHA+IEm4F%xv4b zW|C)6W_L?y?$W_R9Bh%Txyv~Rarf=y%d|Nwr9J5>Ig5&Hm;D+#yY2-Q9rQQ5pdy;n z=ik(lb>BQG7G?iWC#r8}1=X*;W%)qd$K8@TbVnd1&AO|;SfA-{zOW2#~bGTD=aQalS!Ok2e&EoVkZv|r+!kt3uU&ew{%P?8LDb#-`C!M|7f1Sf29sR z+7_*{pkgMM^Sf6pnTU!$m~wE{nD12W>N;_gUnL-RRsQ9t9aHZ73$sx@=JySMGktBW zzo+c|7mqKXoOD$!tJ>JPZ2Rc0PF~^OZ@cYdnk+|7limYO3!F@^qW#XhDE3VL7^?{q5*-H{Yr~X_=fAspc7QSZ2hKbF*LEx}ckmp*CpY8@zrrsvE zwP{RQS|E!GmhR*|)Q-zh43F5}zvGL+>3SV}(k^a*XU_~yJBPq4Nc;Xg+9lfX%+nT+ z+2&=Fl*E6BoOevz?5?WZoXMHV)9wVlVl;Ykc5mJrh<_EIVi}2j*~?_^R7Qt>JQtX@DJ0bcD3ctRIZF0 z=Rh9>Sk62~@mHU!A6hXe^JJajA!wuwt{n6Q(WRMa8?e8a=Ne68V=twwYg89t*H`O^ zi;m@U3v~S0b1UXJ{8txU%P;%4pxkM`>|bW@-FyCsIm!{e7p0u%R}QLi9gH=5V5?@8 zT{bJ9=1=;xUF1fZ&Y!fm-I#~>)7UjM7H=uB=OaO(Q&vk(K^gzW>QW2NGB>DblQes>G2d3Ox#%9sGVU=q()h`jd`u05)_Qh<_D1v zZ``xj+auhLpI?M|B=Ec-jVEQe!()Ym#jv1t=0suGjVvhYP1OadgR0)IQ0Q{ zHkN)lkD%FoekhdIl+lITNi-mO4N!=d3~2Z%GtRHr0{5ID22^o*-H?iFBNeqnDt^L6 z_A$E0-d$`7PeA4s2tr~wS+OiiMx0GGtM>Z`1@G0|`DVWyefuW3d|???Q1OVZ8D}O` zalfsmAr*5fRwS%98(k#ZaMSF2+dI&d%3dfkOl>R8 z48dfDw)HJc3y!hjIlA*>(A-srW!Uz}@hVXXfGe+!45)VQZuwD0;!hu z$-rq-2XcIJz0x{Tn)wGJ)Q78>&_S8~^cmu_H1h=#hD`l)=E>mq5N2coce5hPt7M@c zr7L%3UZ@5)4XM~ev9!pq-ozh)ASgdiKZMixsf2e#?j}*Qqy8v@_mA`Q zue`iEPQQX>(}XM3&>eJ^gRnV~BO&{^IpdIlF)Nw{uBUq;_ycaRjYbtQf#U$94P06L z9R|_ui4IN{HY(F*`WKws*$*wV&}X!$v>6tf=ZF4ip{LZFN{9QeT;CG+?|9?ij{A|# zhK3HO1nO*oz{je(tM}}UE)K0^x|ZTS3!hMc5v6#SK*<$gvQxbC{Q$U_;+^3KShgwN zNqztvOYx5P17K*1mrkGs1JM2Xoe3`AqIc*eG8X9KWM%qOZ)(c#k|nCUQmWaL4X+WE zPeot4JF&4cFy=b8ZcuuON+RwbKr61|TfNuPF)U$DZ4F4u%CE#sX-wAIhQz^O1~+q({QX-<127BACXBC=9wyg~*cn3QVgbP$n& z29s`QPO3v7-_>1vieqh0QFm5B#S&Z^cP}`2Zb9V`O3*!(xS7wYCeDY8Qh$Ff*tayi zIcLd|CUy}cGoGO`c7>nalJPsfPPVwG^u<Q$2ZwIx;B{LY|kgv~^W$F??% z9Sr_|T*ufO`5ns9voiF7{hw=IzYXj|n#1c+#Fxw)$X8Y5Xa5u_ikdi&c2>a#j}?($ zzOJ;uZLf>=EQRLaUjU)`NkD$CoD59h!{FG~#Q6#<>TIb6X=gzVIW=k$Im=IWcF)dW z+vLp1m{(nYqITad2cG+w3b^M1RxoN*9kq|nmtTVBE9GBrTd?dVqptBhZZxujnfn?N zXuC5qk%NSS333qk=kd1_k-wcS6^(MYvr}6e5#Ne0WbTr?-1SQ)4;qj-Q+~xPb^4>o z3(!jB*meqS8q+tLZv2D%kr&>eaOGo}W?EDE=S;c&8&dhSg9O;!QTHOLiy6$b%e@i*I#%DiybfOJdrPU~?9Gw}d*fMeBUUfzeq1e1# zPtmHK2esQiscuifh&?y}n|j|hqz70Z+NF|j0Rpg&iPJLYvwQu%j-TqoE2x`Yby^>+ z9<&!v>-8BeW^}hP;nS))?PxR#HmC*kcmv&B$njJoMOSkcg3skpJyonC%%G_Ozo`62 zU8HI`7j7)VD~lXgg;SS~15k~4X_0@WDck5+u|Vk78jyasyyE?1|HQIY+? zd235J?;Q)AcL~nx_TbqLI1ie7uK+!9W+J3Vyi+z0uXk|(8)P!(QJVf%%caWEbB0U} z%;1QLp41D(vnH0L^_hzfJgwIj2G{w0;Jwk{T#KPkWB6_0x`zL52#w*n)HKUrEBG5+ zG11XnNnJ<2I|fiX<8s;z>}BzQcc$=xmI=q)Eafe~^Oi9`aWlYg;Q2qdPx19m^dYwZ zglD=UV>?mt4DDFzLn{Zg-_3^R{y#&r)WGgBYQQ0OvIc^c>3dq7XQ3qV#^G=$uGb6H zUD+P`r@(c=}TZ3?a;*;Ad1mT;3m|Z84aT++w99Ifmf)H zy9M*n$PBCU>kWK?+)bek0z_3EP;g5WB_7oRH5LO1k*j7fJ;598HlUiCrLer%>WP7- zY+P0w#>2!ooOF-|`e86UirL+u8^N-4eh~-tEL6Z74OFB0$CmVF`B$JfX<1iM0gLvc zd4~6aFhR6s>CaukFrg#XH^L7po+mYF;+iN)!zv~^J0xKx6V5$ewE+Qj?HCo2S2_&^ zC?Daf&_O3yscLirD>*1qv1{T-MswzYbC`ZIR%&+90tDZ7CJo%d*&^qFlFvoy?eRAJVIEhH@i zkr+LsD$?SUCdf=v_G+re^;3Kqz^j)6ES*f_^6wu$CAosenUX<9W1u%Q7`XIukaF7n z33TU4mpiNOHo?E|k~s$d+!X|UxNo3Isb>W!n85qWXtYL;XEkN3*L`17cHnM*8;ceK zYteKab~8{!4m`mZZEg+Y)o~av0>-WAjDTDw?Yx2c23iok5gsN$IPChlR?u7~FdN~S z4dFRYr%S+DMCS}6I(>H1#ZLkD8Xh@nq9(eDxsMvy7m!&?mcFt`7`Qfgp9$`Ox)r?< zs&2m(z!=?W2Z`>>+-mJvM3+uC9*Kp}7(SfXu2-zMOIs^;;2znZ#4^)iNQBGrHgf=6Ti^~e!1!Z+SSob2IARrgh}dK3^F3z z3V)HcXG##-)Lra2$g)_^lbibf^q%1KTE0)&j=f0w^p~iuDO;YPF;p3WPkz~dfH3x! zeXwjYdwHT#$B{2sK2mOCe8Jj|Fc7hVSSfRWu;r|(Cdl%-?o;nSv>p54&a zGRYfE(O!#btz*r~6W3yl1tS$W#R4E&hp1AdpmnsvGS9NVi51p$=IG#LjJ!hYrrtM1 zQu3oU^(U@?LO;(_U#z2EReX2ogtOeLx{g%Yrwid`y}&<2R{cbO9X1D*|m(d`QN zNab2JD<3N$d&eYq8u2=I_K4%9<;igIAjyHLg~>i-&Ebj%v=Fr|sn2EzL0p#UYW*3Sz4 ztm4GB8R|_LO#1j(s6*nKro2VL%E{ELl4t#dl1pxxMJtfhd<$jc49D$tu#&EA|K7w0hbhZlLOV;-;YLGh51vD67;u5&mH zhm}QIXn}snZk1qLDod+stg9HEsX($$F9ZfF3Sk9#dPBvj!|Sy0nEoVw1Q7a=Qy`$#N9kI$^2 zV+$b=yqul=QB6;5O@RV7t>MjpF}#b1@t_CQ*i|@&^C|3HJnL;J+DH6Vyq+_}3L9+J zI}#dgtp+LlYj(37y2NIAA-&S-u6N@;Td^w&F;3*8bIE9ZFvMq49Gk24mytw@-SKUMp<>O(<2F=n*p?n(B@z)XtgzJ z%5HRTa`eZXmL%RY?7?eA%o#t}){cN*g07B}6x&pY5GSiq>1`;*u2Ii<%7nHA8BRhrZ(3TFh@G@; zQfjtvMb`qw2qn2n=F`?wr@@u$aF0eR+T6P`PkxhyCw71ej9_<+?^^fXXVXx?HB-m_9N@$);ZU8^1`d`-aQHoGE#aV~$SBV8s6BAjE*RtEd!SVIX6sY_i?O# zDD+C7nXU2i^lpr=?- zfo4i|rwyVu6>wDk!qX8s;oI~DQA!z1zzH>xQ0pRPYbOHFCXdKP5xb8h+nRBGuNa z?scj{0vcNp%_}wAu(K{7tYLq<5IK*X6b0uI&s?9Y_$oaVUM%_k9gaarM9Ed8RW0<8 z7!88H{vsU}B(-Jf8G2u>&DW2;Z@ozy4-_!xaGk>XO%DV&iHVY7wa9q=5;;^EYmsab z6!kzm!@2Egrc2uu!A0Fer0j;0hq?iaM0vqRpaA3yQD4kD!&6W|W80?odZ6erh>+w) zefW3w0CY|dO>D$*c>KFd1u6->SUUpvcQU65o@llW0?kDM}GwIvc zGwMy8jebp|p8oyhqaLUD_^5BxW-RHbulUo~HR@{~|Jp|V%X5>DdZOavqaMZ~R`OBb z@Wj`J;d!{q_?qVWcY~6Tx>E7+QJ=+bGx?}*d(O=@^5egicg4rMZ+4Z0Q%U6k-;&e- zr|wzAecPTK>qt)`wl6jAOn9giU~6If(yF1Ip~PZe4TCPFIOjd-Q1~k?h}b#&UNX38 z{}30NvQa@gk-=E_ToZcj3I^9tk%(dG3y^2I&V0@}fTyak8F^?{u>4$sk*#sAVw(z4 zTk!0B`4Ni62A_?AQ)ZyqK&c`5SBj~%2<Bi-)`LAs{!p# zHm3NY`QB`DRxFl<{yhiJ4VFHD4x{Xy;C}f`# zf{$uS?e}}37y^*@x{e-NCx81fklvDikE*{-@~&s2r5|Fu)F$~)e~2dEtxZnr${+i6 zwDKF+Jhe%_JeE9^Jye_I@v*kg)Gn`e<)6j|mcvF7z)4G5wA+L##I^y801T zmVLzJc%uL}IoUP1Jx#NBg1aZfagkw#^j)+0U*l~Mw3@PKd2hN8fQdZYctz?*&$Pp* zfGR@t-1R7p5c!TG4s6|uU3`iBYr$Byuv{UIg+oHH}Qas18-*!3B^O_bR#gt%N4v5w9 zlcQX>5?xKYp8am1+v-Q35m6m3rGgXyfxW98>7({io?zu#w+3~5C2KgRp<8uC>v5Y} zE`5j_cg>81aa+ottiV3TZ8>i2wx4lZjuVdD&$une7=w(n*pjkKFm$TDKb@6i+*am6 zQj(3kNefixsQ$Q3Gqygx^|&oMW3U_ddv7I-+fx2!1@&6{W}NPqkkLX(6A+HPZBI^ z*TTN0VVSR|it&RLEz|$e@_jrb4_K8A%ET5WcDGD6I1`)n8!UZQdPA&%u6|0aP0skR z2oeiS9e4&YpA}+?l$Kul2vn&lZ%MHHYNwJ;UuXFh^MI=%{VJUCS)R$?Qy$et$)kR2 z^~xSg;jAAh*Gi7L8c_(e`n?6Y61-q$7&KQ zs@aD}OEeU{uUyltHrQhwDQf+FJGW^FlS;h}MW|mweM8FCz{!)v@wYjRM+(WgQmH3K zQ{_~J9NOA1ujv%p?i4Y#r>i5*qXI`&*$bHqls7LE%}Ff!%3?r1IakAzS`Qt7(_ymT zPd!OhOSYo_QZGo6^O6{0>E?Y~sMo4zqM*Rg#u5<4JYBTlga~;MIk3tt1%Y zytOzRO~~OPjx;&KGzF33&}Ep$q*G|Cf|h`8N1Y(^CyL|nj8vz!c=0q<|Lwwh)okjO z`IeCSs3n|Ih>&R7nzPc$FB(hYku?Z1Aq=+V`yL#-S_!ZRsF$*9D=sQfS+4} z4}i~tbe@p0jozR$o<2daO$v@?3`T-$+X5;B+ELM@gOJ(8bs>Bpb_mnDpa-) zoPFO;DUm^u*@h5i5)e6QQ&AGjm&{@U+^0o-trORVkQBvRDY*`s^qEukUidx8M-^U_ zn({>3<~uHMx?=4jxJ*DEIm)N(uA|xyNOA5iQD0M?n7q+lqDmT)}K0fDj~pq>1f8XM51GrtBra z3j+daWSMlhOgF~RGmNvYwDcirsljXxmjP}Wa5ds!b3U!kSF!i#X6`@9B$z{AM~0S8 z@_1EwNx{@U@1^ih?~Pa09iWtV3UV+8@4Etlep1sd%txOC2<{>%CPZsp6<%lIa5M9? zgSY{QXbW1Ly_a6lgOKIzZA8!>dZx#M&Gz{$ic(&EIy`}?gcA^jW9HcSS|60*G zyKGQeh@YyS-btfHaC z*xHN~xO<00npu+s#q;0Ohf3o9=L$|BKov2^{vo{c-HwTQ|DulVgfMCsBZ{1vnlY}5 zhn6^=`HS9K(vD|}@6B^Oa{|%uOwD`0+rn433jd&0_`9vbhbdf=))Cje^j1C9p^bPGN^bva}Gch%+N3egkbYyfIx zT~2?SXim|VsLPnYEHnr+R`qde>RbJzKkx2(S#d{k_Zm?X=50|>(fdyaGbikm9H2Kcs;Iv2hLu2Uf9Ac=f zSA-2T#nA;>$x%cOs3YrVH3d1-87lK7k;$r|$PY_#^~lF&z>;ZT;q0O~8xy9XA(KTu zR6$7<%?VA18Vpjoubv`Ebtxpf2^1`4H|tMXf^RFdDOi3hUJq37yAD|Qp6-Apt0|Fr z7Btd^LCb;3aMc4^1IYNBINN$BpK;l{5sNr>jg3ZB+=e6)-Uz%_*x2a#9>GbJ z9j9>dp&}juC|?+&+C-@aHqk>?Nj_HrUL4fKKq9UINF3ML=FdhHB)>m-A0U}#32~6* z9o_;YSDuyxBtoRF?OK5(gPi|vkTCoxG?D@W;mU_b6cFIc(S|R`k)q^ayFS1fOu2;D z>sV0R9GX0Ql7mTu(BuOE_8#$UYf2Pfby49aPVznumT&GN!8vEO!;v%l`3uUXSh%VQ zki}fDcFgX3E>}u4mxKjb^O@c;e!w^1KhVcODccte$b@v;BfJ~}rsGW$2+){OsqENL zOJ3&8s_6@hL<-KT%eaD|RVmt2ob!P=y1A5O6uh_Gl&9)9i|A3wEMr$oSz9{F)D9u= zP#&b?G*e9`aPPYmEAGwlX0Uv=vz=Oixoq!KHS~2x5onh7)jen)?oZId%I+A#%wH@e z^VXoLT!*l*mayz7ooJAItSVnps2mWhuqwwa@LG3pY$$_ew?wyO zXZo{{EWig@N7A2sgzD+gefle5O4T(Ku^)q9GsvWj+41Ca+c}=xP-Oh|I)c=6wD|GG z`qtjFK4jt3TZNBr6+Wa@cq>n+Qdi~ysw6n=HGGduY?8xuBKzjjRroJohpW@I;m_%) zwzzBP_%i-F0n4_yODGBTy0kA7>9a6#&Bh{QTdxsKJzd4pey?u_01HoV6&}|rd}XWf zSqdj$;pbMFu&|cRnPFd7th*AhZx^x1DtoYXLZaLS_TeMA9~~C%x>dEck57!WyM)#A zzlQ(t&3wo3s30phUsp3y|4Lp~zoadhYH)89R#qL}t*pjb-C{(~FBw=;ILKxOojL$_ z(lEMQcDAB09Kj>%P?GNLDDO@V! zr@AG~9RL3*IR&pMM{5P6mhee{i(vBK50B+oj3tG~Tb2-q$FbZnNPx!!-~Foa_z^k( zz3_;mMpCRml$C^QTTe5^kp)g?<7GDCOPDpY!CxyRK}ytF7yCrRgRD82844h91}E^& zHeS~EdBsI3~LvK#Y)vk<3h?P#%0E1>*&fmPLP-J zc>}A}ksSF)#-JK2ckMP^_3~{jsns@`n`mn*Ja@AZjlT0vfN0Ds+)Aog-U5qF{hMMx zE2Lj}Z1A6vK@P$#jO-?SStKwr_85+D8Y5dlCS7CVI;+ob(Q7WBMpYaGlJ>4KHR)$@m#Ry~piG%g?a=sK+SvbU{;1?G@58 z;=eU4>$~khLMG)p7&M(8q<;;2t*wBy77>P_!g6gp3Nh4N$Tocw7d8YM+m0gmK#L?o zMbJQPWk<#J$h7n~?q?|4j+St@r;Y)n|2i7O_dN;UBND#Pi+&g9)U!$dQ000MCj-MZ z`dLlKOb8J*rJVs~eO#(c*k$E42dP^7-=)rdS{_w|m)ScJW(^n!e20FWR>(#i*`e61 z0ZY;be40h9uC3%deqdHr**M6RA-rP)fu6L)H(NaIO3-|su9t&~wdWJXt76BfFL0L) zwAKgL{;sDY6Rybz8fIfDKN8tRdwuQdn{ZA@_e8%pAk!Umq3Kk8yHG;n(`AVLp^FD z{m_K(tyALh%M!j{jedh?j=bD}y}Kz=nH@n#EF6jBBALN!-4*9;3{Gye!?*0Mg2Q%^ z6H$`BZ>zFeE+7a+o7gT2J%Q^+?IQ&{+dJ8|3G4uAxsu~Hc21b|qyy8gk*%XdVSL34 zv617&g>4_%35{4uTGs7qN#Ksq7Q%2b#GnM{5bQqLkg^xuRMSBwkNet+T3*|-ChV{} zIhCC4R@r*7;Z$FQk0{Bsr85BKo`)fPe9Orsh%N)6lN1mAW#^aoNw9pNs6cU!w0J&< z1g9N>Q%wcE2Sx^)mT*acNlRE52!KUPI8>^p{~g&}-0IGmvPI2?|27IVqqu=>7# z7aS%{{%?ZA;nGP&k;3qy@2STL4)PPMWg5qaV-@eiVSBJV;;hLG4(LEwGBJGEpx#Rt zT%5g&`DJTQO{N@T!S{r%f`Roc0;)RZ8l^Q6BxCFI>@e?t%JaD z$fc#p?HsO@VQ|9=$LohGH8Fc-_!>ewRe=m>*X*(LPyl6KbmLl_GmHF4F?2~wT>^lz zZg$J5?pOyt+@B>XoaYhkE1cox9CDr%QzT*OqSzi7p2Yf0%0em{j2!pLJgRLp{l z=9?8y?%k?uiFw&)hx#qm#fI>D#m081Yh@T_R`Ki#+@-t$&v0pnnm;6W*1U4QU~k~J60w8)?itV%EkQed7Ujq$m8z();`;_Cqw`W~^=+?iRl)zg!*!{? zH9VDM`Q}fI=BsxmY7XA9^eM6Q*RWB;-s?!jjF`RG$;h4Zz>Hv&Z6at|WCi}!n1;j~ zkLby?LaHKfkf!U2i_Jo7G=5Yuj+qcM&ziQ=iU!_1Nop2cHd4@;hn4yTqqn$}q8zHo znTMUd-Bs;wJihGTfK1FW>T~6gZ#N1mo3rnF?kKZ+@%>2SIU1!y)3CrxjGL!oQ|HSZ zhZkohT=4|0d%!nFAAm;)X+H*!Gy?(}Gn|G-7HzTNn5C4nLUV)pC-H)Uv)}Q(cg2m= zvNN6W(3bNKwlT_x#}yp!7mS()Ma_Fuk%Ph++g#Po^zCKecOdNPXLSAojvtQ8?ab>1@XzjV#&LXb6|Pr+yt;#%7uQx zq+qcehuTc<11y$ffe+fGV6hxW89u#i6R(9O%zM?f|E(lov6SzTk_;@D7+Hv63kPT^ zktrXy0gJ`oMtpLxSaN-L2bStV31G35)BJ)-!D2af_)8?|BC;HR_d%N!ES95#;ZrNH zxb}}o0v1a-mXu^*xe@}IfGynxmfJVC0gJ_7MtpLxSn`5n9avsICjl&$a=c$KDOfB= zoxenqg2i$??t?ZdSS-h816(Vxxb|_}C3@6?wphwRq{P4iDHg$v@^^fz!vPz-D1Qr< zJp&Vs%Wn;foO}{be++xZg!JcIr$5}%esOvm`^6!db7jAXVIpV#O&qzx*zl{BUopd6 z`7NBd(aag~eJpcE&ivtqnCQ7eQKQHACw^qP_PSgsqA-3ReVW`0rA!Ex_O()Jfy?iZ z+@Du{=UHP0lu6wZC?O_zpG-Ftx|F?H2Mzv zyEj<69`fXT83jv^1fKRy{9S2OEWaC^8K8zi-!=a*x^PM%+DYDIfHykz=gW%a94}|b zL`?LjcL+}Vty+}VtH~qGXg@8mcwAf#!;$uw>CpzS%!xO64c}$&+;N#N_eAY&D&}%A zAeb`f;2FWvH<%F&*7c|;&KsBHySE7P53UN9&Q(%V%r%?f5G>PEsSXxr(t|txEU0v( zzXpfB?NUbV4&KiJjsTc-KRLAbT|4doI=^g^sDAd|$hH+ZYP1wV+cfeQ+NOC%gYR_Dv=)_sZKiG2N=L4@@ z5^3FzwdiBpLiLnpP$#uf+eF)pqsP+T*Ut2P+X0S#hsr*3=oP5F@|L52r-y7n(I_t) z3zC%99cwd!x0K;0@ujQ6q#dQf$-t@9DXC5V)(+@sh+DT`5HX=30XiGg3n0wrnb zs|ctj6&a=P-aH5)Y2Ne#z3m*=tXs^COpu-ztXwd_Kq(8eh0?9<@N2{pCXD=T$}j9O zs8hBwXfJz)(CV@4pk~v1s+VLYz;@1*0m@o+yUTCc1U@v?x3fd1n`LUjt|LoL8Ub_X zQEB=W)-VobTpBTF#4-{%HZjmX8jxa+^SCafGZ#Dc+#iCf+_wk;oahHFA!E8F99O8* zK%G6Gc(&X4pz19u%EUTG_FX+N6Ydep=s@+RP&A_%X2c8M3kzC>E+V$Kgb zg?H%V3tjrRDCs=W(AX^{XI;a=BAOPuDisb&JnL_rO6}nDu1rjS!dqzXE@@SqiqrJa zrf9<94~0;omZXi&1Q9!h&AP#b>0c-C_HeW>=swX=Djj8MClDDst-)gijN)w5C}C+p z-3q!2{Z5&Qmao#H5PJs)$-Y+{s=@~sGFY1wRI(0|=UT#Xg;M9{H3rMy9Oxh^g}Dz& zl612eP%a-G1tkc^KGZa5#o61`4)~_2?t+UoduZV3RgR9GV}?S z2mRCo{Zuse;M#HufHM$wzJujm`um^)f1LeO9FyKuXP7KpScpdWicgl6s8a`?m2{Y6 z{yc0Y_}YIdLh;c^vQ~y!r`s9>on%(HlS_AlwEo?R0Y?WtQEzhSQi3NU>XvIX3R^iG zfuSb_i&2_t(5!qECOYOwcpp%TYI=BHV1C2vq5|{l!RuGcb0XC9NW-S>_KnGiPkxxFPwnz z+##UTDRvSn>)zQWAOs#(Y*QghA^h)_KkF#IULn=nQg#7Nt>BJ{<1OiBF^#(FR!zP1 z8*=}#6y>t>f;x-88|YRIe__8|q_izM_aLWKu{92sy(Wb}TlHhD&0&EZROI&RxV}ap zI2^@ARQ3oQ7neQG|DI$InhvDjBB|;gUBV-@VpDMPKe`)llK{n8*08`x_2sx>8IulHw&F{wWgwjTvr)vNnY~+oC1sSP z1t!uef75dWhI~8rlPxnEGD#E7z2@!5KB#O;3!B|%2~vG$*#|wOZ%G-AIJiI^skpI< zO9)@lD*XLc;XH+V7j-_s3eoRt)o&QAvkf{=A$Nfr%mj}dE9Q$+=e&i%%2)cbDY5hZ z$8;e|+G26wl|^PqrnCLef!Dk0rr}ij@Pnu^r%5 zO#NgKNHrT7z*FQCZ_`OW4uQiTIW4V8kqMV)I2SLHyEZIB5g!pqbz<*4nsG}e1eeqC zy>9qo&cy#ZBmfwN(9fHcJ~c;6hQo2H3=A!uXrCI+k)jO z{SpCk4YygNiwVo@))?ZSxqK&@%URBv$4Z^%)A%O04dTcj5%NQpngmDu;K;tnSzVXt z63u0DcUdCa3=ZQE-ATtvyqYJii*xG4-FO?>d}yvR?uO@ASrxqv!xux95D)v}^-%&} z7<-f9M=hFo>N3VT;L;9|jH*IhWf~!w<=E*U#WqDR`mcd;Q3Dqn0+-?U&rY(MFXh3+e?q-`HNDl_3|62FnXip?bK~ zBBCMGzKv758s)We{&UC&H|AaGyKf?g*tgg?Ec|kX#kD#5aI75V2wVpMP@oYrE~7|! zReI9x8OJJR`&#Y&EuupT+rQr>PXn*{=WNB;X|dye`CII`*(cYmyn>q@cAHQ_%ztLL zZTt42|GC|E&C)A8ZyKHrqWUBORce>i5!WL@ln<9$!C-jc34Dn;k@kDi_+Di?1vva1 z+ZSRQ35etj*02wn&EfQVfRuVY`7KF-A0!5H69Z|9fyV1-Lv_Gd)v5W;`Y9E1o_k8oC~Mul=(|G%c#_b6v`pJ(ThAUSpIUZlZK@g@D1;Jhf=>ohgH#;H}IF;y<||h zf=Qkhv`cBdWnXA}yW+eR!OFX+ipI>qOe|@++uh?eRV7iInE5KL#A;)!X^IaW)CpWY za6d(bg`!!z6;Yg)=u_6K3|whu41pkpgdZV3;~|R|MA#CJNeqM%1N{>N$3z2? zwBdy8@#zzF8x2_M(WuPCb83rYj2&f3wn(WkVE$a(XgN>0r{cZf+_8LS31l*)*$aMhBz=s(T zdwz@4{$42tQ^^n7&TokiZLy2M@DEjnAFTq^$}JNI0m7;ls@Nfn7j!{gb0YadWKu(* zXtZ)yi-Zbnm@uj$J>&Fi-Tc@^2!N)|NeOP~5u-Z@LqMzR(Ul568!W+$&lU#DKj`IB z&-YVZu{sLeY`eFcGciftK_)>6@J1mGFJT)dP%pa1&=x2=zzUKESO@U`>p&S~JT_P@ z@Rp!l(bECz=r59i@&!M2&u*8R6qHT=(oYJ?r$>C#LFw?K1#S*l^J4%8tQNIEQPT&Z z!!i`N<)vg_b%5x3qJc7FNwa`;Tp?J_0)x||ln9oW_^E&MQ(ZA(C3#Gz09G#cv66Kg zRZkfu(=Dou8?QD{vgS&;-0Lr8v-$hP=@fkTpr$F-I^qVLQ`to|2SR7FHAKTKMFSd* zE>ct>T+|pC>YU1eij3;WS%NC=(6c>LD_K}bT3;m7$o!kW57yL#1tWk*cEU}RTx z2?v?dFBm02+G#SSwx|Ny5b3gUE-u(Fmx-}fo31xV_o$2hYy@>VO#&0f1x{evLkR__ zt3yaSe6|`GE6@N>LdXOX@?thqf%A7UA5QeKJIS^e4D?p)X@w@$pq-x}3|FUo?S)1n zPd8F9)R|S*4&;)LX!Jdq@gM?iM(o-`c=2e7K!JJ=NSIV1fZ2kg^HK3)!3I%@pIX6#D$8pvy`>iH^gDPE<^p)d@LTo)?7~m!PTrJ4r8j| z+&+bhH>iqHf89dGwSodYw*9X!R46P{;EaBj=t~ye5(9g9(?zSmWRA6ofmzXj)&_i$ z^}5^%6*uh=aC~D<8^149Tx1Dxq2f7^Pkl%xRMc4Y|L+JD8;acgBoQjUp9zM5R)=8^ z)K;iC-%tGc92fW3Gbw7>i=IORJ_V-G(xK+pzPAafpX60$v~+WYz64& z{M4kN{9=Egynv>^*`TC%2%EN~jUy2rP!R@T|52f03u-;G7raYV{|$1%4+RC*U{blDyCwSEze8eR z<8T%8Q|2WG{u~Xokqa)y@-C@daGE8=<$}+SaZpSq7yQMl|9?j=czc+epCrs|Q8$NH zyFPaK*;3i?te?8dPfg0q0w^ps`$^@3t7#gv{a+&&{C4O*LAm@W2g>I$8Eh+JJ@2PJ z=%*$HYuBaKX0?lo{7F2p+AK4d3xozwf6el?xUD zZ-FwYT(Fx?(b@km7kovzV3o&wv{5$9R%~1@I7id+Uy%#OQeT2xa0M?MN-nrk&BWw_ zD~}}9N-p>fd%{Gy;EfBJ-WGDfgYMi!b_;!$IW0oyM`#fg(Zi1@j7A*hM_i%^>YeKy zz0k^}etrQJb279_e;b{FLYf-q_~J<0nEuBM6xQF^!ayN#6Nl=)fx>4bp^Ir@pzxmJ z5)2gHXcc~@Rd}kxi3SR@)bE&q!m|qP&p_dd^r(SC^KaZiqRvtFW1#TzN5GZ#0aE?TI6(Gopimag^$j*q_}4nd)y6>KcZ!V}C>(IOLS~@w z>Z2Msj=laX1`6j=dxC+&Uu1s=!^~5oF@|}WFtC+@!p+)oMhz4a7^Us1pFbbAun*OI za7w=eWn1`Nexc!J%lCxxW6Sr?wdzgOmTz7Gv9QV)^;fKttDcEwd*UQ!y2mrUeQHwp zXO}?M9Z-<76wRr?vdFOLgUVZzAYV4dNeK2joXmB;2`N` zpQpq)zxh+D^>q!)iB~E)(khsGMq-1rkP_z>z2B zk|Ydrsa@&}I17Ll2{i_>!0r!;Jgrb>wz5k-Oo&v>v5~vHE>EGisb;w*7s{q(>Mi9$ zqM{sH;j>zWPiPemwhDjxGsjp*5f8c8BjV4`><4wrCjA=qE2j_#cg{k?4dF+M z_0Lf-cr5B-y?xt(;3;ZVFLiFB8`L^f(WQvaG=t$_h20F$GtpP6dF%#>#`@Rs=}-J6 zXAfJP2A)7LCCV!5(0Fd<{>!Sn@Q`PvoHB#Z0q_codupXSjT8&!|N@XnT zLF$5HU?+F!^c`x8XRHa zI6y{sN(9I+?*FO)8BWe`FhG)QCP%&}fVACA4pn@7GuaQn32_V=TNww)zBiNoqPf1o zo5`EsWn69e)g_9J@v9>aR>(G!Kj9*hFS#bMb{EUn6M8atui^ikL{l#l0|x9~DzN6; zqY~OP_~!K+h>kb72Jajcht*=Vo?zy6tnG2ls@|D-H97}B-t#!cl7e-n<92}~cmbx` z_oB@9<|7`<2~O{(ci0HcBjg>bfNp{MTeUUbg>u$qvX8rrAQ^{SeY5hp{^YI4v(P>h zpZ_457!_~5^WNcfxNJPXj03Yo+^TUG?L$4<(`8uhj&}rv;!A3H-f5_wt<%M#Cb!3Z zO?lQ1%UDXDnkKHR11Xj<8soP#HKC=)a3a<4&tTaA z>#p?*hB+*7zVaSCtnZKgyt8TYTL8nm7C!>PvhOhT1b+<}IAWDu=Ut8OCO)~y>7C|2 zu?P0n;T_c(S9$-^XH)h9FMqlJ@eEfCNW@;!YpStN&TzcN?o)M!H(0FdJURY3bEU;9 zL-*CO3_DiEV&75*wbV;4u4LO>=jE@lPfi29BlW4|OJu#Lk3UPv?uL=K)IQZ@zi|cm3Mec)ggLWJ8iyVK7L z)S;Np$D6kGY!bbbq00$buiQ`8&wbNcSLwOY4*0qid8b3Kf`Y|+0#|d%pmlYhD73bJ z=yJ4PdfmxkOYdSZP*o)OfzVqe8OK@`T4Dp| znk6LMtX7n;aUKcWgLTVh+r9fl&=-d>fxE3-OnIERY%g=Z@9@RTYt%#u9xB@v#ttV5F!kolf%(B-@ND#+b~MOs%Yuqe%_miNey_<) zi#+@E7rJjSER%>dBKRGWS-@|`XjLhlbYr-7?8T)kgJp-bx6TJ%nyb3FFVP$hT%uf! zp}7s3zrOtxsts@TMoEA>b^<-M;dYP4ca6uZ#wXP)=Ju+D8arBzytSpfD+5(Gy|7!O zyoRgXsUIB4jZjLxx*CephzBEDe)bQpAB@psXhSj&QqDVwmB+4wG&PgzI!xNh>s{Ps zVN1dPO>}h&DHKRc9c~qbbxl^j#Btk+YF*!gDh>Ql>B=v0SUR&tx~M!{aSfK#0GZGPVAUHs46TVOLgS2 z-&)rk4uB8dXH+FSQ_77}2b#k(y%9LriqC5x6pe4Pyc6h!b^H(fRWAm{I$pHGJKN@7 z@wuZ~^@B^o$nz)D50a|KfD}39# z+45RHQWUSZhZ@7Fe}1+@iuY1NJ@m7Vv$AOV{YoE9U(NkneEkh~%Q}1cP^gtnmaXWY zxj7oJ`WZmf#K8%;@}R0~;%NfCNYq?ZP1QQzn*n>ABP|$9lsn+fJd_|T4IEF41(m}H zRENJnVtgp4Bb!jT3+F^t>)IEL0K=hUJlipM>JQrM24lepZXOo}K2w_|X&s5~Fli=l zYv2)i#5+nXNyAH>?qpH@Qst6DQ@5UERaDD!0@6CWqZ!oG^hti zdZ_j#Tycin{_|;iK$(UM3?B*CqzEd5q@H(r| zytV0y{1)9_|E*#97-`)D&noX)J)Q?`#oMVCx)D>u;({k^O%2NIN8Z@Vq8=#nUDPtL z^kWgx^JyelR_iaCp{mkH)*ZiN03xq<+IW^LxHP=UyD?5jsX2E>G(IIBU%JwInA%a* zK?9%$1(#he=QgD@L>zd(m~!evV|ebEvxvxef2IwGC#Av}CDu0YVTt0L93#Z-M?b@0 zXGS`2`(m$Or@N;{@d6d$F{y?*wjNXaSry^=UcY4P32{JDfQbVY&2Clc4a>AZ$1GPe) zIWVRe;te!B?molsun_%ncW*LAuPeR~#SYo3lML3|i7^9uKFKur6#K)sn1ruRu}4uf zkz&{N_=*(!EVcQi6#F>k`fs7wZ#_XvKE-}5_8rQ7>rLSCpQqR$`Q56`r`$IlFGT-S zD@4CDV@$Uwk-AdtIU*H;NXf6M1fW-hh~WG{=Eh-_=&PYNy0-3-$S)1yox~c&c*F>B zy%{s@?!x%Zk9SBJcayNluzg?xA)7d9gTuLzku$d#Qn|(_&@5}RXq$Io9PcQdyYn{; zYG3?hg)c9$t{NUO`WLwG4eEhAc&EneiA?$=))XQ}e0{NN5IJ0Kr0_zat1NzklY991 zTB62%d_74O?-yT9x-c9?q8NA__z7K|>-sMN_zNTphEgTz0_BE84-oTclQ7`@P}(&T zBzhy|aws@g)X7O1zJwv>OpW7JqfyeLz@4%0P++C02Y!Qpd#z88wE4)!_kq9_zqPO{J@g1~d_{gyNj{2_sVs4LA7W z#CuMhKxp5WIKe#DsRAE47aS|({Hx7)oC@FBeatbF>f75r^wg@?1Z`uX7hVQ(8h&70 z6fFHG#rB7wAN}>q5p*z}8Fyn61Vz*+25+K-@w&+Qn+3 zCE(}J9DYV#_3=~uIZ9u9e;jQ^5^xMZZU4S__)z@bKPg}(AXo*@AbQ=+aqr%H2JGE? z!I{Bn)5*iNxfy_`8BY0zgxY!6|cDI-JdD0r4CR4y3K;a2dC^Ho0ZM z-YXmEB)m8U*TEQM9ZoaBX@5DGLR|P~^|U{R)uXnWvEKm7x2Yc`X@PsKKWPKpUrF=A z(3!UAw7RrIWXOZbrd8(TcM+TwT3JoFFskRixE39OMn;5R;4pFkE6dal?5EiYBL8Tl zn4R3t?zFLpH)VLL%`6SWwJb@y!8d6p+XR#Rn^j$XSO#74{4gT4l6Teg6!|=MkE{5r z$M5Q?2XNtR2at8rFa$oxChwbe6v%GjHx90MFT0!`%w!kIesI9<8#)XOPXC#JT9TH# zjja`ME6(wP)0XI{k{566DK@UW&U=)an|NA%((`6Z$;nSiTGmo+#+q6FxJ@uMuZ<9C z^is(Etg2h_I;Gyp`>)}cK)#on9K-F&dt-Wu1i)@p8Kv8yf>~oiXvkGbI-ZV$+}xIZs|_ANp}tGQ~NVg6b*&0$`Z9%=LO^B9yEM96+b z4w0wqF;ml>{2CDF2d7`cGNtXn5OvBcT*mR*$(>G@%@o!8rO+v((hMoQi zT|uOJ+@&-Vr#0x12&4?BPGej)MqFtJE3Z0$zBlEi-|!Fp&7R3lS?s(iKoFZ)QOr?H z?l2TkSq~Y73+z>2~;?*by6 z-_8NMj{9YPaQfvPNMUaOa)477O|7MaPUo}L@Y6)uY@D8QsCZC8Ws$buMfhh;3!MG) z4k?rBJJ2o<^oHk142P*`XCF9;B*jI;Cq%CtdNb5XjO~4;+Tf_iZKK=!m0%=G?#g%o>Bz9Hiu|rWTgijd-+-vkq4#9 z>>#R1(J1?~I7GE{nTQfv@Cz)XtY?KDcvzJJC5&sGp>nb#2jok`7_5$9*=Q-D+Y{jA z6%Q|GIS^)f5xgA)S!qv#*3o7)iC_=y)nmvleIGmVoNs}!)#`MsF<5%4@Kg7ns5>%c^%n`}??f&3 z{--{=#LFqRT8;Is}R~X)kN^ z93ySnb!8lWh3jmMW<2$x!C!hlmGLWx7N#p1tAgd1%f5-2pFC)Dk~>^w#jls5 z5vvbnT&sA6`MxpX+w%MIT{;140YRPDj=;rhfb~Y0ovX(NmQ?PB7pNc2*fU+V7%!C_ z`O;ACxU;B1q7%my!l*RnHF6W@n^dvbTguVV0|p)FMkZTh(AL;Mo#WRKIHC6fuh7t; z6w>DOzS$zWQS=$S66|Bfy}#kGz{#6;s52m{w;kJ)xE?vx=D#MAP4 zgA$K)D!Yr6Q5wMF9M%Ghq$#gHc<)F7x5pnl*5$;rcX*K_l+i^!I%6@Jn;=eH z;vki^%)}s1)snq92kOZXd)NZ5(t@WR+=@wB(Ta7VaH`(<;2T-moff?gsu+=+?|{1d zFAk`havVm-BoIa_euigLDpTTu$SF^8s!$D2k{*IO=X)pGD}ob*=Rhsv1=S@Z*dF1G zm#1-F(5EF`yeBxV8VP!Ud*bClk;sNC-tkH}5sm4)gb_EW9!RZQGdV?QEOZppWx1^! z3qmnh6xMsUaPI2l8^*V4tceCEs`P$EgMz6hA?J57^^}fG;n-=pFA~i#0#*7edVB+% zEznJwL7N*ulc~40(@{ewx5=+i%82cb9iAaRDJEH*lh;Yw(9^yEnU;ZW!%x!)S|g=z(%vSaxIU!b!z4;`{dfGlT4n zlx@lU;L%U-dr+}`Ny_J~5xJ?8BMqJx&1=Rt-GB{gqIbPnGv;4IKV&G*YYI+*79)Jz z&o4WCx;h_@%8|NPE*Qu5yCkdxNCRe}w=xb9TWoM>ZBuBzUEyx;J|kHJji^7Wylv+* ze_4D!3#+}CKo%20@hERInRS(w!^f{~v?XI8S>r2hCdUPBE9xBiHlqX6$>wIa*devr z2I-Mh=J;(2xLNdPPSnZQJo;P3rfls8K4*G%v-&@ETY;k7UsKXps$?ScKA?@ZMB0+p zhWjj5gT!Q&D%(mXb7fK1gxGf|tMre+fOuF1_sNu5m+*9o%JCG{aRrJ8OLTk=RU>0o z|Da~-FxCsPS*!cOnPkY>#M{qP#v{-M%kJQJ(nq?Ouq;^mJ@dgkFvWXcb`heCQtECJ zaYW)hg4R#ju3_oY;I^7Bg`6{`1C|RJxVsIuq(@;o!fSU^}1)aQ3*H_XPi9M(9JoDUzim6FI1Z#KiPl-3r5(z z&|eCD&qn|5P~Kf8k{c=|^C%~D^ze{bhEn!$Jt>4;k7)Y7mcgO4gik}nyEe-p)wZ4o zYU`;!&kvTZL;&z6nB^1?QhRg3Y+OlswU@mUEc*ZE`{l+0_o@~$^oH$;2P!}A zFL`svGH_*#Mn7gZAzNTx{=wq&W9Eb7SiSOXCc-d6j+C@*H`5c8o_Ux*g>!fC9!9YI zN6f7q=v<(UCB*d6$v_qR3`D=Exk-)0zj7u4eWu$@EPa;DVk=1FiF{IWMfXVhub^ex zOK6AgI28L*+pFvGFjN60G!iWTE=^k7hid*=I=$4kHU;9*{$|8+>)@0MuqIeGNw`zr zK3I0J>Rl>^CBoh{AdvBt!OQDaSd)>fOz+6=A{Zf`uYYTNQ z1x=VteY7;7Jp(eDAXfSjHs?*m=JqN#l8|+XQB)njLFl9l0QlP+MI~1`xg1qxc}GP< z*dH1%+pByoL5e8~gA&rYaPoZ_MPl?bMkG|E7B8nFwvMJ|olQocO2RUYwlds4Dvo6- zvWN&MB=Nh?NCH=&+8oToeLyUla>wReoHcT)Gf^qaEZ4VKkm&F7VUY@n5M?ZCBVbVK{G9_&Sm^=3>-2qk?d9*#j+ znxQPaO0~Q?(PV$L3B8e?ltip6%YluP$dYswX&tXO>YNsM)N&az+nF;8D=DWqM=2-8Swz9n{vaK-9+~+> zvM+z7;c&VwAs0G}(P{K9x9YbVEw(wB)u?|C1|EHDJN|1jFN|C?zRj44_Q%;`e3PT& zTP=Vx>4)xfe8DLrz}H~e<@}nd(@5-gy)~@(vKj83>7VODgI=PY02ofuXU5)p1yO^h zHU_eu@>Ow@Qz;pF-`R^V_UbTwXSV=ecBM$L?0b?YWFHS3nfVmowghf1(rr{6`Mw|;%;*VXiX3S*76`U!J{90=P%ANC21iIp!jck`-JRr453UUM{#tO12 zgIke{_c!?A;xTujjT4c8QUR49#>P0abt)@a0O7|Tl_?+C#OV<=KDZ^078tZqGD2Ys zn;j!UxA1ZY&XXb4hQ-|kRYsBq*kDt#pl`v44nnr`H^G4+Pm*_^Z0M7cFJnWWPZ0gP z4Q#Qd|LU3!JVW%p7tmy9@;@`OW-(j9gQ16!Yq*6X{PLQy*0-w8WH^kX?+;X!anqtt zyuV1Ohx%va!L6Q>CZ)EhZ<+#SCfsB+74IMw=AtOLm8J&iI3F_r88PEEnla#3pa zc&!n(??SR#?;S~%6uvp3aEc25om#E8C%AS4yC~?Us%Wk^kE$)Tzn{7)F;y}pl?J{= zrE!|%ROTk6u(xVUo1ZH-Byu#^(PKxOjg(8K@vck!%$B{#fo10Vp{gz*Bp}Y zOhUqGN_a9lj2?bRdnb0ZLedKz{i%vcW!oGM9HwGsuFcXIt_0tj&AXd~Du*EChNaR5eEl3;cvb5)%HZggFlH0-rq=Z~SLUcqQ8BryQmQCKDS2{b&c=+*c`< z2wV&*jOmFpG-H)B_woI!eW02=OrXG+(p8< z4jO^HgoF>2a4{#?EzYZDX}(yNKmUilH-W3FTK~pTq)@|6DP}h*O;ivhwJdSC%af3p zXqE$zIOUL)N1LY4aQisDJ~C1Be4^%Gn&1S;dL}_q*0UaGdVv z{_cDG-S_i;{uXENy~bxf>sf0((^?CRs!};qBL>tLy~}3crm&0cIwBJd)&d6W_b|!~ zTkuDC#cJWU9w|`@%vb4g*;*Xzq#Q-=mC=%OwAKMf9E~96aR33jBdUyDyFP~xq;q** zJ)PteeCTu*S8v70wTYRSywjD@(y&#+gln@?M&fJ<$n~^SdWYg*4%#0_<4(^ih=cTK zp<)kqN=WCJh~Z`d`xW$hH2umI9rkOOl<)_876c>Na%d-W!Rb+L&&G1Wg<=Ae5hbTbLUyA>aC$sYfdTLv zn2MGH+{r}jfa`@>0lHR1kS_vvDf{+%v&_n? z^(e}K*B*o|g&-|12Je`MrJ=JwFoT)Ia`;s_HeAA@IJ6)@^+zu%&m}U4HqB+@@Yc+U zO1D^=X2Aes^N)ke+d_N)O~VfF&RIr^JWwOTV!7Zh6z-(GZS)S%Km0SigDk5eQ8C+t z_@^0$egNGZM;Lma<5vMes~#}G{v3}IEm}fT#hi8hX`uwY=SORhJ3rKdUa7zm-gPs> z`HlDQ?A~R1BYaFH)U(tvQxin36T>NAM!2vgtkm_*>owX80VMQh`l{=@jmthil=`Fxx zsF3HN6ln=wgXT(0@M~;06}@cZKho5;mtuP)|$r zp-t6`ad!=)?5a({yXZ{-P5uzm64*u#DnqZ!c?{w*B|F=^gat&+OLRJiv_dy^if>SF z?L!FsZVVZ&Ucc)^`bePmN-DN^?Fq!Yi(29g1ZnY8@EZ@8gRN@4aJjac2n|lxzmt^V zFP)QUzx=}B3*%2Kx|p1bXRYTY^tiNN_MEQ}sh(*2b+qyaV(V$eX2ZmV>9E6rI_^U( zZJ1Rd5a;AX0s$)&dxv1sp(>n{8lCvK8-PP215!N&Fm5j~TfH5{+VZiSb|Ec(irrXJw}f-SO~IFNmJ7U=T%C5$ zlbG9np&oPG4Rjsmkjg7uDVH#6Zc;9hDlSNDK!pUZbDPvPQ~xO2sI*PM!dcV=6cJxe z6?nJBLdk;I5*drDgVT8&Q9cyS53&@o}yIpwdUdWm?;;26T~<4AnHdg&Gj{0=3< zpN0G)5cr|0$3P(WFKO{`N`QJviyr{46L`}j}&3z4?;L5X;4|F7T3yH5kEvmwMLF1L14mN zJqID+2p7MOZ?1918kx*+eq)V%-R@ncH^Tj_n0szqBe_0uzZxfYS|RLIe0!=%#K!>( z$RVUkKSY3S`~uq{9ViH|RB=IqEMv{`BI9{fY9Zv*YzZ&y<@lygf#HX6gyH;#AHs3F zcbVP@H3bmk5a>jvd{*ekLU@%{TKXZ3VfoNZyGxk=ApU@fvInFe0yqKedjywx zF9k?;z)`O2P4Q*d9+-NTyD=lioiB>J#kdOwq?oaWRkN8`r1Ehc+|A=|Gg5KZ`acWM8~xh9Gw%AKWG$fydQbIvf^9uh+VN^d0;GRwxe50ePaQs# zZ;}b!HugH3&8H|vTd^3w(q{9re1XlTH(oGq()8u9d(&p~K5Bu@X5q*Nn@ysuxIf8B z*=_td;ttFNS|lF=gSx?IxH`qGki7;*BdaN{8im>BOQwT-4vm$a)utD^*1f|l>I?p< z)dqf@WDlr4OCO9)XgCedFxr4u$WTTbDJ5i@B0aGuPMU2XFhKPMu%uDNxM>ll8x}^> zO&_dP6ecda_T7#NH%-P+V+O^AwA>7!2r(cGTuCGr?LJDP!sa=;s*}>8h@)-|CoMv= zhcEKC;AfD7W9;Unc03P)Q9kUuAWk8{{+L$Uho}UG$Dm5L@_Q|zm95^#RlP1zthY)! zxniME5(_vP!@uGK?k}g5;`ql^Ilqsly#_Pj8?Q=8PN93LA*kn8^;}B(iuu4u-k>JT zev^<~j%4sL!P{)snH4kSKwe%B5Xkmx3JEDD`QozPV10REsIz-kpq@*EU0fXyRy!3#l-TtD(T-D#`95*mXO7D4$G$n z`_5#&#ty?QjADSFX?Z*s(_mvBdyx*ipS{e2SsEC!hN3*i)wU&^E=1;O*!r=^hM?--Rh9MD3NMt~y)QS2- zp;W?kxG|C#WrAj8nVoMg)BS$JFSCP?q#AU=dzSM!D?(3)S{X4tYt2Yu=qr<_W68gQ zb^tNqJrL`jgb=J?IOvG>g0NiOSs|w97Q1Ytm~9@WKIT}@2)L~wm-`SzSTW_fy1cJZ?*5DCGpmA1Fh9TcJ{-2F4oV zHk9%F#(NLD_ttjrU5;b9FM{@oEDEfK(&}i%wMA4SSfRn;DF;cD?w7!KeU&-kCsO^s z6sYK6Mxikswd_N9zeS7(3n1Z*1h32O#gRB2vk#=bS~&m9^l%wLns!K=nf_uJv{}-z z9cx(#nIVJ$WG2i7zl($=(@-eiX^{>=ReS4W;ex;v-!Vn4??D-k@74Tf33!jRy~C!d z&S2iQ9F6e`#<`xp`vKfebvW;4hBlnfc!({Q?nvtRA08Q#i$9n3C@<5*J9wa=!k>k! z2`;(h&6&mlv(oZ%8OptV7*BBLz|FK+jIb)T45M`fO9QVXr&$w@AEo42P!mBpg*645 zFvl>sR(Xf+hbYe6yt>%c-6ZS1AHF$`p_n2feeI+{3;<}V)&-u2wWK}&spvGO#&u7+sTHw$28K@IEwcj8PPo$-dK^?1(5L0- z-=_KR%7}*M&%5vT&ENgPU)TItS@vJm{O{s!)BN{jL__m~+T6bRHJZYN-Y0h8RQPqK0 zkRus1iNydd46`Q<-Z&A1zH_ibhr(TI0K84p4VyNvT}Bp8BlJ_jL92MuJ5Q#DI*V#G zO4ss04vH+0TIsJy^&FQ*?nMfr`UNTIDY=MW@GptPUN$Pd^0~odFzw>e$VtyeEU>WA zKodu$2^a68kP&b$avIrC3AgnS?bIsf@!Z0~uNi+hr{@n+b`n z_$7~@QR)CXesSLd3|;s;!qs-`L@a04ko_>09Fl9bG~qxT=jK1$PKYPAW^je&;V~Cm zQc+WhU*zAe^efo*Cs`C!#J#Q#%0{Lblc`Ku6_$NNniz0pTV7l(N%YoA3nWOJ5=>q`5{wIeYma5CcbZ z?1Cc;VjX)Bk^O3(Mk42B~35VMOipbV?^Ezy!LdlNmr^_ z=?RAp@ZYmp?suzzF$k3sW~}X5OwlLAX)&IeCT?+hB#a9#_9b9_l_?{==o|_+4LEgj zIM5@}=_RHIyR;ubU6aYsP!2vq2d%mn#vWs%!COt0L1369@1REhZ%gb(J{(D4y^|4c z>tuviFvEN+ajwZDYUJlb%$JUutin44pCN8-RP%8D3N{2q!})0{Ai;q1gmmmkaHO|N z2l`4%5u1K09J|qQWeQ;!hHi7Pec%M}gCrE_w<0>ugEYt>ZZiY6n&YVG1_pi zV2s>_h8(Wp9t&kLvh49H0RHaKml(m2cRBEFC8I_pf~!2M+@`K;C#M<>MsqyziEv2t z(XRa*4{(cTq%Sxsc;d*CQ6{iJ*ui1h!Or{uaVqwocLzy<07fllGyEV3Gh#f;*{dbY zHe!1ju__x|hBPpHpp{y}FGytIElj}~0^e4GfbMT`5M)GHr-GCvhsXZ%yhQo{-XlFL z)rIcO!-!%|k&Fa;c@2OpB2vhcbqEdPt0OEu62bM1o6H0z5$V~JxaJyKhLHO7MgVZv zA?y%~!fcOTCZ`L^JC8{kUP=7HRLc9}c_uB1G!s2?9w1WZ0^SyH7)Xq64go%wu1@F* zc{u|nea!42BWyDO@k>#I_u13R^0$^O^y0y!gTkHyEHAIO9SK z#N^iu{y!Ssg3CGB56I}X3p5Wwaub5-Uye-=z6Z2~_T4x`U@c1@Oqpab4x^*1XD-@8 z-?~~~$SuQpxErK^NC=mGuyF9SfAozKD8{pz?%3c-F#`q3X{P5>49$iUd!+9!E#bX~ zWhFerh()t9kYsL1IOYlNG^RP7hepXZL-T=IL^cUET|=2%p`fs!$%#8FaL)uQ!umA> z`4I|agjK@q&5e3l=n!_y0ky`a4~EkxRA7)wys`0-cQ_D#++2yE4k3rwZgiU$y_@Np zIT%arWzbzd+DvaUb~V<5oV}C;eF-MlE9wFFtCo(Bk}akAV852I(idNlS)XF4E^kJ` zywXIqAEhY&CPv{1n+q@3NG}M( zVW-$~Y!3@LfpTEep-16-crAVyeo+Zb^`YDK z(a`qL4h4)ZWO;JEUE(5f=Jb0u7g$%f4^|M@JPVKVzLcn;)xwnG%zWcRv6jkn@p94W zNInh$Tu!md@Iqq?6AiG1@mujo#NHOPv=~LjdE_~vP8bsqZ~_7AJc<#ZEq@n`KgPdX zQ64~ulwQ(Us$KgP!A^tZm$cZW%_Xq?)}w~l;zlxX*+vfp;*hlXGy=4XmG=R`QvSul zgl->zMHE6{8(=PG2Q-SF>B9&(F;D)T3qLzD4ZGqp2Efe8X>_eCQn)nZnK0ay0}|nyQ6Ee;%G_Mn5rTn>8B4E%fXKQ zO%TI*MJHWTh?wf3b>I&+QAK0JER6n<&#_mr^BMtkkRHpn8=lQ_PQ_#i{E+v7nX2P*4lGXJVRICc9xMGEmo5 ziE*b{^HHW>FjLq~c%ckc6W&%W;VAoz=5S6UG~$GyB5;nNJQA9$mCd<)_pgc+VVOf9 zz;NyPU$=9dx;PDE5qNFv>WLHK+#pLyv=L0KLn@!r|Kwcsgbg z?r0bt#sds22$7IyqJc)R4P5P80+-SlVv{Sm2&1g}^TuUbBm)qJv zIa~}T1#lu(vZ7t@3nvG3ckmfji=hGTSn;S1GQumEVZNnWLI;CK#jYuXD?kjFMDVDs z&;VwI;0Xlr?J$2NavBhGBSIt|fRO8vQ84nqhm5=C-3A#|a~aWqjFCO~jr+H5fsD>* zz<&xE))D_bWYo>M4Khy4hz4X>z{=eY8NJbf{}eK=4gc>UqjL6bkWnZj8jw-+PmnPL z4fszXV-L@a_}`c_T5_j@ZQ_tqL%&nAhzxAxy>ZUiAtMZAT+$N00RLG}8JKS6;%m$q zo4|E3?hxj@t8(JXf{B44m@nyyino)P_rPUKr4{#2P@m5!25%JJA+m5{LkdUi5WAnd zN4e7zYZH8S2E%-uK3rY5R|4h(8gtCh@OgtZ!0QyAkh)rilrfFmA(%zh9_9+Lbnv>v zhG4S!%3^{V;YbF_0gIsIO=zc32F-hM$n4A|-VC_CW{4$&RWI9{ZgM9m;MbDgiq~X&CKiw?UgC(}Of9cTzb7 zc0?-o_yb#-6eD0lcXc27492tcf*VWg)d9)jles<#gCfyg3veh9(oZj!1}gI8zFVUf zM$AWkm$5IQIq-+j7h@BK^h<)fMbk&Uq`J+vO*S5J_5Ltg{F~|~jU0Ut!U;qufuKt1 zWM}~-qDBwS;dHC-7{78svNq_Z-fv?B!?Vvrel*Z%WH|+JbfV;BA{48T) zUXtzuugWO>5bmPDc^=SGsuqI?sD*?;rO!c>;de{2rp~wFZUz@K`bu)B`c?hrbkag3 z?Pe82Ik$kJ(huMsjT_5rNVmQ|-B;MYb^CM^>eIb~D@Jag?!NkT6R`irNCyJi$!72@ zuif}_$sYnNgV)yE1OImZVIamIpJoS8|9L=(IBvebN(sTK#Zo-2IJ*oiVq>PVf|#jt zq+bqYGPfOrZ890))FOP zs}^|sd}z%n^wmp%m+#)FB)^39Ob5B+b>@aBjb`G&bT`HlBjyZ0CD-lMkw<&^rN zEYafjcoHV5d`Oe9VQSOf+7h={9`V@m=rlx2_Zc7uNK?q!&QOJ%5-s7B;;oA@YfBLj zN@tvJlrB5CqYI9J&on8`24>^`eGzalb&CxmAWvFBSIiFrqA>4JVSytN29Kp;h$0{) zH9HZI8X`I;Q3RCt8cGq6lYXu51uf}LiegG`P=X!NO2Lk5u0B{6E>l4ZWb-&Zm`FH} zGT{NG#l$qrZDG*E0Z5q#H*~2qkSpgsMGA>T*RV7Qn8aSW>~-d&`U!hv8;iofJFZv_5(+93SN~F4JgokZjXZEC;w6u zye^CX%TVy~#M_|2EF&6FVE!j4xEk=6qG0APT%P_jD7b}Rz=zKh1-I}ENRSZ*3g8zo z8OGH5fpCLgz;y6RjN21OJuOU1-aOWZUIF;Il|uj~xggpF4MkBYOhGho-7keF!#M!4 z*uxH~2Um8(NMtDW2N((^WqIO^izy$=43$eXEmADQ#LM%M5R3(r^9&cg4q?Zz(m)3a zRVV5_EG4ANuqM*jg?b=VV3mUbp${Af#l4nacsLEwT+Uh1f< zF1z(pM_Gcu%m=yYTgmcLN|II(?z3_QLqcEci4Q|qBAPb>+&m}F=_QsAi6MTTq+rVVbT>Vgl|PnFlrWxHSe!n?QF~cxN@xU?wioV9f}O&(p9Scb z^va!SWLTwO4x@(Lry@-qxG;!17s!xF30N)wo|Mv4AfW%=3_l<;MQS7DK{L{qAHE{} zEr)Tm0O^wSNV;T>pP9p)VM!Y!<#%PWV`On7qc|KcZ+QrEOaS{E8!=W zVCnX_5o46il(KBg6jicq7`OrwfXw-l4et5Y-_c+yp)SMqpc_J!C5C-V%ZxDwNdG`P z=OrqY7y(OV2zr4@pt(XI&m$iG&+Ig`%-HNSN+3lk%6#)r4K{!F1Beu{;Q+kd?tP=( zdy3tAxZQh*-Fsi#d%eLXaWuN?CWB2lLmLb>4|l;QBqc5#*BNYPpu9}eUvIE!MY#Vr zl&@G}*&cg?&D7_}4cx+D^R$d;&_r7xy)!fT0icPTL4(0&VqXJMT(YbKPBXcvNFa}isdoACm<#rggNj}cvZsh(d$o)035QL)Uqv$ z@};C|xIX1Qix9d#6@_+OrwYeK8Ln;xJy8)0w}w!VX(*J|NLsrhy9ic8l^|2(gedMC&N2FDZ?qS&}5L% z9H0Vf7)79h=g=rd=8mtw0Ft6iqP)Af=f0W>(6=AOl!rR<$=5TRIvWpaRh|z)E?;S( z$>q~tx*NRtd6;&TFQ~$%mo&fD7$2umG@UNbQP5Th@}9dO`#{+|0KpiL5J)0@p+T|y zO`!n#3vecqwgX@i8H1!>DvT0?f$3=1ej7i>l#R}$6+u?U0@+tk4p-QL zjm+$U@mj(LY`|haG#;jC3&&{?C`ol%!crsl&!<(a%C=CpYBqWR@M#HkOayd*xak>= znx%xt?(g}_dM<*1b39V#DNrJDYCcd|akDcu!fnpfvzbIWQ{&YUVxUAU^+{6u4K}$s z9j&f&rk*No0!(i>Q;(;BS}5)G&^^JZ5a|U+>QL!O%^mA>sg9)cBn47B2ve0qCq%=g z8UUdd#6ZY}-A5*A4q+Gl$y1kiqY2nM2$dOeOA#10@s_xwf?A(QFGj&G;TXn^$FPGq zN+U%YU!Y@?tiEj=8H%m}hEKKoyrIBp`(RXiolkWbf^9z4N8!juFH*IV+4)qnHPr~F zgbW8@<%obYN$Hgcv5~4ZtbkHy(62e`Ne{j%dj}=S(4I9z5Sooc2x>7+CG5Ia)*?N( z>9lPuoVg+2s!57Cqa$%7{el&iI8j(6f;jS^Sx|B*rySe(;#73m*f{`7hi-uyMmT+7 zUWY5At5e!1oUlMN&@*y)p-7;vWf&aSfPKts)L?e7^Z4Wuya>Y4)kq-?dD5f@KWi$0 zBE2v#;hi;*Ti~h!4TGFMoSLw~%GDD3!jD?x3p4q-AUu`6aEq2uB17So4vv8WcqZ0z zxveNZ4TT-SbgwoPoeU|^;_gy7<7QpR_)u)Hx<}wi%4TzGFi1*jgXj!Gu&8b1Iq*b} zv>s!nq6<70H{y;PsFae0o)JvWfo5c{ux+s=)YbQ0JjAm(znub#vs^&^fvTw%gaA zpArqr{6c-rF57w!#|nMU9)5BCBL9mCR)5Ye9?iupMtx*%h@5D^gz4k*n593b5v(gv z_sT}*V(4KB(TjH5^o<;?I9}4Wb%Qoqrx4HyhtF2MKdMoBNjln;%H~N0DFk8QAYZ>A ztAT!!C?EjD^LcRS$`S(>22^sAJyw0k{9CuD%QtA-6_vEBL0>IDIE%avNrVeDw;ptz%FN(( zhVjWTgV*WLj5s%{HIb>s&2R>~wahuv1gpg_5}+=hKnrO)z?-s3dGEO zeepPz+{R#V&c#-}q;;6R0;f5??6$ebxlK|~h?2OWT@>8yLAsp#4F&8|P1KR@QXqiV5aQK0eMlv<> z!2Tb)pkp5iC5PgYYxjQ4c$YOI`3R5MvJbkB3S=J`8X>s2!x|(b-1^A~9Iu5iy6}G1 ziV0a6NgeAVclLn9N$#6jI{9HPd(luJ&W240+^+PvlMYFdPzX2YOiOgCsa4(BR|{Y! z(MkgqF$qUby7)l`&f>_S-1CqIDb*^02pr7D>0lw3KC+&Z`07Zz&HZ6eNpYHw2H!It zmD=*y!T@@6Oq4C*p@#w69L5c4&u$L7j&|+({fCO{f&7Y+35O~UrPGH^R-s@E0ejqp zR05lZ>p&t0N=AiRlGZ*gp$I5rY~_e&4naU5*mk^Y39AjfQebAEdWY=e4^@+H z*=v>53?FiAX=1Ag5WtAUlmWc3C4jM|Jjj3pk3NY^0rXD-)7N0AH`-Dxu?7r)ZvvTs z(>D=AxWxPa?X94C3rTE+I@NN7wr5Ux1Aur|r|NErYTB!_Z) zwkP|&>)0MlNH?%NeX!w5ZF1>@rCW_lx|R-BEDyj3pM*aC7uX&bwz!_{xr>+u+jC(6 zp7m@`G4UXE0RIBplcWT0PzL)Qn`zXF2CJ`ZxMFe?p@s9WfE?lfnp!F5-%&iK|(eKz| z<1Y}^aabo*#0}F$*w9Q4ihik=; zC~U(a*Xtly4$G_cJ)tGW;2?J`K8nY=%f{4iKNiQc&?ve1h#ENuwmi|4GAtC5w~Aa=<2T#!*jNd@6ncBXkY(unllT znuNaJIu8^=!peZl9etF+RsyHRcv8p#uhSdw;0^q+YsV?0a3KF%TXf$7)l8aEltBdx zX^2~J2XZ}_O!SsuObOBr3C=%cOHcq-65~;>6I>nS=9wQ5jrV;0b&$g?vLCF^&V#8i zHt2@{v4iG5y?u^sk^4Pt5&fpQ-76n1%;f9y!SpJh=`1a=KQwasfIpBNNiY_r*Eoa` z=`ns8>~a?P^!n-vB4`E8b4E|A<_!hAT%SN1lw^Vh_3*Vr`++d0Q=dwf_k)=YEblTl z@-{5*5~ed)-ZZ?B<>f)AuyA8t1Iru1%wT!P@X0WPSOr9t!hc1p!h(=@|s_&XLqr%t5WtXyHzoNKhrTaB?;5_Z)#qHwDAp(Ra6&kkUe;;Lqz+eV^hggDj#{aPp;&BLoPaT6G0mWiXB?ho1Jxn>7DX&y)=!f7X)f(7BfoS6cXF*^{ zAr*0Yk!_X9&=GX22Q$#JcK6e2oSiL$@VLT|A15UEKTTwDG$mjwff;vB-grAsE9C5M(J(lQ( z1f7kFp)P{jxv5MgsGtKcEvC$;qSai!7VhEA;yw$6v5tq4iU>u|%|= zyahPrdbp9Ba6{`?c^7bp-ngr;q9%-DM4(uCl0vo-d#;a)RoSTZxzxkijS@*mODO*^*hLQ)nceyrDvsdszkLRdHP3Ws}Z9|;)Pg|o1b8w zFpM)-?&IppO-=WJd$~n|U+NQ_Gq{%PS39lhPQ);IA*-*EngTvOlVmFx#hMJqSP0le> zZzU^gP|lW<9p|p03;IfUg92h+L~NLUq%kl3H7-g}HRx9W1Zw2`Ader%J8$E*7YV5g z=bkK^E*!@?{(HJ`j-q;9cm@ovVCNrak6{|XYz2-iW9%gWK$^tSRy?Q!6<-El14TKW zIQvW9bG}865FP@aco8SC;`}fC8vT;1U;Tz3(%4{-d~2}stg8>ni}DkNLbf3nSVDNq zr!b9iN>c*IIW2MEK^AMmFVgSSH=s!N)E@F?m@g?(VRiI|=nC`Z2-%^byuF=^yu1(- zS{hCO)c;`F26H(Z4u^b&zlLqC@Ojj>R^Sw_2U!RTd;DHf2MXg}y?;_*;o|WOq^EFBX%KVA!wIg{xyTrRL~Cnxcsa#CX7@ZBEShl&ym4jl8hi$uTsHM zO3T&1M4W27w@pnc1&tQ10VoBf5mscQ#z@X=m!W)wAXF-0AR&TRv(YixFH&8lJ{tFW zp>=d4za7=_VAq?e?%&Wu$obi3fr0LnJ$^T^Yz#7}z(s7tB2|$}DG3@1ar1jsiE{__Da2wl zkhf6ps$QY=)tm5@=(}#b-%spuhPi-JaT|bi4afa%_sA;$1(CA9cUt?ELHI z_kav$f{U*7e39FpZF67!`Y)-_w*2#$CN=l{kC%UGE`)QZ93*|zVM;|3t$m<==>z=$ z=eRy&x8O#3XhRJ{AgM47F}JYpy;xMy>mGUoz+bv4)|Xjg4y@;Z(Tf>L(FL zB9sdbIIKVQ7b}pC6BSRXsb5cW&dUN1>Yu6?$-a`WBom}qN;zfg|KRLno1_q@7+c0& z)ZL9Z%68eV^gMWBc zU@Fcr+#Zf|49#WRns^|{!9S^Q3U;kW`@-k^P@vi0!<9eImV3HftqZ_aDl0xiqJZw_ zl^qiZj`M)_P`aG2ZOrGdvS{-mQ|wk83Ki@$2qi&!Q^_p%Q^5c?byiO>n8#cgWG=Iq zz`!%+x>5=Q&8IC3z@^@t2OwL{-oY4Kje+KKmKVJMrr$L!{&`>qCtR|{qsN%SOk+%A zP2)0vjlAJW_nKXkd>ifbemMTDwqh3`Nq(jgTH^NQN`eY|auj!QyB~{hge%YXn#{V% zyd6y#k>_k}XKQy@x+&Ju$P}wL%KRw$ZvQ;zr_5mm&f#Ln#DYN+_XH#lW4NpTG3Oz; z0}VQ@1J3vkK{^Nv=|+}$KiZcuqQE&KT^`TwbuPJ8_vG*vb@AtyOfZ=%yeh2^HPkCJ zr=eUxpf`#=*9bMIIfwW1Pj1p9XySn(6VqhPX{y454Hc$2&-55)+xYDXG%s}3;u7&K zZ?`n(dgYtUg{D1vfH^myQBnASpyUzdZGw{h%U!$g?S3A1X)OPqO?t#`X@r-SO}gRt zUjJ^+fw5a%{rz(09`|o_%-^plqPf-2;M>gylY?=KTpeznLv=~v<<5cT@QcoiOGb~u zv8MgeTV3!M;`C@7*cTi_YIa4$=rQouGjG+$b-r5n2WeU-G01&CCK3P!g`@%hq&t&Z zoBZ;$xHmzCCa*kyzjW=@ukfB6N_uel0NXE2=EDJAnS&VROy|a+C)U`tkM~49Oag#YGz-+a8+4yb1zGcwF zd{b;GNXgnjPHAZ8j6CP?zYm#+_&u^iw>e{qve8i*yLG!k3JZR`p$r8}#FhZBQvt~% z8~K|LfRbJcNPbF!bSFRxN^(zeaYUmltq;m`=m-beAqmPTHpm^5hAzg-dfg}wgC{w*D4zkP)4 z7<>Wdbbs^KL9rQ)Oc(Y%mE5Y}$>gA>jcsHMDl;iU&JTA-xq%a}ahgKcU34~I@b}v0 zcWHsu8G?%(J@0CKmn^)K+o2GK1I#Id+sO+`Fx#BJ$(_JUKhyU+_HA1l-la*hE# z1(`8X=$o*h8hFLz@Sm<-D`Gf=u-WD!4;8$qB}_$Rpm`vu&IihU*N%A+SbxBm zyuxR#Z>IUqxoxtlx?pC+HG25Q4QV(V!Y6%RsrgQPTju`_=ZmQLOn&3cVHv*w@v+yM zn0{=69>Z2ej1_I@)`0l5B~O`>`%BiR<7=FKT4iD4cj%6bp-~_F9jai&#FY*xYy12r zsx%yt2YlS=8W@Wa;|BzWW=7w0?b2TT5V?aU7Mjf2=IsVSp!<%2AX+pYlwRC- zP`X6~_-zl+2BxESe{)9o-vTG*#io%SMjUiDZ}G~(?6ANZ;FlggD!?l}z`WhG#}Z)P zLW1ZCka9o}PbJ@Vtoz=qidMYsF&$K$RqNF#Fg6_%+7{A7-VOA?^8FyVvIfvYMt#4y zw8M@Nth}{NiC$cC7lZ!8P1*QG>R@Mij&q_MwxQ{ z*5U^uy-a<~nl~jS(0r79Ku1}8fGS=Ok+Xda%U56+K-A$1lzJfa9!Qm9iYXIgBSC_!+OVvGP_o)82;h#ik8D~!#|^X#^f!k3-bPeDI|6Nb^okci4-`c`^2CV{OGNcu5}P7&NhnOWlk^gww4U`U(H! z$wZ?2I=tiA@i3mmo8J+0pnzR+HqiN4fZv;T=kpiAGyxe)!J#rMVA z=rJgHy0a-PgB6<_TVIjOh~5!dcztw(zS0yt$b8T=YLNMwX{2eyAanJ|;pSXJ5CW`D zzb43OaG-OPd&K<`+?!gRe<(D_mx&97;i%q!8!$NlkmOUP1DC2%+oTWED+48@|g6}16 zoUln*#>B`B5b*HTkWr=hNv8Na>SsF~ny3^i<*%{|mEsDg2&C8qDrOlsr+5k%Suw_P zCsX_?%TkcVV6tOOxe>!MRLm5_0A}=7(HtZ}B=8;uuJH;H?bz5a zFwZqK1^D?{21C;>p}T0*L=>r*E0`)}O)|bJv)!D(6G!n%1C_nGz{gGHHws%j9 zy@aa+7lAB|@h+L4&~(4N2>7$i3mxK`-0E2*b^mr@BizyEh*!6_Q6JD#IKLI~0V@Dx z7Yuk#VucHM3tleofOG_MO<;y`cj$^>c2<&8%KSzS0m%b_F!U&>!hF=9+z!Tc&|x00f%cwF%~7%Y*D%@TRUz#aNca)TH6l+x$J+0WS_1hQtqFS+pmA zx&@l!JkSJ(!AbsC5gg|cgAdD5IXqT*xEk~(p~Ao^v#dhL`txjU6IRtF^8?J=6ra{m z^S4GW8w8f6;2s7|+$O10Qn+g6pd|k+1)wRmtWkZ{6K|+`6S8p3mRasY)h68e8S%zH zsjL-Q6^;YjSRy`U_CvrTu^u-8EeuGWQuiA%VT%3pnkhEZ(duJs2L`Uhpen;$7@O5N z5L3V}7-0T>r?j|-kd36RYEbxQ4HqnHWRjYQUjmarg7v+5$WnIi)jIteYHOH(F{}TG z4suxX2uXG5Qn{k|4r!w$c0u{!t@RFgfQ|wuLQfv)8&u;Q)imNxP@!MOVr%j|aLQUd zuk2Mc=HxyN!jht@*ES$Hh4h4yogNJbZFN5nHXf4`CR0qS+KM-jV$j4i_^@Y9#&Ae( zg4ZUdq`nD^ZgeodZpr=nETm!mYwDw$Bs9v4PkVW!DS04JRtA|IeQ`_{i*=D%QIY<* zk(qb`RSXA#QBD~Zv&kv=<=A>@s-u#3u$Xd8aU9Bv>Le0% ztNqk0XARA>T=T5;*F4jzw9raCv+=xK<*$Wi@Fz#}JYA)Qm6$Y7OO;6r(KX*cqgqyJ z(6L{{?+lMCRoW5=dl{PV*=P&0=OI^EUVw)CDiSZCYY?=DL3>mXY>$8sfqNOaR|Udy z#B})#%2z?9=<>KUEq*DUh&sTi11f40f;7(yfa-$gdtOWY3f};)9N>kO%aCO%q=F$8 z3`rV{bsf30wL}x%G~cx7JGBu`?H&ei=9|rTmsaw9FW=pq<$Dp|-LJssU-Q&~6riFQ z4{Md?+H-n$M+dy001&5$85tZ3OocGzIlTyYMtx~oVmRuvu8?3+@JP{LmH^agiGg^5 z{d1Q5F47WR@PcN#x|va>NgJ^j6?J?GJI^#vt2UzJL?}W~A|gt)QKZg0K=V8)%kx8d0Q4lw)JC~Q4PdMP)Do$7(}MrBekc($1vzB$W~%xv z{BS>u9Sp$#aetuVIA%rkYk)T5M1VHxFmRqLVc4tr7Ri@GlEKvdpBw~lt<=J{O(Er0l5(d2rYI+b?}VrcYOP_8eMlU(Z;GO< zM=;Saa1R6b7=dY$Vi~-b!F!Ehs-+m1&%k^mun7W5wa@~~$ODW#U_@px5QGb;E&u>f zZWcpGx_~bXtzsAyhBB;zVHGkgNm7a;-+sUb0{@J5o&uV97<;hrl`X$q+N-a<^2@EI z`YMuN?oRT{QwOGqnoK;c_}fwmV*Ux6U;tDW!p|7tKwSvap3`@r57_{8Cj~$2G6m)% z>?59oq|a0kfuOtNEkz%zzR{VL$O;6wy1jx5(9RKiQJd35et@I_zthu8B>aCevUG|z ziXaq3JMr@b+oh?d<1tIOK{)IFZASb{ETq_b+H7A-3%B==ST@cmq6`BK}G7-p!Gj7iz5)D zDT8k)rci>l8inE|tWdRugbu(u?s}<_LsV-N3yM!-VOrvIXqSFcHpw@8N=noTeG2ht z`&We9;_=r8f1dd3RhUtbQl1-UY;0B<`BbB~@V*ix8XWQlt82>%uE zKWnEWM~@sf-v4Iz-U6XAT&?R>8O#~Iw{UAg$uUdxoq9M1Md2Wt5Df(v6c;U|O zX@!{ur(}YW4A=o^{*<42zUvv1Cjdd3RfLBX=f&sZxQt&O4*Ac4h!kog~ z!fb0>qus6eZEYccoo%rakHG3tz0hf;x1+=1?82Q#k?v^D(e$G^a>-Ohb|O4Q5~A$F zQ^$&r6r9g&TzD@04uE*Bu(;5Ia%C_|KF+AL!s0{OM+#N$J;aL*{v=A_c4cUBQ)Odi zIjCEIf$=-ou#Z3*s)JChEFSBE)5w+%4yXc4u)jxjp+&-A0SxH{CuA=yWo_9gE=Om{ zg*#bP0E$9a-V*fP2I#x42OS_pjRnpmR-**4xubBWn&vNq;O)u+!)Mn7{a)58dxjHu zVYYsRmD^SQt-_jhqkZ7p1}bx{uNUqj$jj<0VXMbs|HiFat%$RUwR_=CGW18c ztDBO-LOm~Ic0{sLOmFFSMIn30CHxh0UC&}!Tx?mM^-Hd>UuwZ%1P(?$9??_tJr>oC z>v=>Mxt8D_G6!&4A7JYPxGPNA`*5%h+JMqa@mDO_B2>4XMMJ@kwcs7_I%(RwY3=f~ z_){Qn2@GP>)#{Y3g2=XnZIMCDuvcb?Xp6+;XTvgNOw!#T4>|if<3*O9cn#fuLy_c` zF_C$eg*yYyU5~@^j1*h&-tiPRCjiq}F)~fsD2wK~ABX}*t!THFcoMK6n>OMkdt=lY z^n&Jj1noi}kwMJBA5w>ajbm#Wgl=GWgqG!3MBZoaflOgFfpKGvZ zG5)}{d2Yd9F4%>w_}hg=bNl?>2q7DD34dT^#^!=msl{J9{&s?Oxs1Oourxamw+(+d z?jF3KsVZX%SOJ#hc^Q95F*b)wHeTwpBTL97{AF_WMtNf;2f3YvSbst>+0pn7=9+&n zs%OL_cpi)D8sUv6cz{cwY7`96M!39z?KW8QUEY;XPXn~j%na7JgQf2vUq!l>nH6Ez zfN~T_NRY(@V7v|(fm@hsiwcyv4C;Q6Imix$WvIv`njTOp*b5T4sweR(kbhIz76itn z0qEV~&cMA(CY;`xh)B;Tzn04YARg$JbOf-aLF~ z;_nc<1JC`cOF~gr=waX$9A_B23*8dBTQcHWVmrdfI_=t*=w<|7$6z}k&>q^>2DBgo zSEu#{r1nsPs{_N2I(Gu%?5LOV1!5QhMw2aa?e`ltn*nOHM?y`W7Z6Gwc^{tSkpa0R zrX0N2LtTW-ZflTPOQgC}zeL<}>?d8pz+hu`)VD}>_7>gWNP?U$V`WZ?ev*H-8vs}i zuIKmC3y&A#@0fn1VE%Nh?-gK_vccbF7336T;VY+LXTj;C6_VeZYUAasy}kUz zMdk33L*M{C>fioW|K@6Yv)R)yMkHTfm{w4U+Oi8W!06=^Y?U?bDmcrUtg9rC_#W2U z9Ytr*f1J$Y>HGs$=gg7AS|W8nT0DQ{0{fVRrHCAt^$y9A7B;MwPVU%n6z+_b)@k6g zjt+%sV7zj4%FSeeqVvdTg5R}}K|~2VSqk`&U1SmqcVhT}PvGE*Xrp*gEs3*`V!Dhs zSUb6r-obFmw&MH;yb~*ARJVYP(H4Wfx}E{DF;r%zkqniB9Piihcx21TM5Y&>0|S|R zbVp$}{&J3XZEaQm){G(6CNdlxjO5?}=XGuBW3bsxtX|-}kV?OkjgX8L zg=NWfW-A`g0xrvsVPx9&sO03K_M>`Rv$F|Gfogcf#D+$bsX1QHuu4`ux`{Oqm_7$w zOGXOs*R^;{!442eE?Vp~8r!bW>YSrH@s~>h1g+1J?gs!c+xjk<_NcG%PHudY9l58# zo#xbVSf61Rc5>b6=@1Beark|K$?lH$pk6K3>Rgu>nB>TahzeMWo#CL9lEN&O4;R+f zF@&PE@o&P!S@UK%@K^p!ahNb~+DruCSNkrm|;AP2ZCq4fUsFF@K1hq zM?rY+-c9{ZahN@8!3_TJZ;AupoH|4P${z&GnG4AHD}SaqOnGV6q#5#8{!DS0JNcyv z(`HVZJaUWC6bU-`38~(>DnmxTc z{>LktJ$)wrpW+a1G+RB5Pl-I>7?|rJe`Ek#ju5n5{z_~h5s=YC{wPR$xAT8`h-uK! zc9ZAMoi(?a?6e!h#sv*}V%(^JXNM1ZdT6_T{o0KiK5CHvIMtaqrj6`&Q%LulLT26= zqI$D;yWxX|4zxi6KyMLnJ+!iCZ%WnuCK%Ayp51)9dEHpA3ZFUog_~kX0XL>5DfDi4 z1H$Ub;l|XG0B#B-1>7dkzVW@=jR<;r_;4F8RCizBP&op9eIK3|Id9VB+4CNrHhJ>o z$9q2d@QdT-p^`}x=1%gR=zykm=`wTH%&yaBhEINB?t~dP)@_XA*CT4{f?utz`zoon z?s8&nT_paNCc|ifu%8oZ>+Zqd9&>G-7yg#MQd?KJyteMX*xI_cmetmsg(W2be^D!I z>-N50Tldf#wRMgwYU`H8*VZ+~-{iR3x(uXUol;v@^;&J+BS`ZI@(;oLXGr&9Ol{q@ zmuu@rFGBs%wRJ^!4#!k83}KfdYwJEc{_A`op$%^EqzZi<9ThoIIm`&ajVE@5Oa>Wdrfb=Qb5o z{<86`Q%~D(xlnJ##?uz=5L5pqUu^mL5p!eO>ypMd-?4rDC#OZr(xY?hHk}q-dvwo! z?$^^|(M#{_`eoZ`QIS*`|4{yEvCrJHa>dcp;z4VHTcgs`;>tev>V-9@Md79`ubp=& z5wqKVY>m9DL@f9IM>EGZCBo8aUD@j$O2l&xiSKuMxJ2yl=yz{=?-G$ee9gECPnL*# zGg2b&e6~b{cW6HKn=vI~>%_{glc$x4jAoDSY8z1^zF7J5;6pJb;@qCd_3yu0B7S*j zT@n`jM4xKJXB&nh_i2ua8(n;LOYi3WY`JradjM47P{|UoX19V~9oMeNpB&Vv|6MZjAv z7u34zV#VEVYm&O?V&V259X%e`#j>Y5{we+_B{tUAV^mP?R}M z7c(4BTNlmO#k&<>hxUop#V&*;fO9ez3VyGtyC8Yo4@?o<$^9UO&4SCYEmkmd)a^c-FKIY z+9e0xaDSjwoZVP<`eE-o|# zYpKvuMrOF=l#2ISID5=LSStQ8Y)$V|f0l|-TP8FcU0Es?58d+S!Mak>c0!wz&$(Dd zpX98{KmTSG?+@_Fj_|aKW0N;cb9u}v{QZACm^#2JM*Og$^)t^{MOAL4*VVCBQQp0_ z)utI%vE*T&qG?f9v7>eE%Uxcviq$XgxubHmRcwBy)4a5QScUVaFK%DG*(#3swQe@| z534Y5dcV)eomMevX7qSbWEHs%ofmb}t)i^%!IhpDtfI-ACqL=zbVgh|R{nF>mS;q& zHG5z0_GiS%T@~ktK72;J9dOQLdcQN`zVic~e|7K~F*R}V*WZPn5%d1=xbO4}XGGfC zthe3gpAjdAo_jnj?u@AI?0ey(m1o43wylfKtvw^c9`q}D;;S>FD)He5Klts8nDySP z2@X5Xh%Q$w?WP|(Bfcptu7EXOc=%~opS^HKw4Qsb+5C z#olulT~?XTikZ22=CCzq#ja_;zv%PXS@FZzg+Dlce^$IW@|)QwGS7+@@txk?o_|&> zpZ;p^?@yc+rRg6$n_6*J{5&K_rA^PdQLb6 zJTv}O-*X~ix_I}_pmXAxPadAuee^l8XwjLS&rd%mw)K2s=ev>TgvX9+(+|ILPMpZD z+~Be1oLJGWJSF_IbK;}aoOV0DKPQIu4;kyd^_-YJX3mh6`_G9+iDeZIr_PD?`!|Br z&WV;8%cs{kmWkH_o_{jBWtpgY`)?)A9m>Ry;qMIlphuZ#^4bpxeV!;2b?2ug7e7-b zdXIWzYVw3KapCUvZJ(G^CLa6BY2&q+GLfCywrxgAnV58P`s~-%mI=o-M>kH~R3_R? z`gFfYD--=z-f^x&UK!?vFE44uWn$Re;dPGXWyTy`F1m~v<neyoR*H)H`Z%%#VSoBW0n14!->++9sVH#fQyCk(-JiRc- z@xV9b;*KZQI`#OqTr6L^?6H-Z<)Zg%<~8Scl#2((?CLshf4TUy>5CV0kCclwzeZi^ zd%9cpgEJj@V-zk@_Q|MetliJC~L7e*xR{6r1Ung*z8&%CcLnvY2W)Q z#2=x9a&y{Oh{tyi*gvLAg?M)Ley^Gy6{4w2$J~@Y72@xQLVoGyUm>0fT61MzP=(l5 z>+<^Ikrg6;<%y^+V=Kg~U7z^1Xi9~c_d-bU>$57v7k!5h9lWqYcw8C(kETm2#AhQn zhwLy{h)*7fnEl4e3b8x#$eFS4R*0W}bId z@onx`rmJ{nr=~n{N2U1eowij2wMsE_!MMU_+EfCc-v^9uUn#y^Ii>f!E|ubM4}J4f z;v@KuI+68h-%2s#yS#(%cadH{u3(2!$)i0STMa( zM7E#f{?)unF~GfGfOS!&@ah-U)F+`*)C7Gtd(LZ>;_RhO(Z8&z6vgdypJpFdigpv% zC5%a}6c6oxEa|&%kw4)=-+O+q6dRlM{b1g4nmhboa+*-d=Zv`QpLOrPV~vPvX8Fmvj+ZL36+ ztM7LT=u{>Ag2sP&=;12SV$FSxBmAmFV2f@Ztp-$ybE5gZKL%Ba{Y9;gj2~4cuKf1> z!WQGJ#F<`UXVRus39sZiy%)|y`iG}Xespn_xHkKQioaC}vj_-XEySxc{0iH;K&ZeDh0wdntqPxUKzSBtP!PxM)J zf3m8ssYvF`BSmI+6=80QBk{hnL?^X z;{iU=v!AaPrVSnXubWXVX73AVcVvFGxbMLSAGm*MwTL+K_r7D3szr9o#}~${ z{LPb9A0pqkHFKWafOIdN>hi(2)nZ-TRoBbEqaOEtoyKHWi;BWVvoiCm#p0&z&vZLl zE&A=+vG!w2wHWC5(QEfrRf{}JpI=sAtrn-t`*gb3xkg09oATekr$&ryTb}9VUL(5q zwp{(WbB*}+$K5f{^r#Vgyax|E+qXuHUC?;eih(uaxy1L6J^E~o*zjrAy5g`J@kj4Y z>94;~BOWT7{&?Wr8gbWMPc&@UE5dHeO)8&+;P_H@NYGu_1PYIziqD(&;Rj>WnF%ac<|vS^Itz&BZfYFM|7-S zBVHOX?NU@V@(b(v1$8xIz*|qvi)waWw00OYcbVIHk@(i<=U;1gUU)Y1ar}q(c@a18 z?RS28?7Ud?&ewkwn$C-)l>re~gU*XDqg(&pDdfE9L(VN}PFKe7~-y zb7tguairPLg^uy(MU#nt_zX%pF9v;gu*0f%&tJzgM{QWt)ve&;FV15q>1x>!_`0)C|3M#g=|6eq28VYpdB!xV^cr8YFctdcPlhdh(%UtR%PIGEbr}CZYFf$NUDi2zY>av2Z>i%?H}dhnx@u$0 z&}#3Pi(R_(f3b&8w^fd*&b4o(mM)-LBE$F8wptZs@e+$i|oz zYc@D+800nV`#Zf|zigZ8`rselvrh+m|D$i`FM54no$Bg7FZIk_&KuLxT5Krxt=%x} zrOn!xg6`?mAOqtjMze0AQ_J~4UoH-vO~(>ra_dce8dd+jr^U3MJqv2pgbMX52d z$*D2zKlc7S=nxa zvux-3jh4xmyr25%H=l&=ulZ~`b&q$ejcYf?ybYP7dM z)bS4Iy~ocQ>3vsl6QAPg`%=4pbl(>aaVtLWTlV#-rr{f@{*s@(qR;=F0j*WY!7JRQEPNt<6biznu# z%x%?ioA7z4y7~Assba>wZz5bz{~!iry!}j2_2s3Ga~@P;+} zeZ`Qcq6~P`Meu7!x7Ktn7ssCoesu7YUkj(Hjdw3JZ4(EI*Y__tyixRe&)vGL$B!a< z_U{K%YSxPbpMLB(^{v!jX9xBv-n6Ts+yU!nxA*)1h&b;+s=qgmTUn)qhzgNeiBhPm z=g1z(ZkmY@DJ#jIp{O*7>{T`)T^Y$%_TGDU?G=8v?)`n;|IYp6^}IjN=Zxn(=Q$tR zM?}4)@aCEOJXpKY=AI9GX4yP7WsuI)-@WrDU1QSWz1=2m^-$6auYiZYGg()P(_ut9Sei zx_<#rlyd3!Mk-WL4J6gj#$fuF&c(_%?{IJFc3lzwe2=KN4DPpIe<3M~?|-)0+{4tL zq2_JN-tL|XpqNW_eA$-)vK`mtuJwEYi>MSPR=RZ9vbxeotb`A$)bF|N#-+cz&w+mcHNGid`a({HaVJ7e&nEZMaQvl1SIBh)` zGGNezx?w-%M~uN8>Xd-C9j<@hRlU!`Mnt_oz<;0BmsklLEDP*;KE|I5q`g018go~I zm#)(WZX^?CsS6)Sekg#Pbyxk(=nNQJrugl)7K|-^_PFlyb>jHPk2lBm5_z@<*NJ+6 z0K+Z5@dp_Een3#=8h=49C`$&O$(65!cHQ{v6!)^g{3Pd6G5J@BGcgY5I-3bLPk9By zFz+y&f}L1JDyNbMwP*DI9I&i}ClONXhZeIy zaQtds>AkNYaqDvD!P-o?%(Zc{*(eE%^A9|HK(`$J%?EhBMP1cj?&k6k^_D|Wk`TG< zB^=n~#CXZ~<-wAHIhEh5N+=2Oe6Hw{4G%^4G2iI;3iJwI64a(yFj*O3#(yak6U7v0 zd8luPo8lm2$I5?+Xr}_E0&nmu$>R54FAtTTw#f%F(d3u(Un{|9sp(=QZ4OkjoHmYB z#DYb%fG!(lHnh#JN%m#MVhy54BP0wf{?n`c>5O?azc!&=Tmjdf4R;vg_h-w8QCEqp4(!qZu9m&eK3Af+-~%aHmQ)4%R3Wj(aR-Ji}@ zmHpj-Xr~fryyedYD&ruhWZilo;tQA@O~!u=vkDTJ%P98>eg>J??!#ec3n5Bn(?wf7 z2Xvn%osGXIfx%g+%oN?J{7-M(e%hdW2Th53D?wqfo(#FE1^LcB+70 zu+WlK0|(L7A^d)|1;A`~Dc91t3fhd5V#zggp?Lwb*I(otJW8m0B%b~m`qU#jk9fsm z3=;f5rb!qI}rpieKVz?*$$QhF*EZmZnd zU;g&v21+R;$}>CMoBu#|L_5`BJDS`ykKae17WWO++x`j@ zhljim7gxc2WIyjQpFFtbhr?XESOgMA?;2H)=0S+u^@}4zZ!z_sRWm89tN+t$@elNf zsJ9ww*ljGI+`{j(s9PV-6@qaWP9>GI8bpBY(2=ry zQ0zbJO~2stMrb(Iu^77JZ!?qGe}M>ovGVV!vDhfe znsuW}r3R*J+Tft-WNc)OU@;sNJAFEu zzXtT?k_6Nku`pnr)$3eT0=I2j(cuX!P=8dWx1UJBAj6d`CCZ=wajS~rMx(Bo5%vCr zj_u-icO7tmV{^S9_M{j#1cR&}8`i*{&ph<*l+fzQVO54X;M*JAry-TAM85) z3`@do|7Pjw4p;3miOWwRLjt$>C$N<9?SAQmgU8fI#}E7}hQMycfWr4RP`dODi8vR6 z-7f0s;D@Diq@t_V+Gud*R^i>Ji#w_W1YXAif#FR10VzJW=yzV}s;@9@!r zy?xi+Vwhf+Kjh-!gL!AV_i7(){eOCO%DXaW0@Vm@&U$c4UeFBi!$B*Lw|7x>2?VE$ zVU#p$K~N<1piy2Cq*kkE-gx~TPL8KiG5;Zlav2t13I(=p~J@L}o(* z*PtF&$#;LEeujhbScu3VlgBf?YsN>&v($kcxk?PTmm;d zzm{s|k^bZk+Tn8lrefCFZ%*Jw)r0SPhxPjxIH0*FOMA|~6ds8wbV{|zIYtWU;NvhUev*s#O(^Z5&UK;ZV*Lqkh;tMnTj z$Q>|#$W~Vh(-le)5eMtQL@1monYIL^e0!VNTgu?BeCM)HWGT1{26~Vrr(r7nbjvds z8wecyyuwHo)t-Bm2nS;{Yr^+^RYD9rE}GcZccLK?d2I#%Y@p2z6NBmnioG zB6SLU??`-y@AEpL*G{KlarZlw7>HL>K+u?Qp%*|AJfz+^7c7 z59_EXj>EyFFBU-wt=}Oz|6azs={m@?Jt3`lxfIH+4hOc0mV*IL5$W=iGN|COk{_Fi z#c(>zurYKIxy3l(jlRPx4o*e?=HLDX2vD)eE=k70`yof_F5xl=aQ5>^J@*qFG1&vY zg{7c35!YLsSq@5S!B5!uegJi$m4C-NKAw!#KbU@`k)RLHJ#3d9qH@umz~yX&8J9x} z9clP==z^gME}#s8dLkwLJbuFbZh0;#;qPFd^W$y)=?bv9V)&k`?FUrKzP0nPNXF#9 zE|N1a*x`0FxDV&?J|J-M|L^Vl`Hd2&>1@bbEw@HGBA6!L4- z4(3$=N9wev>a%jV{VMN?kN4kx#!bo_yTer+mNN3d5##EpMmT(=T>bJF9Eh#DKWviu z0Z$|6=<_*#fsB8Bh5eB-7#&$;yCYQz;_V}P1Bw+8oU|5wPS77?aMdT4WORpn>UqFe ze)SEae;c9XOFZV|H+)|Dg*l|e{D3Ys<||wee!~ZF?tYZ6 z5;&XoJ(rexho$Ch@W=5t{pa7!h1+pwZ=EIjw+Yw|xM11w`Ek~ZA;M2c%Yn{*Pvw)c zUl75to8jGoAMjZ_DTdyt3h21q-d$^}gg4$SMFI_RSheDAre%vAF1v}=>fB@EykpP= zXG@y)eX7Er3s6+@DH@hT4_(Tmi9Pj@Nx@aW{`v>d*;X#hUq^Yg$X>{ z{GWgM|AC0{8D}$`taR`h=)}P{B~RuqA3T@k_8jZ0dPsk3)D$960e<4wim<&kFe>=` z#UYhixOG5j!TJ=wpRqRYn|`#z)%*u~Ot53n46FQNdB6H`U>-|Z)-hQD%n5}r)=KK( zc$v@5_qi1i8CVyp6Hp816scEMCF{VKJ4DO&!b|KpS~t6mC2~pT;44*IrGhXqj*4oA z{Fn5*+wkWh`-6dE=}IL`wWcR7&(*`1w)pe=@cXUJa8<`#Ja5x%Be-4sC;V_eU3zjo z98)~FKYf0ChpV7q`FoMyv4}7~G=rKqN%hJ!4icxogrCW+1j!W6;|IALz+k+kjjpQ_ z(ho33FfP}@eQf*bqmsX1_WAJ3bLQa~>iTmsVbU#x=f>-Onf`eDEdKLo|G1njV05BD z^7H}@Fz-B_!;e&fP*l&AJK7CUA@7^>`C%2T?RtSt%=rnw^fb*QdFr7=dvf{QlrKj7 zY*Nq--yNStn{2u6`UOH@*VMOfGM#Pj=X!Tp>F&v zU%KNjC~mH`YRIey`dw+?K9jx16#M^LJyWy8RasFIlNcfHW20K&e4~KP(l&lv;O>5= z!Bs(4#4GQp!Upiq^dxgntpcMe$s)Uhr1Na1ZxZQP3#R_N2kMr(p{m&2X z#Q`@{SVsu?vHlkDeRICSg%W>01y_C^zF7^jvi280EHuC&-{AXWYBliIRpI{bzv7@5^}_K z-k=qZneR;=WSj$w6Z#5VXKSFgb?$)Y?MBdUSz|Jds|6Pcy<^#C4X_d}ANq@}3HVE2 zJ_R}(EdPb0yCS-FxMu%AHUzy%Nn$aBeuZ(zOz^&e8UteWWx{3pPG5l#+b-O zbI@v-sKKX9%p-EPfzl`L6P5gPpc9)At?p9`L!Uyo;}0}J>G1P!vEP4!t~2NUmZnBn zwcH{*exd~yo?YIeSct{qN`Qtsd56oDtJU2k=1}x+To|;$nSGZyS5M*f()ql3wpI%- z=b6N(G@D@M&^X^ck6)l+;}OQJ-2{E*OrtZCEwIPBfUhsE4Bv|hETU~61T$ZEsv{&1K-$v=^Q>#zd zYZQsEoUuDxM_abjl|9!8`VHElEWRhc=kgp#h}CsOw)_MJii%6#x0)fzvr5tUdIRj9 zS=syHX$ypkYGK#Ub%4;kfD_$PI!5i+m+W}bj{p47@2mV(`Ktw?9n}sG-BXNX@aM$x z*416%YQNxqw6<_rOfys%s5ibWZve{BpydzTtuQF`=ZGX{Cqyo=o3e7IVh-{JB~Q!k zaFZYW1rgVw{&pbSZfEh)oddnikM1&czra54;cVe#GeC%|Si`wS$g_<16#d=`YWFO^ z%QAMsSFr>3BT|pB)Z@o+8i709UedoHXM$eN4hU1adHm^}IVevmPO8Vxuerm=mRv+z zpm65S(uI$WaEbp}RoLA&=*i*F45IG_vjh#9DLsGeqj%gC9SuaT8-Ct0`5f15Ps~>v zbUxZlchv)1+KVl!5U68;X~`J@)8RWzLc+0X@= z&R;(;ISs&L7L{G5e)w^0C+zUqZinmi5A=v&r@s?MIa6m(N6*1xQo2q1S_8-&FTl~= zZvzHnhpaniTfyC3`FTKMH{5vmviCL5AXpFUamjXm!uEf%FyO}$xy5tf!q%s;zs`l| z-!5S8^7oSZh>wE=Uu}Itji5W;HcL^}2HBZNuCcroIO*%%ZM=Ix;){4_cH1D3S+$+3 z5yGEehBSJlyZK+lK(4PZemv9!g>@v4X-3*1?zerC!kc!8y72YY zsz5)y46(oXlVb!D0xCLb3vXko{gpWk+jh8J?>tyonXeQ4!r2Y4%;h*of6W1-;XwDS zNfQ{wh=?aEbU@xY%^J(|9T0Csz9jsqABJW3$%HJ9K>q$DN63oCR_f51KV$Ft&%eRE zErF=^KA~-Zf6qtXC8pr(TCCL>eGRjlAo$co*-%;sP|{wwmp{}2o@No!o+1Mt!d(%qpD3@L!H&UXjb_Jr+ou@LV@YH;Q;A%Xc}Q3FGgmTsQbdS< zyMaA5YAkhT4%&@$k1kwk1|i$511_GOV08Y8_6xZ#h^qY-W}!L=tmkxBj%AF)Q4Y-O z<8cPqy8~anHWzoeW`i2~2Q`TE8D|d+1jzJFtjvL|Bz+DSK7QAj3)ZKd?*v|

Udv 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Đ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�je2pY}^*&wivf1xLN+I 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 literal 0 HcmV?d00001 From f5f686dc78aa98e9c654fa8ac5256706cf5a24b1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 9 Jan 2017 20:25:11 +0000 Subject: [PATCH 0090/1895] Forgot to remove from i386 --- lgsm/functions/fix_glibc.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index 84c244a9e..8580e3e71 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -20,7 +20,7 @@ do done # libm.so.6 -local libm_servers_array=( "Black Mesa: Deathmatch" "Codename CURE" "Day of Infamy" "Double Action: Boogaloo" "Empires Mod" "Factorio" "Fistful of Frags" "Garry's Mod" "GoldenEye: Source" "Insurgency" "Natural Selection 2" "NS2: Combat" "No More Room in Hell" ) +local libm_servers_array=( "Black Mesa: Deathmatch" "Codename CURE" "Day of Infamy" "Double Action: Boogaloo" "Empires Mod" "Fistful of Frags" "Garry's Mod" "GoldenEye: Source" "Insurgency" "Natural Selection 2" "NS2: Combat" "No More Room in Hell" ) for libm_server in "${libm_servers_array[@]}" do if [ "${gamename}" == "${libm_server}" ]; then @@ -29,7 +29,7 @@ do done # libc.so.6 -local libc_servers_array=( "Black Mesa: Deathmatch" "Blade Symphony" "Factorio" "Garry's Mod" "GoldenEye: Source" ) +local libc_servers_array=( "Black Mesa: Deathmatch" "Blade Symphony" "Garry's Mod" "GoldenEye: Source" ) for libc_server in "${libc_servers_array[@]}" do if [ "${gamename}" == "${libc_server}" ]; then @@ -60,7 +60,7 @@ do done # libc.so.6 -local libm_servers_array=( "Factorio" ) +local libc_servers_array=( "Factorio" ) for libc_server in "${libc_servers_array[@]}" do if [ "${gamename}" == "${libc_server}" ]; then From 0db7db8e8434808c7df2600f3d4bae413cca1a5d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 9 Jan 2017 20:54:25 +0000 Subject: [PATCH 0091/1895] Changed back to start-server save as auto save was not working --- Factorio/fctrserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 88f69b1a1..326f48077 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -31,7 +31,7 @@ ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters # Edit with care fn_parms(){ -parms="--start-server-load-latest --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" +parms="--start-server ${filesdir}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" } #### LinuxGSM Settings #### From da76b7f707291e8f38cabba54ca0d74b785590d9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 9 Jan 2017 20:55:09 +0000 Subject: [PATCH 0092/1895] missing then --- 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 8f86b3117..3af2b7ac7 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -756,7 +756,7 @@ fn_display_details() { fn_details_realvirtuality elif [ "${engine}" == "seriousengine35" ]; then fn_details_seriousengine35 - elif [ "${engine}" == "source" ] + elif [ "${engine}" == "source" ]; then fn_details_source elif [ "${engine}" == "spark" ]; then fn_details_spark From 6fec3d13a48849043fd542d1bc8c30f90bee07a9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 9 Jan 2017 20:58:19 +0000 Subject: [PATCH 0093/1895] Added factorio graceful stop --- lgsm/functions/command_stop.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index c5483a864..2013f85bf 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -58,6 +58,24 @@ fn_stop_graceful_goldsource(){ fn_stop_tmux } +fn_stop_graceful_factorio(){ + fn_print_dots "Graceful: console CTRL+c" + fn_script_log_info "Graceful: console CTRL+c" + # sends quit + tmux send-keys C-c -t "${servicename}" > /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: console CTRL+c: ${seconds}" + done + fn_print_ok "Graceful: console CTRL+c: ${seconds}: " + fn_print_ok_eol_nl + fn_script_log_pass "Graceful: console CTRL+c: 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 ' @@ -175,6 +193,8 @@ fn_stop_graceful_minecraft(){ fn_stop_graceful_select(){ if [ "${gamename}" == "7 Days To Die" ]; then fn_stop_graceful_sdtd + elif [ "${gamename}" == "Factorio" ]; then + fn_stop_graceful_factorio elif [ "${engine}" == "source" ]; then fn_stop_graceful_source elif [ "${engine}" == "goldsource" ]; then From 12a3957f051d706562e7743d4d62fb1f15e7cf19 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 10 Jan 2017 19:50:08 +0000 Subject: [PATCH 0094/1895] Changed to master --- Factorio/fctrserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 326f48077..ca21b262c 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -67,7 +67,7 @@ logdays="7" # from a different repo and/or branch. githubuser="GameServerManagers" githubrepo="LinuxGSM" -githubbranch="feature/factorio" +githubbranch="master" ## LinuxGSM Server Details # Do not edit From 61e6a7d2885b5298f346a2550f4b7854615407c1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 10 Jan 2017 19:56:49 +0000 Subject: [PATCH 0095/1895] Updated to release 170110 --- 7DaysToDie/sdtdserver | 2 +- ARKSurvivalEvolved/arkserver | 2 +- Arma3/arma3server | 2 +- Battlefield1942/bf1942server | 2 +- BlackMesa/bmdmserver | 2 +- BladeSymphony/bsserver | 2 +- BrainBread2/bb2server | 2 +- CallOfDuty/codserver | 2 +- CallOfDuty2/cod2server | 2 +- CallOfDuty4/cod4server | 2 +- CallOfDutyUnitedOffensive/coduoserver | 2 +- CallOfDutyWorldAtWar/codwawserver | 2 +- CodenameCURE/ccserver | 2 +- CounterStrike/csserver | 2 +- CounterStrikeConditionZero/csczserver | 2 +- CounterStrikeGlobalOffensive/csgoserver | 2 +- CounterStrikeSource/cssserver | 2 +- DayOfDefeat/dodserver | 2 +- DayOfDefeatSource/dodsserver | 2 +- DayOfInfamy/doiserver | 2 +- DeathmatchClassic/dmcserver | 2 +- DontStarveTogether/dstserver | 2 +- DoubleActionBoogaloo/dabserver | 2 +- EmpiresMod/emserver | 2 +- Factorio/fctrserver | 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 +- Minecraft/mcserver | 2 +- Mumble/mumbleserver | 2 +- NS2Combat/ns2cserver | 2 +- NaturalSelection2/ns2server | 2 +- NoMoreRoomInHell/nmrihserver | 2 +- OpposingForce/opforserver | 2 +- PiratesVikingandKnightsII/pvkiiserver | 2 +- ProjectZomboid/pzserver | 2 +- Quake2/q2server | 2 +- Quake3/q3server | 2 +- QuakeLive/qlserver | 2 +- QuakeWorld/qwserver | 2 +- RedOrchestra/roserver | 2 +- Ricochet/ricochetserver | 2 +- Rust/rustserver | 2 +- SeriousSam3BFE/ss3sserver | 2 +- Starbound/sbserver | 2 +- SvenCoop/svenserver | 2 +- TeamFortress2/tf2server | 2 +- TeamFortressClassic/tfcserver | 2 +- TeamSpeak3/ts3server | 2 +- Teeworlds/twserver | 2 +- Terraria/terrariaserver | 2 +- UnrealTournament/utserver | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament3/ut3server | 2 +- UnrealTournament99/ut99server | 2 +- WolfensteinEnemyTerritory/wetserver | 2 +- tests/tests_jc2server.sh | 2 +- 66 files changed, 66 insertions(+), 66 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index 99f77df29..4839083c0 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 9912429cd..569be1483 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Arma3/arma3server b/Arma3/arma3server index 77cb59eb2..357253709 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Battlefield1942/bf1942server b/Battlefield1942/bf1942server index d9c0537e4..42d616617 100644 --- a/Battlefield1942/bf1942server +++ b/Battlefield1942/bf1942server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index 6a599555f..18f0647bb 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index f4214061a..e0ea10bca 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index 5a9e401af..540d50873 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/CallOfDuty/codserver b/CallOfDuty/codserver index a5d88b91a..d78cbaece 100755 --- a/CallOfDuty/codserver +++ b/CallOfDuty/codserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/CallOfDuty2/cod2server b/CallOfDuty2/cod2server index c7277d16b..ecf79db64 100755 --- a/CallOfDuty2/cod2server +++ b/CallOfDuty2/cod2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server index 0290ab69d..8ccebd949 100644 --- a/CallOfDuty4/cod4server +++ b/CallOfDuty4/cod4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/CallOfDutyUnitedOffensive/coduoserver b/CallOfDutyUnitedOffensive/coduoserver index d658af116..02f2b8b09 100755 --- a/CallOfDutyUnitedOffensive/coduoserver +++ b/CallOfDutyUnitedOffensive/coduoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/CallOfDutyWorldAtWar/codwawserver b/CallOfDutyWorldAtWar/codwawserver index 15a984e25..2f3e93fae 100755 --- a/CallOfDutyWorldAtWar/codwawserver +++ b/CallOfDutyWorldAtWar/codwawserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 93e6595c5..08eb09a3d 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/CounterStrike/csserver b/CounterStrike/csserver index 9853a148c..c23d9c988 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index 69c68a8b7..3e25bb09a 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 6f97641a8..de6450a99 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index 554b1ee8f..dca4bfa8a 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index 55ade1e61..d9e1b19c4 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 45b0407e6..2e98b7771 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/DayOfInfamy/doiserver b/DayOfInfamy/doiserver index dbc17e178..215a1d8a4 100644 --- a/DayOfInfamy/doiserver +++ b/DayOfInfamy/doiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index 2c7ed676e..a0e438363 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index df915813c..99239c49a 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 4bfb6fa9b..821fbf872 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/EmpiresMod/emserver b/EmpiresMod/emserver index 525657530..d64f0491a 100644 --- a/EmpiresMod/emserver +++ b/EmpiresMod/emserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Factorio/fctrserver b/Factorio/fctrserver index ca21b262c..948af8b31 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index f57dea7c7..8cbda31ac 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index da7bf61b8..a73ac81fa 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index 4714c9a64..b5c7aa25b 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index eaedd7e05..bb4f2c73a 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index d82e3228f..c2a95d39f 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index 95c542c99..707881508 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index af38201da..43a6e465f 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Insurgency/insserver b/Insurgency/insserver index 4f7d585a6..722fcea46 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/JustCause2/jc2server b/JustCause2/jc2server index 3112912eb..d36ef0a00 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index 0cd35653d..3227bdd58 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index f8f4f84db..a6446c8bf 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index d7c3a0fcc..23902ea43 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Minecraft/mcserver b/Minecraft/mcserver index 8d0f317cf..74e03c6ab 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index 13f8a5bae..4e4a28f4c 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index ce5348a19..ccb7de1be 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index a449c704c..d81b3b5a3 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index ea7251ab0..54e59c299 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index b75a9d67e..5d347f06b 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index 73702aeb5..56ad17438 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index 70298be30..c39c86f5e 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Quake2/q2server b/Quake2/q2server index 98ecb348e..a1ff9bb75 100644 --- a/Quake2/q2server +++ b/Quake2/q2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Quake3/q3server b/Quake3/q3server index 78f68fb21..1a64eeb1b 100644 --- a/Quake3/q3server +++ b/Quake3/q3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index f0bcd183b..73047718d 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/QuakeWorld/qwserver b/QuakeWorld/qwserver index f1d5a43ab..7e27f0a89 100644 --- a/QuakeWorld/qwserver +++ b/QuakeWorld/qwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index cc8d24232..3506d0285 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index 0775d0f75..8a7658131 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Rust/rustserver b/Rust/rustserver index b7848b97d..14d9e4e42 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index 577205ad1..33487a651 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Starbound/sbserver b/Starbound/sbserver index 45136f09e..732a1d9c0 100644 --- a/Starbound/sbserver +++ b/Starbound/sbserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/SvenCoop/svenserver b/SvenCoop/svenserver index 0be845023..b2e7f35e8 100644 --- a/SvenCoop/svenserver +++ b/SvenCoop/svenserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index 4db8d44c6..a278d0921 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index fbd933328..beec9da19 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index 5fb6e174b..d1d97c172 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Teeworlds/twserver b/Teeworlds/twserver index 45b4a9bf9..4dab7b02b 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index f76c5ec53..c86a93734 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/UnrealTournament/utserver b/UnrealTournament/utserver index be80e850b..49d955329 100644 --- a/UnrealTournament/utserver +++ b/UnrealTournament/utserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index c29fe97e6..c235f0746 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/UnrealTournament3/ut3server b/UnrealTournament3/ut3server index 5946ff18d..8a839fc92 100644 --- a/UnrealTournament3/ut3server +++ b/UnrealTournament3/ut3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index e0b6a2539..0a62996d1 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/WolfensteinEnemyTerritory/wetserver b/WolfensteinEnemyTerritory/wetserver index cdcb14e2c..564473568 100644 --- a/WolfensteinEnemyTerritory/wetserver +++ b/WolfensteinEnemyTerritory/wetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 697176aec..cd765b480 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -17,7 +17,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="161224" +version="170110" ########################## ######## Settings ######## From 01011b5360455dd0f6640f61ca5ee9e8701beaa1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 10 Jan 2017 20:12:21 +0000 Subject: [PATCH 0096/1895] Added engine --- Factorio/fctrserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 948af8b31..0d10ee24d 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -72,7 +72,7 @@ githubbranch="master" ## LinuxGSM Server Details # Do not edit gamename="Factorio" -engine="" +engine="factorio" ## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers servicename="fctr-server" From 2d97072581cda11a5ae2cdd599d3fda77ca2f068 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:27:28 +0100 Subject: [PATCH 0097/1895] Revert single quote on ${steampass} --- lgsm/functions/check_steamcmd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 79c016b58..20a36afea 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -58,7 +58,7 @@ fn_check_steamcmd_sh(){ 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 + "${steamcmddir}"/steamcmd.sh +login "${steamuser}" "${steampass}" +quit if [ $? -ne 0 ]; then fn_print_failure_nl "Error running SteamCMD" fi From da6b5087b7e80be45c942e64e711b03c7ba00ee3 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:27:50 +0100 Subject: [PATCH 0098/1895] Revert single quote on ${steampass} --- lgsm/functions/command_validate.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 8b55aaae9..6125ed513 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -24,9 +24,9 @@ fn_validation(){ fi if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" fi if [ $? != 0 ]; then fn_print_fail_nl "Validating files: SteamCMD" @@ -54,4 +54,4 @@ if [ "${status}" != "0" ]; then else fn_validation fi -core_exit.sh \ No newline at end of file +core_exit.sh From 683fe847f75972a0ac452c31b28e574e0b8f9f0e Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:28:36 +0100 Subject: [PATCH 0099/1895] Revert single quote on ${steampass} --- lgsm/functions/install_server_files.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 896347388..792cb5e49 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -78,18 +78,18 @@ fn_install_server_files_steamcmd(){ 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}" ${branch} +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +quit local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} +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}" ${branch} -validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} -validate +quit local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} -validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} -validate +quit local exitcode=$? fi fi @@ -107,7 +107,7 @@ fn_install_server_files_steamcmd(){ 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}" ${branch} -validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} -validate +quit local exitcode=$? done fi From 7ab3eadc0ddae4f4a63b08643ba900c7730f36e9 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:30:35 +0100 Subject: [PATCH 0100/1895] Revert single quote on ${steampass} --- lgsm/functions/update_steamcmd.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index d2808974c..167daf5fb 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -26,9 +26,9 @@ fn_update_steamcmd_dl(){ fi if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" '${steampass}' +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" fi fix.sh @@ -156,7 +156,7 @@ fn_update_steamcmd_check(){ fi # Gets availablebuild info - 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+\"${branchname}\"$" | grep -m 1 -EB 10 "^\s+}$" | grep -E "^\s+\"buildid\"\s+" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) + 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+\"${branchname}\"$" | 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" sleep 1 From 46bce6bc5be6adc7338fe610d7ae98f43a429c80 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:32:33 +0100 Subject: [PATCH 0101/1895] single quote password --- 7DaysToDie/sdtdserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index 4839083c0..36bfbed5d 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -24,7 +24,7 @@ version="170110" ## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login steamuser="username" -steampass="password" +steampass='password' ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters ip="0.0.0.0" From aef9c2d3891477d9f0132869975d3cffcedb8877 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:32:55 +0100 Subject: [PATCH 0102/1895] single quote password --- Arma3/arma3server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Arma3/arma3server b/Arma3/arma3server index 357253709..8898beb93 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -24,7 +24,7 @@ version="170110" ## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login steamuser="username" -steampass="password" +steampass='password' ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters ip="0.0.0.0" From a51bcf0b8445ceea80ed39a7819c7cf5b5ba6f15 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:33:06 +0100 Subject: [PATCH 0103/1895] single quote password --- BladeSymphony/bsserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index e0ea10bca..0bac17035 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -24,7 +24,7 @@ version="170110" ## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login steamuser="username" -steampass="password" +steampass='password' ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters defaultmap="duel_winter" From 64a5777bee1be6e489320f08ef0d22d73466ceab Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:35:03 +0100 Subject: [PATCH 0104/1895] single quote password --- BrainBread2/bb2server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index 540d50873..50e46bf72 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -23,7 +23,7 @@ version="170110" ## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login # Steam login steamuser="username" -steampass="password" +steampass='password' ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters defaultmap="bba_barracks" From 594a636ace1d9f498ce8cbc8dbf8a640371482a5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:35:04 +0100 Subject: [PATCH 0105/1895] single quote password --- KillingFloor/kfserver | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index 3227bdd58..e42dd92a1 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -24,7 +24,7 @@ version="170110" ## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login steamuser="username" -steampass="password" +steampass='password' ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters defaultmap="KF-BioticsLab.rom" @@ -203,4 +203,4 @@ fi core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From 447bf80a9c7c8cbc8d86dac652b461d13216b8dd Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:35:06 +0100 Subject: [PATCH 0106/1895] single quote password --- NaturalSelection2/ns2server | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index d81b3b5a3..c662ecbd5 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -24,7 +24,7 @@ version="170110" ## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login steamuser="username" -steampass="password" +steampass='password' ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters defaultmap="ns2_summit" @@ -208,4 +208,4 @@ fi core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From 9a2cc8d8bfcc21db903242ee00e0e5ae905d40ef Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:35:09 +0100 Subject: [PATCH 0107/1895] single quote password --- NS2Combat/ns2cserver | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index ccb7de1be..b5fcd7b8f 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -24,7 +24,7 @@ version="170110" ## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login steamuser="username" -steampass="password" +steampass='password' ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters defaultmap="co_core" @@ -208,4 +208,4 @@ fi core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From 461021560999715dbcde9aaed3cf22b60a936275 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:35:11 +0100 Subject: [PATCH 0108/1895] single quote password --- RedOrchestra/roserver | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index 3506d0285..8170bb53d 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -24,7 +24,7 @@ version="170110" ## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login steamuser="username" -steampass="password" +steampass='password' ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters defaultmap="RO-Arad.rom" @@ -205,4 +205,4 @@ fi core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From c1308b55b04983a8bf0c2d5cb473a7f9bbadc330 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:35:13 +0100 Subject: [PATCH 0109/1895] single quote password --- Starbound/sbserver | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Starbound/sbserver b/Starbound/sbserver index 732a1d9c0..e6b37dc71 100644 --- a/Starbound/sbserver +++ b/Starbound/sbserver @@ -24,7 +24,7 @@ version="170110" ## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login steamuser="username" -steampass="password" +steampass='password' ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters ip="0.0.0.0" @@ -197,4 +197,4 @@ fi core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From 0310b3d00942570bc6af805ea4228c446a875f03 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:35:15 +0100 Subject: [PATCH 0110/1895] single quote password --- Teeworlds/twserver | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Teeworlds/twserver b/Teeworlds/twserver index 4dab7b02b..4a9684003 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -24,7 +24,7 @@ version="170110" ## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login steamuser="username" -steampass="password" +steampass='password' ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters ip="0.0.0.0" @@ -198,4 +198,4 @@ fi core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From 994eda68e6382ef9e60af0cb8f7ac21cf2d7e589 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 12 Jan 2017 22:35:17 +0100 Subject: [PATCH 0111/1895] single quote password --- Terraria/terrariaserver | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index c86a93734..a55c57286 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -24,7 +24,7 @@ version="170110" ## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login steamuser="username" -steampass="password" +steampass='password' ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters ip="0.0.0.0" @@ -197,4 +197,4 @@ fi core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From 95942d7e51e94edb69b4bb632bd30a77fcfa9356 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 12 Jan 2017 21:47:53 +0000 Subject: [PATCH 0112/1895] changed quotes --- lgsm/functions/check_steamcmd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 20a36afea..25b73a70b 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -31,7 +31,7 @@ fn_check_steamcmd_user(){ fn_script_log_info "Using anonymous Steam login." fi steamuser="anonymous" - steampass="" + steampass='' sleep 1 fi } From a300a15df2d8b596e1fc1961e0d6c7bd1be0ef42 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 12 Jan 2017 21:48:10 +0000 Subject: [PATCH 0113/1895] this is a anonymous login removed steamuser var --- Ricochet/ricochetserver | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index 8a7658131..d3165f2fd 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -41,10 +41,6 @@ parms="-game ricochet -strictportbind +ip ${ip} -port ${port} +clientport ${clie #### Server Settings #### -## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -steamuser="username" -steampass="password" - ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters ip="0.0.0.0" From 1b9e0bcd1b13cbb12aca510a0ddd50062b76c637 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 03:12:01 +0100 Subject: [PATCH 0114/1895] Fixes #1235 and more No config alteration for Ark, and requires to create the cfgdir. + Rearranging presentation to make more visual sense --- lgsm/functions/install_config.sh | 73 +++++++++++++++++--------------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 10a7040d2..426bec9c8 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -8,35 +8,7 @@ local commandname="INSTALL" local commandaction="Install" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -fn_fetch_default_config(){ - mkdir -pv "${lgsmdir}/default-configs" - githuburl="https://github.com/GameServerManagers/Game-Server-Configs/master" - - for config in "${array_configs[@]}" - do - fileurl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master/${gamedirname}/${config}"; filedir="${lgsmdir}/default-configs"; filename="${config}"; executecmd="noexecute" run="norun"; force="noforce" - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" - done -} - -# Changes some variables within the default configs -# SERVERNAME to LinuxGSM -# PASSWORD to random password -fn_set_config_vars(){ - random=$(strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 8 | tr -d '\n'; echo) - servername="LinuxGSM" - rconpass="admin$random" - echo "changing hostname." - fn_script_log_info "changing hostname." - sleep 1 - sed -i "s/SERVERNAME/${servername}/g" "${servercfgfullpath}" - echo "changing rcon/admin password." - fn_script_log_info "changing rcon/admin password." - sed -i "s/ADMINPASSWORD/${rconpass}/g" "${servercfgfullpath}" - sleep 1 -} - -# Checks if cfg dir exists, creates it if it doesn't +# Checks if server cfg dir exists, creates it if it doesn't fn_check_cfgdir(){ if [ ! -d "${servercfgdir}" ]; then echo "creating ${servercfgdir} config directory." @@ -45,11 +17,19 @@ fn_check_cfgdir(){ fi } -# Copys the default configs from Game-Server-Configs repo to the -# correct location +# Downloads default configs from Game-Server-Configs repo to lgsm/default-configs +fn_fetch_default_config(){ + mkdir -pv "${lgsmdir}/default-configs" + githuburl="https://github.com/GameServerManagers/Game-Server-Configs/master" + for config in "${array_configs[@]}"; do + fileurl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master/${gamedirname}/${config}"; filedir="${lgsmdir}/default-configs"; filename="${config}"; executecmd="noexecute" run="norun"; force="noforce" + fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + done +} + +# Copys default configs from Game-Server-Configs repo to server config location fn_default_config_remote(){ - for config in "${array_configs[@]}" - do + for config in "${array_configs[@]}"; do # every config is copied echo "copying ${config} config file." fn_script_log_info "copying ${servercfg} config file." @@ -66,6 +46,29 @@ fn_default_config_remote(){ sleep 1 } +# Changes some variables within the default configs +# SERVERNAME to LinuxGSM +# PASSWORD to random password +fn_set_config_vars(){ + if [ -f "${servercfgfullpath}" ]; then + random=$(strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 8 | tr -d '\n'; echo) + servername="LinuxGSM" + rconpass="admin$random" + echo "changing hostname." + fn_script_log_info "changing hostname." + sleep 1 + sed -i "s/SERVERNAME/${servername}/g" "${servercfgfullpath}" + echo "changing rcon/admin password." + fn_script_log_info "changing rcon/admin password." + sed -i "s/ADMINPASSWORD/${rconpass}/g" "${servercfgfullpath}" + sleep 1 + else + fn_script_log_warn "Config file not found, cannot alter it." + echo "Config file not found, cannot alter it." + sleep 1 + fi +} + # Changes some variables within the default Don't Starve Together configs fn_set_dst_config_vars(){ ## cluster.ini @@ -129,10 +132,10 @@ if [ "${gamename}" == "7 Days To Die" ]; then fn_set_config_vars elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then gamedirname="ARKSurvivalEvolved" + fn_check_cfgdir array_configs+=( GameUserSettings.ini ) fn_fetch_default_config fn_default_config_remote - fn_set_config_vars elif [ "${gamename}" == "ARMA 3" ]; then gamedirname="Arma3" fn_check_cfgdir @@ -494,4 +497,4 @@ elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars -fi \ No newline at end of file +fi From 6da044b55e80e501a915e564a5efa56848c291e6 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 04:22:22 +0100 Subject: [PATCH 0115/1895] Real default values --- ARKSurvivalEvolved/arkserver | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 569be1483..95fce2b44 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -24,11 +24,11 @@ version="170110" ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters servername="ark-server" -port="7778" +port="7777" queryport="27015" -rconport="32330" +rconport="27020" rconpassword="" # Set to enable rcon -maxplayers="50" +maxplayers="60" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters From 8f143f0d3baec3049b1ace4cfdf70e915b43bc28 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 04:36:40 +0100 Subject: [PATCH 0116/1895] More explicit servername Otherwise you can think it's a servicename --- ARKSurvivalEvolved/arkserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 95fce2b44..47ba8919e 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -23,7 +23,7 @@ version="170110" #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -servername="ark-server" +servername="LGSM ARK Server" port="7777" queryport="27015" rconport="27020" From eb2788ed9e25bdf6ad602c542d66e7deb72640ae Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 04:54:55 +0100 Subject: [PATCH 0117/1895] Better ARK ports info Will test if ok --- lgsm/functions/command_details.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 3af2b7ac7..20ad29222 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -347,9 +347,14 @@ fn_details_ark(){ 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 "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + # Don't do arithmetics if ever the port wasn't a numeric value + if [ "${port}" -eq "${port}" ];then + echo -e "> RAW\t\INBOUND\t$((port+1))\tudp + fi echo -e "> Query\tINBOUND\t${queryport}\tudp" + echo -e "> RCON\INBOUND\t${rconport}\ttcp" } | column -s $'\t' -t } From 07fc2472992c0d2972ff59c30dd2487798ab2d67 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 04:56:23 +0100 Subject: [PATCH 0118/1895] missing space --- 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 20ad29222..fae41b1a1 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -350,7 +350,7 @@ fn_details_ark(){ echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" echo -e "> Game\tINBOUND\t${port}\tudp" # Don't do arithmetics if ever the port wasn't a numeric value - if [ "${port}" -eq "${port}" ];then + if [ "${port}" -eq "${port}" ]; then echo -e "> RAW\t\INBOUND\t$((port+1))\tudp fi echo -e "> Query\tINBOUND\t${queryport}\tudp" From 6d15a580e72b9f9438e0c2cea2b706a5fac85f94 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 05:01:15 +0100 Subject: [PATCH 0119/1895] better close an echo --- 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 fae41b1a1..bc634a4ce 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -351,7 +351,7 @@ fn_details_ark(){ echo -e "> Game\tINBOUND\t${port}\tudp" # Don't do arithmetics if ever the port wasn't a numeric value if [ "${port}" -eq "${port}" ]; then - echo -e "> RAW\t\INBOUND\t$((port+1))\tudp + echo -e "> RAW\t\INBOUND\t$((port+1))\tudp" fi echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> RCON\INBOUND\t${rconport}\ttcp" From a12d6cc2276f1e2c105858978a440b9a47839ceb Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 05:03:04 +0100 Subject: [PATCH 0120/1895] I need to get better with tables. --- lgsm/functions/command_details.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index bc634a4ce..eee2af76e 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -351,10 +351,10 @@ fn_details_ark(){ echo -e "> Game\tINBOUND\t${port}\tudp" # Don't do arithmetics if ever the port wasn't a numeric value if [ "${port}" -eq "${port}" ]; then - echo -e "> RAW\t\INBOUND\t$((port+1))\tudp" + echo -e "> RAW\tINBOUND\t$((port+1))\tudp" fi echo -e "> Query\tINBOUND\t${queryport}\tudp" - echo -e "> RCON\INBOUND\t${rconport}\ttcp" + echo -e "> RCON\tINBOUND\t${rconport}\ttcp" } | column -s $'\t' -t } From 8543ec774414d1116d3954eecb93a5e2cc5a213b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 05:37:55 +0100 Subject: [PATCH 0121/1895] added back config vars for ark --- lgsm/functions/install_config.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 426bec9c8..51d8c4065 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -136,6 +136,7 @@ elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then array_configs+=( GameUserSettings.ini ) fn_fetch_default_config fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "ARMA 3" ]; then gamedirname="Arma3" fn_check_cfgdir From a557486a526af84e61de7ea727805a127f9d3321 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 05:57:25 +0100 Subject: [PATCH 0122/1895] Cleaning parameters set within .ini file and default maxplayers is actually 70 --- ARKSurvivalEvolved/arkserver | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 47ba8919e..d2d45f904 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -23,18 +23,16 @@ version="170110" #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -servername="LGSM ARK Server" port="7777" queryport="27015" rconport="27020" -rconpassword="" # Set to enable rcon -maxplayers="60" +maxplayers="70" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters # Edit with care fn_parms(){ -parms="\"TheIsland?listen?MultiHome=${ip}?SessionName=${servername}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port}?ServerAdminPassword=${rconpassword}\"" +parms="\"TheIsland?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port}?\"" } #### LinuxGSM Settings #### From 5144d86be55f7c63e0e581b9fc2821f69ddfcc4f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 06:07:35 +0100 Subject: [PATCH 0123/1895] Ark info config, to test --- lgsm/functions/info_config.sh | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 2da3c4d84..c487d3917 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -39,6 +39,16 @@ fn_info_config_avalanche(){ fi } +fn_info_config_ark(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + else + servername=$(grep "Name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/SessionName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + # Not Set + servername=${servername:-"NOT SET"} + fi +} + fn_info_config_bf1942(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -596,6 +606,9 @@ fn_info_config_sdtd(){ # Just Cause 2 if [ "${engine}" == "avalanche" ]; then fn_info_config_avalanche +# ARK: Survival Evolved +elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then + fn_info_config_ark # Battlefield: 1942 elif [ "${gamename}" == "Battlefield: 1942" ]; then fn_info_config_bf1942 @@ -663,4 +676,4 @@ elif [ "${gamename}" == "7 Days To Die" ]; then fn_info_config_sdtd elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fn_info_config_wolfensteinenemyterritory -fi \ No newline at end of file +fi From e4b0054f637452dbd3584aa8be9d89f4f29b4571 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 06:11:33 +0100 Subject: [PATCH 0124/1895] Grep Ark SessionName --- lgsm/functions/info_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index c487d3917..ea05055cd 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -43,7 +43,7 @@ fn_info_config_ark(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" else - servername=$(grep "Name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/SessionName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + servername=$(grep "SessionName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/SessionName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') # Not Set servername=${servername:-"NOT SET"} fi From 43a924a12483b2947f1366677c249c1051cd1136 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 14:54:44 +0100 Subject: [PATCH 0125/1895] Typo: Survivial > Survival --- lgsm/functions/install_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 51d8c4065..840347ab4 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -130,7 +130,7 @@ if [ "${gamename}" == "7 Days To Die" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then +elif [ "${gamename}" == "ARK: Survival Evolved" ]; then gamedirname="ARKSurvivalEvolved" fn_check_cfgdir array_configs+=( GameUserSettings.ini ) From 4d4de5c822e0ad2a8afa0fb92d2083ececcf2b05 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 14:55:19 +0100 Subject: [PATCH 0126/1895] Typo: Survivial > Survival --- lgsm/functions/command_stop.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 2013f85bf..a23f4ad5c 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -296,7 +296,7 @@ fn_stop_tmux(){ rm -f "${rootdir}/${lockselfname}" # ARK doesn't clean up immediately after tmux is killed. # Make certain the ports are cleared before continuing. - if [ "${gamename}" == "ARK: Survivial Evolved" ]; then + if [ "${gamename}" == "ARK: Survival Evolved" ]; then fn_stop_ark echo -en "\n" fi From d6944b6f94f279278aaec570855e76025891a692 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 14:56:09 +0100 Subject: [PATCH 0127/1895] Typo: Survivial > Survival --- 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 eee2af76e..73e54c3ff 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -777,7 +777,7 @@ fn_display_details() { fn_details_ut3 elif [ "${gamename}" == "7 Days To Die" ]; then fn_details_sdtd - elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then + elif [ "${gamename}" == "ARK: Survival Evolved" ]; then fn_details_ark elif [ "${gamename}" == "Call of Duty" ]; then fn_details_cod From c909a85b569dd561fde67f1efb62cc8757b90b0d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 13 Jan 2017 14:56:47 +0100 Subject: [PATCH 0128/1895] Typo: Survivial > Survival --- ARKSurvivalEvolved/arkserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index d2d45f904..6bc5079c0 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -80,7 +80,7 @@ githubbranch="master" ## LinuxGSM Server Details # Do not edit -gamename="ARK: Survivial Evolved" +gamename="ARK: Survival Evolved" engine="unreal4" ## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers From 189a1659fc1820a52774bac2d23c04b33060ccf0 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 18:34:45 +0100 Subject: [PATCH 0129/1895] Fixes arma3 ports actually working with parms Fixes #1240 --- lgsm/functions/command_details.sh | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 3af2b7ac7..f606b2f37 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -310,7 +310,7 @@ fn_details_ports(){ parmslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file - local ports_edit_array=( "avalanche" "dontstarve" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "projectzomboid" "quake" "refractor" "realvirtuality" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" ) + local ports_edit_array=( "avalanche" "dontstarve" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "projectzomboid" "quake" "refractor" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" ) for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then @@ -318,7 +318,7 @@ fn_details_ports(){ fi done # engines/games that require editing in the script file - local ports_edit_array=( "goldsource" "Factorio" "Hurtworld" "iw3.0" "Rust" "spark" "source" "starbound" "unreal4" ) + local ports_edit_array=( "goldsource" "Factorio" "Hurtworld" "iw3.0" "Rust" "spark" "source" "starbound" "unreal4" "realvirtuality") for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then @@ -347,9 +347,14 @@ fn_details_ark(){ 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 "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + # Don't do arithmetics if ever the port wasn't a numeric value + if [ "${port}" -eq "${port}" ]; then + echo -e "> RAW\tINBOUND\t$((port+1))\tudp" + fi echo -e "> Query\tINBOUND\t${queryport}\tudp" + echo -e "> RCON\tINBOUND\t${rconport}\ttcp" } | column -s $'\t' -t } @@ -521,15 +526,19 @@ fn_details_quakelive(){ fn_details_realvirtuality(){ echo -e "netstat -atunp | grep arma3server" echo -e "" - if [ -z "${port}" ]||[ -z "${queryport}" ]||[ -z "${masterport}" ]; then - echo -e "${red}ERROR!${default} Missing/commented ports in ${servercfg}." - echo -e "" + # Default port + if [ -z "${port}" ]; then + port="2302" 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" + # Don't do arithmetics if ever the port wasn't a numeric value + if [ "${port}" -eq "${port}" ]; then + echo -e "> Steam: Query\tINBOUND\t$((port+1))\tudp" + echo -e "> Steam: Master traffic\tINBOUND\t$((port+2))\tudp" + echo -e "> Undocumented Port\tINBOUND\t$((port+3))\tudp" + fi } | column -s $'\t' -t } @@ -772,7 +781,7 @@ fn_display_details() { fn_details_ut3 elif [ "${gamename}" == "7 Days To Die" ]; then fn_details_sdtd - elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then + elif [ "${gamename}" == "ARK: Survival Evolved" ]; then fn_details_ark elif [ "${gamename}" == "Call of Duty" ]; then fn_details_cod @@ -816,4 +825,3 @@ then fn_display_details core_exit.sh fi - From c5535543e1106bc5b1680e02f04f357bf3870245 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 18:36:12 +0100 Subject: [PATCH 0130/1895] Revert change to Ark to fit master, not develop --- 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 f606b2f37..5f7f43b1e 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -781,7 +781,7 @@ fn_display_details() { fn_details_ut3 elif [ "${gamename}" == "7 Days To Die" ]; then fn_details_sdtd - elif [ "${gamename}" == "ARK: Survival Evolved" ]; then + elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then fn_details_ark elif [ "${gamename}" == "Call of Duty" ]; then fn_details_cod From 4cca1e82dfcd210ff8939cec527aa065aaffa866 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 19:03:57 +0100 Subject: [PATCH 0131/1895] Mods install command --- lgsm/functions/command_mods_install.sh | 175 +++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 lgsm/functions/command_mods_install.sh diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh new file mode 100644 index 000000000..a2c7b8bed --- /dev/null +++ b/lgsm/functions/command_mods_install.sh @@ -0,0 +1,175 @@ +#!/bin/bash +# LGSM command_mods_install.sh function +# Author: Daniel Gibbs +# Contributor: UltimateByte +# Website: https://gameservermanagers.com +# Description: List and installs available mods along with mods_list.sh. + +local commandname="MODS" +local commandaction="Mod Installation" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +check.sh +mods_list.sh + +fn_mods_install_init(){ + fn_script_log "Entering mods & addons installation" + echo "=================================" + echo "${gamename} mods & addons installation" + echo "" + # Display available mods from mods_list.sh + fn_mods_show_available + echo "" + # Keep prompting as long as the user input doesn't correspond to an available mod + while [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; do + echo -en "Enter a \e[36mmod\e[0m to install (or exit to abort): " + read -r usermodselect + # Exit if user says exit or abort + if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then + fn_script_log "User aborted." + echo "Aborted." + core_exit.sh + # Supplementary output upon invalid user input + elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then + fn_print_error2_nl "${usermodselect} is not a valid mod." + echo " * Enter a valid mod or input exit to abort." + fi + done + # Gives a pretty name to the user and get all mod info + currentmod="${usermodselect}" + fn_mod_get_info_from_command + fn_print_dots "Installing ${modprettyname}" + sleep 1 + fn_script_log "Installing ${modprettyname}." +} + +# Create mods directory if it doesn't exist +# Assuming the game is already installed as mods_list.sh checked for it. +fn_mods_dir(){ + if [ ! -d "${modinstalldir}" ]; then + fn_script_log_info "Creating mods directory: ${modinstalldir}" + fn_print_dots "Creating mods directory" + sleep 1 + mkdir -p "${modinstalldir}" + fn_print_ok_nl "Created mods directory" + fi +} + +# Clear mod download directory so that there is only one file in it since we don't the file name and extention +fn_clear_tmp_mods(){ + if [ -d "${modstmpdir}" ]; then + rm -r "${modstmpdir}" + fn_script_log "Clearing temp mod download directory: ${modstmpdir}" + fi +} + +# Create tmp download mod directory +fn_mods_tmpdir(){ + if [ ! -d "${modstmpdir}" ]; then + mkdir -p "${modstmpdir}" + fn_script_log "Creating temp mod download directory: ${modstmpdir}" + fi +} + +fn_mod_dl(){ + # fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + fileurl="${modurl}" + filedir="${modstmpdir}" + filename="${modfilename}" + fn_script_log "Downloading mods to ${modstmpdir}" + fn_fetch_file "${fileurl}" "${filedir}" "${filename}" + # Check if variable is valid checking if file has been downloaded and exists + if [ ! -f "${modstmpdir}/${modfilename}" ]; then + fn_print_fail "An issue occurred upon downloading ${modprettyname}" + core_exit.sh + fi +} + +fn_mod_extract(){ + # fn_dl_extract "${filedir}" "${filename}" "${extractdir}" + filename="${modfilename}" + extractdir="${modstmpdir}/extracted" + if [ ! -d "${extractdir}" ]; then + mkdir -p "${extractdir}" + fi + fn_script_log "Extracting ${modprettyname} to ${extractdir}" + fn_dl_extract "${filedir}" "${filename}" "${extractdir}" +} + +fn_mod_fileslist(){ + # ${modsdatadir}/${modcommand}-files.list + true; +} + +fn_mod_copy_destination(){ + # Destination directory: ${modinstalldir} + fn_script_log "Copying ${modprettyname} to ${modinstalldir}" + cp -Rf "${extractdir}/." "${modinstalldir}/" +} + +# Check if the mod is already installed and warn the user +fn_mod_already_installed(){ + if [ -f "${modslockfilefullpath}" ]; then + if [ -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then + echo "" + fn_print_warning_nl "${modprettyname} has already been installed." + echo " * Mod files will be overwritten." + sleep 4 + fi + fi +} + +# Add the mod to the installed mods list +fn_mod_add_list(){ + # Create lgsm/data directory + if [ ! -d "${modsdatadir}" ]; then + mkdir -p "${modsdatadir}" + fn_script_log "Created ${modsdatadir}" + fi + # Create lgsm/data/${modslockfile} + if [ ! -f "${modslockfilefullpath}" ]; then + touch "${modslockfilefullpath}" + fn_script_log "Created ${modslockfilefullpath}" + fi + # Input mod name to lockfile + if [ ! -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then + echo "${modcommand}" >> "${modslockfilefullpath}" + fn_script_log "${modcommand} added to ${modslockfile}" + fi +} + +# Run all required operation +fn_mod_installation(){ + # If a mod was selected + if [ -n "${currentmod}" ]; then + # Get mod info + fn_mod_get_info_from_command + # Check if mod is already installed + fn_mod_already_installed + # Check and create required directories + fn_mods_dir + # Clear lgsm/tmp/mods dir if exists then recreate it + fn_clear_tmp_mods + fn_mods_tmpdir + # Download mod + fn_mod_dl + # Extract the mod + fn_mod_extract + # Build a file list + fn_mod_fileslist + # Copying to destination + fn_mod_copy_destination + # Ending with installation routines + fn_mod_add_list + fn_clear_tmp_mods + fn_print_ok_nl "${modprettyname} installed." + fn_script_log "${modprettyname} installed." + else + fn_print_fail "No mod was selected." + core_exit.sh + fi +} + +fn_mods_install_checks +fn_mods_install_init +fn_mod_installation From f677f13b666eff74745a44cb4837d74081bd3859 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 19:04:50 +0100 Subject: [PATCH 0132/1895] Mods remove init --- lgsm/functions/command_mods_remove.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 lgsm/functions/command_mods_remove.sh diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh new file mode 100644 index 000000000..c2bb35f48 --- /dev/null +++ b/lgsm/functions/command_mods_remove.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# LGSM command_mods_uninstall.sh function +# Author: Daniel Gibbs +# Contributor: UltimateByte +# Website: https://gameservermanagers.com +# Description: Uninstall mods along with mods_list.sh. + +local commandname="MODS" +local commandaction="Mod Remove" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" From 18d6168c30e7bfaf11f46867b712ae55397d7e83 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 19:05:17 +0100 Subject: [PATCH 0133/1895] Command mods update init --- lgsm/functions/command_mods_update.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 lgsm/functions/command_mods_update.sh diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh new file mode 100644 index 000000000..e1a818bc1 --- /dev/null +++ b/lgsm/functions/command_mods_update.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# LGSM command_mods_update.sh function +# Author: Daniel Gibbs +# Contributor: UltimateByte +# Website: https://gameservermanagers.com +# Description: Updates installed mods along with mods_list.sh. + +local commandname="MODS" +local commandaction="Mod Update" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" From 24fb13ffac418a903d32a5bf8b0d8125302877a7 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 19:05:59 +0100 Subject: [PATCH 0134/1895] Declare mods functions --- lgsm/functions/core_functions.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 3a233174a..a8c41fc32 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -180,6 +180,21 @@ functionfile="${FUNCNAME}" fn_fetch_function } +command_mods_install.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_mods_update.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + +command_mods_remove.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + command_fastdl.sh(){ functionfile="${FUNCNAME}" fn_fetch_function @@ -276,6 +291,12 @@ functionfile="${FUNCNAME}" fn_fetch_function } +# Mods + +mods_list.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} # Dev From f303ce2eb56acf1596fbaee7749db7d609c47e5c Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 19:06:37 +0100 Subject: [PATCH 0135/1895] Mods install/update/remove opt --- lgsm/functions/core_getopt.sh | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 0cbd6f2b0..faa9c7011 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -43,6 +43,12 @@ case "${getopt}" in command_install.sh;; ai|auto-install) fn_autoinstall;; + mi|mods-install) + command_mods_install.sh;; + mu|mods-update) + command_mods_update.sh;; + mr|mods-remove) + command_mods_remove.sh;; dd|detect-deps) command_dev_detect_deps.sh;; dg|detect-glibc) @@ -76,6 +82,9 @@ case "${getopt}" in echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." echo -e "${blue}install\t${default}i |Install the server." echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + echo -e "${blue}mods-install\t${default}mi |View and install available mods/addons." + echo -e "${blue}mods-update\t${default}mu |Update installed mods/addons." + echo -e "${blue}mods-remove\t${default}mr |Remove installed mods/addons." } | column -s $'\t' -t esac } @@ -517,14 +526,20 @@ case "${getopt}" in command_install.sh;; ai|auto-install) fn_autoinstall;; + fd|fastdl) + command_fastdl.sh;; + mi|mods-install) + command_mods_install.sh;; + mu|mods-update) + command_mods_update.sh;; + mr|mods-remove) + command_mods_remove.sh;; dd|detect-deps) command_dev_detect_deps.sh;; dg|detect-glibc) command_dev_detect_glibc.sh;; dl|detect-ldd) command_dev_detect_ldd.sh;; - fd|fastdl) - command_fastdl.sh;; *) if [ -n "${getopt}" ]; then echo -e "${red}Unknown command${default}: $0 ${getopt}" @@ -552,6 +567,9 @@ case "${getopt}" in echo -e "${blue}install\t${default}i |Install the server." echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." echo -e "${blue}fastdl\t${default}fd |Generates or update a FastDL directory for your server." + echo -e "${blue}mods-install\t${default}mi |View and install available mods/addons." + echo -e "${blue}mods-update\t${default}mu |Update installed mods/addons." + echo -e "${blue}mods-remove\t${default}mr |Remove installed mods/addons." } | column -s $'\t' -t esac } From cc07590575e1bfcbd2da9c0dba4498feebf270fb Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 19:07:32 +0100 Subject: [PATCH 0136/1895] Base for mods_list.sh --- lgsm/functions/mods_list.sh | 286 ++++++++++++++++++++++++++++++++++++ 1 file changed, 286 insertions(+) create mode 100644 lgsm/functions/mods_list.sh diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh new file mode 100644 index 000000000..f4c1910b5 --- /dev/null +++ b/lgsm/functions/mods_list.sh @@ -0,0 +1,286 @@ +#!/bin/bash +# LGSM mods_list.sh function +# Author: Daniel Gibbs +# Contributor: UltimateByte +# Website: https://gameservermanagers.com +# Description: Lists and defines available mods for LGSM supported servers. +# Usage: To add a mod, you just need to add an array variable into fn_mods_info following the guide to set proper values. +# Usage: Then add this array to the mods_global_array. +# Usage: If needed, you can scrape to define the download URL inside the fn_mods_scrape_urls function. + +local commandname="MODS" +local commandaction="List Mods" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +check.sh + +## Useful variables +# Files and Directories +modstmpdir="${tmpdir}/mods" +modsdatadir="${lgsmdir}/data/mods" +modslockfile="installed-mods-listing" +modslockfilefullpath="${modsdatadir}/${modslockfile}" +# Separator name +modseparator="MOD" + +# Define mods information (required) +fn_mods_info(){ + # REQUIRED: mod_info_name=( MOD "modcommand" "Pretty Name" "URL" "filename" "modsubfolders" "LowercaseOn/Off" "/files/to/keep;" "/install/path" "ENGINES" "GAMES" "NOTGAMES" "AUTHOR_URL" "Short Description" ) + # Example 1) Well made mod: mod_info_name=( MOD "awesomemod" "This is an Awesome Mod" "https://awesomemod.com/latest.zip" "awesomemod.zip" "0" "LowercaseOff" "OVERWRITE" "${systemdir}/addons" "source;unity3d;" "GAMES" "NOTGAMES" "https://awesomemod.com/" "This mod knows that 42 is the answer" ) + # Example 2) Poorly made mod: mod_info_name=( MOD "stupidmod" "This is a stupid mod" "${crappymodurl}" "StupidMod.zip" "2" "LowercaseOn" "cfg;data/crappymod;" "${systemdir}" "source;" "GAMES" "Garry's mod;Counter-Strike: Source;" "This mod is dumber than dumb" ) + # None of those values can be empty + # [index] | Usage + # [0] | MOD: separator, all mods must begin with it + # [1] | "modcommand": the LGSM name and command to install the mod (must be unique and lowercase) + # [2] | "Pretty Name": the common name people use to call the mod that will be displayed to the user + # [3] | "URL": link to the file; can be a variable defined in fn_mods_nasty_urls (make sure curl can download it) + # [4] | "filename": the output filename + # [5] | "modsubfolders": in how many subfolders is the mod (none is 1) + # [6] | "LowercaseOn/Off": LowercaseOff or LowercaseOn: enable/disable converting extracted files and directories to lowercase (some games require it) + # [7] | "modinstalldir": the directory in which to install the mode ( use LGSM dir variables such as ${systemdir}) + # [8] | "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" to ignore the value or "NOUPDATE" to disallow updating + # [9] | "Supported Engines;": list them according to LGSM ${engine} variables, separated and ended with a semicolon, or use ENGINES to ignore the value + # [10] | "Supported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use GAMES to ignore the value + # [11] | "Unsupported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use NOTGAMES to ignore the value (useful to exclude a game when using Supported Engines) + # [12] | "AUTHOR_URL" is the author's website, displayed to the user when chosing mods to install + # [13] | "Short Description" a description showed to the user upon installation + + # Source mods + mod_info_metamod=( MOD "metamod" "MetaMod" "${metamodurl}" "${metamodlatestfile}" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "source;" "GAMES" "Garry's Mod;" "https://www.sourcemm.net" "Plugins Framework" ) + mod_info_sourcemod=( MOD "sourcemod" "SourceMod" "${sourcemodurl}" "${sourcemodlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;" "source;" "GAMES" "Garry's Mod;" "http://www.sourcemod.net" "Admin Features (requires MetaMod)" ) + # Garry's Mod Addons + mod_info_ulib=( MOD "ulib" "ULib" "https://codeload.github.com/TeamUlysses/ulib/zip/master" "ulib-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Complete Framework" ) + mod_info_ulx=( MOD "ulx" "ULX" "https://codeload.github.com/TeamUlysses/ulx/zip/master" "ulx-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Admin Panel (requires ULib)" ) + mod_info_utime=( MOD "utime" "UTime" "https://github.com/TeamUlysses/utime/archive/master.zip" "utime-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Keep track of players play time" ) + mod_info_uclip=( MOD "uclip" "UClib" "https://github.com/TeamUlysses/uclip/archive/master.zip" "uclip-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "An alternative to noclip" ) + mod_info_acf=( MOD "acf" "Armoured Combat Framework" "https://github.com/nrlulz/ACF/archive/master.zip" "acf-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/nrlulz/ACF" "Realistic Wepons & Engines" ) + mod_info_acf_missiles=( MOD "acfmissiles" "ACF Missiles" "https://github.com/Bubbus/ACF-Missiles/archive/master.zip" "acf-missiles-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Bubbus/ACF-Missiles" "More missiles for ACF" ) + mod_info_acf_advdupe2=( MOD "advdupe2" "Advanced Duplicator 2" "https://github.com/wiremod/advdupe2/archive/master.zip" "advdupe2-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://www.wiremod.com" "Save your constructions" ) + mod_info_darkrp=( MOD "darkrp" "DarkRP" "https://github.com/FPtje/DarkRP/archive/master.zip" "darkrp-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Most popular gamemode" ) + mod_info_darkrpmodification=( MOD "darkrpmodification" "DarkRP Modification" "https://github.com/FPtje/darkrpmodification/archive/master.zip" "darkrpmodification-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "NOUPDATE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Customize DarkRP settings" ) + # Oxidemod + mod_info_rustoxide=( MOD "rustoxide" "Oxide for Rust" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-Rust.zip" "Oxide-Rust_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Rust;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-rust.1659" "Allows for the use of plugins" ) + mod_info_hwoxide=( MOD "hwoxide" "Oxide for Hurtworld" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-Hurtworld.zip" "Oxide-Hurtworld_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Hurtworld;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-hurtworld.1332" "Allows for the use of plugins" ) + mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-7DaysToDie.zip" "Oxide-7DaysToDie_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-7-days-to-die.813" "Allows for the use of plugins" ) + + # REQUIRED: Set all mods info into one array for convenience + mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_sourcemod[@]}" "${mod_info_ulib[@]}" "${mod_info_ulx[@]}" "${mod_info_utime[@]}" "${mod_info_uclip[@]}" "${mod_info_acf[@]}" "${mod_info_acf_missiles[@]}" "${mod_info_acf_sweps[@]}" "${mod_info_advdupe2[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) +} + +# Get a proper URL for mods that don't provide a good one (optional) +fn_mods_scrape_urls(){ + # Metamod + metamodscrapeurl="http://www.gsptalk.com/mirror/sourcemod" + metamodlatestfile="$(wget "${metamodscrapeurl}/?MD" -q -O -| grep "mmsource" | grep "\-linux" | head -n1 | awk -F '>' '{ print $3 }' | awk -F '<' '{ print $1}')" + metamodfasterurl="http://cdn.probablyaserver.com/sourcemod/" + metamodurl="${metamodfasterurl}/${metamodlatestfile}" + # Sourcemod + sourcemodmversion="1.8" + sourcemodscrapeurl="http://www.gsptalk.com/mirror/sourcemod" + sourcemodlatestfile="$(wget "${sourcemodscrapeurl}/?MD" -q -O -| grep "sourcemod-" | grep "\-linux" | head -n1 | awk -F '>' '{ print $3 }' | awk -F '<' '{ print $1}')" + sourcemodfasterurl="http://cdn.probablyaserver.com/sourcemod/" + sourcemodurl="${sourcemodfasterurl}/${sourcemodlatestfile}" +} + +# Define all variables from a mod at once when index is set to a separator +fn_mod_info(){ +# If for some reason no index is set, none of this can work +if [ -z "$index" ]; then + fn_print_error "index variable not set. Please report an issue to LGSM Team." + echo "* https://github.com/GameServerManagers/LinuxGSM/issues" + core_exit.sh +fi + modcommand="${mods_global_array[index+1]}" + modprettyname="${mods_global_array[index+2]}" + modurl="${mods_global_array[index+3]}" + modfilename="${mods_global_array[index+4]}" + modsubfolders="${mods_global_array[index+5]}" + modlowercase="${mods_global_array[index+6]}" + modinstalldir="${mods_global_array[index+7]}" + modkeepfiles="${mods_global_array[index+8]}" + modengines="${mods_global_array[index+9]}" + modgames="${mods_global_array[index+10]}" + modexcludegames="${mods_global_array[index+11]}" + modsite="${mods_global_array[index+12]}" + moddescription="${mods_global_array[index+13]}" +} + + +# Find out if a game is compatible with a mod from a modgames (list of games supported by a mod) variable +fn_compatible_mod_games(){ + # Reset test value + modcompatiblegame="0" + # If value is set to GAMES (ignore) + if [ "${modgames}" != "GAMES" ]; then + # How many games we need to test + gamesamount="$(echo "${modgames}" | awk -F ';' '{ print NF }')" + # Test all subvalue of "modgames" using the ";" separator + for ((gamevarindex=1; gamevarindex < ${gamesamount}; gamevarindex++)); do + # Put current game name into modtest variable + gamemodtest="$( echo "${modgames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" + # If game name matches + if [ "${gamemodtest}" == "${gamename}" ]; then + # Mod is compatible ! + modcompatiblegame="1" + fi + done + fi +} + +# Find out if an engine is compatible with a mod from a modengines (list of engines supported by a mod) variable +fn_compatible_mod_engines(){ + # Reset test value + modcompatibleengine="0" + # If value is set to ENGINES (ignore) + if [ "${modengines}" != "ENGINES" ]; then + # How many engines we need to test + enginesamount="$(echo "${modengines}" | awk -F ';' '{ print NF }')" + # Test all subvalue of "modengines" using the ";" separator + for ((gamevarindex=1; gamevarindex < ${enginesamount}; gamevarindex++)); do + # Put current engine name into modtest variable + enginemodtest="$( echo "${modengines}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" + # If engine name matches + if [ "${enginemodtest}" == "${engine}" ]; then + # Mod is compatible ! + modcompatibleengine="1" + fi + done + fi +} + +# Find out if a game is not compatible with a mod from a modnotgames (list of games not supported by a mod) variable +fn_not_compatible_mod_games(){ + # Reset test value + modeincompatiblegame="0" + # If value is set to NOTGAMES (ignore) + if [ "${modexcludegames}" != "NOTGAMES" ]; then + # How many engines we need to test + excludegamesamount="$(echo "${modexcludegames}" | awk -F ';' '{ print NF }')" + # Test all subvalue of "modexcludegames" using the ";" separator + for ((gamevarindex=1; gamevarindex < ${excludegamesamount}; gamevarindex++)); do + # Put current engine name into modtest variable + excludegamemodtest="$( echo "${modexcludegames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" + # If engine name matches + if [ "${excludegamemodtest}" == "${gamename}" ]; then + # Mod is compatible ! + modeincompatiblegame="1" + fi + done + fi +} + +# Sums up if a mod is compatible or not with modcompatibility=0/1 +fn_mod_compatible_test(){ + # Test game and engine compatibility + fn_compatible_mod_games + fn_compatible_mod_engines + fn_not_compatible_mod_games + if [ "${modeincompatiblegame}" == "1" ]; then + modcompatibility="0" + elif [ "${modcompatibleengine}" == "1" ]||[ "${modcompatiblegame}" == "1" ]; then + modcompatibility="1" + else + modcompatibility="0" + fi +} + +# Checks if a mod is compatibile for installation +# Provides available mods for installation +# Provides commands for mods installation +fn_mods_available(){ + # First, reset variables + compatiblemodslist=() + availablemodscommands=() + modprettynamemaxlength="0" + modsitemaxlength="0" + moddescriptionmaxlength="0" + modcommandmaxlength="0" + # Find compatible games + # Find separators through the global array + for ((index="0"; index <= ${#mods_global_array[@]}; index++)); do + # If current value is a separator; then + if [ "${mods_global_array[index]}" == "${modseparator}" ]; then + # Set mod variables + fn_mod_info + # Test if game is compatible + fn_mod_compatible_test + # If game is compatible + if [ "${modcompatibility}" == "1" ]; then + # Put it into the list to display to the user + compatiblemodslist+=( "${modprettyname}" "${modcommand}" "${modsite}" "${moddescription}" ) + # Keep available commands in an array + availablemodscommands+=( "${modcommand}" ) + fi + fi + done +} + +# Output available mods in a nice way to the user +fn_mods_show_available(){ + # Set and reset vars + compatiblemodslistindex=0 + spaces=" " + # As long as we're within index values + while [ "${compatiblemodslistindex}" -lt "${#compatiblemodslist[@]}" ]; do + # Set values for convenience + displayedmodname="${compatiblemodslist[compatiblemodslistindex]}" + displayedmodcommand="${compatiblemodslist[compatiblemodslistindex+1]}" + displayedmodsite="${compatiblemodslist[compatiblemodslistindex+2]}" + displayedmoddescription="${compatiblemodslist[compatiblemodslistindex+3]}" + # Output mods to the user + echo -e "\e[1m${displayedmodname}\e[0m" + echo -e " * ${displayedmoddescription} - ${displayedmodsite}" + echo -e " * \e[36m${displayedmodcommand}\e[0m" + # Increment index from the amount of values we just displayed + let "compatiblemodslistindex+=4" + done +} + +# Get details of a mod any (relevant and unique, such as full mod name or install command) value +fn_mod_get_info_from_command(){ + # Variable to know when job is done + modinfocommand="0" + # Find entry in global array + for ((index=0; index <= ${#mods_global_array[@]}; index++)); do + # When entry is found + if [ "${mods_global_array[index]}" == "${currentmod}" ]; then + # Go back to the previous "MOD" separator + for ((index=index; index <= ${#mods_global_array[@]}; index--)); do + # When "MOD" is found + if [ "${mods_global_array[index]}" == "MOD" ]; then + # Get info + fn_mod_info + modinfocommand="1" + break + fi + done + fi + # Exit the loop if job is done + if [ "${modinfocommand}" == "1" ]; then + break + fi + done +} + +# Requirements to install mods +fn_mods_install_checks(){ + # If no mods are found + if [ -z "${compatiblemodslist}" ]; then + fn_print_fail "No mods are currently available for ${gamename}." + core_exit.sh + # If systemdir doesn't exist, then the game isn't installed + elif [ ! -d "${systemdir}" ]; then + fn_print_fail "${gamename} needs to be installed first." + core_exit.sh + # If tompdir variable doesn't exist, LGSM is too old + elif [ -z "${tmpdir}" ]||[ -z "${lgsmdir}" ]; then + fn_print_fail "Your LGSM version is too old." + echo " * Please do a full update, including ${selfname} script." + core_exit.sh + fi +} + +fn_mods_scrape_urls +fn_mods_info +fn_mods_available +fn_mods_install_checks From 05b4e3b06a675eda7efb2fb44b87a6223c45e076 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 20:29:56 +0100 Subject: [PATCH 0137/1895] Checks done differently --- lgsm/functions/mods_list.sh | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index f4c1910b5..42a301499 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -234,6 +234,11 @@ fn_mods_show_available(){ # Increment index from the amount of values we just displayed let "compatiblemodslistindex+=4" done + # If no mods are found + if [ -z "${compatiblemodslist}" ]; then + fn_print_fail "No mods are currently available for ${gamename}." + core_exit.sh + fi } # Get details of a mod any (relevant and unique, such as full mod name or install command) value @@ -262,25 +267,6 @@ fn_mod_get_info_from_command(){ done } -# Requirements to install mods -fn_mods_install_checks(){ - # If no mods are found - if [ -z "${compatiblemodslist}" ]; then - fn_print_fail "No mods are currently available for ${gamename}." - core_exit.sh - # If systemdir doesn't exist, then the game isn't installed - elif [ ! -d "${systemdir}" ]; then - fn_print_fail "${gamename} needs to be installed first." - core_exit.sh - # If tompdir variable doesn't exist, LGSM is too old - elif [ -z "${tmpdir}" ]||[ -z "${lgsmdir}" ]; then - fn_print_fail "Your LGSM version is too old." - echo " * Please do a full update, including ${selfname} script." - core_exit.sh - fi -} - fn_mods_scrape_urls fn_mods_info fn_mods_available -fn_mods_install_checks From 5c8b59db19c6ce0167462dcfe9699faa05d9ce21 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 20:30:09 +0100 Subject: [PATCH 0138/1895] Checks done differently --- lgsm/functions/command_mods_install.sh | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index a2c7b8bed..c1bbcf89c 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -43,6 +43,19 @@ fn_mods_install_init(){ fn_script_log "Installing ${modprettyname}." } +fn_mods_requirements(){ + # If systemdir doesn't exist, then the game isn't installed + if [ ! -d "${systemdir}" ]; then + fn_print_fail "${gamename} needs to be installed first." + core_exit.sh + # If tompdir variable doesn't exist, LGSM is too old + elif [ -z "${tmpdir}" ]||[ -z "${lgsmdir}" ]; then + fn_print_fail "Your LGSM version is too old." + echo " * Please do a full update, including ${selfname} script." + core_exit.sh + fi +} + # Create mods directory if it doesn't exist # Assuming the game is already installed as mods_list.sh checked for it. fn_mods_dir(){ @@ -170,6 +183,6 @@ fn_mod_installation(){ fi } -fn_mods_install_checks +fn_mods_requirements fn_mods_install_init fn_mod_installation From 29d2b51085ac7b5a6d134f9203271b0eeac172cf Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 20:35:18 +0100 Subject: [PATCH 0139/1895] No need to check for systemdir, lgsm already does --- lgsm/functions/command_mods_install.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index c1bbcf89c..5e419b86b 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -44,12 +44,8 @@ fn_mods_install_init(){ } fn_mods_requirements(){ - # If systemdir doesn't exist, then the game isn't installed - if [ ! -d "${systemdir}" ]; then - fn_print_fail "${gamename} needs to be installed first." - core_exit.sh # If tompdir variable doesn't exist, LGSM is too old - elif [ -z "${tmpdir}" ]||[ -z "${lgsmdir}" ]; then + if [ -z "${tmpdir}" ]||[ -z "${lgsmdir}" ]; then fn_print_fail "Your LGSM version is too old." echo " * Please do a full update, including ${selfname} script." core_exit.sh From 77e2043700cad4893ef80935c43d8b679c7a6c55 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 20:36:47 +0100 Subject: [PATCH 0140/1895] checks moves to mods_list.sh --- lgsm/functions/command_mods_install.sh | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 5e419b86b..8601567a7 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -43,15 +43,6 @@ fn_mods_install_init(){ fn_script_log "Installing ${modprettyname}." } -fn_mods_requirements(){ - # If tompdir variable doesn't exist, LGSM is too old - if [ -z "${tmpdir}" ]||[ -z "${lgsmdir}" ]; then - fn_print_fail "Your LGSM version is too old." - echo " * Please do a full update, including ${selfname} script." - core_exit.sh - fi -} - # Create mods directory if it doesn't exist # Assuming the game is already installed as mods_list.sh checked for it. fn_mods_dir(){ @@ -179,6 +170,5 @@ fn_mod_installation(){ fi } -fn_mods_requirements fn_mods_install_init fn_mod_installation From ad2965d9f234ef52354bfdf69f4c15fb76109c37 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 20:37:52 +0100 Subject: [PATCH 0141/1895] Checks back here --- lgsm/functions/mods_list.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 42a301499..5da1d5dfc 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -82,6 +82,16 @@ fn_mods_scrape_urls(){ sourcemodurl="${sourcemodfasterurl}/${sourcemodlatestfile}" } +# Sets some gsm requirements +fn_gsm_requirements(){ + # If tmpdir variable doesn't exist, LGSM is too old + if [ -z "${tmpdir}" ]||[ -z "${lgsmdir}" ]; then + fn_print_fail "Your LGSM version is too old." + echo " * Please do a full update, including ${selfname} script." + core_exit.sh + fi +} + # Define all variables from a mod at once when index is set to a separator fn_mod_info(){ # If for some reason no index is set, none of this can work @@ -267,6 +277,7 @@ fn_mod_get_info_from_command(){ done } +fn_gsm_requirements fn_mods_scrape_urls fn_mods_info fn_mods_available From 7df96359817ff2aa0b8cf3c40d2d6b867c2a1a80 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 20:42:10 +0100 Subject: [PATCH 0142/1895] New line for better output --- lgsm/functions/command_mods_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 8601567a7..9bde617cd 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -38,7 +38,7 @@ fn_mods_install_init(){ # Gives a pretty name to the user and get all mod info currentmod="${usermodselect}" fn_mod_get_info_from_command - fn_print_dots "Installing ${modprettyname}" + fn_print_dots_nl "Installing ${modprettyname}" sleep 1 fn_script_log "Installing ${modprettyname}." } From d35de663b0074712a4cd028e49607f3b410868fc Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 20:51:18 +0100 Subject: [PATCH 0143/1895] trying different mod view --- lgsm/functions/mods_list.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 5da1d5dfc..f05a7ac47 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -238,9 +238,8 @@ fn_mods_show_available(){ displayedmodsite="${compatiblemodslist[compatiblemodslistindex+2]}" displayedmoddescription="${compatiblemodslist[compatiblemodslistindex+3]}" # Output mods to the user - echo -e "\e[1m${displayedmodname}\e[0m" + echo -e "\e[36m${displayedmodcommand}\e[0m - \e[1m${displayedmodname}\e[0m" echo -e " * ${displayedmoddescription} - ${displayedmodsite}" - echo -e " * \e[36m${displayedmodcommand}\e[0m" # Increment index from the amount of values we just displayed let "compatiblemodslistindex+=4" done From 46802979b380d12df404477b2efbc12d0e204cbd Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 20:54:06 +0100 Subject: [PATCH 0144/1895] Trying another look --- lgsm/functions/mods_list.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index f05a7ac47..4d09807c9 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -238,8 +238,8 @@ fn_mods_show_available(){ displayedmodsite="${compatiblemodslist[compatiblemodslistindex+2]}" displayedmoddescription="${compatiblemodslist[compatiblemodslistindex+3]}" # Output mods to the user - echo -e "\e[36m${displayedmodcommand}\e[0m - \e[1m${displayedmodname}\e[0m" - echo -e " * ${displayedmoddescription} - ${displayedmodsite}" + echo -e "\e[1m${displayedmodname}\e[0m - ${displayedmoddescription} - ${displayedmodsite}" + echo -e " * \e[36m${displayedmodcommand}\e[0m" # Increment index from the amount of values we just displayed let "compatiblemodslistindex+=4" done From 9ae8cb4d8f1c6568499ab8308ca5bbd2c5de5af2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 14 Jan 2017 20:59:00 +0100 Subject: [PATCH 0145/1895] typo ublib > uclip --- lgsm/functions/mods_list.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 4d09807c9..ebff4c67a 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -52,7 +52,7 @@ fn_mods_info(){ mod_info_ulib=( MOD "ulib" "ULib" "https://codeload.github.com/TeamUlysses/ulib/zip/master" "ulib-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Complete Framework" ) mod_info_ulx=( MOD "ulx" "ULX" "https://codeload.github.com/TeamUlysses/ulx/zip/master" "ulx-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Admin Panel (requires ULib)" ) mod_info_utime=( MOD "utime" "UTime" "https://github.com/TeamUlysses/utime/archive/master.zip" "utime-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Keep track of players play time" ) - mod_info_uclip=( MOD "uclip" "UClib" "https://github.com/TeamUlysses/uclip/archive/master.zip" "uclip-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "An alternative to noclip" ) + mod_info_uclip=( MOD "uclip" "UClip" "https://github.com/TeamUlysses/uclip/archive/master.zip" "uclip-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "An alternative to noclip" ) mod_info_acf=( MOD "acf" "Armoured Combat Framework" "https://github.com/nrlulz/ACF/archive/master.zip" "acf-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/nrlulz/ACF" "Realistic Wepons & Engines" ) mod_info_acf_missiles=( MOD "acfmissiles" "ACF Missiles" "https://github.com/Bubbus/ACF-Missiles/archive/master.zip" "acf-missiles-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Bubbus/ACF-Missiles" "More missiles for ACF" ) mod_info_acf_advdupe2=( MOD "advdupe2" "Advanced Duplicator 2" "https://github.com/wiremod/advdupe2/archive/master.zip" "advdupe2-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://www.wiremod.com" "Save your constructions" ) From 80b21df4b05e0eff16cc209802da0088cbb62779 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 02:02:36 +0100 Subject: [PATCH 0146/1895] Added file list generation --- lgsm/functions/command_mods_install.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 9bde617cd..9ea76257f 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -98,7 +98,8 @@ fn_mod_extract(){ fn_mod_fileslist(){ # ${modsdatadir}/${modcommand}-files.list - true; + find "${extractdir}" -mindepth 1 -printf '%P\n' >> ${modsdatadir}/${modcommand}-files.list + fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.list}" } fn_mod_copy_destination(){ From aecdd4c3a36a17d08a9559f4e9d448b24a845ca5 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 19:32:49 -0600 Subject: [PATCH 0147/1895] Trying out a hypothesis on the travis failures. --- .travis.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f91811da3..abb770e05 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,16 @@ language: bash -sudo: false +sudo: required env: - DISTRO=ubuntu-trusty before_script: + - sudo ls -l /sys/class/net + - sudo ls -l --dereference /sys/class/net + - sudo ls -lad /sys/class + - sudo ls -lad /sys/devices + - sudo chmod a+x /sys + - sudo chmod a+rx /sys/class + - sudo chmod a+r /sys/class/net - curl -L "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/shunit2/shunit2-2.1.6.tgz" | tar zx addons: From 1e83458917e5b19d67455978b069956c1d843d04 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 02:36:39 +0100 Subject: [PATCH 0148/1895] Trying recursive installed mods display --- lgsm/functions/command_mods_update.sh | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index e1a818bc1..26bf7ba69 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -6,5 +6,28 @@ # Description: Updates installed mods along with mods_list.sh. local commandname="MODS" -local commandaction="Mod Update" +local commandaction="Mods Update" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +check.sh +mods_list.sh + +fn_mods_update_init(){ + fn_script_log "Entering mods & addons update" + echo "=================================" + echo "${gamename} mods & addons update" + echo "" + # Installed mod dir is "${modslockfilefullpath}" + # How many mods will be updated + installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" + # Loop showing mods to update + for (( installedmodsline=$installedmodscount; installedmodsline<=5; installedmodsline++ )); do + sed -n 'installedmodsline{p;q}' "${modslockfilefullpath}" + done + + currentmod="${usermodselect}" + fn_mod_get_info_from_command + fn_print_dots_nl "Updating ${modprettyname}" + sleep 1 + fn_script_log "Updating ${modprettyname}." +} From e229b2c7ea6586d532865e2e7d780105fb93d57b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 02:46:26 +0100 Subject: [PATCH 0149/1895] new attempt --- lgsm/functions/command_mods_update.sh | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 26bf7ba69..c99162ae1 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -17,17 +17,20 @@ fn_mods_update_init(){ echo "=================================" echo "${gamename} mods & addons update" echo "" - # Installed mod dir is "${modslockfilefullpath}" - # How many mods will be updated - installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" - # Loop showing mods to update - for (( installedmodsline=$installedmodscount; installedmodsline<=5; installedmodsline++ )); do - sed -n 'installedmodsline{p;q}' "${modslockfilefullpath}" - done + # Installed mod dir is "${modslockfilefullpath}" + # How many mods will be updated + installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" + # Loop showing mods to update + while [ $installedmodsline -lte $installedmodscount ]; do + sed -n 'installedmodsline{p;q}' "${modslockfilefullpath}" + let installedmodscount=installedmodscount+1 + done - currentmod="${usermodselect}" - fn_mod_get_info_from_command - fn_print_dots_nl "Updating ${modprettyname}" - sleep 1 - fn_script_log "Updating ${modprettyname}." + #currentmod="${usermodselect}" + #fn_mod_get_info_from_command + #fn_print_dots_nl "Updating ${modprettyname}" + #sleep 1 + #fn_script_log "Updating ${modprettyname}." } + +fn_mods_update_init From 896c1b8fa54d391e6e69147321af8bf165332d37 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 19:50:13 -0600 Subject: [PATCH 0150/1895] One successful travis build. Ref: #1186 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index abb770e05..0b4a10ab8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ env: - DISTRO=ubuntu-trusty before_script: - - sudo ls -l /sys/class/net + - sudo ls -l /sys - sudo ls -l --dereference /sys/class/net - sudo ls -lad /sys/class - sudo ls -lad /sys/devices From 2c2ac53082696987a1171c3a73e19d51303fdcb6 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 19:58:07 -0600 Subject: [PATCH 0151/1895] #1186 revisited. --- .travis.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0b4a10ab8..b63d7cd85 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,13 +4,7 @@ env: - DISTRO=ubuntu-trusty before_script: - - sudo ls -l /sys - - sudo ls -l --dereference /sys/class/net - - sudo ls -lad /sys/class - - sudo ls -lad /sys/devices - - sudo chmod a+x /sys - - sudo chmod a+rx /sys/class - - sudo chmod a+r /sys/class/net + - sudo ls -ld /sys - curl -L "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/shunit2/shunit2-2.1.6.tgz" | tar zx addons: From a1a68db23369bc6cd93c95d1b0e6092f3f58b676 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 20:01:42 -0600 Subject: [PATCH 0152/1895] #1186 - Making sudo required seems to resolve the issue. --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b63d7cd85..d385c27fa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,6 @@ env: - DISTRO=ubuntu-trusty before_script: - - sudo ls -ld /sys - curl -L "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/shunit2/shunit2-2.1.6.tgz" | tar zx addons: From 89eb3ee9f9b29de982412ffda8263602a8f6c187 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 03:17:58 +0100 Subject: [PATCH 0153/1895] Fixed output --- lgsm/functions/command_mods_update.sh | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index c99162ae1..f162bb33b 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -20,12 +20,14 @@ fn_mods_update_init(){ # Installed mod dir is "${modslockfilefullpath}" # How many mods will be updated installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" + echo "${installedmodscount} addons will be updated:" # Loop showing mods to update - while [ $installedmodsline -lte $installedmodscount ]; do - sed -n 'installedmodsline{p;q}' "${modslockfilefullpath}" - let installedmodscount=installedmodscount+1 - done - + installedmodsline=1 + while [ $installedmodsline -le $installedmodscount ]; do + echo -e " * \e[36m$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")\e[0m" + let installedmodsline=installedmodsline+1 + done + exit #currentmod="${usermodselect}" #fn_mod_get_info_from_command #fn_print_dots_nl "Updating ${modprettyname}" From 8ca7bca3cacd29a5449c1a04f025dd290d17e89c Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 03:25:51 +0100 Subject: [PATCH 0154/1895] Testing for multiple installations --- lgsm/functions/command_mods_update.sh | 44 +++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index f162bb33b..272fee642 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -27,12 +27,44 @@ fn_mods_update_init(){ echo -e " * \e[36m$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")\e[0m" let installedmodsline=installedmodsline+1 done - exit - #currentmod="${usermodselect}" - #fn_mod_get_info_from_command - #fn_print_dots_nl "Updating ${modprettyname}" - #sleep 1 - #fn_script_log "Updating ${modprettyname}." + sleep 2 +} + +fn_mods_update_loop(){ + while [ $installedmodsline -le $installedmodscount ]; do + currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")" + fn_mod_get_info_from_command + if [ -n "${currentmod}" ]; then + fn_print_dots_nl "Updating ${modprettyname}" + sleep 0.5 + fn_script_log "Updating ${modprettyname}." + # Get mod info + fn_mod_get_info_from_command + # Check if mod is already installed + fn_mod_already_installed + # Check and create required directories + fn_mods_dir + # Clear lgsm/tmp/mods dir if exists then recreate it + fn_clear_tmp_mods + fn_mods_tmpdir + # Download mod + fn_mod_dl + # Extract the mod + fn_mod_extract + # Build a file list + fn_mod_fileslist + # Copying to destination + fn_mod_copy_destination + # Ending with installation routines + fn_mod_add_list + fn_clear_tmp_mods + fn_print_ok_nl "${modprettyname} installed." + fn_script_log "${modprettyname} installed." + else + fn_print_fail "No mod was selected." + core_exit.sh + fi + done } fn_mods_update_init From 5adee73be4ae46efa8afb40cd1f4a83f19275994 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 03:32:09 +0100 Subject: [PATCH 0155/1895] moving mods core functions away --- 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 a8c41fc32..fc9dfaab0 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -298,6 +298,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +mods_core.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + # Dev command_dev_debug.sh(){ From c91831a133e25d8e89c8750c5505e8e298825e04 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 03:32:12 +0100 Subject: [PATCH 0156/1895] moving mods core functions away --- lgsm/functions/mods_core.sh | 114 ++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 lgsm/functions/mods_core.sh diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh new file mode 100644 index 000000000..17bce6f30 --- /dev/null +++ b/lgsm/functions/mods_core.sh @@ -0,0 +1,114 @@ +176 lines (161 sloc) 5.27 KB +#!/bin/bash +# LGSM command_mods_install.sh function +# Author: Daniel Gibbs +# Contributor: UltimateByte +# Website: https://gameservermanagers.com +# Description: List and installs available mods along with mods_list.sh. + +local commandname="MODS" +local commandaction="Core functions for mods" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +## Useful variables +# Files and Directories +modstmpdir="${tmpdir}/mods" +modsdatadir="${lgsmdir}/data/mods" +modslockfile="installed-mods-listing" +modslockfilefullpath="${modsdatadir}/${modslockfile}" + +# Create mods directory if it doesn't exist +# Assuming the game is already installed as mods_list.sh checked for it. +fn_mods_dir(){ + if [ ! -d "${modinstalldir}" ]; then + fn_script_log_info "Creating mods directory: ${modinstalldir}" + fn_print_dots "Creating mods directory" + sleep 1 + mkdir -p "${modinstalldir}" + fn_print_ok_nl "Created mods directory" + fi +} + +# Clear mod download directory so that there is only one file in it since we don't the file name and extention +fn_clear_tmp_mods(){ + if [ -d "${modstmpdir}" ]; then + rm -r "${modstmpdir}" + fn_script_log "Clearing temp mod download directory: ${modstmpdir}" + fi +} + +# Create tmp download mod directory +fn_mods_tmpdir(){ + if [ ! -d "${modstmpdir}" ]; then + mkdir -p "${modstmpdir}" + fn_script_log "Creating temp mod download directory: ${modstmpdir}" + fi +} + +fn_mod_dl(){ + # fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + fileurl="${modurl}" + filedir="${modstmpdir}" + filename="${modfilename}" + fn_script_log "Downloading mods to ${modstmpdir}" + fn_fetch_file "${fileurl}" "${filedir}" "${filename}" + # Check if variable is valid checking if file has been downloaded and exists + if [ ! -f "${modstmpdir}/${modfilename}" ]; then + fn_print_fail "An issue occurred upon downloading ${modprettyname}" + core_exit.sh + fi +} + +fn_mod_extract(){ + # fn_dl_extract "${filedir}" "${filename}" "${extractdir}" + filename="${modfilename}" + extractdir="${modstmpdir}/extracted" + if [ ! -d "${extractdir}" ]; then + mkdir -p "${extractdir}" + fi + fn_script_log "Extracting ${modprettyname} to ${extractdir}" + fn_dl_extract "${filedir}" "${filename}" "${extractdir}" +} + +fn_mod_fileslist(){ + # ${modsdatadir}/${modcommand}-files.list + find "${extractdir}" -mindepth 1 -printf '%P\n' >> ${modsdatadir}/${modcommand}-files.list + fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.list}" +} + +fn_mod_copy_destination(){ + # Destination directory: ${modinstalldir} + fn_script_log "Copying ${modprettyname} to ${modinstalldir}" + cp -Rf "${extractdir}/." "${modinstalldir}/" +} + +# Check if the mod is already installed and warn the user +fn_mod_already_installed(){ + if [ -f "${modslockfilefullpath}" ]; then + if [ -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then + echo "" + fn_print_warning_nl "${modprettyname} has already been installed." + echo " * Mod files will be overwritten." + sleep 4 + fi + fi +} + +# Add the mod to the installed mods list +fn_mod_add_list(){ + # Create lgsm/data directory + if [ ! -d "${modsdatadir}" ]; then + mkdir -p "${modsdatadir}" + fn_script_log "Created ${modsdatadir}" + fi + # Create lgsm/data/${modslockfile} + if [ ! -f "${modslockfilefullpath}" ]; then + touch "${modslockfilefullpath}" + fn_script_log "Created ${modslockfilefullpath}" + fi + # Input mod name to lockfile + if [ ! -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then + echo "${modcommand}" >> "${modslockfilefullpath}" + fn_script_log "${modcommand} added to ${modslockfile}" + fi +} From e2d26df74464de321cdaed6465279ff17bb76388 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 03:32:15 +0100 Subject: [PATCH 0157/1895] moving mods core functions away --- lgsm/functions/mods_list.sh | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index ebff4c67a..28d8d5621 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -15,11 +15,6 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh ## Useful variables -# Files and Directories -modstmpdir="${tmpdir}/mods" -modsdatadir="${lgsmdir}/data/mods" -modslockfile="installed-mods-listing" -modslockfilefullpath="${modsdatadir}/${modslockfile}" # Separator name modseparator="MOD" From 1de06e19458a5f1ff537ecaa1a7821689e3d9dc1 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 03:32:18 +0100 Subject: [PATCH 0158/1895] moving mods core functions away --- lgsm/functions/command_mods_install.sh | 97 +------------------------- 1 file changed, 1 insertion(+), 96 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 9ea76257f..5c3fb7032 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -10,6 +10,7 @@ local commandaction="Mod Installation" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh +mods_core.sh mods_list.sh fn_mods_install_init(){ @@ -43,102 +44,6 @@ fn_mods_install_init(){ fn_script_log "Installing ${modprettyname}." } -# Create mods directory if it doesn't exist -# Assuming the game is already installed as mods_list.sh checked for it. -fn_mods_dir(){ - if [ ! -d "${modinstalldir}" ]; then - fn_script_log_info "Creating mods directory: ${modinstalldir}" - fn_print_dots "Creating mods directory" - sleep 1 - mkdir -p "${modinstalldir}" - fn_print_ok_nl "Created mods directory" - fi -} - -# Clear mod download directory so that there is only one file in it since we don't the file name and extention -fn_clear_tmp_mods(){ - if [ -d "${modstmpdir}" ]; then - rm -r "${modstmpdir}" - fn_script_log "Clearing temp mod download directory: ${modstmpdir}" - fi -} - -# Create tmp download mod directory -fn_mods_tmpdir(){ - if [ ! -d "${modstmpdir}" ]; then - mkdir -p "${modstmpdir}" - fn_script_log "Creating temp mod download directory: ${modstmpdir}" - fi -} - -fn_mod_dl(){ - # fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" - fileurl="${modurl}" - filedir="${modstmpdir}" - filename="${modfilename}" - fn_script_log "Downloading mods to ${modstmpdir}" - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" - # Check if variable is valid checking if file has been downloaded and exists - if [ ! -f "${modstmpdir}/${modfilename}" ]; then - fn_print_fail "An issue occurred upon downloading ${modprettyname}" - core_exit.sh - fi -} - -fn_mod_extract(){ - # fn_dl_extract "${filedir}" "${filename}" "${extractdir}" - filename="${modfilename}" - extractdir="${modstmpdir}/extracted" - if [ ! -d "${extractdir}" ]; then - mkdir -p "${extractdir}" - fi - fn_script_log "Extracting ${modprettyname} to ${extractdir}" - fn_dl_extract "${filedir}" "${filename}" "${extractdir}" -} - -fn_mod_fileslist(){ - # ${modsdatadir}/${modcommand}-files.list - find "${extractdir}" -mindepth 1 -printf '%P\n' >> ${modsdatadir}/${modcommand}-files.list - fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.list}" -} - -fn_mod_copy_destination(){ - # Destination directory: ${modinstalldir} - fn_script_log "Copying ${modprettyname} to ${modinstalldir}" - cp -Rf "${extractdir}/." "${modinstalldir}/" -} - -# Check if the mod is already installed and warn the user -fn_mod_already_installed(){ - if [ -f "${modslockfilefullpath}" ]; then - if [ -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then - echo "" - fn_print_warning_nl "${modprettyname} has already been installed." - echo " * Mod files will be overwritten." - sleep 4 - fi - fi -} - -# Add the mod to the installed mods list -fn_mod_add_list(){ - # Create lgsm/data directory - if [ ! -d "${modsdatadir}" ]; then - mkdir -p "${modsdatadir}" - fn_script_log "Created ${modsdatadir}" - fi - # Create lgsm/data/${modslockfile} - if [ ! -f "${modslockfilefullpath}" ]; then - touch "${modslockfilefullpath}" - fn_script_log "Created ${modslockfilefullpath}" - fi - # Input mod name to lockfile - if [ ! -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then - echo "${modcommand}" >> "${modslockfilefullpath}" - fn_script_log "${modcommand} added to ${modslockfile}" - fi -} - # Run all required operation fn_mod_installation(){ # If a mod was selected From 9502cbdb034f6fddd4dcd8cdf1e9e92a1a9e9d89 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 03:33:18 +0100 Subject: [PATCH 0159/1895] Removed jerk line --- lgsm/functions/mods_core.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 17bce6f30..ac1b0ab61 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -1,4 +1,3 @@ -176 lines (161 sloc) 5.27 KB #!/bin/bash # LGSM command_mods_install.sh function # Author: Daniel Gibbs From 99bf5905a36ef1ad3cd89bbedc87a2a51b9f3067 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 03:36:01 +0100 Subject: [PATCH 0160/1895] description --- lgsm/functions/command_mods_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 5c3fb7032..0b9d64eff 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -3,7 +3,7 @@ # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com -# Description: List and installs available mods along with mods_list.sh. +# Description: List and installs available mods along with mods_list.sh and mods_core.sh. local commandname="MODS" local commandaction="Mod Installation" From 47e8886d0b1c30b029e1264861216d75a6036a60 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 03:48:14 +0100 Subject: [PATCH 0161/1895] Various fixes --- lgsm/functions/command_mods_update.sh | 33 +++++++++++++++++++-------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 272fee642..c64bf5427 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -3,13 +3,14 @@ # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com -# Description: Updates installed mods along with mods_list.sh. +# Description: Updates installed mods along with mods_list.sh and mods_core.sh. local commandname="MODS" local commandaction="Mods Update" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh +mods_core.sh mods_list.sh fn_mods_update_init(){ @@ -19,18 +20,27 @@ fn_mods_update_init(){ echo "" # Installed mod dir is "${modslockfilefullpath}" # How many mods will be updated - installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" - echo "${installedmodscount} addons will be updated:" - # Loop showing mods to update - installedmodsline=1 - while [ $installedmodsline -le $installedmodscount ]; do - echo -e " * \e[36m$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")\e[0m" - let installedmodsline=installedmodsline+1 - done - sleep 2 + if [ -f "${modslockfilefullpath}" ]; then + installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" + if + echo "${installedmodscount} addons will be updated:" + # Loop showing mods to update + installedmodsline=1 + while [ $installedmodsline -le $installedmodscount ]; do + echo -e " * \e[36m$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")\e[0m" + let installedmodsline=installedmodsline+1 + done + sleep 2 + else + fn_print_info_nl "No mods to be updated!" + echo " * Did you install any mod using LGSM?" + fn_print_log "No mods to be updated" + core_exit.sh + fi } fn_mods_update_loop(){ + installedmodline="1" while [ $installedmodsline -le $installedmodscount ]; do currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")" fn_mod_get_info_from_command @@ -60,6 +70,8 @@ fn_mods_update_loop(){ fn_clear_tmp_mods fn_print_ok_nl "${modprettyname} installed." fn_script_log "${modprettyname} installed." + let installedmodsline=installedmodsline+1 + else fn_print_fail "No mod was selected." core_exit.sh @@ -68,3 +80,4 @@ fn_mods_update_loop(){ } fn_mods_update_init +fn_mods_update_loop From 5fa0d131a00d741faa73be5bb52bcbeb79cc22ef Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 20:49:37 -0600 Subject: [PATCH 0162/1895] Trying to break it now. --- .travis.yml | 3 ++- tests/tests_jc2server.sh | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index d385c27fa..84fc85d9e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: bash -sudo: required +sudo: false env: - DISTRO=ubuntu-trusty @@ -19,6 +19,7 @@ addons: - libstdc++6:i386 - telnet - expect + - strace script: diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index cd765b480..194165365 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -(command_start.sh) +(strace -f command_start.sh | tee /tmp/output; curl --upload-file ./hello.txt https://transfer.sh/hello.txt) fn_test_result_pass echo "" From 74cdfa3cff326f4a714bc8d11e2552b6eefad518 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 20:53:24 -0600 Subject: [PATCH 0163/1895] Meh. Cut-and-paste the wrong line. --- tests/tests_jc2server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 194165365..44731f195 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -(strace -f command_start.sh | tee /tmp/output; curl --upload-file ./hello.txt https://transfer.sh/hello.txt) +(strace -f command_start.sh | tee /tmp/output; curl --upload-file /tmp/output https://transfer.sh/output) fn_test_result_pass echo "" From d368cdb2a84f57e869a0f9103fa7fa6391bed979 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 03:56:53 +0100 Subject: [PATCH 0164/1895] fixes and comments --- lgsm/functions/command_mods_update.sh | 33 +++++++++++++-------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index c64bf5427..1e08679fb 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -20,10 +20,16 @@ fn_mods_update_init(){ echo "" # Installed mod dir is "${modslockfilefullpath}" # How many mods will be updated - if [ -f "${modslockfilefullpath}" ]; then - installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" - if - echo "${installedmodscount} addons will be updated:" + installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" + # If no mods to be updated + if [ ! -f "${modslockfilefullpath}" ]||[ $installedmodscount -eq 0 ]; then + fn_print_information_nl "No mods or addons to be updated" + echo " * Did you install any mod using LGSM?" + fn_log_info "No mods or addons to be updated" + core_exit.sh + else + fn_print_information_nl "${installedmodscount} mods or addons will be updated:" + fn_log_info "${installedmodscount} mods or addons will be updated" # Loop showing mods to update installedmodsline=1 while [ $installedmodsline -le $installedmodscount ]; do @@ -31,27 +37,21 @@ fn_mods_update_init(){ let installedmodsline=installedmodsline+1 done sleep 2 - else - fn_print_info_nl "No mods to be updated!" - echo " * Did you install any mod using LGSM?" - fn_print_log "No mods to be updated" - core_exit.sh fi } +# Recursively list all installed mods and apply update fn_mods_update_loop(){ + # Reset line value installedmodline="1" while [ $installedmodsline -le $installedmodscount ]; do + # Current line defines current mod command currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")" - fn_mod_get_info_from_command if [ -n "${currentmod}" ]; then - fn_print_dots_nl "Updating ${modprettyname}" - sleep 0.5 - fn_script_log "Updating ${modprettyname}." # Get mod info fn_mod_get_info_from_command - # Check if mod is already installed - fn_mod_already_installed + fn_print_dots_nl "Updating ${modprettyname}" + fn_script_log "Updating ${modprettyname}." # Check and create required directories fn_mods_dir # Clear lgsm/tmp/mods dir if exists then recreate it @@ -70,8 +70,7 @@ fn_mods_update_loop(){ fn_clear_tmp_mods fn_print_ok_nl "${modprettyname} installed." fn_script_log "${modprettyname} installed." - let installedmodsline=installedmodsline+1 - + let installedmodsline=installedmodsline+1 else fn_print_fail "No mod was selected." core_exit.sh From 663763e6a34d05daf6747a7770e3764600c2e1a8 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 20:57:23 -0600 Subject: [PATCH 0165/1895] Floundering a bit grok'ing travis. --- tests/tests_jc2server.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 44731f195..83133814a 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,8 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -(strace -f command_start.sh | tee /tmp/output; curl --upload-file /tmp/output https://transfer.sh/output) +strace -f (command_start.sh) | tee /tmp/output +curl --upload-file /tmp/output https://transfer.sh/output fn_test_result_pass echo "" From e83e9b62d2e8bdfa6781a3074cb579aad509289a Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 21:03:28 -0600 Subject: [PATCH 0166/1895] More playing with travis. --- tests/tests_jc2server.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 83133814a..06b44cc89 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,8 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -strace -f (command_start.sh) | tee /tmp/output -curl --upload-file /tmp/output https://transfer.sh/output +strace -f ~/jc2server start | tee /tmp/output; curl --upload-file /tmp/output https://transfer.sh/output fn_test_result_pass echo "" From b0aa04f723d29c36a167d3e72387e6ca6a7354ea Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 21:06:54 -0600 Subject: [PATCH 0167/1895] IBID --- tests/tests_jc2server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 06b44cc89..d06379bca 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -strace -f ~/jc2server start | tee /tmp/output; curl --upload-file /tmp/output https://transfer.sh/output +strace -f ./tests-jc2server.sh start | tee /tmp/output; curl --upload-file /tmp/output https://transfer.sh/output fn_test_result_pass echo "" From c9a655c46cfc4d12b85d432f6993960cdaabdfb0 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 21:10:24 -0600 Subject: [PATCH 0168/1895] IBID --- tests/tests_jc2server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index d06379bca..a6a340b7c 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -strace -f ./tests-jc2server.sh start | tee /tmp/output; curl --upload-file /tmp/output https://transfer.sh/output +strace -f tests/tests-jc2server.sh start | tee /tmp/output; curl --upload-file /tmp/output https://transfer.sh/output fn_test_result_pass echo "" From 83617a604ca4b7f7565fb413b2df985a06c55adc Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 21:17:11 -0600 Subject: [PATCH 0169/1895] ibid --- tests/tests_jc2server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index a6a340b7c..ce48d5265 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -strace -f tests/tests-jc2server.sh start | tee /tmp/output; curl --upload-file /tmp/output https://transfer.sh/output +strace -f tests/tests_jc2server.sh start | tee /tmp/output; curl --upload-file /tmp/output https://transfer.sh/output fn_test_result_pass echo "" From da8c08c5ef12f183b4f90bc3b7b6b5db83b1f59a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 04:17:37 +0100 Subject: [PATCH 0170/1895] typo --- lgsm/functions/command_mods_update.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 1e08679fb..a7fd0c572 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -25,11 +25,11 @@ fn_mods_update_init(){ if [ ! -f "${modslockfilefullpath}" ]||[ $installedmodscount -eq 0 ]; then fn_print_information_nl "No mods or addons to be updated" echo " * Did you install any mod using LGSM?" - fn_log_info "No mods or addons to be updated" + fn_scrip_log_info "No mods or addons to be updated" core_exit.sh else fn_print_information_nl "${installedmodscount} mods or addons will be updated:" - fn_log_info "${installedmodscount} mods or addons will be updated" + fn_script_log_info "${installedmodscount} mods or addons will be updated" # Loop showing mods to update installedmodsline=1 while [ $installedmodsline -le $installedmodscount ]; do @@ -43,7 +43,7 @@ fn_mods_update_init(){ # Recursively list all installed mods and apply update fn_mods_update_loop(){ # Reset line value - installedmodline="1" + installedmodsline="1" while [ $installedmodsline -le $installedmodscount ]; do # Current line defines current mod command currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")" From 5649a226c8d27177637da67738b76f11a9b0cbfb Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 21:20:30 -0600 Subject: [PATCH 0171/1895] ibid --- tests/tests_jc2server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index ce48d5265..b03542993 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -strace -f tests/tests_jc2server.sh start | tee /tmp/output; curl --upload-file /tmp/output https://transfer.sh/output +strace -f bash tests/tests_jc2server.sh start | tee /tmp/output; curl --upload-file /tmp/output https://transfer.sh/output fn_test_result_pass echo "" From ef4b57cbd0f140652bee744b14807f63f205a052 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 21:24:41 -0600 Subject: [PATCH 0172/1895] closer to a closer. --- tests/tests_jc2server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index b03542993..0bee062e8 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -strace -f bash tests/tests_jc2server.sh start | tee /tmp/output; curl --upload-file /tmp/output https://transfer.sh/output +strace -f bash tests/tests_jc2server.sh start > /tmp/output 2>&1; curl --upload-file /tmp/output https://transfer.sh/output fn_test_result_pass echo "" From 9929c3ecbde9f8740a4dd7666047b9a202a358b1 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 21:29:35 -0600 Subject: [PATCH 0173/1895] back to square 1 --- tests/tests_jc2server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 0bee062e8..cd765b480 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -strace -f bash tests/tests_jc2server.sh start > /tmp/output 2>&1; curl --upload-file /tmp/output https://transfer.sh/output +(command_start.sh) fn_test_result_pass echo "" From 214d755b027306a8b8fa91e0b97eba0931c0c801 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 04:29:52 +0100 Subject: [PATCH 0174/1895] fn_mod_lowercase --- lgsm/functions/mods_core.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index ac1b0ab61..e67f1bc45 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -69,6 +69,17 @@ fn_mod_extract(){ fn_dl_extract "${filedir}" "${filename}" "${extractdir}" } +fn_mod_lowercase(){ + # Converting files to lowercase + if [ "${modlowercase}" == "LowercaseOn" ]; then + fn_print_dots "Converting ${modprettyname} files to lowercase" + fn_script_log "Converting ${modprettyname} files to lowercase" + find "${extractdir}" -exec readlink -e '{}' \; | rename 'y/A-Z/a-z/' + fn_print_ok "Converting ${modprettyname} files to lowercase" + sleep 1 + fi +} + fn_mod_fileslist(){ # ${modsdatadir}/${modcommand}-files.list find "${extractdir}" -mindepth 1 -printf '%P\n' >> ${modsdatadir}/${modcommand}-files.list From 389b6a1c55d26ed3b0b3ca9c8c51023f87a1336f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 04:35:57 +0100 Subject: [PATCH 0175/1895] added lowercase convert to install --- lgsm/functions/command_mods_install.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 0b9d64eff..c4039951b 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -61,6 +61,8 @@ fn_mod_installation(){ fn_mod_dl # Extract the mod fn_mod_extract + # Convert to lowercase if needed + fn_mod_lowercase # Build a file list fn_mod_fileslist # Copying to destination From 7721c4be0be6e9b47045cef770aaa7c1a7473acc Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 04:35:58 +0100 Subject: [PATCH 0176/1895] added lowercase convert to update --- lgsm/functions/command_mods_update.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index a7fd0c572..a271a3163 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -61,6 +61,10 @@ fn_mods_update_loop(){ fn_mod_dl # Extract the mod fn_mod_extract + # Remove files that should not be erased + # fn_remove_cfg_files + # Convert to lowercase if needed + fn_mod_lowercase # Build a file list fn_mod_fileslist # Copying to destination From da4d7f146cd858a34e0e0307119495c4fc3788b3 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 04:38:27 +0100 Subject: [PATCH 0177/1895] changed message for already installed mod --- lgsm/functions/mods_core.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index e67f1bc45..2326f2135 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -98,7 +98,8 @@ fn_mod_already_installed(){ if [ -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then echo "" fn_print_warning_nl "${modprettyname} has already been installed." - echo " * Mod files will be overwritten." + echo " * Config files might be overwritten." + echo " * Press ctrl + c to abort." sleep 4 fi fi From d1d47dd2e7f5c987cf644bdbd905900e4f506ecf Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 21:43:53 -0600 Subject: [PATCH 0178/1895] testing another aspect --- tests/tests_jc2server.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index cd765b480..657854d17 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,8 +358,10 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus +bash -x tests/tests_jc2server.sh start (command_start.sh) fn_test_result_pass +find . -name *.log echo "" echo "3.2 - start - online" From fe05fc466f7dbaf645bf488a4d5d8d0ed651fdc7 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 21:52:28 -0600 Subject: [PATCH 0179/1895] more tests. [is what bad students everywhere have never said, ever] --- tests/tests_jc2server.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 657854d17..05aae74d9 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,8 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -bash -x tests/tests_jc2server.sh start +bash -x tests/tests_jc2server.sh start > /tmp/output 2>&1 +curl --upload-file /tmp/output https://transfer.sh/lgsm (command_start.sh) fn_test_result_pass find . -name *.log From d6c5bf446e6227b14de6ebf4fb7597cb84e4eb0e Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 04:59:56 +0100 Subject: [PATCH 0180/1895] better lowercase algorithm --- lgsm/functions/mods_core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 2326f2135..9312fe352 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -74,7 +74,7 @@ fn_mod_lowercase(){ if [ "${modlowercase}" == "LowercaseOn" ]; then fn_print_dots "Converting ${modprettyname} files to lowercase" fn_script_log "Converting ${modprettyname} files to lowercase" - find "${extractdir}" -exec readlink -e '{}' \; | rename 'y/A-Z/a-z/' + find "${extractdir}" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \; fn_print_ok "Converting ${modprettyname} files to lowercase" sleep 1 fi From 7826ee237e55667fa01ce8474e0cc299d0a3d415 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 22:07:48 -0600 Subject: [PATCH 0181/1895] more tests --- tests/tests_jc2server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 05aae74d9..3fdd87ad8 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -bash -x tests/tests_jc2server.sh start > /tmp/output 2>&1 +bash -x tests/tests_jc2server.sh start | tee /tmp/output 2>&1 curl --upload-file /tmp/output https://transfer.sh/lgsm (command_start.sh) fn_test_result_pass From d706670fd3bf3ff1700d7119196083c425be016e Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 22:13:30 -0600 Subject: [PATCH 0182/1895] more tests --- tests/tests_jc2server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 3fdd87ad8..4a1681201 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -bash -x tests/tests_jc2server.sh start | tee /tmp/output 2>&1 +bash -x tests/jc2server start | tee /tmp/output 2>&1 curl --upload-file /tmp/output https://transfer.sh/lgsm (command_start.sh) fn_test_result_pass From 8a3411b51a3b30d9c9a4df4855ddedee6a9024c2 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 22:17:39 -0600 Subject: [PATCH 0183/1895] travis-ty --- tests/tests_jc2server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 4a1681201..17653a658 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -359,10 +359,10 @@ echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus bash -x tests/jc2server start | tee /tmp/output 2>&1 +find . >> /tmp/output curl --upload-file /tmp/output https://transfer.sh/lgsm (command_start.sh) fn_test_result_pass -find . -name *.log echo "" echo "3.2 - start - online" From 52565e889024807a16121d22fe0be6657871a95a Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 22:23:26 -0600 Subject: [PATCH 0184/1895] travisty --- tests/tests_jc2server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 17653a658..f0807f127 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -bash -x tests/jc2server start | tee /tmp/output 2>&1 +bash -x tests/lgsm/functions/command_start.sh | tee /tmp/output 2>&1 find . >> /tmp/output curl --upload-file /tmp/output https://transfer.sh/lgsm (command_start.sh) From 85fcb07ccd73bb83bfcc89a448d218d52cfed335 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 22:29:52 -0600 Subject: [PATCH 0185/1895] travista. --- tests/tests_jc2server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index f0807f127..5eb26df9d 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,7 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -bash -x tests/lgsm/functions/command_start.sh | tee /tmp/output 2>&1 +strace -f tests/lgsm/functions/command_start.sh > tee /tmp/output 2>&1 find . >> /tmp/output curl --upload-file /tmp/output https://transfer.sh/lgsm (command_start.sh) From dd27330aebdadc407e5f974a1051f3e06fd3a249 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 22:36:34 -0600 Subject: [PATCH 0186/1895] tests --- tests/tests_jc2server.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 5eb26df9d..801d344b3 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,9 +358,11 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -strace -f tests/lgsm/functions/command_start.sh > tee /tmp/output 2>&1 +strace -f tests/lgsm/functions/command_start.sh > /tmp/output 2>&1 find . >> /tmp/output curl --upload-file /tmp/output https://transfer.sh/lgsm +curl --upload-file ./tests/log/script/*.log https://transfer.sh/slog +curl --upload-file ./tests/log/console/*.log https://transfer.sh/clog (command_start.sh) fn_test_result_pass From fdb46fafd17878fc916a59b6951ba6c32a896e10 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 22:38:07 -0600 Subject: [PATCH 0187/1895] Move the logs --- tests/tests_jc2server.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 801d344b3..5401dfa02 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,12 +358,9 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -strace -f tests/lgsm/functions/command_start.sh > /tmp/output 2>&1 -find . >> /tmp/output -curl --upload-file /tmp/output https://transfer.sh/lgsm +(command_start.sh) curl --upload-file ./tests/log/script/*.log https://transfer.sh/slog curl --upload-file ./tests/log/console/*.log https://transfer.sh/clog -(command_start.sh) fn_test_result_pass echo "" From 2abbd25bfb6da5b98001d96af102289fc37c9e8f Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 22:43:42 -0600 Subject: [PATCH 0188/1895] Path tweak --- tests/tests_jc2server.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 5401dfa02..4540e44a0 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,6 +358,7 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus +PATH=$PATH:./tests/lgsm/functions strace -f tests/lgsm/functions/command_start.sh > /tmp/output 2>&1 (command_start.sh) curl --upload-file ./tests/log/script/*.log https://transfer.sh/slog curl --upload-file ./tests/log/console/*.log https://transfer.sh/clog From 650f992b3edfdbe1413753ef77e5c4c5f14c7a64 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 22:49:25 -0600 Subject: [PATCH 0189/1895] nothing to see here. (so I added echo) --- tests/tests_jc2server.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 4540e44a0..93194587c 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,9 +358,11 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -PATH=$PATH:./tests/lgsm/functions strace -f tests/lgsm/functions/command_start.sh > /tmp/output 2>&1 +PATH=${PATH}:./tests/lgsm/functions strace -f tests/lgsm/functions/command_start.sh > /tmp/output 2>&1 (command_start.sh) +echo curl --upload-file ./tests/log/script/*.log https://transfer.sh/slog curl --upload-file ./tests/log/script/*.log https://transfer.sh/slog +echo curl --upload-file ./tests/log/console/*.log https://transfer.sh/clog curl --upload-file ./tests/log/console/*.log https://transfer.sh/clog fn_test_result_pass From 62d5b0833549f0088f3773467b0089ef04bc9ba3 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 22:54:15 -0600 Subject: [PATCH 0190/1895] curl it --- tests/tests_jc2server.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 93194587c..35f15bfc9 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -360,10 +360,10 @@ requiredstatus="OFFLINE" fn_setstatus PATH=${PATH}:./tests/lgsm/functions strace -f tests/lgsm/functions/command_start.sh > /tmp/output 2>&1 (command_start.sh) -echo curl --upload-file ./tests/log/script/*.log https://transfer.sh/slog -curl --upload-file ./tests/log/script/*.log https://transfer.sh/slog -echo curl --upload-file ./tests/log/console/*.log https://transfer.sh/clog -curl --upload-file ./tests/log/console/*.log https://transfer.sh/clog +for x in ./tests/log/*/*.log /tmp/output +do +curl --upload-file $x https://transfer.sh/lgsm +done fn_test_result_pass echo "" From 9c076536f349600cb2d81946cb46159e7da1c119 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 23:02:17 -0600 Subject: [PATCH 0191/1895] Packages #1 --- tests/tests_jc2server.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 35f15bfc9..ad54edebe 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,12 +358,9 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -PATH=${PATH}:./tests/lgsm/functions strace -f tests/lgsm/functions/command_start.sh > /tmp/output 2>&1 +dpkg -l > /tmp/packages +curl --upload-file ./tmp/packages https://transfer.sh/lgsm (command_start.sh) -for x in ./tests/log/*/*.log /tmp/output -do -curl --upload-file $x https://transfer.sh/lgsm -done fn_test_result_pass echo "" From 606570b11648d678c4dde6d134cd7ef781934e56 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 23:03:04 -0600 Subject: [PATCH 0192/1895] Packages 2 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 84fc85d9e..5ea64bd39 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: bash -sudo: false +sudo: required env: - DISTRO=ubuntu-trusty From 47a6c84dbcaeb3f7ddcd86c6868fa502cc89caf2 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 23:05:01 -0600 Subject: [PATCH 0193/1895] Packages 1(b) --- tests/tests_jc2server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index ad54edebe..48c9f09cd 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -359,7 +359,7 @@ echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus dpkg -l > /tmp/packages -curl --upload-file ./tmp/packages https://transfer.sh/lgsm +curl --upload-file /tmp/packages https://transfer.sh/lgsm (command_start.sh) fn_test_result_pass From cc7ddcac7f92ed945dfe060a17fb28ac38e1eb6e Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 23:05:22 -0600 Subject: [PATCH 0194/1895] Packages 1(a) --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5ea64bd39..84fc85d9e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: bash -sudo: required +sudo: false env: - DISTRO=ubuntu-trusty From 58fa09aa1ccfb413a50631d5523f8016cf10b678 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sat, 14 Jan 2017 23:10:37 -0600 Subject: [PATCH 0195/1895] put sudo back in. check packages --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 84fc85d9e..5ea64bd39 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: bash -sudo: false +sudo: required env: - DISTRO=ubuntu-trusty From 1f6c9c907823a4f3ad33980c3236657b2bb21986 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 06:29:19 +0100 Subject: [PATCH 0196/1895] Disable update mods --- lgsm/functions/command_mods_update.sh | 61 ++++++++++++++++----------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index a271a3163..cc2e25cb7 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -50,33 +50,44 @@ fn_mods_update_loop(){ if [ -n "${currentmod}" ]; then # Get mod info fn_mod_get_info_from_command - fn_print_dots_nl "Updating ${modprettyname}" - fn_script_log "Updating ${modprettyname}." - # Check and create required directories - fn_mods_dir - # Clear lgsm/tmp/mods dir if exists then recreate it - fn_clear_tmp_mods - fn_mods_tmpdir - # Download mod - fn_mod_dl - # Extract the mod - fn_mod_extract - # Remove files that should not be erased - # fn_remove_cfg_files - # Convert to lowercase if needed - fn_mod_lowercase - # Build a file list - fn_mod_fileslist - # Copying to destination - fn_mod_copy_destination - # Ending with installation routines - fn_mod_add_list - fn_clear_tmp_mods - fn_print_ok_nl "${modprettyname} installed." - fn_script_log "${modprettyname} installed." - let installedmodsline=installedmodsline+1 + # Don't update the mod if it's policy is to "NOUPDATE" + if [ "${modkeepfiles}" == "NOUPDATE" ]; then + fn_print_warning "${modprettyname} update has been disabled by LGSM." + echo " * Usual reason is to prevent erasing custom files." + echo " * If you still wish to update this mod: + echo " * 1) Backup your critical mod files + echo " * 2) Uninstall the mod with ./${selfname} mods-uninstall (optionnal) + echo " * 3) Re-install the mod with ./${selfname} mods-install" + else + fn_print_dots_nl "Updating ${modprettyname}" + fn_script_log "Updating ${modprettyname}." + # Check and create required directories + fn_mods_dir + # Clear lgsm/tmp/mods dir if exists then recreate it + fn_clear_tmp_mods + fn_mods_tmpdir + # Download mod + fn_mod_dl + # Extract the mod + fn_mod_extract + # Remove files that should not be erased + # fn_remove_cfg_files + # Convert to lowercase if needed + fn_mod_lowercase + # Build a file list + fn_mod_fileslist + # Copying to destination + fn_mod_copy_destination + # Ending with installation routines + fn_mod_add_list + fn_clear_tmp_mods + fn_print_ok_nl "${modprettyname} installed." + fn_script_log "${modprettyname} installed." + let installedmodsline=installedmodsline+1 + fi else fn_print_fail "No mod was selected." + fn_script_log_fail "No mod was selected." core_exit.sh fi done From 3b90b501d324b13faacbb54962a1893680dfd823 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 06:32:34 +0100 Subject: [PATCH 0197/1895] missing dir created & preparing cfg keep solution --- lgsm/functions/mods_core.sh | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 9312fe352..1e1822a19 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -80,7 +80,20 @@ fn_mod_lowercase(){ fi } +fn_remove_cfg_files(){ + # Remove config file after extraction for updates set by ${modkeepfiles} + if [ "${modkeepfiles}" != "OVERWRITE" ]&&[ "${modkeepfiles}" != "NOUPDATE" ]; then + echo "Prevent erasing custom files." + echo "Todo list" + fi +} + fn_mod_fileslist(){ + # Create lgsm/data/mods directory + if [ ! -d "${modsdatadir}" ]; then + mkdir -p "${modsdatadir}" + fn_script_log "Created ${modsdatadir}" + fi # ${modsdatadir}/${modcommand}-files.list find "${extractdir}" -mindepth 1 -printf '%P\n' >> ${modsdatadir}/${modcommand}-files.list fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.list}" @@ -107,7 +120,7 @@ fn_mod_already_installed(){ # Add the mod to the installed mods list fn_mod_add_list(){ - # Create lgsm/data directory + # Create lgsm/data/mods directory if [ ! -d "${modsdatadir}" ]; then mkdir -p "${modsdatadir}" fn_script_log "Created ${modsdatadir}" From 0286aaed8cc4eed6b2277551728a1bf4ee3c8905 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 06:33:33 +0100 Subject: [PATCH 0198/1895] closed double quotes --- lgsm/functions/command_mods_update.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index cc2e25cb7..13196e015 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -54,9 +54,9 @@ fn_mods_update_loop(){ if [ "${modkeepfiles}" == "NOUPDATE" ]; then fn_print_warning "${modprettyname} update has been disabled by LGSM." echo " * Usual reason is to prevent erasing custom files." - echo " * If you still wish to update this mod: - echo " * 1) Backup your critical mod files - echo " * 2) Uninstall the mod with ./${selfname} mods-uninstall (optionnal) + echo " * If you still wish to update this mod:" + echo " * 1) Backup your critical mod files" + echo " * 2) Uninstall the mod with ./${selfname} mods-uninstall (optionnal)" echo " * 3) Re-install the mod with ./${selfname} mods-install" else fn_print_dots_nl "Updating ${modprettyname}" From 97e30c95ff30cc0271e7e0867b2eb4af212b128c Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 06:35:27 +0100 Subject: [PATCH 0199/1895] missing increment --- lgsm/functions/command_mods_update.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 13196e015..a480cf17d 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -52,12 +52,13 @@ fn_mods_update_loop(){ fn_mod_get_info_from_command # Don't update the mod if it's policy is to "NOUPDATE" if [ "${modkeepfiles}" == "NOUPDATE" ]; then - fn_print_warning "${modprettyname} update has been disabled by LGSM." + fn_print_warning_nl "${modprettyname} update has been disabled by LGSM." echo " * Usual reason is to prevent erasing custom files." echo " * If you still wish to update this mod:" echo " * 1) Backup your critical mod files" echo " * 2) Uninstall the mod with ./${selfname} mods-uninstall (optionnal)" echo " * 3) Re-install the mod with ./${selfname} mods-install" + let installedmodsline=installedmodsline+1 else fn_print_dots_nl "Updating ${modprettyname}" fn_script_log "Updating ${modprettyname}." From cfe30b2b9d72c3539e92feb26490113ebfb13c31 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 08:16:38 +0100 Subject: [PATCH 0200/1895] Update mods_list.sh --- lgsm/functions/mods_list.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 28d8d5621..91ebb2ad6 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -20,7 +20,7 @@ modseparator="MOD" # Define mods information (required) fn_mods_info(){ - # REQUIRED: mod_info_name=( MOD "modcommand" "Pretty Name" "URL" "filename" "modsubfolders" "LowercaseOn/Off" "/files/to/keep;" "/install/path" "ENGINES" "GAMES" "NOTGAMES" "AUTHOR_URL" "Short Description" ) + # REQUIRED: mod_info_name=( MOD "modcommand" "Pretty Name" "URL" "filename" "modsubdirs" "LowercaseOn/Off" "/files/to/keep;" "/install/path" "ENGINES" "GAMES" "NOTGAMES" "AUTHOR_URL" "Short Description" ) # Example 1) Well made mod: mod_info_name=( MOD "awesomemod" "This is an Awesome Mod" "https://awesomemod.com/latest.zip" "awesomemod.zip" "0" "LowercaseOff" "OVERWRITE" "${systemdir}/addons" "source;unity3d;" "GAMES" "NOTGAMES" "https://awesomemod.com/" "This mod knows that 42 is the answer" ) # Example 2) Poorly made mod: mod_info_name=( MOD "stupidmod" "This is a stupid mod" "${crappymodurl}" "StupidMod.zip" "2" "LowercaseOn" "cfg;data/crappymod;" "${systemdir}" "source;" "GAMES" "Garry's mod;Counter-Strike: Source;" "This mod is dumber than dumb" ) # None of those values can be empty @@ -30,7 +30,7 @@ fn_mods_info(){ # [2] | "Pretty Name": the common name people use to call the mod that will be displayed to the user # [3] | "URL": link to the file; can be a variable defined in fn_mods_nasty_urls (make sure curl can download it) # [4] | "filename": the output filename - # [5] | "modsubfolders": in how many subfolders is the mod (none is 1) + # [5] | "modsubdirs": in how many subdirectories is the mod (none is 0) # [6] | "LowercaseOn/Off": LowercaseOff or LowercaseOn: enable/disable converting extracted files and directories to lowercase (some games require it) # [7] | "modinstalldir": the directory in which to install the mode ( use LGSM dir variables such as ${systemdir}) # [8] | "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" to ignore the value or "NOUPDATE" to disallow updating @@ -41,8 +41,8 @@ fn_mods_info(){ # [13] | "Short Description" a description showed to the user upon installation # Source mods - mod_info_metamod=( MOD "metamod" "MetaMod" "${metamodurl}" "${metamodlatestfile}" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "source;" "GAMES" "Garry's Mod;" "https://www.sourcemm.net" "Plugins Framework" ) - mod_info_sourcemod=( MOD "sourcemod" "SourceMod" "${sourcemodurl}" "${sourcemodlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;" "source;" "GAMES" "Garry's Mod;" "http://www.sourcemod.net" "Admin Features (requires MetaMod)" ) + mod_info_metamod=( MOD "metamod" "MetaMod" "${metamodurl}" "${metamodlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/metaplugins.ini;" "source;" "GAMES" "Garry's Mod;" "https://www.sourcemm.net" "Plugins Framework" ) + mod_info_sourcemod=( MOD "sourcemod" "SourceMod" "${sourcemodurl}" "${sourcemodlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "source;" "GAMES" "Garry's Mod;" "http://www.sourcemod.net" "Admin Features (requires MetaMod)" ) # Garry's Mod Addons mod_info_ulib=( MOD "ulib" "ULib" "https://codeload.github.com/TeamUlysses/ulib/zip/master" "ulib-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Complete Framework" ) mod_info_ulx=( MOD "ulx" "ULX" "https://codeload.github.com/TeamUlysses/ulx/zip/master" "ulx-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Admin Panel (requires ULib)" ) @@ -99,7 +99,7 @@ fi modprettyname="${mods_global_array[index+2]}" modurl="${mods_global_array[index+3]}" modfilename="${mods_global_array[index+4]}" - modsubfolders="${mods_global_array[index+5]}" + modsubdirs="${mods_global_array[index+5]}" modlowercase="${mods_global_array[index+6]}" modinstalldir="${mods_global_array[index+7]}" modkeepfiles="${mods_global_array[index+8]}" From 41230b0cfeb88e98d32588fc592b7fe0b0515fc0 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 09:03:50 +0100 Subject: [PATCH 0201/1895] merging, to test and fix --- lgsm/functions/mods_core.sh | 81 +++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 1e1822a19..826ad7c4a 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -34,6 +34,10 @@ fn_clear_tmp_mods(){ rm -r "${modstmpdir}" fn_script_log "Clearing temp mod download directory: ${modstmpdir}" fi + # Clear temp file list as well + if [ -f "${modsdatadir}/.removedfiles.tmp" ]; then + rm "${modsdatadir}/.removedfiles.tmp" + fi } # Create tmp download mod directory @@ -83,8 +87,24 @@ fn_mod_lowercase(){ fn_remove_cfg_files(){ # Remove config file after extraction for updates set by ${modkeepfiles} if [ "${modkeepfiles}" != "OVERWRITE" ]&&[ "${modkeepfiles}" != "NOUPDATE" ]; then - echo "Prevent erasing custom files." - echo "Todo list" + # Upon mods updates, config files should not be overwritten + # We will just remove these files before copying the mod to the destination + removefilesamount="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" + # Test all subvalue of "modgames" using the ";" separator + for ((removefilesindex=1; removefilesindex < ${removefilesamount}; removefilesindex++)); do + # Put current game name into modtest variable + removefiletest="$( echo "${modkeepfiles}" | awk -F ';' -v x=${removefilesindex} '{ print $x }' )" + # If it matches + if [ -f "${extractdir}/${removefiletest}" ]||[ -d "${extractdir}/${removefiletest}" ]; then + # Then delete the file! + rm -R "${extractdir}/${removefiletest}" + # Write this file path in a tmp file, to rebuild a full file list + if [ ! -f "${modsdatadir}/.removedfiles.tmp" ]; then + touch "${modsdatadir}/.removedfiles.tmp" + fi + echo "${removefiletest}" > ${modsdatadir}/.removedfiles.tmp" + fi + done fi } @@ -95,8 +115,12 @@ fn_mod_fileslist(){ fn_script_log "Created ${modsdatadir}" fi # ${modsdatadir}/${modcommand}-files.list - find "${extractdir}" -mindepth 1 -printf '%P\n' >> ${modsdatadir}/${modcommand}-files.list + find "${extractdir}" -mindepth 1 -printf '%P\n' > ${modsdatadir}/${modcommand}-files.list fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.list}" + # Adding removed files if needed + if [ -f "${modsdatadir}/.removedfiles.tmp" ]; then + cat "${modsdatadir}/.removedfiles.tmp" >> ${modsdatadir}/${modcommand}-files.list + fi } fn_mod_copy_destination(){ @@ -136,3 +160,54 @@ fn_mod_add_list(){ fn_script_log "${modcommand} added to ${modslockfile}" fi } + +fn_check_files_list(){ + # File list must exist and be valid before any operation on it + if [ -f "${modsdatadir}/${modcommand}-files.list" ]; then + # How many lines is the file list + modsfilelistsize="$(cat "${modsdatadir}/${modcommand}-files.list" | wc -l)" + # If file list is empty + if [ $modsfilelistsize -eq 0 ]; then + fn_print_error_nl "${modcommand}-files.list is empty" + echo "Exiting." + fn_scrip_log_fatal "${modcommand}-files.list is empty" + exitcode="2" + core_exit.sh + fi + else + fn_print_error_nl "${modsdatadir}/${modcommand}-files.list don't exist" + echo "Exiting." + fn_scrip_log_fatal "${modsdatadir}/${modcommand}-files.list don't exist" + exitcode="2" + core_exit.sh + fi +} + +fn_postinstall_tasks(){ + # Sourcemod, but any other game as well should never delete "cfg" or "addons" folder + # Prevent addons folder from being removed by clearing them in: ${modsdatadir}/${modcommand}-files.list + fn_check_files_list + # Output to the user + fn_print_information_nl "Rearranging ${modcommand}-files.list" + fn_script_log_info "Rearranging ${modcommand}-files.list" + smremovefromlist="cfg;addons" + # Loop through every single line to find any of the files to remove from the list + # that way these files won't get removed upon update or uninstall + fileslistline=1 + while [ $fileslistline -le $modsfilelistsize ]; do + testline="$(sed "${fileslistline}q;d" "${modsdatadir}/${modcommand}-files.list")" + # How many elements to remove from list + smremoveamount="$(echo "${smremovefromlist}" | awk -F ';' '{ print NF }')" + # Test all subvalue of "modkeepfiles" using the ";" separator + for ((filesindex=1; filesindex < ${smremoveamount}; filesindex++)); do + # Put current file into test variable + smremovetestvar="$( echo "${smremovefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }' )" + # If it matches + if [ "${testline}" == "${smremovetestvar}" ]; then + # Then delete the line! + sed -i "${testline}d" "${modsdatadir}/${modcommand}-files.list" + fi + done + let fileslistline=fileslistline+1 + done +} From 6d381f079955f34252ba7827a29f4a0cf0fcc533 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 09:08:06 +0100 Subject: [PATCH 0202/1895] removed space --- lgsm/functions/mods_core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 826ad7c4a..38fb1e376 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -110,7 +110,7 @@ fn_remove_cfg_files(){ fn_mod_fileslist(){ # Create lgsm/data/mods directory - if [ ! -d "${modsdatadir}" ]; then + if [ ! -d "${modsdatadir}" ]; then mkdir -p "${modsdatadir}" fn_script_log "Created ${modsdatadir}" fi From f280dd779464746f12807d6cebf851bddc07bcc7 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 09:13:28 +0100 Subject: [PATCH 0203/1895] missing double quote --- lgsm/functions/mods_core.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 38fb1e376..082afb399 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -102,7 +102,7 @@ fn_remove_cfg_files(){ if [ ! -f "${modsdatadir}/.removedfiles.tmp" ]; then touch "${modsdatadir}/.removedfiles.tmp" fi - echo "${removefiletest}" > ${modsdatadir}/.removedfiles.tmp" + echo "${removefiletest}" > "${modsdatadir}/.removedfiles.tmp" fi done fi @@ -180,7 +180,7 @@ fn_check_files_list(){ fn_scrip_log_fatal "${modsdatadir}/${modcommand}-files.list don't exist" exitcode="2" core_exit.sh - fi + fi } fn_postinstall_tasks(){ From 8c399fcf460064ad8e28d2b751e7bacf4f173e6b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 09:18:54 +0100 Subject: [PATCH 0204/1895] added postinstall tasks --- lgsm/functions/command_mods_install.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index c4039951b..6a3e05b20 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -69,6 +69,9 @@ fn_mod_installation(){ fn_mod_copy_destination # Ending with installation routines fn_mod_add_list + # Post install fixes + fn_postinstall_tasks + # Cleaning fn_clear_tmp_mods fn_print_ok_nl "${modprettyname} installed." fn_script_log "${modprettyname} installed." From 890e20438e81a515f76f6d75a600ccf807488063 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 09:20:53 +0100 Subject: [PATCH 0205/1895] added fn_postinstall_tasks & fn_remove_cfg_files --- lgsm/functions/command_mods_update.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index a480cf17d..390897d41 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -71,16 +71,19 @@ fn_mods_update_loop(){ fn_mod_dl # Extract the mod fn_mod_extract - # Remove files that should not be erased - # fn_remove_cfg_files # Convert to lowercase if needed fn_mod_lowercase + # Remove files that should not be erased + fn_remove_cfg_files # Build a file list fn_mod_fileslist # Copying to destination fn_mod_copy_destination # Ending with installation routines fn_mod_add_list + # Post install fixes + fn_postinstall_tasks + # Cleaning fn_clear_tmp_mods fn_print_ok_nl "${modprettyname} installed." fn_script_log "${modprettyname} installed." From f2dc5fd1a5333c927bffcd1e2f6fa3705f28d69b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 09:44:32 +0100 Subject: [PATCH 0206/1895] attempt to fix sed --- lgsm/functions/mods_core.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 082afb399..a24f88195 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -190,7 +190,7 @@ fn_postinstall_tasks(){ # Output to the user fn_print_information_nl "Rearranging ${modcommand}-files.list" fn_script_log_info "Rearranging ${modcommand}-files.list" - smremovefromlist="cfg;addons" + smremovefromlist="cfg;addons;" # Loop through every single line to find any of the files to remove from the list # that way these files won't get removed upon update or uninstall fileslistline=1 @@ -205,7 +205,7 @@ fn_postinstall_tasks(){ # If it matches if [ "${testline}" == "${smremovetestvar}" ]; then # Then delete the line! - sed -i "${testline}d" "${modsdatadir}/${modcommand}-files.list" + sed -i "/${testline}/d" "${modsdatadir}/${modcommand}-files.list" fi done let fileslistline=fileslistline+1 From 98174069416783180fba620fe6ea4178967b3483 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 09:45:40 +0100 Subject: [PATCH 0207/1895] sourcemod available for gmod --- lgsm/functions/mods_list.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 91ebb2ad6..24a81f262 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -41,8 +41,8 @@ fn_mods_info(){ # [13] | "Short Description" a description showed to the user upon installation # Source mods - mod_info_metamod=( MOD "metamod" "MetaMod" "${metamodurl}" "${metamodlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/metaplugins.ini;" "source;" "GAMES" "Garry's Mod;" "https://www.sourcemm.net" "Plugins Framework" ) - mod_info_sourcemod=( MOD "sourcemod" "SourceMod" "${sourcemodurl}" "${sourcemodlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "source;" "GAMES" "Garry's Mod;" "http://www.sourcemod.net" "Admin Features (requires MetaMod)" ) + mod_info_metamod=( MOD "metamod" "MetaMod" "${metamodurl}" "${metamodlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/metaplugins.ini;" "source;" "GAMES" "NOTGAMES" "https://www.sourcemm.net" "Plugins Framework" ) + mod_info_sourcemod=( MOD "sourcemod" "SourceMod" "${sourcemodurl}" "${sourcemodlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "source;" "GAMES" "NOTGAMES" "http://www.sourcemod.net" "Admin Features (requires MetaMod)" ) # Garry's Mod Addons mod_info_ulib=( MOD "ulib" "ULib" "https://codeload.github.com/TeamUlysses/ulib/zip/master" "ulib-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Complete Framework" ) mod_info_ulx=( MOD "ulx" "ULX" "https://codeload.github.com/TeamUlysses/ulx/zip/master" "ulx-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Admin Panel (requires ULib)" ) From cf6de952e18e05423d89a96c4943516d290fcd7d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 10:02:39 +0100 Subject: [PATCH 0208/1895] try replacing with grep --- lgsm/functions/mods_core.sh | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index a24f88195..2bb9a80da 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -190,24 +190,16 @@ fn_postinstall_tasks(){ # Output to the user fn_print_information_nl "Rearranging ${modcommand}-files.list" fn_script_log_info "Rearranging ${modcommand}-files.list" - smremovefromlist="cfg;addons;" + removefromlist="cfg;addons;" # Loop through every single line to find any of the files to remove from the list # that way these files won't get removed upon update or uninstall - fileslistline=1 - while [ $fileslistline -le $modsfilelistsize ]; do - testline="$(sed "${fileslistline}q;d" "${modsdatadir}/${modcommand}-files.list")" - # How many elements to remove from list - smremoveamount="$(echo "${smremovefromlist}" | awk -F ';' '{ print NF }')" - # Test all subvalue of "modkeepfiles" using the ";" separator - for ((filesindex=1; filesindex < ${smremoveamount}; filesindex++)); do - # Put current file into test variable - smremovetestvar="$( echo "${smremovefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }' )" - # If it matches - if [ "${testline}" == "${smremovetestvar}" ]; then - # Then delete the line! - sed -i "/${testline}/d" "${modsdatadir}/${modcommand}-files.list" - fi - done - let fileslistline=fileslistline+1 + # How many elements to remove from list + smremoveamount="$(echo "${removefromlist}" | awk -F ';' '{ print NF }')" + # Test all subvalue of "modkeepfiles" using the ";" separator + for ((filesindex=1; filesindex < ${smremoveamount}; filesindex++)); do + # Put current file into test variable + rmtestvar="$( echo "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }' )" + # Remove matches + grep -vFf ${modsdatadir}/${modcommand}-files.list "${rmtestvar}" > ${modsdatadir}/${modcommand}-files.list done } From 4e79f341e5fff091c4096a982826f0aac3c508c6 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 10:07:16 +0100 Subject: [PATCH 0209/1895] rollback to fix --- lgsm/functions/mods_core.sh | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 2bb9a80da..d39fc2204 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -190,16 +190,24 @@ fn_postinstall_tasks(){ # Output to the user fn_print_information_nl "Rearranging ${modcommand}-files.list" fn_script_log_info "Rearranging ${modcommand}-files.list" - removefromlist="cfg;addons;" + smremovefromlist="cfg;addons;" # Loop through every single line to find any of the files to remove from the list # that way these files won't get removed upon update or uninstall - # How many elements to remove from list - smremoveamount="$(echo "${removefromlist}" | awk -F ';' '{ print NF }')" - # Test all subvalue of "modkeepfiles" using the ";" separator - for ((filesindex=1; filesindex < ${smremoveamount}; filesindex++)); do - # Put current file into test variable - rmtestvar="$( echo "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }' )" - # Remove matches - grep -vFf ${modsdatadir}/${modcommand}-files.list "${rmtestvar}" > ${modsdatadir}/${modcommand}-files.list + fileslistline=1 + while [ $fileslistline -le $modsfilelistsize ]; do + testline="$(sed "${fileslistline}q;d" "${modsdatadir}/${modcommand}-files.list")" + # How many elements to remove from list + smremoveamount="$(echo "${smremovefromlist}" | awk -F ';' '{ print NF }')" + # Test all subvalue of "modkeepfiles" using the ";" separator + for ((filesindex=1; filesindex < ${smremoveamount}; filesindex++)); do + # Put current file into test variable + smremovetestvar="$( echo "${smremovefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }' )" + # If it matches + if [ "${testline}" == "${smremovetestvar}" ]; then + # Then delete the line! + sed -i "${testline}d" "${modsdatadir}/${modcommand}-files.list" + fi + done + let fileslistline=fileslistline+1 done } From 4804346806635d1aa8dd133fe14675ac0dd927b2 Mon Sep 17 00:00:00 2001 From: CedarLUG Date: Sun, 15 Jan 2017 08:56:40 -0600 Subject: [PATCH 0210/1895] This should roll everything back to a single one-line "sudo: required". --- .travis.yml | 1 - tests/tests_jc2server.sh | 2 -- 2 files changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5ea64bd39..d385c27fa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,6 @@ addons: - libstdc++6:i386 - telnet - expect - - strace script: diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 48c9f09cd..cd765b480 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -358,8 +358,6 @@ echo "start ${gamename} server." echo "Command: ./jc2server start" requiredstatus="OFFLINE" fn_setstatus -dpkg -l > /tmp/packages -curl --upload-file /tmp/packages https://transfer.sh/lgsm (command_start.sh) fn_test_result_pass From 37fae9b0875a865e712c427c6ae20702f9c6eff3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 15 Jan 2017 17:47:18 +0000 Subject: [PATCH 0211/1895] Fixed some insonsistancys with the comments --- 7DaysToDie/sdtdserver | 1 - ARKSurvivalEvolved/arkserver | 1 - Arma3/arma3server | 1 - Battlefield1942/bf1942server | 2 +- BlackMesa/bmdmserver | 1 - BladeSymphony/bsserver | 1 - BrainBread2/bb2server | 1 - CallOfDuty2/cod2server | 1 - CallOfDuty4/cod4server | 1 - CallOfDutyUnitedOffensive/coduoserver | 1 - CallOfDutyWorldAtWar/codwawserver | 1 - CodenameCURE/ccserver | 3 ++- CounterStrike/csserver | 1 - CounterStrikeConditionZero/csczserver | 1 - CounterStrikeGlobalOffensive/csgoserver | 1 - CounterStrikeSource/cssserver | 1 - DayOfDefeat/dodserver | 1 - DayOfDefeatSource/dodsserver | 1 - DayOfInfamy/doiserver | 1 - DeathmatchClassic/dmcserver | 1 - DoubleActionBoogaloo/dabserver | 1 - EmpiresMod/emserver | 1 - Factorio/fctrserver | 1 - FistfulOfFrags/fofserver | 1 - GarrysMod/gmodserver | 1 - GoldenEyeSource/gesserver | 3 +-- HalfLife2Deathmatch/hl2dmserver | 1 - HalfLifeDeathmatch/hldmserver | 1 - HalfLifeDeathmatchSource/hldmsserver | 1 - Insurgency/insserver | 1 - JustCause2/jc2server | 4 ---- KillingFloor/kfserver | 3 ++- Left4Dead/l4dserver | 1 - Left4Dead2/l4d2server | 1 - Minecraft/mcserver | 1 - Mumble/mumbleserver | 1 - NS2Combat/ns2cserver | 1 - NaturalSelection2/ns2server | 1 - NoMoreRoomInHell/nmrihserver | 1 - OpposingForce/opforserver | 1 - PiratesVikingandKnightsII/pvkiiserver | 1 - QuakeWorld/qwserver | 1 - RedOrchestra/roserver | 1 - Ricochet/ricochetserver | 4 +--- Rust/rustserver | 1 - Starbound/sbserver | 1 - SvenCoop/svenserver | 1 - TeamFortress2/tf2server | 1 - TeamFortressClassic/tfcserver | 1 - Teeworlds/twserver | 1 - Terraria/terrariaserver | 1 - UnrealTournament/utserver | 1 - UnrealTournament2004/ut2k4server | 1 - UnrealTournament99/ut99server | 1 - WolfensteinEnemyTerritory/wetserver | 4 ---- tests/tests_jc2server.sh | 1 - tests/tests_ts3server.sh | 1 + 57 files changed, 8 insertions(+), 65 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index 36bfbed5d..6ca116aa7 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -30,7 +30,6 @@ steampass='password' ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | http://7daystodie.gamepedia.com/Server fn_parms(){ parms="-logfile ${gamelogdir}/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated -configfile=${servercfgfullpath}" } diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 6bc5079c0..da408b353 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -30,7 +30,6 @@ maxplayers="70" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="\"TheIsland?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port}?\"" } diff --git a/Arma3/arma3server b/Arma3/arma3server index 8898beb93..8d6dcb210 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -46,7 +46,6 @@ servermods="" bepath="" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="-netlog -ip=${ip} -port=${port} -cfg=${networkcfgfullpath} -config=${servercfgfullpath} -mod=${mods} -servermod=${servermods} -bepath=${bepath} -autoinit -loadmissiontomemory" } diff --git a/Battlefield1942/bf1942server b/Battlefield1942/bf1942server index 42d616617..51b8dfcc0 100644 --- a/Battlefield1942/bf1942server +++ b/Battlefield1942/bf1942server @@ -22,7 +22,7 @@ version="170110" #### Server Settings #### -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ parms="+hostServer 1 +dedicated 1" } diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index 18f0647bb..1b6c9d573 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -36,7 +36,6 @@ ip="0.0.0.0" gslt="" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game bms -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index 0bac17035..38c71ce1e 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -35,7 +35,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-autoupdate -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index 50e46bf72..df5034bb8 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -39,7 +39,6 @@ ip="0.0.0.0" gslt="" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game brainbread2 -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/CallOfDuty2/cod2server b/CallOfDuty2/cod2server index ecf79db64..db4f07af9 100755 --- a/CallOfDuty2/cod2server +++ b/CallOfDuty2/cod2server @@ -23,7 +23,6 @@ version="170110" #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters - defaultmap="mp_leningrad" maxclients="20" port="28960" diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server index 8ccebd949..6b4a0260e 100644 --- a/CallOfDuty4/cod4server +++ b/CallOfDuty4/cod4server @@ -23,7 +23,6 @@ version="170110" #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters - defaultmap="mp_crossfire" maxclients="32" port="28960" diff --git a/CallOfDutyUnitedOffensive/coduoserver b/CallOfDutyUnitedOffensive/coduoserver index 02f2b8b09..c3d71ae8a 100755 --- a/CallOfDutyUnitedOffensive/coduoserver +++ b/CallOfDutyUnitedOffensive/coduoserver @@ -23,7 +23,6 @@ version="170110" #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters - defaultmap="mp_cassino" maxclients="20" port="28960" diff --git a/CallOfDutyWorldAtWar/codwawserver b/CallOfDutyWorldAtWar/codwawserver index 2f3e93fae..5e3681ead 100755 --- a/CallOfDutyWorldAtWar/codwawserver +++ b/CallOfDutyWorldAtWar/codwawserver @@ -23,7 +23,6 @@ version="170110" #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters - defaultmap="mp_castle" maxclients="20" port="28960" diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 08eb09a3d..3196b993c 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -20,6 +20,8 @@ version="170110" ######## Settings ######## ########################## +#### Server Settings #### + ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters defaultmap="cbe_bunker" maxplayers="6" @@ -29,7 +31,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game cure -insecure -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/CounterStrike/csserver b/CounterStrike/csserver index c23d9c988..4add519a6 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -30,7 +30,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ parms="-game cstrike -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" } diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index 3e25bb09a..8333438b9 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -30,7 +30,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ parms="-game czero -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" } diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index de6450a99..8a306dc03 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -54,7 +54,6 @@ gslt="" # ws_start_map="" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game csgo -usercon -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers_override ${maxplayers} +mapgroup ${mapgroup} +game_mode ${gamemode} +game_type ${gametype} +host_workshop_collection ${ws_collection_id} +workshop_start_map ${ws_start_map} -authkey ${authkey}" } diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index dca4bfa8a..bdee401bb 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -37,7 +37,6 @@ updateonstart="off" gslt="" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game cstrike -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index d9e1b19c4..efe5861f8 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -31,7 +31,6 @@ ip="0.0.0.0" updateonstart="off" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ parms="-game dod -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" } diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 2e98b7771..3508e0686 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -31,7 +31,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | ttps://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game dod -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/DayOfInfamy/doiserver b/DayOfInfamy/doiserver index 215a1d8a4..5d2ed38fe 100644 --- a/DayOfInfamy/doiserver +++ b/DayOfInfamy/doiserver @@ -33,7 +33,6 @@ ip="0.0.0.0" workshop="0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game doi -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} +sv_workshop_enabled ${workshop}" } diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index a0e438363..4ef098e91 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -30,7 +30,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ parms="-game dmc -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" } diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 821fbf872..245cd0c59 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -31,7 +31,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/EmpiresMod/emserver b/EmpiresMod/emserver index d64f0491a..36cb92f5a 100644 --- a/EmpiresMod/emserver +++ b/EmpiresMod/emserver @@ -36,7 +36,6 @@ ip="0.0.0.0" gslt="" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game empires -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 0d10ee24d..8843668e4 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -29,7 +29,6 @@ rconpassword="CHANGE_ME" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="--start-server ${filesdir}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" } diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index 8cbda31ac..988a1b680 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -31,7 +31,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game fof -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index a73ac81fa..c432c6769 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -46,7 +46,6 @@ customparms="+r_hunkalloclightmaps 0" gslt="" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ 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}" } diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index b5c7aa25b..d1520cc35 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -22,7 +22,7 @@ version="170110" #### Server Settings #### -# Start Variables +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters defaultmap="ge_archives" maxplayers="16" port="27015" @@ -31,7 +31,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game gesource -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index bb4f2c73a..b5a15f78c 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -31,7 +31,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game hl2mp -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index c2a95d39f..8ba1b8d01 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -30,7 +30,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ parms="-game valve -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" } diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index 707881508..c25dc3fbf 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -31,7 +31,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game hl1mp -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/Insurgency/insserver b/Insurgency/insserver index 722fcea46..eac3777c3 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -33,7 +33,6 @@ ip="0.0.0.0" workshop="0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game insurgency -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} +sv_workshop_enabled ${workshop} -norestart" } diff --git a/JustCause2/jc2server b/JustCause2/jc2server index d36ef0a00..626df4b3a 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -20,11 +20,7 @@ version="170110" ######## Settings ######## ########################## -#### Server Settings #### -# No settings available for Just Cause 2 - ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="" } diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index e42dd92a1..baca47dcc 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -30,10 +30,11 @@ steampass='password' defaultmap="KF-BioticsLab.rom" ip="0.0.0.0" +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ parms="server ${defaultmap}?game=KFmod.KFGameType?VACSecured=true -nohomedir ini=${servercfg} log=${gamelog}" -# Start Variables for Objective mode +# Server Start Command for Objective mode #defaultmap="KFO-Steamland" #parms="server ${defaultmap}?Game=KFStoryGame.KFStoryGame?VACSecured=true -nohomedir ini=${servercfg} log=${gamelog}" } diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index a6446c8bf..2216a5f93 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -30,7 +30,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game left4dead -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" } diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index 23902ea43..496444a20 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -30,7 +30,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game left4dead2 -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/Minecraft/mcserver b/Minecraft/mcserver index 74e03c6ab..82999f5a3 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -26,7 +26,6 @@ version="170110" javaram="1024" # -Xmx$1024M ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="nogui" } diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index 4e4a28f4c..6dd9eb2d3 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -24,7 +24,6 @@ version="170110" # Use .ini config file for Mumble (Murmur) server. ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="-fg -ini ${servercfgfullpath}" } diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index b5fcd7b8f..c1b39d836 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -42,7 +42,6 @@ password="" # -password \"${password}\" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | 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 \"${servercfgdir}\" -modstorage \"${modstoragedir}\" -mods \"${mods}\"" } diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index c662ecbd5..bc01063c2 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -42,7 +42,6 @@ password="" # -password \"${password}\" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | 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 \"${servercfgdir}\" -logdir \"${gamelogdir}\" -modstorage \"${modstoragedir}\" -mods \"${mods}\"" } diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index 54e59c299..5a925ea54 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -36,7 +36,6 @@ ip="0.0.0.0" gslt="" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game nmrih -insecure -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index 5d347f06b..945f353d4 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -30,7 +30,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ parms="-game gearbox -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" } diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index 56ad17438..6a715b7b9 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -31,7 +31,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game pvkii -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/QuakeWorld/qwserver b/QuakeWorld/qwserver index 7e27f0a89..1b92190e3 100644 --- a/QuakeWorld/qwserver +++ b/QuakeWorld/qwserver @@ -27,7 +27,6 @@ port="27500" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-port ${port} -game ktx +exec ${servercfg}" } diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index 8170bb53d..0812c7f41 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -31,7 +31,6 @@ defaultmap="RO-Arad.rom" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="server ${defaultmap}?game=ROGame.ROTeamGame?VACSecured=true -nohomedir ini=${servercfg} log=${gamelog}" } diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index d3165f2fd..16d9fca81 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -22,7 +22,7 @@ version="170110" #### Server Settings #### -# Start Variables +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters defaultmap="rc_arena" maxplayers="16" port="27015" @@ -30,7 +30,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ parms="-game ricochet -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" } @@ -50,7 +49,6 @@ ip="0.0.0.0" gslt="" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="" } diff --git a/Rust/rustserver b/Rust/rustserver index 14d9e4e42..aa740f8b1 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -38,7 +38,6 @@ saveinterval="300" # Auto-save in seconds tickrate="30" # default 30; range : 15 to 100 ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Rust_Dedicated_Server fn_parms(){ parms="-batchmode +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${servicename}\" ${conditionalseed} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile ${gamelogfile}" } diff --git a/Starbound/sbserver b/Starbound/sbserver index e6b37dc71..899d846dc 100644 --- a/Starbound/sbserver +++ b/Starbound/sbserver @@ -30,7 +30,6 @@ steampass='password' ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="" } diff --git a/SvenCoop/svenserver b/SvenCoop/svenserver index b2e7f35e8..10e27db1b 100644 --- a/SvenCoop/svenserver +++ b/SvenCoop/svenserver @@ -30,7 +30,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ parms="-game svencoop -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" } diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index a278d0921..bbc242d0b 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -36,7 +36,6 @@ ip="0.0.0.0" gslt="" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server fn_parms(){ parms="-game tf -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index beec9da19..6c3a7d9eb 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -30,7 +30,6 @@ clientport="27005" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://developer.valvesoftware.com/wiki/Command_Line_Options#Command-line_parameters_2 fn_parms(){ parms="-game tfc -strictportbind _ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" } diff --git a/Teeworlds/twserver b/Teeworlds/twserver index 4a9684003..d0de5a1d0 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -30,7 +30,6 @@ steampass='password' ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="-f ${servercfgfullpath}" } diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index a55c57286..a155828eb 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -30,7 +30,6 @@ steampass='password' ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="-config ${servercfgfullpath}" } diff --git a/UnrealTournament/utserver b/UnrealTournament/utserver index 49d955329..e95414adc 100644 --- a/UnrealTournament/utserver +++ b/UnrealTournament/utserver @@ -31,7 +31,6 @@ ip="0.0.0.0" port="7777" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="UnrealTournament ${defaultmap}?Game=${gametype}?TimeLimit=${timelimit} -port=${port}" } diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index c235f0746..0b49bd361 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -27,7 +27,6 @@ defaultmap="DM-Rankin" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | fn_parms(){ parms="server ${defaultmap}?game=XGame.xDeathMatch -nohomedir ini=${servercfg} log=${gamelog}" } diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index 0a62996d1..fff7c8cb4 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -27,7 +27,6 @@ defaultmap="DM-Deck16][" ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="server ${defaultmap}.unr ini=${servercfgfullpath}" } diff --git a/WolfensteinEnemyTerritory/wetserver b/WolfensteinEnemyTerritory/wetserver index 564473568..07ec5b7d9 100644 --- a/WolfensteinEnemyTerritory/wetserver +++ b/WolfensteinEnemyTerritory/wetserver @@ -22,11 +22,7 @@ version="170110" #### Server Settings #### -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -# Please use Enemy Territory config file. - ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="+set net_strict 1 +set fs_homepath ${filesdir} +exec ${servercfg}" } diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index cd765b480..c9140e9d0 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -27,7 +27,6 @@ version="170110" # No settings available for Just Cause 2 ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care fn_parms(){ parms="" } diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 82a4cc147..21c76309c 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -29,6 +29,7 @@ pushbullettoken="accesstoken" # Start Variables updateonstart="off" + fn_parms(){ parms="" } From 7fa45081d2c2002689106b5e39892c4a571342ed Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 19:12:17 +0100 Subject: [PATCH 0212/1895] travis Cedar fix --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f91811da3..d385c27fa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: bash -sudo: false +sudo: required env: - DISTRO=ubuntu-trusty From ff583d565c8078e179ba2879366520f37cf65d57 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 20:05:29 +0100 Subject: [PATCH 0213/1895] attempt to fix thanks @cedar :D --- lgsm/functions/mods_core.sh | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index d39fc2204..9482dd12e 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -188,26 +188,22 @@ fn_postinstall_tasks(){ # Prevent addons folder from being removed by clearing them in: ${modsdatadir}/${modcommand}-files.list fn_check_files_list # Output to the user - fn_print_information_nl "Rearranging ${modcommand}-files.list" + fn_print_dots "Rearranging ${modcommand}-files.list" fn_script_log_info "Rearranging ${modcommand}-files.list" - smremovefromlist="cfg;addons;" - # Loop through every single line to find any of the files to remove from the list + removefromlist="cfg;addons;" + # Loop through files to remove and remove them from file list # that way these files won't get removed upon update or uninstall - fileslistline=1 - while [ $fileslistline -le $modsfilelistsize ]; do - testline="$(sed "${fileslistline}q;d" "${modsdatadir}/${modcommand}-files.list")" - # How many elements to remove from list - smremoveamount="$(echo "${smremovefromlist}" | awk -F ';' '{ print NF }')" - # Test all subvalue of "modkeepfiles" using the ";" separator - for ((filesindex=1; filesindex < ${smremoveamount}; filesindex++)); do - # Put current file into test variable - smremovetestvar="$( echo "${smremovefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }' )" - # If it matches - if [ "${testline}" == "${smremovetestvar}" ]; then - # Then delete the line! - sed -i "${testline}d" "${modsdatadir}/${modcommand}-files.list" - fi - done - let fileslistline=fileslistline+1 + # How many elements to remove from list + removefromlistamount="$(echo "${removefromlist}" | awk -F ';' '{ print NF }')" + # Test all subvalue of "removefromlist" using the ";" separator + for ((filesindex=1; filesindex < ${removefromlistamount}; filesindex++)); do + # Put current file into test variable + removefilevar="$( echo "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }' )" + # If it matches + if [ "${testline}" == "${removefilevar}" ]; then + # Then delete matching line(s)! + sed -i "/^${testline}$/d" "${modsdatadir}/${modcommand}-files.list" + fi done + fn_print_ok "Rearranging ${modcommand}-files.list" } From 98f30f384362ecc102befe1b3f3e45f6988134f4 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 20:09:48 +0100 Subject: [PATCH 0214/1895] clearing junk --- lgsm/functions/mods_core.sh | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 9482dd12e..5bde66b15 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -191,19 +191,16 @@ fn_postinstall_tasks(){ fn_print_dots "Rearranging ${modcommand}-files.list" fn_script_log_info "Rearranging ${modcommand}-files.list" removefromlist="cfg;addons;" - # Loop through files to remove and remove them from file list - # that way these files won't get removed upon update or uninstall + # Loop through files to remove from file list, + # that way these files won't get removed upon uninstall # How many elements to remove from list removefromlistamount="$(echo "${removefromlist}" | awk -F ';' '{ print NF }')" # Test all subvalue of "removefromlist" using the ";" separator for ((filesindex=1; filesindex < ${removefromlistamount}; filesindex++)); do # Put current file into test variable removefilevar="$( echo "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }' )" - # If it matches - if [ "${testline}" == "${removefilevar}" ]; then - # Then delete matching line(s)! - sed -i "/^${testline}$/d" "${modsdatadir}/${modcommand}-files.list" - fi + # Then delete matching line(s)! + sed -i "/^${testline}$/d" "${modsdatadir}/${modcommand}-files.list" done fn_print_ok "Rearranging ${modcommand}-files.list" } From 02fc9bc11564d195ab1c627ec5fc0c941d88ba48 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 20:17:00 +0100 Subject: [PATCH 0215/1895] proper var & comments --- lgsm/functions/mods_core.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 5bde66b15..de4a7fde9 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -184,12 +184,13 @@ fn_check_files_list(){ } fn_postinstall_tasks(){ - # Sourcemod, but any other game as well should never delete "cfg" or "addons" folder # Prevent addons folder from being removed by clearing them in: ${modsdatadir}/${modcommand}-files.list + # Check file validity fn_check_files_list # Output to the user fn_print_dots "Rearranging ${modcommand}-files.list" fn_script_log_info "Rearranging ${modcommand}-files.list" + # What lines/files to remove from file list removefromlist="cfg;addons;" # Loop through files to remove from file list, # that way these files won't get removed upon uninstall @@ -200,7 +201,7 @@ fn_postinstall_tasks(){ # Put current file into test variable removefilevar="$( echo "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }' )" # Then delete matching line(s)! - sed -i "/^${testline}$/d" "${modsdatadir}/${modcommand}-files.list" + sed -i "/^${removefilevar}$/d" "${modsdatadir}/${modcommand}-files.list" done fn_print_ok "Rearranging ${modcommand}-files.list" } From d47652db6335f22a6181ac0081d85b500d4184a9 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 21:53:44 +0100 Subject: [PATCH 0216/1895] Changes & echoing for diagnose purposes --- lgsm/functions/mods_core.sh | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index de4a7fde9..b5e441b5e 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -3,7 +3,7 @@ # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com -# Description: List and installs available mods along with mods_list.sh. +# Description: Core functions for mods list/install/update/remove local commandname="MODS" local commandaction="Core functions for mods" @@ -12,6 +12,7 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" ## Useful variables # Files and Directories modstmpdir="${tmpdir}/mods" +extractdir="${modstmpdir}/extracted" modsdatadir="${lgsmdir}/data/mods" modslockfile="installed-mods-listing" modslockfilefullpath="${modsdatadir}/${modslockfile}" @@ -65,7 +66,6 @@ fn_mod_dl(){ fn_mod_extract(){ # fn_dl_extract "${filedir}" "${filename}" "${extractdir}" filename="${modfilename}" - extractdir="${modstmpdir}/extracted" if [ ! -d "${extractdir}" ]; then mkdir -p "${extractdir}" fi @@ -89,15 +89,18 @@ fn_remove_cfg_files(){ if [ "${modkeepfiles}" != "OVERWRITE" ]&&[ "${modkeepfiles}" != "NOUPDATE" ]; then # Upon mods updates, config files should not be overwritten # We will just remove these files before copying the mod to the destination + # Let's count how many files there are to remove removefilesamount="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" # Test all subvalue of "modgames" using the ";" separator for ((removefilesindex=1; removefilesindex < ${removefilesamount}; removefilesindex++)); do - # Put current game name into modtest variable - removefiletest="$( echo "${modkeepfiles}" | awk -F ';' -v x=${removefilesindex} '{ print $x }' )" - # If it matches - if [ -f "${extractdir}/${removefiletest}" ]||[ -d "${extractdir}/${removefiletest}" ]; then + # Put current file we're looking for into a variable + filetoremove="$( echo "${modkeepfiles}" | awk -F ';' -v x=${removefilesindex} '{ print $x }' )" + echo "Testing ${filetoremove}" + # If it matches an existing file that have been extracted + if [ -f "${extractdir}/${filetoremove}" ]||[ -d "${extractdir}/${filetoremove}" ]; then + echo "Removing ${extractdir}/${filetoremove}" # Then delete the file! - rm -R "${extractdir}/${removefiletest}" + rm -R "${extractdir}/${filetoremove}" # Write this file path in a tmp file, to rebuild a full file list if [ ! -f "${modsdatadir}/.removedfiles.tmp" ]; then touch "${modsdatadir}/.removedfiles.tmp" From 8d6fe73cc4058d0716deb452dee7fc9cd91549c3 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 22:00:45 +0100 Subject: [PATCH 0217/1895] Attempt for fix fn_remove_cfg_files --- lgsm/functions/mods_core.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index b5e441b5e..294193237 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -95,17 +95,15 @@ fn_remove_cfg_files(){ for ((removefilesindex=1; removefilesindex < ${removefilesamount}; removefilesindex++)); do # Put current file we're looking for into a variable filetoremove="$( echo "${modkeepfiles}" | awk -F ';' -v x=${removefilesindex} '{ print $x }' )" - echo "Testing ${filetoremove}" # If it matches an existing file that have been extracted if [ -f "${extractdir}/${filetoremove}" ]||[ -d "${extractdir}/${filetoremove}" ]; then - echo "Removing ${extractdir}/${filetoremove}" # Then delete the file! rm -R "${extractdir}/${filetoremove}" # Write this file path in a tmp file, to rebuild a full file list if [ ! -f "${modsdatadir}/.removedfiles.tmp" ]; then touch "${modsdatadir}/.removedfiles.tmp" fi - echo "${removefiletest}" > "${modsdatadir}/.removedfiles.tmp" + echo "${filetoremove}" > "${modsdatadir}/.removedfiles.tmp" fi done fi From bcd64144e44c46e7e65f4dd85786bfa3521ace94 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 22:18:12 +0100 Subject: [PATCH 0218/1895] trying to improve output --- lgsm/functions/command_mods_update.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 390897d41..ea2355581 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -60,7 +60,8 @@ fn_mods_update_loop(){ echo " * 3) Re-install the mod with ./${selfname} mods-install" let installedmodsline=installedmodsline+1 else - fn_print_dots_nl "Updating ${modprettyname}" + echo "" + fn_print_dots "Updating ${modprettyname}" fn_script_log "Updating ${modprettyname}." # Check and create required directories fn_mods_dir From 97dcc1bca87ce8e2c1b8fa0eef4a6bbdbd981216 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 22:21:29 +0100 Subject: [PATCH 0219/1895] output --- lgsm/functions/command_mods_update.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index ea2355581..8a7869431 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -52,12 +52,11 @@ fn_mods_update_loop(){ fn_mod_get_info_from_command # Don't update the mod if it's policy is to "NOUPDATE" if [ "${modkeepfiles}" == "NOUPDATE" ]; then - fn_print_warning_nl "${modprettyname} update has been disabled by LGSM." - echo " * Usual reason is to prevent erasing custom files." + fn_print_info_nl "${modprettyname} won't be updated to prevent erasing custom files." echo " * If you still wish to update this mod:" - echo " * 1) Backup your critical mod files" - echo " * 2) Uninstall the mod with ./${selfname} mods-uninstall (optionnal)" - echo " * 3) Re-install the mod with ./${selfname} mods-install" + echo " 1) Backup your critical mod files" + echo " 2) Uninstall the mod with ./${selfname} mods-uninstall (optionnal)" + echo " 3) Re-install the mod with ./${selfname} mods-install" let installedmodsline=installedmodsline+1 else echo "" From 9ceca05b8ae3840cf226ca7477208fe1c519ffab Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 15 Jan 2017 23:02:50 +0100 Subject: [PATCH 0220/1895] way more output --- lgsm/functions/mods_core.sh | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 294193237..aa0a2c61c 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -76,7 +76,7 @@ fn_mod_extract(){ fn_mod_lowercase(){ # Converting files to lowercase if [ "${modlowercase}" == "LowercaseOn" ]; then - fn_print_dots "Converting ${modprettyname} files to lowercase" + fn_print_dots_nl "Converting ${modprettyname} files to lowercase" fn_script_log "Converting ${modprettyname} files to lowercase" find "${extractdir}" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \; fn_print_ok "Converting ${modprettyname} files to lowercase" @@ -90,6 +90,8 @@ fn_remove_cfg_files(){ # Upon mods updates, config files should not be overwritten # We will just remove these files before copying the mod to the destination # Let's count how many files there are to remove + fn_print_dots_nl "Allow for preserving ${modprettyname} config files" + sleep 0.5 removefilesamount="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" # Test all subvalue of "modgames" using the ";" separator for ((removefilesindex=1; removefilesindex < ${removefilesamount}; removefilesindex++)); do @@ -103,9 +105,10 @@ fn_remove_cfg_files(){ if [ ! -f "${modsdatadir}/.removedfiles.tmp" ]; then touch "${modsdatadir}/.removedfiles.tmp" fi - echo "${filetoremove}" > "${modsdatadir}/.removedfiles.tmp" + echo "${filetoremove}" >> "${modsdatadir}/.removedfiles.tmp" fi done + fn_print_ok "Allow for preserving ${modprettyname} config files" fi } @@ -115,6 +118,8 @@ fn_mod_fileslist(){ mkdir -p "${modsdatadir}" fn_script_log "Created ${modsdatadir}" fi + fn_print_dots_nl "Building ${modcommand}-files.list" + fn_script_log "Building ${modcommand}-files.list" # ${modsdatadir}/${modcommand}-files.list find "${extractdir}" -mindepth 1 -printf '%P\n' > ${modsdatadir}/${modcommand}-files.list fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.list}" @@ -122,10 +127,12 @@ fn_mod_fileslist(){ if [ -f "${modsdatadir}/.removedfiles.tmp" ]; then cat "${modsdatadir}/.removedfiles.tmp" >> ${modsdatadir}/${modcommand}-files.list fi + fn_print_ok "Building ${modcommand}-files.list" } fn_mod_copy_destination(){ # Destination directory: ${modinstalldir} + fn_print_dots_nl "Copying ${modprettyname} to ${modinstalldir}" fn_script_log "Copying ${modprettyname} to ${modinstalldir}" cp -Rf "${extractdir}/." "${modinstalldir}/" } @@ -134,12 +141,12 @@ fn_mod_copy_destination(){ fn_mod_already_installed(){ if [ -f "${modslockfilefullpath}" ]; then if [ -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then - echo "" fn_print_warning_nl "${modprettyname} has already been installed." - echo " * Config files might be overwritten." + echo " * Config files, if any, might be overwritten." echo " * Press ctrl + c to abort." sleep 4 fi + fn_script_log "${modprettyname} is already installed, overwriting any file." fi } @@ -157,7 +164,7 @@ fn_mod_add_list(){ fi # Input mod name to lockfile if [ ! -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then - echo "${modcommand}" >> "${modslockfilefullpath}" + echo "${modcommand}" > "${modslockfilefullpath}" fn_script_log "${modcommand} added to ${modslockfile}" fi } @@ -190,6 +197,7 @@ fn_postinstall_tasks(){ fn_check_files_list # Output to the user fn_print_dots "Rearranging ${modcommand}-files.list" + sleep 1 fn_script_log_info "Rearranging ${modcommand}-files.list" # What lines/files to remove from file list removefromlist="cfg;addons;" From 988d79e88a29748e852d27ddbf37e3358b404b76 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 15 Jan 2017 22:36:10 +0000 Subject: [PATCH 0221/1895] Prevents Legacy arkserver from failing issue was caused by a Typo in to word Survival --- lgsm/functions/core_functions.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 3a233174a..f4b6c47f7 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -6,7 +6,9 @@ # This function is called first before any other function. Without this file other functions will not load. # Fixes for legacy code -if [ "${gamename}" == "Teamspeak 3" ]; then +if [ "${gamename}" == "ARK: Survivial Evolved" ]; then + gamename="ARK: Survival Evolved" +elif [ "${gamename}" == "Teamspeak 3" ]; then gamename="TeamSpeak 3" elif [ "${gamename}" == "Counter Strike: Global Offensive" ]; then gamename="Counter-Strike: Global Offensive" From 9cd758ea33321082af57c40b936c2b01f53aca66 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 01:26:45 +0100 Subject: [PATCH 0222/1895] Don't overwrite, append & less space try --- lgsm/functions/mods_core.sh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index aa0a2c61c..09d4e2163 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -25,7 +25,7 @@ fn_mods_dir(){ fn_print_dots "Creating mods directory" sleep 1 mkdir -p "${modinstalldir}" - fn_print_ok_nl "Created mods directory" + fn_print_ok "Created mods directory" fi } @@ -76,7 +76,7 @@ fn_mod_extract(){ fn_mod_lowercase(){ # Converting files to lowercase if [ "${modlowercase}" == "LowercaseOn" ]; then - fn_print_dots_nl "Converting ${modprettyname} files to lowercase" + fn_print_dots "Converting ${modprettyname} files to lowercase" fn_script_log "Converting ${modprettyname} files to lowercase" find "${extractdir}" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \; fn_print_ok "Converting ${modprettyname} files to lowercase" @@ -90,7 +90,7 @@ fn_remove_cfg_files(){ # Upon mods updates, config files should not be overwritten # We will just remove these files before copying the mod to the destination # Let's count how many files there are to remove - fn_print_dots_nl "Allow for preserving ${modprettyname} config files" + fn_print_dots "Allow for preserving ${modprettyname} config files" sleep 0.5 removefilesamount="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" # Test all subvalue of "modgames" using the ";" separator @@ -118,7 +118,7 @@ fn_mod_fileslist(){ mkdir -p "${modsdatadir}" fn_script_log "Created ${modsdatadir}" fi - fn_print_dots_nl "Building ${modcommand}-files.list" + fn_print_dots "Building ${modcommand}-files.list" fn_script_log "Building ${modcommand}-files.list" # ${modsdatadir}/${modcommand}-files.list find "${extractdir}" -mindepth 1 -printf '%P\n' > ${modsdatadir}/${modcommand}-files.list @@ -132,9 +132,11 @@ fn_mod_fileslist(){ fn_mod_copy_destination(){ # Destination directory: ${modinstalldir} - fn_print_dots_nl "Copying ${modprettyname} to ${modinstalldir}" + fn_print_dots "Copying ${modprettyname} to ${modinstalldir}" fn_script_log "Copying ${modprettyname} to ${modinstalldir}" cp -Rf "${extractdir}/." "${modinstalldir}/" + sleep 0.5 + fn_print_ok "Copying ${modprettyname} to ${modinstalldir}" } # Check if the mod is already installed and warn the user @@ -164,7 +166,7 @@ fn_mod_add_list(){ fi # Input mod name to lockfile if [ ! -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then - echo "${modcommand}" > "${modslockfilefullpath}" + echo "${modcommand}" >> "${modslockfilefullpath}" fn_script_log "${modcommand} added to ${modslockfile}" fi } From 60effd5e0f689c4d0a257b65f74cdbca70bbc461 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 02:50:28 +0100 Subject: [PATCH 0223/1895] installed > updated --- lgsm/functions/command_mods_update.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 8a7869431..ae8222761 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -60,7 +60,7 @@ fn_mods_update_loop(){ let installedmodsline=installedmodsline+1 else echo "" - fn_print_dots "Updating ${modprettyname}" + fn_print_dots_nl "Updating ${modprettyname}" fn_script_log "Updating ${modprettyname}." # Check and create required directories fn_mods_dir @@ -85,8 +85,8 @@ fn_mods_update_loop(){ fn_postinstall_tasks # Cleaning fn_clear_tmp_mods - fn_print_ok_nl "${modprettyname} installed." - fn_script_log "${modprettyname} installed." + fn_print_ok_nl "${modprettyname} updated" + fn_script_log "${modprettyname} updated." let installedmodsline=installedmodsline+1 fi else From 424cc93c284192fdbc176f36a14f036d67b266e5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 02:55:56 +0100 Subject: [PATCH 0224/1895] better output --- lgsm/functions/command_mods_update.sh | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index ae8222761..6c468aa11 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -52,11 +52,8 @@ fn_mods_update_loop(){ fn_mod_get_info_from_command # Don't update the mod if it's policy is to "NOUPDATE" if [ "${modkeepfiles}" == "NOUPDATE" ]; then - fn_print_info_nl "${modprettyname} won't be updated to prevent erasing custom files." - echo " * If you still wish to update this mod:" - echo " 1) Backup your critical mod files" - echo " 2) Uninstall the mod with ./${selfname} mods-uninstall (optionnal)" - echo " 3) Re-install the mod with ./${selfname} mods-install" + fn_print_info_nl "${modprettyname} won't be updated to preserve custom files" + fn_script_log "${modprettyname} won't be updated to preserve custom files." let installedmodsline=installedmodsline+1 else echo "" @@ -85,7 +82,7 @@ fn_mods_update_loop(){ fn_postinstall_tasks # Cleaning fn_clear_tmp_mods - fn_print_ok_nl "${modprettyname} updated" + fn_print_ok "${modprettyname} updated" fn_script_log "${modprettyname} updated." let installedmodsline=installedmodsline+1 fi From b3b0a0cb55fa50b0b43818af8388f8feed08152c Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 03:28:00 +0100 Subject: [PATCH 0225/1895] Moved functions to core --- lgsm/functions/mods_list.sh | 197 ------------------------------------ 1 file changed, 197 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 24a81f262..d9288a11f 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -77,201 +77,4 @@ fn_mods_scrape_urls(){ sourcemodurl="${sourcemodfasterurl}/${sourcemodlatestfile}" } -# Sets some gsm requirements -fn_gsm_requirements(){ - # If tmpdir variable doesn't exist, LGSM is too old - if [ -z "${tmpdir}" ]||[ -z "${lgsmdir}" ]; then - fn_print_fail "Your LGSM version is too old." - echo " * Please do a full update, including ${selfname} script." - core_exit.sh - fi -} - -# Define all variables from a mod at once when index is set to a separator -fn_mod_info(){ -# If for some reason no index is set, none of this can work -if [ -z "$index" ]; then - fn_print_error "index variable not set. Please report an issue to LGSM Team." - echo "* https://github.com/GameServerManagers/LinuxGSM/issues" - core_exit.sh -fi - modcommand="${mods_global_array[index+1]}" - modprettyname="${mods_global_array[index+2]}" - modurl="${mods_global_array[index+3]}" - modfilename="${mods_global_array[index+4]}" - modsubdirs="${mods_global_array[index+5]}" - modlowercase="${mods_global_array[index+6]}" - modinstalldir="${mods_global_array[index+7]}" - modkeepfiles="${mods_global_array[index+8]}" - modengines="${mods_global_array[index+9]}" - modgames="${mods_global_array[index+10]}" - modexcludegames="${mods_global_array[index+11]}" - modsite="${mods_global_array[index+12]}" - moddescription="${mods_global_array[index+13]}" -} - - -# Find out if a game is compatible with a mod from a modgames (list of games supported by a mod) variable -fn_compatible_mod_games(){ - # Reset test value - modcompatiblegame="0" - # If value is set to GAMES (ignore) - if [ "${modgames}" != "GAMES" ]; then - # How many games we need to test - gamesamount="$(echo "${modgames}" | awk -F ';' '{ print NF }')" - # Test all subvalue of "modgames" using the ";" separator - for ((gamevarindex=1; gamevarindex < ${gamesamount}; gamevarindex++)); do - # Put current game name into modtest variable - gamemodtest="$( echo "${modgames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" - # If game name matches - if [ "${gamemodtest}" == "${gamename}" ]; then - # Mod is compatible ! - modcompatiblegame="1" - fi - done - fi -} - -# Find out if an engine is compatible with a mod from a modengines (list of engines supported by a mod) variable -fn_compatible_mod_engines(){ - # Reset test value - modcompatibleengine="0" - # If value is set to ENGINES (ignore) - if [ "${modengines}" != "ENGINES" ]; then - # How many engines we need to test - enginesamount="$(echo "${modengines}" | awk -F ';' '{ print NF }')" - # Test all subvalue of "modengines" using the ";" separator - for ((gamevarindex=1; gamevarindex < ${enginesamount}; gamevarindex++)); do - # Put current engine name into modtest variable - enginemodtest="$( echo "${modengines}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" - # If engine name matches - if [ "${enginemodtest}" == "${engine}" ]; then - # Mod is compatible ! - modcompatibleengine="1" - fi - done - fi -} - -# Find out if a game is not compatible with a mod from a modnotgames (list of games not supported by a mod) variable -fn_not_compatible_mod_games(){ - # Reset test value - modeincompatiblegame="0" - # If value is set to NOTGAMES (ignore) - if [ "${modexcludegames}" != "NOTGAMES" ]; then - # How many engines we need to test - excludegamesamount="$(echo "${modexcludegames}" | awk -F ';' '{ print NF }')" - # Test all subvalue of "modexcludegames" using the ";" separator - for ((gamevarindex=1; gamevarindex < ${excludegamesamount}; gamevarindex++)); do - # Put current engine name into modtest variable - excludegamemodtest="$( echo "${modexcludegames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" - # If engine name matches - if [ "${excludegamemodtest}" == "${gamename}" ]; then - # Mod is compatible ! - modeincompatiblegame="1" - fi - done - fi -} - -# Sums up if a mod is compatible or not with modcompatibility=0/1 -fn_mod_compatible_test(){ - # Test game and engine compatibility - fn_compatible_mod_games - fn_compatible_mod_engines - fn_not_compatible_mod_games - if [ "${modeincompatiblegame}" == "1" ]; then - modcompatibility="0" - elif [ "${modcompatibleengine}" == "1" ]||[ "${modcompatiblegame}" == "1" ]; then - modcompatibility="1" - else - modcompatibility="0" - fi -} - -# Checks if a mod is compatibile for installation -# Provides available mods for installation -# Provides commands for mods installation -fn_mods_available(){ - # First, reset variables - compatiblemodslist=() - availablemodscommands=() - modprettynamemaxlength="0" - modsitemaxlength="0" - moddescriptionmaxlength="0" - modcommandmaxlength="0" - # Find compatible games - # Find separators through the global array - for ((index="0"; index <= ${#mods_global_array[@]}; index++)); do - # If current value is a separator; then - if [ "${mods_global_array[index]}" == "${modseparator}" ]; then - # Set mod variables - fn_mod_info - # Test if game is compatible - fn_mod_compatible_test - # If game is compatible - if [ "${modcompatibility}" == "1" ]; then - # Put it into the list to display to the user - compatiblemodslist+=( "${modprettyname}" "${modcommand}" "${modsite}" "${moddescription}" ) - # Keep available commands in an array - availablemodscommands+=( "${modcommand}" ) - fi - fi - done -} - -# Output available mods in a nice way to the user -fn_mods_show_available(){ - # Set and reset vars - compatiblemodslistindex=0 - spaces=" " - # As long as we're within index values - while [ "${compatiblemodslistindex}" -lt "${#compatiblemodslist[@]}" ]; do - # Set values for convenience - displayedmodname="${compatiblemodslist[compatiblemodslistindex]}" - displayedmodcommand="${compatiblemodslist[compatiblemodslistindex+1]}" - displayedmodsite="${compatiblemodslist[compatiblemodslistindex+2]}" - displayedmoddescription="${compatiblemodslist[compatiblemodslistindex+3]}" - # Output mods to the user - echo -e "\e[1m${displayedmodname}\e[0m - ${displayedmoddescription} - ${displayedmodsite}" - echo -e " * \e[36m${displayedmodcommand}\e[0m" - # Increment index from the amount of values we just displayed - let "compatiblemodslistindex+=4" - done - # If no mods are found - if [ -z "${compatiblemodslist}" ]; then - fn_print_fail "No mods are currently available for ${gamename}." - core_exit.sh - fi -} - -# Get details of a mod any (relevant and unique, such as full mod name or install command) value -fn_mod_get_info_from_command(){ - # Variable to know when job is done - modinfocommand="0" - # Find entry in global array - for ((index=0; index <= ${#mods_global_array[@]}; index++)); do - # When entry is found - if [ "${mods_global_array[index]}" == "${currentmod}" ]; then - # Go back to the previous "MOD" separator - for ((index=index; index <= ${#mods_global_array[@]}; index--)); do - # When "MOD" is found - if [ "${mods_global_array[index]}" == "MOD" ]; then - # Get info - fn_mod_info - modinfocommand="1" - break - fi - done - fi - # Exit the loop if job is done - if [ "${modinfocommand}" == "1" ]; then - break - fi - done -} - -fn_gsm_requirements fn_mods_scrape_urls -fn_mods_info -fn_mods_available From 609b346b9a7c0078ee20cd5a3956a1b09246cfc3 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 03:28:10 +0100 Subject: [PATCH 0226/1895] moved mods_list.sh functions to core --- lgsm/functions/mods_core.sh | 200 ++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 09d4e2163..54c394cf5 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -17,6 +17,16 @@ modsdatadir="${lgsmdir}/data/mods" modslockfile="installed-mods-listing" modslockfilefullpath="${modsdatadir}/${modslockfile}" +# Sets some gsm requirements +fn_gsm_requirements(){ + # If tmpdir variable doesn't exist, LGSM is too old + if [ -z "${tmpdir}" ]||[ -z "${lgsmdir}" ]; then + fn_print_fail "Your LGSM version is too old." + echo " * Please do a full update, including ${selfname} script." + core_exit.sh + fi +} + # Create mods directory if it doesn't exist # Assuming the game is already installed as mods_list.sh checked for it. fn_mods_dir(){ @@ -216,3 +226,193 @@ fn_postinstall_tasks(){ done fn_print_ok "Rearranging ${modcommand}-files.list" } + +## mods_list.sh arrays + +# Define all variables from a mod at once when index is set to a separator +fn_mod_info(){ +# If for some reason no index is set, none of this can work +if [ -z "$index" ]; then + fn_print_error "index variable not set. Please report an issue to LGSM Team." + echo "* https://github.com/GameServerManagers/LinuxGSM/issues" + core_exit.sh +fi + modcommand="${mods_global_array[index+1]}" + modprettyname="${mods_global_array[index+2]}" + modurl="${mods_global_array[index+3]}" + modfilename="${mods_global_array[index+4]}" + modsubdirs="${mods_global_array[index+5]}" + modlowercase="${mods_global_array[index+6]}" + modinstalldir="${mods_global_array[index+7]}" + modkeepfiles="${mods_global_array[index+8]}" + modengines="${mods_global_array[index+9]}" + modgames="${mods_global_array[index+10]}" + modexcludegames="${mods_global_array[index+11]}" + modsite="${mods_global_array[index+12]}" + moddescription="${mods_global_array[index+13]}" +} + + +# Find out if a game is compatible with a mod from a modgames (list of games supported by a mod) variable +fn_compatible_mod_games(){ + # Reset test value + modcompatiblegame="0" + # If value is set to GAMES (ignore) + if [ "${modgames}" != "GAMES" ]; then + # How many games we need to test + gamesamount="$(echo "${modgames}" | awk -F ';' '{ print NF }')" + # Test all subvalue of "modgames" using the ";" separator + for ((gamevarindex=1; gamevarindex < ${gamesamount}; gamevarindex++)); do + # Put current game name into modtest variable + gamemodtest="$( echo "${modgames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" + # If game name matches + if [ "${gamemodtest}" == "${gamename}" ]; then + # Mod is compatible ! + modcompatiblegame="1" + fi + done + fi +} + +# Find out if an engine is compatible with a mod from a modengines (list of engines supported by a mod) variable +fn_compatible_mod_engines(){ + # Reset test value + modcompatibleengine="0" + # If value is set to ENGINES (ignore) + if [ "${modengines}" != "ENGINES" ]; then + # How many engines we need to test + enginesamount="$(echo "${modengines}" | awk -F ';' '{ print NF }')" + # Test all subvalue of "modengines" using the ";" separator + for ((gamevarindex=1; gamevarindex < ${enginesamount}; gamevarindex++)); do + # Put current engine name into modtest variable + enginemodtest="$( echo "${modengines}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" + # If engine name matches + if [ "${enginemodtest}" == "${engine}" ]; then + # Mod is compatible ! + modcompatibleengine="1" + fi + done + fi +} + +# Find out if a game is not compatible with a mod from a modnotgames (list of games not supported by a mod) variable +fn_not_compatible_mod_games(){ + # Reset test value + modeincompatiblegame="0" + # If value is set to NOTGAMES (ignore) + if [ "${modexcludegames}" != "NOTGAMES" ]; then + # How many engines we need to test + excludegamesamount="$(echo "${modexcludegames}" | awk -F ';' '{ print NF }')" + # Test all subvalue of "modexcludegames" using the ";" separator + for ((gamevarindex=1; gamevarindex < ${excludegamesamount}; gamevarindex++)); do + # Put current engine name into modtest variable + excludegamemodtest="$( echo "${modexcludegames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" + # If engine name matches + if [ "${excludegamemodtest}" == "${gamename}" ]; then + # Mod is compatible ! + modeincompatiblegame="1" + fi + done + fi +} + +# Sums up if a mod is compatible or not with modcompatibility=0/1 +fn_mod_compatible_test(){ + # Test game and engine compatibility + fn_compatible_mod_games + fn_compatible_mod_engines + fn_not_compatible_mod_games + if [ "${modeincompatiblegame}" == "1" ]; then + modcompatibility="0" + elif [ "${modcompatibleengine}" == "1" ]||[ "${modcompatiblegame}" == "1" ]; then + modcompatibility="1" + else + modcompatibility="0" + fi +} + +# Checks if a mod is compatibile for installation +# Provides available mods for installation +# Provides commands for mods installation +fn_mods_available(){ + # First, reset variables + compatiblemodslist=() + availablemodscommands=() + modprettynamemaxlength="0" + modsitemaxlength="0" + moddescriptionmaxlength="0" + modcommandmaxlength="0" + # Find compatible games + # Find separators through the global array + for ((index="0"; index <= ${#mods_global_array[@]}; index++)); do + # If current value is a separator; then + if [ "${mods_global_array[index]}" == "${modseparator}" ]; then + # Set mod variables + fn_mod_info + # Test if game is compatible + fn_mod_compatible_test + # If game is compatible + if [ "${modcompatibility}" == "1" ]; then + # Put it into an array to prepare user output + compatiblemodslist+=( "${modprettyname}" "${modcommand}" "${modsite}" "${moddescription}" ) + # Keep available commands in an array to make life easier + availablemodscommands+=( "${modcommand}" ) + fi + fi + done +} + +# Output available mods in a nice way to the user +fn_mods_show_available(){ + # Set and reset vars + compatiblemodslistindex=0 + spaces=" " + # As long as we're within index values + while [ "${compatiblemodslistindex}" -lt "${#compatiblemodslist[@]}" ]; do + # Set values for convenience + displayedmodname="${compatiblemodslist[compatiblemodslistindex]}" + displayedmodcommand="${compatiblemodslist[compatiblemodslistindex+1]}" + displayedmodsite="${compatiblemodslist[compatiblemodslistindex+2]}" + displayedmoddescription="${compatiblemodslist[compatiblemodslistindex+3]}" + # Output mods to the user + echo -e "\e[1m${displayedmodname}\e[0m - ${displayedmoddescription} - ${displayedmodsite}" + echo -e " * \e[36m${displayedmodcommand}\e[0m" + # Increment index from the amount of values we just displayed + let "compatiblemodslistindex+=4" + done + # If no mods are found + if [ -z "${compatiblemodslist}" ]; then + fn_print_fail "No mods are currently available for ${gamename}." + core_exit.sh + fi +} + +# Get details of a mod any (relevant and unique, such as full mod name or install command) value +fn_mod_get_info_from_command(){ + # Variable to know when job is done + modinfocommand="0" + # Find entry in global array + for ((index=0; index <= ${#mods_global_array[@]}; index++)); do + # When entry is found + if [ "${mods_global_array[index]}" == "${currentmod}" ]; then + # Go back to the previous "MOD" separator + for ((index=index; index <= ${#mods_global_array[@]}; index--)); do + # When "MOD" is found + if [ "${mods_global_array[index]}" == "MOD" ]; then + # Get info + fn_mod_info + modinfocommand="1" + break + fi + done + fi + # Exit the loop if job is done + if [ "${modinfocommand}" == "1" ]; then + break + fi + done +} + +fn_gsm_requirements +fn_mods_info +fn_mods_available From 7cadebbe5b62e7eb357f3e196e2a54c16f28befd Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 03:53:12 +0100 Subject: [PATCH 0227/1895] move to core --- lgsm/functions/mods_list.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index d9288a11f..e99ff2214 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -76,5 +76,3 @@ fn_mods_scrape_urls(){ sourcemodfasterurl="http://cdn.probablyaserver.com/sourcemod/" sourcemodurl="${sourcemodfasterurl}/${sourcemodlatestfile}" } - -fn_mods_scrape_urls From 3bfde779a1a863884362e23ce36e17b3691763f6 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 03:54:24 +0100 Subject: [PATCH 0228/1895] moves & fixes running functions --- lgsm/functions/mods_core.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 54c394cf5..dcb50a400 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -16,6 +16,8 @@ extractdir="${modstmpdir}/extracted" modsdatadir="${lgsmdir}/data/mods" modslockfile="installed-mods-listing" modslockfilefullpath="${modsdatadir}/${modslockfile}" +# Database initialization +mods_list.sh # Sets some gsm requirements fn_gsm_requirements(){ @@ -415,4 +417,5 @@ fn_mod_get_info_from_command(){ fn_gsm_requirements fn_mods_info +fn_mods_scrape_urls fn_mods_available From 7c29d0c38334db02992dd4322c74e78f8a6a913e Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 04:00:33 +0100 Subject: [PATCH 0229/1895] scrape_urls goes first, right --- lgsm/functions/mods_core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index dcb50a400..efdcec31f 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -416,6 +416,6 @@ fn_mod_get_info_from_command(){ } fn_gsm_requirements -fn_mods_info fn_mods_scrape_urls +fn_mods_info fn_mods_available From cdd78a9c0753d5848ffdc4e8f5131963dade7494 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 04:12:25 +0100 Subject: [PATCH 0230/1895] Mods update conclusion --- lgsm/functions/command_mods_update.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 6c468aa11..19eb449cf 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -92,6 +92,9 @@ fn_mods_update_loop(){ core_exit.sh fi done + echo "" + fn_print_ok_nl "Mods update complete" + fn_script_log "Mods update complete." } fn_mods_update_init From a3501e6544708a206e0fcb45fd798bf09f05e79d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 05:05:41 +0100 Subject: [PATCH 0231/1895] Remove metamod dir from sourcemod file list --- lgsm/functions/mods_core.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index efdcec31f..d55b84631 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -226,6 +226,13 @@ fn_postinstall_tasks(){ # Then delete matching line(s)! sed -i "/^${removefilevar}$/d" "${modsdatadir}/${modcommand}-files.list" done + # Sourcemod fix + # Remove metamod from sourcemod fileslist + if [ "${modcommand}" == "sourcemod" ]; then + # Remove addons/metamod & addons/metamod/sourcemod.vdf from ${modcommand}-files.list + sed -i "/^addons/metamod$/d" "${modsdatadir}/${modcommand}-files.list" + sed -i "/^addons/metamod/sourcemod.vdf$/d" "${modsdatadir}/${modcommand}-files.list" + fi fn_print_ok "Rearranging ${modcommand}-files.list" } From bee22481997cf49e579364bde5be7d8aa31576c9 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 05:26:10 +0100 Subject: [PATCH 0232/1895] Escape slashes in sed --- lgsm/functions/mods_core.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index d55b84631..78de67a96 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -230,8 +230,8 @@ fn_postinstall_tasks(){ # Remove metamod from sourcemod fileslist if [ "${modcommand}" == "sourcemod" ]; then # Remove addons/metamod & addons/metamod/sourcemod.vdf from ${modcommand}-files.list - sed -i "/^addons/metamod$/d" "${modsdatadir}/${modcommand}-files.list" - sed -i "/^addons/metamod/sourcemod.vdf$/d" "${modsdatadir}/${modcommand}-files.list" + sed -i "/^addons\/metamod$/d" "${modsdatadir}/${modcommand}-files.list" + sed -i "/^addons\/metamod\/sourcemod.vdf$/d" "${modsdatadir}/${modcommand}-files.list" fi fn_print_ok "Rearranging ${modcommand}-files.list" } From 57b5374078d5fec3b400000097d2ab84e758c735 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 19:23:45 +0100 Subject: [PATCH 0233/1895] fn_mods_remove_init --- lgsm/functions/command_mods_remove.sh | 54 +++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index c2bb35f48..6e7abc531 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -8,3 +8,57 @@ local commandname="MODS" local commandaction="Mod Remove" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +check.sh +mods_core.sh +mods_list.sh + +fn_mods_remove_init(){ + fn_script_log "Entering mods & addons removal" + echo "=================================" + echo "${gamename} mods & addons update" + echo "" + # Installed mod dir is "${modslockfilefullpath}" + # How many mods are installed + installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" + # If no mods to be updated + if [ ! -f "${modslockfilefullpath}" ]||[ $installedmodscount -eq 0 ]; then + fn_print_information_nl "No mods or addons to remove" + echo " * Did you install any mod using LGSM?" + fn_scrip_log_info "No mods or addons to remove." + core_exit.sh + fi + # Build installed mods list and display to the user. + installedmodsline=1 + availablemodsremove=() + while [ $installedmodsline -le $installedmodscount ]; do + availablemodsremove+=( "$(sed "${installedmodsline}q;d" "${modslockfilefullpath})" ) + echo -e " * \e[36m$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")\e[0m" + let installedmodsline=installedmodsline+1 + done + sleep 2 + + # Keep prompting as long as the user input doesn't correspond to an available mod + while [[ ! " ${availablemodsremove[@]} " =~ " ${usermodselect} " ]]; do + echo -en "Enter a \e[36mmod\e[0m to ${red}remove${default} (or exit to abort): " + read -r usermodselect + # Exit if user says exit or abort + if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then + fn_script_log "User aborted." + echo "Aborted." + core_exit.sh + # Supplementary output upon invalid user input + elif [[ ! " ${availablemodsremove[@]} " =~ " ${usermodselect} " ]]; then + fn_print_error2_nl "${usermodselect} is not a valid mod." + echo " * Enter a valid mod or input exit to abort." + fi + done + # Gives a pretty name to the user and get all mod info + currentmod="${usermodselect}" + fn_mod_get_info_from_command + fn_print_dots_nl "Removing ${modprettyname}" + sleep 1 + fn_script_log "Removing ${modprettyname}." +} + +fn_mods_remove_init From 90a795adaa31fc9782520eeeba3182ba10cb0d54 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 19:28:43 +0100 Subject: [PATCH 0234/1895] one fix --- lgsm/functions/command_mods_remove.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 6e7abc531..f72e3b385 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -30,9 +30,9 @@ fn_mods_remove_init(){ fi # Build installed mods list and display to the user. installedmodsline=1 - availablemodsremove=() + availablemodsremove=() while [ $installedmodsline -le $installedmodscount ]; do - availablemodsremove+=( "$(sed "${installedmodsline}q;d" "${modslockfilefullpath})" ) + availablemodsremove+=( "$(sed "${installedmodsline}q;d" "${modslockfilefullpath}" )" ) echo -e " * \e[36m$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")\e[0m" let installedmodsline=installedmodsline+1 done @@ -40,7 +40,7 @@ fn_mods_remove_init(){ # Keep prompting as long as the user input doesn't correspond to an available mod while [[ ! " ${availablemodsremove[@]} " =~ " ${usermodselect} " ]]; do - echo -en "Enter a \e[36mmod\e[0m to ${red}remove${default} (or exit to abort): " + echo -en "Enter a \e[36mmod\e[0m to \e[31mremove\e[0m (or exit to abort): " read -r usermodselect # Exit if user says exit or abort if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then From b8fc80443ecd4374b8368426cef45eac4bc7c9c5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 19:49:18 +0100 Subject: [PATCH 0235/1895] tabs and line jump --- lgsm/functions/command_mods_remove.sh | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index f72e3b385..e86fefedf 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -36,22 +36,23 @@ fn_mods_remove_init(){ echo -e " * \e[36m$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")\e[0m" let installedmodsline=installedmodsline+1 done - sleep 2 + echo "" + sleep 1 - # Keep prompting as long as the user input doesn't correspond to an available mod + # Keep prompting as long as the user input doesn't correspond to an available mod while [[ ! " ${availablemodsremove[@]} " =~ " ${usermodselect} " ]]; do - echo -en "Enter a \e[36mmod\e[0m to \e[31mremove\e[0m (or exit to abort): " - read -r usermodselect - # Exit if user says exit or abort - if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then - fn_script_log "User aborted." - echo "Aborted." - core_exit.sh + echo -en "Enter a \e[36mmod\e[0m to \e[31mremove\e[0m (or exit to abort): " + read -r usermodselect + # Exit if user says exit or abort + if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then + fn_script_log "User aborted." + echo "Aborted." + core_exit.sh # Supplementary output upon invalid user input - elif [[ ! " ${availablemodsremove[@]} " =~ " ${usermodselect} " ]]; then + elif [[ ! " ${availablemodsremove[@]} " =~ " ${usermodselect} " ]]; then fn_print_error2_nl "${usermodselect} is not a valid mod." echo " * Enter a valid mod or input exit to abort." - fi + fi done # Gives a pretty name to the user and get all mod info currentmod="${usermodselect}" From efa647966cc19a6dc40fbdf8176a6944c1d4e3da Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 21:13:54 +0100 Subject: [PATCH 0236/1895] Trying mod remove process --- lgsm/functions/command_mods_remove.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index e86fefedf..f761210f5 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -62,4 +62,26 @@ fn_mods_remove_init(){ fn_script_log "Removing ${modprettyname}." } +fn_mod_remove_process(){ + # Check file list in order to make sure we're able to remove the mod + # Returns ${modsfilelistsize} + fn_check_files_list + modfileline="1" + while [ $modfileline -le $modsfilelistsize ]; do + # Current line defines current mod command + currentfileremove="$(sed "${modfileline}q;d" "${modsdatadir}/${modcommand}-files.list")" + if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -f "${modinstalldir}/${currentfileremove}" ]; then + rm -rfv "${currentfileremove}" + fi + let installedmodsline=installedmodsline+1 + done + # Remove file list + rm -rfv "${modsdatadir}/${modcommand}-files.list" + # Remove from installed mods list + sed -i "/^${modcommand}$/d" "${modslockfilefullpath}" + fn_print_ok_nl "Removed ${modprettyname}" + fn_script_log "Removed ${modprettyname}" +} + fn_mods_remove_init +fn_mod_remove_process From 0b3da9d2d3f2a81cf331a3ce6eb9cf18f0453ed5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 21:17:20 +0100 Subject: [PATCH 0237/1895] woops --- lgsm/functions/command_mods_remove.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index f761210f5..eeb00f2ed 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -73,7 +73,7 @@ fn_mod_remove_process(){ if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -f "${modinstalldir}/${currentfileremove}" ]; then rm -rfv "${currentfileremove}" fi - let installedmodsline=installedmodsline+1 + let modfileline=modfileline+1 done # Remove file list rm -rfv "${modsdatadir}/${modcommand}-files.list" From ac58e6eddb9f889a7a8fc02665fdb05c43717fc8 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 21:26:14 +0100 Subject: [PATCH 0238/1895] =?UTF-8?q?woops=C2=B2=20should=20remove=20mods?= =?UTF-8?q?=20now?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgsm/functions/command_mods_remove.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index eeb00f2ed..43a8ddae5 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -70,8 +70,8 @@ fn_mod_remove_process(){ while [ $modfileline -le $modsfilelistsize ]; do # Current line defines current mod command currentfileremove="$(sed "${modfileline}q;d" "${modsdatadir}/${modcommand}-files.list")" - if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -f "${modinstalldir}/${currentfileremove}" ]; then - rm -rfv "${currentfileremove}" + if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then + rm -rfv "${modinstalldir}/${currentfileremove}" fi let modfileline=modfileline+1 done From 86186dc90ba195a9cb5d1d6c3b6a28a646ca614e Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 21:38:12 +0100 Subject: [PATCH 0239/1895] Various improvements --- lgsm/functions/command_mods_remove.sh | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 43a8ddae5..dcaa572c3 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -57,27 +57,30 @@ fn_mods_remove_init(){ # Gives a pretty name to the user and get all mod info currentmod="${usermodselect}" fn_mod_get_info_from_command - fn_print_dots_nl "Removing ${modprettyname}" - sleep 1 - fn_script_log "Removing ${modprettyname}." + # Returns ${modsfilelistsize} + fn_check_files_list + fn_script_log "Removing ${modsfilelistsize} files from ${modprettyname}" + fn_print_dots_nl "Removing ${modsfilelistsize} files from ${modprettyname}" + sleep 4 } fn_mod_remove_process(){ # Check file list in order to make sure we're able to remove the mod - # Returns ${modsfilelistsize} - fn_check_files_list modfileline="1" while [ $modfileline -le $modsfilelistsize ]; do # Current line defines current mod command currentfileremove="$(sed "${modfileline}q;d" "${modsdatadir}/${modcommand}-files.list")" if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then - rm -rfv "${modinstalldir}/${currentfileremove}" + fn_script_log "Removing: ${modinstalldir}/${currentfileremove}" + rm -rf "${modinstalldir}/${currentfileremove}" fi let modfileline=modfileline+1 done # Remove file list - rm -rfv "${modsdatadir}/${modcommand}-files.list" + fn_script_log "Removing: ${modsdatadir}/${modcommand}-files.list" + rm -rf "${modsdatadir}/${modcommand}-files.list" # Remove from installed mods list + fn_script_log "Removing: ${modcommand} from "${modslockfilefullpath}" sed -i "/^${modcommand}$/d" "${modslockfilefullpath}" fn_print_ok_nl "Removed ${modprettyname}" fn_script_log "Removed ${modprettyname}" From 5c4baae75c08e082dcbf4cb36cd705a56d1a35d0 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 21:40:28 +0100 Subject: [PATCH 0240/1895] removed wrongly c/pasted double quote --- lgsm/functions/command_mods_remove.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index dcaa572c3..74cbbac0d 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -80,7 +80,7 @@ fn_mod_remove_process(){ fn_script_log "Removing: ${modsdatadir}/${modcommand}-files.list" rm -rf "${modsdatadir}/${modcommand}-files.list" # Remove from installed mods list - fn_script_log "Removing: ${modcommand} from "${modslockfilefullpath}" + fn_script_log "Removing: ${modcommand} from ${modslockfilefullpath}" sed -i "/^${modcommand}$/d" "${modslockfilefullpath}" fn_print_ok_nl "Removed ${modprettyname}" fn_script_log "Removed ${modprettyname}" From ce9702227d3295c99e7ec1360fb2c93596c3c14d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 21:42:48 +0100 Subject: [PATCH 0241/1895] message --- lgsm/functions/command_mods_remove.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 74cbbac0d..4684a0d96 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -61,6 +61,8 @@ fn_mods_remove_init(){ fn_check_files_list fn_script_log "Removing ${modsfilelistsize} files from ${modprettyname}" fn_print_dots_nl "Removing ${modsfilelistsize} files from ${modprettyname}" + echo " * Any mod's custom file will be deleted." + echo " * Press ctrl + c to abort." sleep 4 } From 86bb4381c9c445a2698ef674b4e72537e4716ede Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 21:44:31 +0100 Subject: [PATCH 0242/1895] fn_scrip_log_info don't exist --- lgsm/functions/command_mods_update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 19eb449cf..7e2bc6612 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -25,7 +25,7 @@ fn_mods_update_init(){ if [ ! -f "${modslockfilefullpath}" ]||[ $installedmodscount -eq 0 ]; then fn_print_information_nl "No mods or addons to be updated" echo " * Did you install any mod using LGSM?" - fn_scrip_log_info "No mods or addons to be updated" + fn_scrip_log "No mods or addons to be updated" core_exit.sh else fn_print_information_nl "${installedmodscount} mods or addons will be updated:" From 83b6d2d07f1d09339b3721bbd4554e68fe38ffbf Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 21:45:12 +0100 Subject: [PATCH 0243/1895] fn_scrip_log_info don't exist > fn_script_log_info --- lgsm/functions/command_mods_remove.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 4684a0d96..3f2021c70 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -25,7 +25,7 @@ fn_mods_remove_init(){ if [ ! -f "${modslockfilefullpath}" ]||[ $installedmodscount -eq 0 ]; then fn_print_information_nl "No mods or addons to remove" echo " * Did you install any mod using LGSM?" - fn_scrip_log_info "No mods or addons to remove." + fn_script_log_info "No mods or addons to remove." core_exit.sh fi # Build installed mods list and display to the user. From fc112a27aaf8568353100b32aec55f611a08371b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 21:45:36 +0100 Subject: [PATCH 0244/1895] scrip > script --- lgsm/functions/command_mods_update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 7e2bc6612..62528446f 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -25,7 +25,7 @@ fn_mods_update_init(){ if [ ! -f "${modslockfilefullpath}" ]||[ $installedmodscount -eq 0 ]; then fn_print_information_nl "No mods or addons to be updated" echo " * Did you install any mod using LGSM?" - fn_scrip_log "No mods or addons to be updated" + fn_script_log_info "No mods or addons to be updated" core_exit.sh else fn_print_information_nl "${installedmodscount} mods or addons will be updated:" From 63373a6ce07a5a59c4ecef73c2fa799e44f0d528 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 21:49:00 +0100 Subject: [PATCH 0245/1895] no end line dot --- lgsm/functions/command_mods_update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 62528446f..c737d2a4a 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -87,7 +87,7 @@ fn_mods_update_loop(){ let installedmodsline=installedmodsline+1 fi else - fn_print_fail "No mod was selected." + fn_print_fail "No mod was selected" fn_script_log_fail "No mod was selected." core_exit.sh fi From a9a72af1aa58a4f7aab33aba82559c24f203ece4 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 21:49:16 +0100 Subject: [PATCH 0246/1895] no end line dot --- lgsm/functions/command_mods_install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 6a3e05b20..dc3c497cc 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -73,10 +73,10 @@ fn_mod_installation(){ fn_postinstall_tasks # Cleaning fn_clear_tmp_mods - fn_print_ok_nl "${modprettyname} installed." + fn_print_ok_nl "${modprettyname} installed" fn_script_log "${modprettyname} installed." else - fn_print_fail "No mod was selected." + fn_print_fail "No mod was selected" core_exit.sh fi } From 26bf25619b832ff3d9f57753b041b9ebaf717934 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 21:57:18 +0100 Subject: [PATCH 0247/1895] no nl for dots --- lgsm/functions/command_mods_remove.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 3f2021c70..889c6dfb6 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -60,7 +60,7 @@ fn_mods_remove_init(){ # Returns ${modsfilelistsize} fn_check_files_list fn_script_log "Removing ${modsfilelistsize} files from ${modprettyname}" - fn_print_dots_nl "Removing ${modsfilelistsize} files from ${modprettyname}" + fn_print_dots "Removing ${modsfilelistsize} files from ${modprettyname}" echo " * Any mod's custom file will be deleted." echo " * Press ctrl + c to abort." sleep 4 From 5295bd94fed851c7cb3f8e2366887c103a114f4d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 21:59:10 +0100 Subject: [PATCH 0248/1895] removal --- lgsm/functions/command_mods_remove.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 889c6dfb6..642e472d3 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -16,7 +16,7 @@ mods_list.sh fn_mods_remove_init(){ fn_script_log "Entering mods & addons removal" echo "=================================" - echo "${gamename} mods & addons update" + echo "${gamename} mods & addons removal" echo "" # Installed mod dir is "${modslockfilefullpath}" # How many mods are installed From f042aee9f55919ed1b241f81c76dc39604f27248 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 22:00:49 +0100 Subject: [PATCH 0249/1895] no need for sleep --- lgsm/functions/command_mods_remove.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 642e472d3..4d67f6d81 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -37,8 +37,6 @@ fn_mods_remove_init(){ let installedmodsline=installedmodsline+1 done echo "" - sleep 1 - # Keep prompting as long as the user input doesn't correspond to an available mod while [[ ! " ${availablemodsremove[@]} " =~ " ${usermodselect} " ]]; do echo -en "Enter a \e[36mmod\e[0m to \e[31mremove\e[0m (or exit to abort): " From 142b02d17ec5f8f6caf216b8f9cbe361a2abbdae Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 22:04:53 +0100 Subject: [PATCH 0250/1895] dots & sleep --- lgsm/functions/mods_core.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 78de67a96..bc02b1442 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -149,13 +149,14 @@ fn_mod_copy_destination(){ cp -Rf "${extractdir}/." "${modinstalldir}/" sleep 0.5 fn_print_ok "Copying ${modprettyname} to ${modinstalldir}" + sleep 0.5 } # Check if the mod is already installed and warn the user fn_mod_already_installed(){ if [ -f "${modslockfilefullpath}" ]; then if [ -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then - fn_print_warning_nl "${modprettyname} has already been installed." + fn_print_warning_nl "${modprettyname} has already been installed" echo " * Config files, if any, might be overwritten." echo " * Press ctrl + c to abort." sleep 4 From bae4085e194b170fd796f84d69a12c89c156b8ea Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 22:12:12 +0100 Subject: [PATCH 0251/1895] sleep times --- lgsm/functions/mods_core.sh | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index bc02b1442..c0765d25a 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -35,9 +35,10 @@ fn_mods_dir(){ if [ ! -d "${modinstalldir}" ]; then fn_script_log_info "Creating mods directory: ${modinstalldir}" fn_print_dots "Creating mods directory" - sleep 1 + sleep 0.5 mkdir -p "${modinstalldir}" fn_print_ok "Created mods directory" + sleep 0.5 fi } @@ -89,10 +90,11 @@ fn_mod_lowercase(){ # Converting files to lowercase if [ "${modlowercase}" == "LowercaseOn" ]; then fn_print_dots "Converting ${modprettyname} files to lowercase" + sleep 0.5 fn_script_log "Converting ${modprettyname} files to lowercase" find "${extractdir}" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \; fn_print_ok "Converting ${modprettyname} files to lowercase" - sleep 1 + sleep 0.5 fi } @@ -121,6 +123,7 @@ fn_remove_cfg_files(){ fi done fn_print_ok "Allow for preserving ${modprettyname} config files" + sleep 0.5 fi } @@ -132,6 +135,7 @@ fn_mod_fileslist(){ fi fn_print_dots "Building ${modcommand}-files.list" fn_script_log "Building ${modcommand}-files.list" + sleep 0.5 # ${modsdatadir}/${modcommand}-files.list find "${extractdir}" -mindepth 1 -printf '%P\n' > ${modsdatadir}/${modcommand}-files.list fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.list}" @@ -140,14 +144,15 @@ fn_mod_fileslist(){ cat "${modsdatadir}/.removedfiles.tmp" >> ${modsdatadir}/${modcommand}-files.list fi fn_print_ok "Building ${modcommand}-files.list" + sleep 0.5 } fn_mod_copy_destination(){ # Destination directory: ${modinstalldir} fn_print_dots "Copying ${modprettyname} to ${modinstalldir}" fn_script_log "Copying ${modprettyname} to ${modinstalldir}" - cp -Rf "${extractdir}/." "${modinstalldir}/" sleep 0.5 + cp -Rf "${extractdir}/." "${modinstalldir}/" fn_print_ok "Copying ${modprettyname} to ${modinstalldir}" sleep 0.5 } @@ -157,9 +162,10 @@ fn_mod_already_installed(){ if [ -f "${modslockfilefullpath}" ]; then if [ -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then fn_print_warning_nl "${modprettyname} has already been installed" + sleep 1 echo " * Config files, if any, might be overwritten." echo " * Press ctrl + c to abort." - sleep 4 + sleep 3 fi fn_script_log "${modprettyname} is already installed, overwriting any file." fi @@ -212,7 +218,7 @@ fn_postinstall_tasks(){ fn_check_files_list # Output to the user fn_print_dots "Rearranging ${modcommand}-files.list" - sleep 1 + sleep 0.5 fn_script_log_info "Rearranging ${modcommand}-files.list" # What lines/files to remove from file list removefromlist="cfg;addons;" @@ -235,6 +241,7 @@ fn_postinstall_tasks(){ sed -i "/^addons\/metamod\/sourcemod.vdf$/d" "${modsdatadir}/${modcommand}-files.list" fi fn_print_ok "Rearranging ${modcommand}-files.list" + sleep 0.5 } ## mods_list.sh arrays From b85a1bb18e566502c526e4d7423ce1762feee5ec Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 22:23:10 +0100 Subject: [PATCH 0252/1895] try replacing cat with sed --- lgsm/functions/mods_core.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index c0765d25a..796567109 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -160,7 +160,8 @@ fn_mod_copy_destination(){ # Check if the mod is already installed and warn the user fn_mod_already_installed(){ if [ -f "${modslockfilefullpath}" ]; then - if [ -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then + + if [ -n "$(sed -n "/^${modcommand}$/p" "${modslockfilefullpath}")" ]; then fn_print_warning_nl "${modprettyname} has already been installed" sleep 1 echo " * Config files, if any, might be overwritten." From 99c29531f39d37a43893ccac7f7c8de390f71b8f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 22:30:01 +0100 Subject: [PATCH 0253/1895] replace with sed again --- lgsm/functions/mods_core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 796567109..e3028f7db 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -185,7 +185,7 @@ fn_mod_add_list(){ fn_script_log "Created ${modslockfilefullpath}" fi # Input mod name to lockfile - if [ ! -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then + if [ ! -n "$(sed -n "/^${modcommand}$/p" "${modslockfilefullpath}")" ]; then echo "${modcommand}" >> "${modslockfilefullpath}" fn_script_log "${modcommand} added to ${modslockfile}" fi From 369416ff62153ea2dfdded479ff0bf2ff371e840 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 16 Jan 2017 23:07:00 +0100 Subject: [PATCH 0254/1895] missing echo --- lgsm/functions/command_mods_remove.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 4d67f6d81..054e0cf20 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -59,6 +59,7 @@ fn_mods_remove_init(){ fn_check_files_list fn_script_log "Removing ${modsfilelistsize} files from ${modprettyname}" fn_print_dots "Removing ${modsfilelistsize} files from ${modprettyname}" + echo "" echo " * Any mod's custom file will be deleted." echo " * Press ctrl + c to abort." sleep 4 From 64a7610505b7c499ac3f11be8298c83320afff61 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 17 Jan 2017 20:33:49 +0000 Subject: [PATCH 0255/1895] renamed RenderWare to renderware --- lgsm/functions/check_deps.sh | 6 ++---- lgsm/functions/command_details.sh | 4 ++-- lgsm/functions/command_stop.sh | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 16df3860e..3ee12f3f5 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -6,8 +6,6 @@ local commandname="CHECK" - - fn_deps_detector(){ # Checks if dependency is missing if [ "${tmuxcheck}" == "1" ]; then @@ -159,7 +157,7 @@ if [ -n "$(command -v dpkg-query)" ]; then fi # All servers except ts3,mumble,multitheftauto and minecraft servers require libstdc++6 and lib32gcc1 - if [ "${gamename}" != "TeamSpeak 3" ]&&[ "${gamename}" != "Mumble" ]&&[ "${engine}" != "lwjgl2" ]&&[ "${engine}" != "RenderWare" ]; then + if [ "${gamename}" != "TeamSpeak 3" ]&&[ "${gamename}" != "Mumble" ]&&[ "${engine}" != "lwjgl2" ]&&[ "${engine}" != "renderware" ]; then if [ "${arch}" == "x86_64" ]; then array_deps_required+=( lib32gcc1 libstdc++6:i386 ) else @@ -242,7 +240,7 @@ elif [ -n "$(command -v yum)" ]; then fi # All servers except ts3,mumble,multitheftauto and minecraft servers require glibc.i686 and libstdc++.i686 - if [ "${gamename}" != "TeamSpeak 3" ]&&[ "${gamename}" != "Mumble" ]&&[ "${engine}" != "lwjgl2" ]&&[ "${engine}" != "RenderWare" ]; then + if [ "${gamename}" != "TeamSpeak 3" ]&&[ "${gamename}" != "Mumble" ]&&[ "${engine}" != "lwjgl2" ]&&[ "${engine}" != "renderware" ]; then array_deps_required+=( glibc.i686 libstdc++.i686 ) fi diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index a4333f041..c227694c8 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -315,7 +315,7 @@ fn_details_ports(){ parmslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file - local ports_edit_array=( "avalanche" "dontstarve" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "projectzomboid" "quake" "refractor" "realvirtuality" "RenderWare" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" ) + local ports_edit_array=( "avalanche" "dontstarve" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" ) for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then @@ -759,7 +759,7 @@ fn_display_details() { fn_details_script fn_details_backup # Some game servers do not have parms. - if [ "${gamename}" != "TeamSpeak 3" ]&&[ "${engine}" != "avalanche" ]&&[ "${engine}" != "dontstarve" ]&&[ "${engine}" != "projectzomboid" ]&&[ "${engine}" != "RenderWare" ]; then + if [ "${gamename}" != "TeamSpeak 3" ]&&[ "${engine}" != "avalanche" ]&&[ "${engine}" != "dontstarve" ]&&[ "${engine}" != "projectzomboid" ]&&[ "${engine}" != "renderware" ]; then fn_parms fn_details_commandlineparms fi diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index dda42c19a..62d73c3da 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -229,7 +229,7 @@ fn_stop_graceful_select(){ fn_stop_graceful_goldsource elif [ "${engine}" == "lwjgl2" ]; then fn_stop_graceful_minecraft - elif [ "${engine}" == "RenderWare" ]; then + elif [ "${engine}" == "renderware" ]; then fn_stop_graceful_mta else fn_stop_tmux From 99e5c34cdbb6f9b7cd14b5713d583ae553d36c68 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 17 Jan 2017 20:58:23 +0000 Subject: [PATCH 0256/1895] added mta to servefiles install --- lgsm/functions/command_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 0d5f95213..2da3992b7 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -18,7 +18,7 @@ check_deps.sh if [ "${gamename}" == "Unreal Tournament 2004" ]; then install_server_files.sh install_ut2k4_key.sh -elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "Factorio" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament" ]||[ "${gamename}" == "Unreal Tournament 3" ]||[ "${gamename}" == "TeamSpeak 3" ]||[ "${gamename}" == "Mumble" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then +elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "Factorio" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Multi Theft Auto" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Unreal Tournament 99" ]||[ "${gamename}" == "Unreal Tournament" ]||[ "${gamename}" == "Unreal Tournament 3" ]||[ "${gamename}" == "TeamSpeak 3" ]||[ "${gamename}" == "Mumble" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then installer=1 install_server_files.sh elif [ -n "${appid}" ]; then From edb4d40f3844e9fbe21dd3f9a28d4ba8cefc13d8 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 17 Jan 2017 22:11:13 +0100 Subject: [PATCH 0257/1895] polishing --- lgsm/functions/mods_core.sh | 69 ++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index e3028f7db..b466340b0 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -29,9 +29,9 @@ fn_gsm_requirements(){ fi } -# Create mods directory if it doesn't exist +# Create mods files and directories if it doesn't exist # Assuming the game is already installed as mods_list.sh checked for it. -fn_mods_dir(){ +fn_mods_files(){ if [ ! -d "${modinstalldir}" ]; then fn_script_log_info "Creating mods directory: ${modinstalldir}" fn_print_dots "Creating mods directory" @@ -40,6 +40,16 @@ fn_mods_dir(){ fn_print_ok "Created mods directory" sleep 0.5 fi + # Create lgsm/data/mods directory + if [ ! -d "${modsdatadir}" ]; then + mkdir -p "${modsdatadir}" + fn_script_log "Created ${modsdatadir}" + fi + # Create lgsm/data/${modslockfile} + if [ ! -f "${modslockfilefullpath}" ]; then + touch "${modslockfilefullpath}" + fn_script_log "Created ${modslockfilefullpath}" + fi } # Clear mod download directory so that there is only one file in it since we don't the file name and extention @@ -62,6 +72,7 @@ fn_mods_tmpdir(){ fi } +# Fetches mod URL fn_mod_dl(){ # fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" fileurl="${modurl}" @@ -76,6 +87,7 @@ fn_mod_dl(){ fi } +# Extract the mod fn_mod_extract(){ # fn_dl_extract "${filedir}" "${filename}" "${extractdir}" filename="${modfilename}" @@ -86,8 +98,8 @@ fn_mod_extract(){ fn_dl_extract "${filedir}" "${filename}" "${extractdir}" } +# Convert mod files to lowercase if needed fn_mod_lowercase(){ - # Converting files to lowercase if [ "${modlowercase}" == "LowercaseOn" ]; then fn_print_dots "Converting ${modprettyname} files to lowercase" sleep 0.5 @@ -98,24 +110,24 @@ fn_mod_lowercase(){ fi } +# Don't overwrite specified files upon update (set by ${modkeepfiles}) +# For that matter, remove cfg files after extraction before copying them to destination fn_remove_cfg_files(){ - # Remove config file after extraction for updates set by ${modkeepfiles} if [ "${modkeepfiles}" != "OVERWRITE" ]&&[ "${modkeepfiles}" != "NOUPDATE" ]; then - # Upon mods updates, config files should not be overwritten - # We will just remove these files before copying the mod to the destination - # Let's count how many files there are to remove - fn_print_dots "Allow for preserving ${modprettyname} config files" + fn_print_dots "Allow for not overwriting ${modprettyname} config files" + fn_script_log "Allow for not overwriting ${modprettyname} config files" sleep 0.5 + # Let's count how many files there are to remove removefilesamount="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" - # Test all subvalue of "modgames" using the ";" separator + # Test all subvalue of "modkeepfiles" using the ";" separator for ((removefilesindex=1; removefilesindex < ${removefilesamount}; removefilesindex++)); do # Put current file we're looking for into a variable filetoremove="$( echo "${modkeepfiles}" | awk -F ';' -v x=${removefilesindex} '{ print $x }' )" # If it matches an existing file that have been extracted if [ -f "${extractdir}/${filetoremove}" ]||[ -d "${extractdir}/${filetoremove}" ]; then # Then delete the file! - rm -R "${extractdir}/${filetoremove}" - # Write this file path in a tmp file, to rebuild a full file list + rm -r "${extractdir}/${filetoremove}" + # Write this file path in a tmp file, to rebuild a full file list since it is rebuilt upon update if [ ! -f "${modsdatadir}/.removedfiles.tmp" ]; then touch "${modsdatadir}/.removedfiles.tmp" fi @@ -127,12 +139,8 @@ fn_remove_cfg_files(){ fi } +# Create ${modcommand}-files.list containing the full extracted file/directory list fn_mod_fileslist(){ - # Create lgsm/data/mods directory - if [ ! -d "${modsdatadir}" ]; then - mkdir -p "${modsdatadir}" - fn_script_log "Created ${modsdatadir}" - fi fn_print_dots "Building ${modcommand}-files.list" fn_script_log "Building ${modcommand}-files.list" sleep 0.5 @@ -147,8 +155,8 @@ fn_mod_fileslist(){ sleep 0.5 } +# Copy the mod to the destination ${modinstalldir} fn_mod_copy_destination(){ - # Destination directory: ${modinstalldir} fn_print_dots "Copying ${modprettyname} to ${modinstalldir}" fn_script_log "Copying ${modprettyname} to ${modinstalldir}" sleep 0.5 @@ -160,7 +168,6 @@ fn_mod_copy_destination(){ # Check if the mod is already installed and warn the user fn_mod_already_installed(){ if [ -f "${modslockfilefullpath}" ]; then - if [ -n "$(sed -n "/^${modcommand}$/p" "${modslockfilefullpath}")" ]; then fn_print_warning_nl "${modprettyname} has already been installed" sleep 1 @@ -174,17 +181,7 @@ fn_mod_already_installed(){ # Add the mod to the installed mods list fn_mod_add_list(){ - # Create lgsm/data/mods directory - if [ ! -d "${modsdatadir}" ]; then - mkdir -p "${modsdatadir}" - fn_script_log "Created ${modsdatadir}" - fi - # Create lgsm/data/${modslockfile} - if [ ! -f "${modslockfilefullpath}" ]; then - touch "${modslockfilefullpath}" - fn_script_log "Created ${modslockfilefullpath}" - fi - # Input mod name to lockfile + # Append modname to lockfile if it's not already in it if [ ! -n "$(sed -n "/^${modcommand}$/p" "${modslockfilefullpath}")" ]; then echo "${modcommand}" >> "${modslockfilefullpath}" fn_script_log "${modcommand} added to ${modslockfile}" @@ -213,15 +210,16 @@ fn_check_files_list(){ fi } +# Apply some postinstall fixes to make sure everything will be fine fn_postinstall_tasks(){ - # Prevent addons folder from being removed by clearing them in: ${modsdatadir}/${modcommand}-files.list + # Prevent sensitive directories from being erased upon uninstall by removing them them from: ${modsdatadir}/${modcommand}-files.list # Check file validity fn_check_files_list # Output to the user fn_print_dots "Rearranging ${modcommand}-files.list" sleep 0.5 fn_script_log_info "Rearranging ${modcommand}-files.list" - # What lines/files to remove from file list + # What lines/files to remove from file list (end var with a ";" separator) removefromlist="cfg;addons;" # Loop through files to remove from file list, # that way these files won't get removed upon uninstall @@ -234,6 +232,7 @@ fn_postinstall_tasks(){ # Then delete matching line(s)! sed -i "/^${removefilevar}$/d" "${modsdatadir}/${modcommand}-files.list" done + # Sourcemod fix # Remove metamod from sourcemod fileslist if [ "${modcommand}" == "sourcemod" ]; then @@ -245,7 +244,11 @@ fn_postinstall_tasks(){ sleep 0.5 } -## mods_list.sh arrays +######################### +## mods_list.sh arrays ## +######################### + +## Define info for a mod # Define all variables from a mod at once when index is set to a separator fn_mod_info(){ @@ -253,6 +256,7 @@ fn_mod_info(){ if [ -z "$index" ]; then fn_print_error "index variable not set. Please report an issue to LGSM Team." echo "* https://github.com/GameServerManagers/LinuxGSM/issues" + exitcode="1" core_exit.sh fi modcommand="${mods_global_array[index+1]}" @@ -270,6 +274,7 @@ fi moddescription="${mods_global_array[index+13]}" } +## Mod compatibility check # Find out if a game is compatible with a mod from a modgames (list of games supported by a mod) variable fn_compatible_mod_games(){ From acdfafe4baca25105139f6b54120f795bbd5b185 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 17 Jan 2017 22:12:48 +0100 Subject: [PATCH 0258/1895] polishing --- lgsm/functions/mods_list.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index e99ff2214..08d6805d8 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -24,13 +24,13 @@ fn_mods_info(){ # Example 1) Well made mod: mod_info_name=( MOD "awesomemod" "This is an Awesome Mod" "https://awesomemod.com/latest.zip" "awesomemod.zip" "0" "LowercaseOff" "OVERWRITE" "${systemdir}/addons" "source;unity3d;" "GAMES" "NOTGAMES" "https://awesomemod.com/" "This mod knows that 42 is the answer" ) # Example 2) Poorly made mod: mod_info_name=( MOD "stupidmod" "This is a stupid mod" "${crappymodurl}" "StupidMod.zip" "2" "LowercaseOn" "cfg;data/crappymod;" "${systemdir}" "source;" "GAMES" "Garry's mod;Counter-Strike: Source;" "This mod is dumber than dumb" ) # None of those values can be empty - # [index] | Usage + # index | Usage # [0] | MOD: separator, all mods must begin with it # [1] | "modcommand": the LGSM name and command to install the mod (must be unique and lowercase) # [2] | "Pretty Name": the common name people use to call the mod that will be displayed to the user # [3] | "URL": link to the file; can be a variable defined in fn_mods_nasty_urls (make sure curl can download it) # [4] | "filename": the output filename - # [5] | "modsubdirs": in how many subdirectories is the mod (none is 0) + # [5] | "modsubdirs": in how many subdirectories is the mod (none is 0) (not used at release, but could be in the future) # [6] | "LowercaseOn/Off": LowercaseOff or LowercaseOn: enable/disable converting extracted files and directories to lowercase (some games require it) # [7] | "modinstalldir": the directory in which to install the mode ( use LGSM dir variables such as ${systemdir}) # [8] | "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" to ignore the value or "NOUPDATE" to disallow updating @@ -64,6 +64,7 @@ fn_mods_info(){ # Get a proper URL for mods that don't provide a good one (optional) fn_mods_scrape_urls(){ + fn_script_log "Retriving latest mods URLs" # Metamod metamodscrapeurl="http://www.gsptalk.com/mirror/sourcemod" metamodlatestfile="$(wget "${metamodscrapeurl}/?MD" -q -O -| grep "mmsource" | grep "\-linux" | head -n1 | awk -F '>' '{ print $3 }' | awk -F '<' '{ print $1}')" From 6df0855bdab3ac5d27d936db65056b06d08bda9b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 17 Jan 2017 21:13:25 +0000 Subject: [PATCH 0259/1895] added ip= --- lgsm/functions/info_config.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index e092c127b..547eb7c47 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -605,6 +605,7 @@ fn_info_config_sdtd(){ fn_info_config_mta(){ if [ ! -f "${servercfgfullpath}" ]; then + ip="${zero}" port="${unavailable}" httpport="${unavailable}" ase="${unavailable}" @@ -612,6 +613,7 @@ fn_info_config_mta(){ serverpassword="${unavailable}" maxplayers="${zero}" else + ip=$(grep -m 1 "serverip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') port=$(grep -m 1 "serverport" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') httpport=$(grep -m 1 "httpport" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') ase=$(grep -m 1 "ase" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') From 821db9741798a4129c5764fef3159545947e6824 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 17 Jan 2017 22:17:03 +0100 Subject: [PATCH 0260/1895] Polishing --- lgsm/functions/command_mods_install.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index dc3c497cc..219f00908 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -11,7 +11,6 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh mods_core.sh -mods_list.sh fn_mods_install_init(){ fn_script_log "Entering mods & addons installation" @@ -52,8 +51,8 @@ fn_mod_installation(){ fn_mod_get_info_from_command # Check if mod is already installed fn_mod_already_installed - # Check and create required directories - fn_mods_dir + # Check and create required files + fn_mods_files # Clear lgsm/tmp/mods dir if exists then recreate it fn_clear_tmp_mods fn_mods_tmpdir @@ -77,9 +76,11 @@ fn_mod_installation(){ fn_script_log "${modprettyname} installed." else fn_print_fail "No mod was selected" + exitcode="1" core_exit.sh fi } fn_mods_install_init fn_mod_installation +core_exit.sh From f9da8c9a1ee6cebd004cdc3993c1e3630de9ce31 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 17 Jan 2017 21:19:01 +0000 Subject: [PATCH 0261/1895] corrections to mta ip= --- lgsm/functions/info_config.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 547eb7c47..0c95770cc 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -613,7 +613,6 @@ fn_info_config_mta(){ serverpassword="${unavailable}" maxplayers="${zero}" else - ip=$(grep -m 1 "serverip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') port=$(grep -m 1 "serverport" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') httpport=$(grep -m 1 "httpport" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') ase=$(grep -m 1 "ase" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') @@ -627,6 +626,10 @@ fn_info_config_mta(){ ase="Disabled" fi + ip=$(grep -m 1 "serverip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') + ipsetinconfig=1 + ipinconfigvar="serverip" + # Not Set port=${port:-"NOT SET - Defaults to 22003"} httpport=${httpport:-"NOT SET - Defaults to 22005"} From c3924fa16ddda494663d0ccfc8350741bcd65d04 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 17 Jan 2017 22:23:29 +0100 Subject: [PATCH 0262/1895] Polishing --- lgsm/functions/command_mods_remove.sh | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 054e0cf20..3404f2feb 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -3,7 +3,7 @@ # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com -# Description: Uninstall mods along with mods_list.sh. +# Description: Uninstall mods along with mods_list.sh and mods_core.sh. local commandname="MODS" local commandaction="Mod Remove" @@ -11,7 +11,6 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh mods_core.sh -mods_list.sh fn_mods_remove_init(){ fn_script_log "Entering mods & addons removal" @@ -55,7 +54,7 @@ fn_mods_remove_init(){ # Gives a pretty name to the user and get all mod info currentmod="${usermodselect}" fn_mod_get_info_from_command - # Returns ${modsfilelistsize} + # Check file list in order to make sure we're able to remove the mod (returns ${modsfilelistsize}) fn_check_files_list fn_script_log "Removing ${modsfilelistsize} files from ${modprettyname}" fn_print_dots "Removing ${modsfilelistsize} files from ${modprettyname}" @@ -65,12 +64,14 @@ fn_mods_remove_init(){ sleep 4 } +# Uninstall the mod fn_mod_remove_process(){ - # Check file list in order to make sure we're able to remove the mod + # Go through every file and remove it modfileline="1" while [ $modfileline -le $modsfilelistsize ]; do - # Current line defines current mod command + # Current line defines current file to remove currentfileremove="$(sed "${modfileline}q;d" "${modsdatadir}/${modcommand}-files.list")" + # If file or directory exists, then remove it if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then fn_script_log "Removing: ${modinstalldir}/${currentfileremove}" rm -rf "${modinstalldir}/${currentfileremove}" @@ -89,3 +90,4 @@ fn_mod_remove_process(){ fn_mods_remove_init fn_mod_remove_process +core_exit.sh From 77c42746ccda457444d6b19e7b84891b05b99bff Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 17 Jan 2017 22:23:47 +0100 Subject: [PATCH 0263/1895] Polishing --- lgsm/functions/command_mods_update.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index c737d2a4a..40250a58d 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -11,7 +11,6 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh mods_core.sh -mods_list.sh fn_mods_update_init(){ fn_script_log "Entering mods & addons update" @@ -59,8 +58,8 @@ fn_mods_update_loop(){ echo "" fn_print_dots_nl "Updating ${modprettyname}" fn_script_log "Updating ${modprettyname}." - # Check and create required directories - fn_mods_dir + # Check and create required files + fn_mods_files # Clear lgsm/tmp/mods dir if exists then recreate it fn_clear_tmp_mods fn_mods_tmpdir @@ -89,6 +88,7 @@ fn_mods_update_loop(){ else fn_print_fail "No mod was selected" fn_script_log_fail "No mod was selected." + exitcode="1" core_exit.sh fi done @@ -99,3 +99,4 @@ fn_mods_update_loop(){ fn_mods_update_init fn_mods_update_loop +core_exit.sh From b048b14b2357b2850b18d51224a3c5f67980fce0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 17 Jan 2017 21:32:37 +0000 Subject: [PATCH 0264/1895] check_config must be completed before check_ip --- lgsm/functions/check.sh | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 25fead75b..bc0b9f83c 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -42,6 +42,14 @@ do 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 + 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 @@ -60,13 +68,7 @@ do 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 + local allowed_commands_array=( command_details.sh command_monitor.sh command_start.sh command_stop.sh command_ts3_server_pass.sh command_update.sh command_details.sh command_validate.sh ) for allowed_command in "${allowed_commands_array[@]}" From 7d848c30c4d8f88e6fdf6384444c6689cbddf50d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 17 Jan 2017 21:40:00 +0000 Subject: [PATCH 0265/1895] added no-clobber option preventing overwriting of already existing configs --- lgsm/functions/install_config.sh | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index e8501eaa6..3bb99da89 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -34,13 +34,13 @@ fn_default_config_remote(){ echo "copying ${config} config file." fn_script_log_info "copying ${servercfg} config file." if [ "${config}" == "${servercfgdefault}" ]; then - cp -v "${lgsmdir}/default-configs/${config}" "${servercfgfullpath}" + cp -nv "${lgsmdir}/default-configs/${config}" "${servercfgfullpath}" elif [ "${gamename}" == "ARMA 3" ]&&[ "${config}" == "${networkcfgdefault}" ]; then - cp -v "${lgsmdir}/default-configs/${config}" "${networkcfgfullpath}" + cp -nv "${lgsmdir}/default-configs/${config}" "${networkcfgfullpath}" elif [ "${gamename}" == "Don't Starve Together" ]&&[ "${config}" == "${clustercfgdefault}" ]; then cp -nv "${lgsmdir}/default-configs/${clustercfgdefault}" "${clustercfgfullpath}" else - cp -v "${lgsmdir}/default-configs/${config}" "${servercfgdir}/${config}" + cp -nv "${lgsmdir}/default-configs/${config}" "${servercfgdir}/${config}" fi done sleep 1 @@ -361,6 +361,13 @@ elif [ "${gamename}" == "No More Room in Hell" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Multi Theft Auto" ]; then + gamedirname="MultiTheftAuto" + fn_check_cfgdir + array_configs+=( acl.xml mtaserver.conf vehiclecolors.conf ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Mumble" ]; then gamedirname="Mumble" array_configs+=( murmur.ini ) @@ -498,11 +505,4 @@ elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Multi Theft Auto" ]; then - gamedirname="MultiTheftAuto" - fn_check_cfgdir - array_configs+=( acl.xml mtaserver.conf vehiclecolors.conf ) - fn_fetch_default_config - fn_default_config_remote - fn_set_config_vars fi From 6a5bad9db2b4e2abb0b4ed8b964cd20f4d2d2786 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 17 Jan 2017 22:41:48 +0100 Subject: [PATCH 0266/1895] Validate after Oxide uninstall --- lgsm/functions/mods_core.sh | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index b466340b0..b6f36b26d 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -210,7 +210,7 @@ fn_check_files_list(){ fi } -# Apply some postinstall fixes to make sure everything will be fine +# Apply some post-install fixes to make sure everything will be fine fn_postinstall_tasks(){ # Prevent sensitive directories from being erased upon uninstall by removing them them from: ${modsdatadir}/${modcommand}-files.list # Check file validity @@ -244,6 +244,18 @@ fn_postinstall_tasks(){ sleep 0.5 } +# Apply some post-uninstall fixes to make sure everything will be fine + +fn_postuninstall_tasks(){ + # Oxide fix + # Oxide replaces server files, so a validate is required after uninstall + if [ "${engine}" == "unity3d" ]&&[[ "${modprettyname}" == *"Oxide"* ]]; then + fn_print_information_nl "Validating to restore original ${gamename} files replaced by Oxide" + fn_script_log "Validating to restore original ${gamename} files replaced by Oxide" + command_validate.sh + fi +} + ######################### ## mods_list.sh arrays ## ######################### From ea37fc9b684e340a59677b5b0c016f9361e7f710 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 17 Jan 2017 22:42:47 +0100 Subject: [PATCH 0267/1895] validate after remove oxide --- lgsm/functions/command_mods_remove.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 3404f2feb..67b4e7f1d 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -84,6 +84,8 @@ fn_mod_remove_process(){ # Remove from installed mods list fn_script_log "Removing: ${modcommand} from ${modslockfilefullpath}" sed -i "/^${modcommand}$/d" "${modslockfilefullpath}" + # Post install tasks to solve potential issues + fn_postuninstall_tasks fn_print_ok_nl "Removed ${modprettyname}" fn_script_log "Removed ${modprettyname}" } From e38afe11ba2a7ad244a2f29c37e6770ea722f925 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 17 Jan 2017 22:50:01 +0100 Subject: [PATCH 0268/1895] exitbypass --- lgsm/functions/mods_core.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index b6f36b26d..fbfa9e5db 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -245,14 +245,15 @@ fn_postinstall_tasks(){ } # Apply some post-uninstall fixes to make sure everything will be fine - fn_postuninstall_tasks(){ # Oxide fix # Oxide replaces server files, so a validate is required after uninstall if [ "${engine}" == "unity3d" ]&&[[ "${modprettyname}" == *"Oxide"* ]]; then fn_print_information_nl "Validating to restore original ${gamename} files replaced by Oxide" fn_script_log "Validating to restore original ${gamename} files replaced by Oxide" + exitbypass="1" command_validate.sh + unset exitbypass fi } From 88c70c99288c0a60ac4f0a867c30930efd6b77e5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 17 Jan 2017 22:55:59 +0100 Subject: [PATCH 0269/1895] Validate fix Fixes Fixes #991 for validate command Also, it lacked a line jump. --- lgsm/functions/command_validate.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 6125ed513..3627acdb6 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -9,6 +9,7 @@ local commandaction="Validate" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_validation(){ + echo "" echo -e " * Validating may overwrite some customised files." echo -en " * https://developer.valvesoftware.com/wiki/SteamCMD#Validate" sleep 3 @@ -19,7 +20,9 @@ fn_validation(){ cd "${rootdir}/steamcmd" - if [ $(command -v stdbuf) ]; then + # Detects if unbuffer command is available for 32 bit distributions only. + info_distro.sh + if [ $(command -v stdbuf) ]&&[ "${arch}" != "x86_64" ]; then unbuffer="stdbuf -i0 -o0 -e0" fi From 213ab5ee0859248ca49eeb72d9200c4703a27f91 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 18 Jan 2017 21:17:30 +0000 Subject: [PATCH 0270/1895] fixes unary operator expected --- 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 7355c840c..b1db1b8fd 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -117,7 +117,7 @@ fn_fetch_file(){ # trap to remove part downloaded files trap fn_fetch_trap INT # if larger file shows progress bar - if [ ${filename##*.} == "bz2" ]||[ ${filename##*.} == "gz" ]||[ ${filename##*.} == "zip" ]||[ ${filename##*.} == "jar" ]; then + if [ "${filename##*.}" == "bz2" ]||[ "${filename##*.}" == "gz" ]||[ "${filename##*.}" == "zip" ]||[ "${filename##*.}" == "jar" ]; then echo -ne "downloading ${filename}..." sleep 1 curlcmd=$(${curlcmd} --progress-bar --fail -L -o "${filedir}/${filename}" "${fileurl}") From 6409a07af93ab4ef9b4506326404123659e2f95b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 18 Jan 2017 21:17:42 +0000 Subject: [PATCH 0271/1895] removed tabs --- lgsm/functions/mods_core.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index fbfa9e5db..813db7e8c 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -67,8 +67,8 @@ fn_clear_tmp_mods(){ # Create tmp download mod directory fn_mods_tmpdir(){ if [ ! -d "${modstmpdir}" ]; then - mkdir -p "${modstmpdir}" - fn_script_log "Creating temp mod download directory: ${modstmpdir}" + mkdir -p "${modstmpdir}" + fn_script_log "Creating temp mod download directory: ${modstmpdir}" fi } From c61440d1be3202a09be980f8ff34cae5787e9db6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 18 Jan 2017 21:52:49 +0000 Subject: [PATCH 0272/1895] Updated info_config.sh to match other servers --- lgsm/functions/info_config.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 0c95770cc..0164999a3 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -631,11 +631,11 @@ fn_info_config_mta(){ ipinconfigvar="serverip" # Not Set - port=${port:-"NOT SET - Defaults to 22003"} - httpport=${httpport:-"NOT SET - Defaults to 22005"} - ase=${ase:-"NOT SET - Defaults to Disabled"} + port=${port:-"22003"} + httpport=${httpport:-"22005"} + ase=${ase:-"Disabled"} servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET - Defaults to none"} + serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} fi } From a54a34c8a33e3ccca90802cb441ea4e074be09ed Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 18 Jan 2017 21:56:00 +0000 Subject: [PATCH 0273/1895] Removed ini variable as not required --- lgsm/functions/command_details.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index c227694c8..e34f65702 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -735,8 +735,8 @@ fn_details_mta(){ echo -e "netstat -atunp | grep mta-server64" echo -e "" { - echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL\tINI VARIABLE" - echo -e "> Game\tOUTBOUND\t${port}\tudp\tPort=${port}" + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tOUTBOUND\t${port}\tudp" echo -e "> HTTP Server\tINBOUND\t${httpport}\ttcp" if [ "${ase}" == "Enabled" ]; then echo -e "> ASE Game_Monitor\tOUTBOUND\t$((${port} + 123))\tudp" From 0546be54d287cfc961e267dbc0802a00f0a0fb4a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Wed, 18 Jan 2017 23:29:17 +0100 Subject: [PATCH 0274/1895] Attempt for installed mods list --- lgsm/functions/mods_core.sh | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 813db7e8c..e6d78ede0 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -402,7 +402,6 @@ fn_mods_available(){ fn_mods_show_available(){ # Set and reset vars compatiblemodslistindex=0 - spaces=" " # As long as we're within index values while [ "${compatiblemodslistindex}" -lt "${#compatiblemodslist[@]}" ]; do # Set values for convenience @@ -423,6 +422,23 @@ fn_mods_show_available(){ fi } + +# Builds installed mods list and display it to the user. +fn_installed_mods_list(){ + # Set variables + installedmodsline=1 + installedmodslist=() + while [ $installedmodsline -le $installedmodscount ]; do + currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}" )"" + installedmodslist+=( "$(sed "${installedmodsline}q;d" "${modslockfilefullpath}" )" ) + fn_mod_get_info_from_command + echo -e "\e[1m${displayedmodname}\e[0m - ${displayedmoddescription} - ${displayedmodsite}" + echo -e " * \e[36m${displayedmodcommand}\e[0m" + let installedmodsline=installedmodsline+1 + done + echo "" +} + # Get details of a mod any (relevant and unique, such as full mod name or install command) value fn_mod_get_info_from_command(){ # Variable to know when job is done From 3853dd36cd3c31322abe91ded943a28e34985c0a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Wed, 18 Jan 2017 23:30:45 +0100 Subject: [PATCH 0275/1895] attempd for new mods remove list --- lgsm/functions/command_mods_remove.sh | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 67b4e7f1d..bf0d13f7c 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -27,17 +27,10 @@ fn_mods_remove_init(){ fn_script_log_info "No mods or addons to remove." core_exit.sh fi - # Build installed mods list and display to the user. - installedmodsline=1 - availablemodsremove=() - while [ $installedmodsline -le $installedmodscount ]; do - availablemodsremove+=( "$(sed "${installedmodsline}q;d" "${modslockfilefullpath}" )" ) - echo -e " * \e[36m$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")\e[0m" - let installedmodsline=installedmodsline+1 - done - echo "" + # Displays installed addons to the user + fn_installed_mods_list # Keep prompting as long as the user input doesn't correspond to an available mod - while [[ ! " ${availablemodsremove[@]} " =~ " ${usermodselect} " ]]; do + while [[ ! " ${installedmodslist[@]} " =~ " ${usermodselect} " ]]; do echo -en "Enter a \e[36mmod\e[0m to \e[31mremove\e[0m (or exit to abort): " read -r usermodselect # Exit if user says exit or abort @@ -46,7 +39,7 @@ fn_mods_remove_init(){ echo "Aborted." core_exit.sh # Supplementary output upon invalid user input - elif [[ ! " ${availablemodsremove[@]} " =~ " ${usermodselect} " ]]; then + elif [[ ! " ${installedmodslist[@]} " =~ " ${usermodselect} " ]]; then fn_print_error2_nl "${usermodselect} is not a valid mod." echo " * Enter a valid mod or input exit to abort." fi From f645ace2433b39d1a82bf10c36831567f9c67c73 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Wed, 18 Jan 2017 23:55:37 +0100 Subject: [PATCH 0276/1895] () lolilol --- lgsm/functions/mods_core.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index e6d78ede0..91ef10dc7 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -422,15 +422,14 @@ fn_mods_show_available(){ fi } - # Builds installed mods list and display it to the user. fn_installed_mods_list(){ # Set variables - installedmodsline=1 + installedmodsline="1" installedmodslist=() while [ $installedmodsline -le $installedmodscount ]; do - currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}" )"" - installedmodslist+=( "$(sed "${installedmodsline}q;d" "${modslockfilefullpath}" )" ) + currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}" )" + installedmodslist+="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")" fn_mod_get_info_from_command echo -e "\e[1m${displayedmodname}\e[0m - ${displayedmoddescription} - ${displayedmodsite}" echo -e " * \e[36m${displayedmodcommand}\e[0m" From 11174b4ed887be31b179501fac035af097de4b8b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 00:03:47 +0100 Subject: [PATCH 0277/1895] corrected variables --- lgsm/functions/mods_core.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 91ef10dc7..30195b350 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -431,8 +431,8 @@ fn_installed_mods_list(){ currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}" )" installedmodslist+="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")" fn_mod_get_info_from_command - echo -e "\e[1m${displayedmodname}\e[0m - ${displayedmoddescription} - ${displayedmodsite}" - echo -e " * \e[36m${displayedmodcommand}\e[0m" + echo -e "\e[1m${modprettyname}\e[0m - ${moddescription} - ${modsite}" + echo -e " * \e[36m${modcommand}\e[0m" let installedmodsline=installedmodsline+1 done echo "" From efe7b219a68e15084716189126942b40a422ff03 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 00:08:38 +0100 Subject: [PATCH 0278/1895] installedmodslist --- lgsm/functions/mods_core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 30195b350..c77c3364e 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -429,10 +429,10 @@ fn_installed_mods_list(){ installedmodslist=() while [ $installedmodsline -le $installedmodscount ]; do currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}" )" - installedmodslist+="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")" fn_mod_get_info_from_command echo -e "\e[1m${modprettyname}\e[0m - ${moddescription} - ${modsite}" echo -e " * \e[36m${modcommand}\e[0m" + installedmodslist+=( "${modcommand}" ) let installedmodsline=installedmodsline+1 done echo "" From e83683f198b4dd01d21e65a0e1cbee326d4fb937 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 00:45:15 +0100 Subject: [PATCH 0279/1895] fn_installed_mods_lightlist --- lgsm/functions/mods_core.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index c77c3364e..b8084cbcf 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -438,6 +438,28 @@ fn_installed_mods_list(){ echo "" } +# Display a simple list of installed mods +fn_installed_mods_lightlist(){ + # How many mods installed + installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" + if [ -f "${modslockfilefullpath}" ]&&[ $installedmodscount -gt 0 ]; then + echo "=================================" + echo "Installed mods/addons + # Set variables + installedmodsline="1" + installedmodslist=() + # Loop through mods + while [ $installedmodsline -le $installedmodscount ]; do + currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}" )" + fn_mod_get_info_from_command + echo -e " * \e[1m${modprettyname}\e[0m" + installedmodslist+=( "${modcommand}" ) + let installedmodsline=installedmodsline+1 + done + echo "" + fi +} + # Get details of a mod any (relevant and unique, such as full mod name or install command) value fn_mod_get_info_from_command(){ # Variable to know when job is done From 16f54c62814b182d379987601f25c2bf5284c48b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 00:45:25 +0100 Subject: [PATCH 0280/1895] fn_installed_mods_lightlist --- lgsm/functions/command_mods_install.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 219f00908..beb1ac242 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -13,6 +13,8 @@ check.sh mods_core.sh fn_mods_install_init(){ + # Display installed mods + fn_installed_mods_lightlist fn_script_log "Entering mods & addons installation" echo "=================================" echo "${gamename} mods & addons installation" From b2c96b67fcd90661bf861d539039e3f2fc55e41e Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 00:50:09 +0100 Subject: [PATCH 0281/1895] "" --- lgsm/functions/mods_core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index b8084cbcf..146b60c71 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -444,7 +444,7 @@ fn_installed_mods_lightlist(){ installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" if [ -f "${modslockfilefullpath}" ]&&[ $installedmodscount -gt 0 ]; then echo "=================================" - echo "Installed mods/addons + echo "Installed mods/addons" # Set variables installedmodsline="1" installedmodslist=() From 3593866157e6ae6037de0978a0d743279c746434 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 00:52:43 +0100 Subject: [PATCH 0282/1895] echo "" moved --- lgsm/functions/mods_core.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 146b60c71..5c62e8981 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -435,7 +435,6 @@ fn_installed_mods_list(){ installedmodslist+=( "${modcommand}" ) let installedmodsline=installedmodsline+1 done - echo "" } # Display a simple list of installed mods @@ -456,7 +455,6 @@ fn_installed_mods_lightlist(){ installedmodslist+=( "${modcommand}" ) let installedmodsline=installedmodsline+1 done - echo "" fi } From 156b351d10c2cc7888c037308989896183ec7f16 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 00:53:10 +0100 Subject: [PATCH 0283/1895] echo "" moved here --- lgsm/functions/command_mods_remove.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index bf0d13f7c..63f7f5bec 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -29,6 +29,7 @@ fn_mods_remove_init(){ fi # Displays installed addons to the user fn_installed_mods_list + echo "" # Keep prompting as long as the user input doesn't correspond to an available mod while [[ ! " ${installedmodslist[@]} " =~ " ${usermodselect} " ]]; do echo -en "Enter a \e[36mmod\e[0m to \e[31mremove\e[0m (or exit to abort): " From c9ef22f68778706cb9603a0ef277638cae49ab12 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 01:36:52 +0100 Subject: [PATCH 0284/1895] Prompt if already installed --- lgsm/functions/mods_core.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 5c62e8981..3268379ad 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -172,8 +172,14 @@ fn_mod_already_installed(){ fn_print_warning_nl "${modprettyname} has already been installed" sleep 1 echo " * Config files, if any, might be overwritten." - echo " * Press ctrl + c to abort." - sleep 3 + while true; do + read -e -i "y" -p "Continue? [Y/n]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; core_exit.sh;; + * ) echo "Please answer yes or no.";; + esac + done fi fn_script_log "${modprettyname} is already installed, overwriting any file." fi From fa8e32a7a3360c01af4092231c2dfe64a42fb013 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 21:14:55 +0100 Subject: [PATCH 0285/1895] Fixed sourcemod URL --- lgsm/functions/mods_list.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 08d6805d8..7012fa1f7 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -68,12 +68,12 @@ fn_mods_scrape_urls(){ # Metamod metamodscrapeurl="http://www.gsptalk.com/mirror/sourcemod" metamodlatestfile="$(wget "${metamodscrapeurl}/?MD" -q -O -| grep "mmsource" | grep "\-linux" | head -n1 | awk -F '>' '{ print $3 }' | awk -F '<' '{ print $1}')" - metamodfasterurl="http://cdn.probablyaserver.com/sourcemod/" - metamodurl="${metamodfasterurl}/${metamodlatestfile}" + metamoddownloadurl="http://cdn.probablyaserver.com/sourcemod/" + metamodurl="${metamoddownloadurl}/${metamodlatestfile}" # Sourcemod sourcemodmversion="1.8" - sourcemodscrapeurl="http://www.gsptalk.com/mirror/sourcemod" - sourcemodlatestfile="$(wget "${sourcemodscrapeurl}/?MD" -q -O -| grep "sourcemod-" | grep "\-linux" | head -n1 | awk -F '>' '{ print $3 }' | awk -F '<' '{ print $1}')" - sourcemodfasterurl="http://cdn.probablyaserver.com/sourcemod/" - sourcemodurl="${sourcemodfasterurl}/${sourcemodlatestfile}" + sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}/sourcemod-latest-linux" + sourcemodlatestfile="$(wget "${sourcemodscrapeurl}/?MD" -q -O -)" + sourcemoddownloadurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}" + sourcemodurl="${sourcemoddownloadurl}/${sourcemodlatestfile}" } From 8a08cda9055abf338379e9a9dd98737570d1b4ad Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 21:18:33 +0100 Subject: [PATCH 0286/1895] "/?MD" drugs are bad --- lgsm/functions/mods_list.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 7012fa1f7..7f795cbe1 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -73,7 +73,7 @@ fn_mods_scrape_urls(){ # Sourcemod sourcemodmversion="1.8" sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}/sourcemod-latest-linux" - sourcemodlatestfile="$(wget "${sourcemodscrapeurl}/?MD" -q -O -)" + sourcemodlatestfile="$(wget "${sourcemodscrapeurl}" -q -O -)" sourcemoddownloadurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}" sourcemodurl="${sourcemoddownloadurl}/${sourcemodlatestfile}" } From 858f1f24b895666e0f2b04fafbeb7f0a538340a0 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 22:53:02 +0100 Subject: [PATCH 0287/1895] Executable not found message --- lgsm/functions/check_permissions.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 1411e649c..38ea23eca 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -123,6 +123,12 @@ fn_check_permissions(){ fi fi fi + else + fn_script_log_warn "Expected executable not found: ${executabledir}/${execname}" + fn_print_fail_nl "Executable ${execname} was not found." + echo " * Is the server properly installed?" + exitcode="1" + core_exit.sh fi } From b126bc6584c40d3b3a3290831361e3fbd08255b3 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 22:53:56 +0100 Subject: [PATCH 0288/1895] Cleaning message --- 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 38ea23eca..65ade3aae 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -125,8 +125,7 @@ fn_check_permissions(){ fi else fn_script_log_warn "Expected executable not found: ${executabledir}/${execname}" - fn_print_fail_nl "Executable ${execname} was not found." - echo " * Is the server properly installed?" + fn_print_fail_nl "Executable ${execname} was not found" exitcode="1" core_exit.sh fi From a96b54748828950f12b758332addf5cca72b2b8f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 22:58:39 +0100 Subject: [PATCH 0289/1895] Reverted changes --- lgsm/functions/check_permissions.sh | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 65ade3aae..1411e649c 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -123,11 +123,6 @@ fn_check_permissions(){ fi fi fi - else - fn_script_log_warn "Expected executable not found: ${executabledir}/${execname}" - fn_print_fail_nl "Executable ${execname} was not found" - exitcode="1" - core_exit.sh fi } From 5f95892b8dde450109ee51d121bd2029f97cf973 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 23:04:03 +0100 Subject: [PATCH 0290/1895] Check if executable exists --- lgsm/functions/check_executable.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 lgsm/functions/check_executable.sh diff --git a/lgsm/functions/check_executable.sh b/lgsm/functions/check_executable.sh new file mode 100644 index 000000000..a0a81aa4d --- /dev/null +++ b/lgsm/functions/check_executable.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# LGSM check_system_dir.sh function +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +# Description: Checks if systemdir is accessible. + +local commandname="CHECK" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +# Check if executable exists +if [ -f "${executabledir}/${execname}" ]; then + fn_script_log_warn "Expected executable not found: ${executabledir}/${execname}" + if [ -d "${scriptlogdir}" ]; then + fn_print_fail_nl "Executable ${execname} was not found" + fi + exitcode="1" + core_exit.sh +fi From f5bda64008b160528f013e972d1ad961ced98256 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 23:04:41 +0100 Subject: [PATCH 0291/1895] check_executable.sh --- lgsm/functions/check.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 25fead75b..42d0a90b2 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -83,3 +83,11 @@ do check_system_requirements.sh fi done + +local allowed_commands_array=( command_start.sh ) +for allowed_command in "${allowed_commands_array[@]}" +do + if [ "${allowed_command}" == "${function_selfname}" ]; then + check_executable.sh + fi +done From a11aca6af94e0c892597fbf13d2aa2df3ac04741 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 23:05:17 +0100 Subject: [PATCH 0292/1895] check_executable.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 fc9dfaab0..4bfc4c9b2 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -228,6 +228,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +check_executable.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + check_glibc.sh(){ functionfile="${FUNCNAME}" fn_fetch_function From 625ba3e558db64e83231c6d3f0dde25a98ef1bb7 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 23:07:27 +0100 Subject: [PATCH 0293/1895] Maybe check executable first --- lgsm/functions/check.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 42d0a90b2..255ab5ee1 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -18,6 +18,14 @@ if [ "${function_selfname}" != "command_install.sh" ]&&[ "${function_selfname}" check_system_dir.sh fi +local allowed_commands_array=( command_start.sh ) +for allowed_command in "${allowed_commands_array[@]}" +do + if [ "${allowed_command}" == "${function_selfname}" ]; then + check_executable.sh + fi +done + local allowed_commands_array=( command_debug.sh command_start.sh command_install.sh ) for allowed_command in "${allowed_commands_array[@]}" do @@ -83,11 +91,3 @@ do check_system_requirements.sh fi done - -local allowed_commands_array=( command_start.sh ) -for allowed_command in "${allowed_commands_array[@]}" -do - if [ "${allowed_command}" == "${function_selfname}" ]; then - check_executable.sh - fi -done From 7ea7a6d94be3df682a41d5cad9453a4150644657 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 23:16:14 +0100 Subject: [PATCH 0294/1895] I'm dumb --- lgsm/functions/check_executable.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/check_executable.sh b/lgsm/functions/check_executable.sh index a0a81aa4d..94337a26d 100644 --- a/lgsm/functions/check_executable.sh +++ b/lgsm/functions/check_executable.sh @@ -8,7 +8,7 @@ local commandname="CHECK" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" # Check if executable exists -if [ -f "${executabledir}/${execname}" ]; then +if [ ! -f "${executabledir}/${execname}" ]; then fn_script_log_warn "Expected executable not found: ${executabledir}/${execname}" if [ -d "${scriptlogdir}" ]; then fn_print_fail_nl "Executable ${execname} was not found" From 16b03293455ea885a957a1f44b7f7e956851d52b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 19 Jan 2017 23:50:59 +0100 Subject: [PATCH 0295/1895] spacing --- lgsm/functions/command_mods_remove.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 63f7f5bec..779c86fd9 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -13,7 +13,7 @@ check.sh mods_core.sh fn_mods_remove_init(){ - fn_script_log "Entering mods & addons removal" + fn_script_log "Entering mods & addons removal" echo "=================================" echo "${gamename} mods & addons removal" echo "" From c5d94762189bc461681131ecffb2740861e162c0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 19 Jan 2017 23:30:05 +0000 Subject: [PATCH 0296/1895] Added command_install_resources_mta.sh --- .../command_install_resources_mta.sh | 31 ++++++++ lgsm/functions/core_functions.sh | 5 ++ lgsm/functions/core_getopt.sh | 72 ++++++++++++++++++- 3 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 lgsm/functions/command_install_resources_mta.sh diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh new file mode 100644 index 000000000..4748774d5 --- /dev/null +++ b/lgsm/functions/command_install_resources_mta.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# LGSM command_install_resources_mta.sh function +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +# Description: Installs the default resources for Multi Theft Auto. + +local commandname="DEFAULT_RESOURCES" +local commandaction="Default Resources" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +fn_install_resources(){ + echo "" + echo "Installing Default Resources" + echo "=================================" + fileurl="http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip"; filedir="${tmpdir}"; filename="multitheftauto_resources.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="97a587509698f7f010bcd6e5c6dd9c31" + fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + fn_dl_extract "${filedir}" "${filename}" "${resourcesdir}" + echo "Default Resources Installed." +} + +fn_print_header + +fn_print_warning_nl "Installing the default resources with existing resources may cause issues." +while true; do + read -e -i "y" -p "Do you want to install MTA default resources? [Y/n]" yn + case $yn in + [Yy]* ) fn_install_resources && break;; + [Nn]* ) break;; + * ) echo "Please answer yes or no.";; + esac +done \ No newline at end of file diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 77fff799f..8c92f3198 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -182,6 +182,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +command_install_resources_mta.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + command_fastdl.sh(){ functionfile="${FUNCNAME}" fn_fetch_function diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 416427ae8..bc18e3292 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -342,6 +342,73 @@ case "${getopt}" in esac } +fn_getopt_mta(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.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;; + ir|install-default-resources) + command_install_resources_mta.sh;; + ai|auto-install) + fn_autoinstall;; + dd|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful infomation about the server." + echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + echo -e "${blue}install-default-resources\t${default}ir |Install the MTA default resources." + } | column -s $'\t' -t + esac +} + fn_getopt_mumble(){ case "${getopt}" in st|start) @@ -772,6 +839,9 @@ elif [ "${gamename}" == "Garry's Mod" ]; then # Minecraft elif [ "${engine}" == "lwjgl2" ]; then fn_getopt_minecraft +# Multi Theft Auto +elif [ "${gamename}" == "Multi Theft Auto" ]; then + fn_getopt_mta # Mumble elif [ "${gamename}" == "Mumble" ]; then fn_getopt_mumble @@ -789,7 +859,7 @@ elif [ "${engine}" == "unreal2" ]; then elif [ "${engine}" == "unreal" ]; then fn_getopt_unreal # Generic -elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "Multi Theft Auto" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then +elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fn_getopt_generic_no_update elif [ "${gamename}" == "Factorio" ]; then fn_getopt_generic_update_no_steam From 233275c3eb17855b74ef429679b83922647650e6 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 20 Jan 2017 01:16:06 +0100 Subject: [PATCH 0297/1895] Attempt for cleaner functions (core) --- lgsm/functions/mods_core.sh | 141 +++++++++++++++++++++++++++++++----- 1 file changed, 122 insertions(+), 19 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 3268379ad..fa9328e26 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -428,42 +428,138 @@ fn_mods_show_available(){ fi } -# Builds installed mods list and display it to the user. -fn_installed_mods_list(){ - # Set variables +# Checks if mods have been installed +# Also returns ${installedmodscount} if mods were found +fn_check_installed_mods(){ + # Count installed mods + if [ -f "${modslockfilefullpath}" ]; then + installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" + fi +} + +# A simple function to exit if no mods were installed +# Also returns ${installedmodscount} if mods were found +fn_mods_exit_if_not_installed(){ + # Checks if mods have been installed + # Also returns ${installedmodscount} if mods were found + fn_check_installed_mods + # If no mods lockfile is found or if it is empty + if [ ! -f "${modslockfilefullpath}" ]||[ -z "${installedmodscount}" ]||[ $installedmodscount -le 0 ]; then + fn_print_information_nl "No installed mods or addons were found" + echo " * Install mods using LGSM first with: ./${selfname} mods-install" + fn_script_log_info "No installed mods or addons were found." + core_exit.sh + fi +} + +# Builds installed mods list and sets available commands according to installed mods +# (requires ${installedmodscount} from fn_check_installed_mods) +fn_mods_available_commands_from_installed(){ + # Set/reset variables installedmodsline="1" installedmodslist=() + # Loop through every line of the installed mods list ${modslockfilefullpath} while [ $installedmodsline -le $installedmodscount ]; do - currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}" )" + currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")" + # Get mod info to make sure mod exists fn_mod_get_info_from_command - echo -e "\e[1m${modprettyname}\e[0m - ${moddescription} - ${modsite}" - echo -e " * \e[36m${modcommand}\e[0m" + # Add the mod to available commands installedmodslist+=( "${modcommand}" ) + # Increment line check let installedmodsline=installedmodsline+1 done } -# Display a simple list of installed mods -fn_installed_mods_lightlist(){ - # How many mods installed - installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" - if [ -f "${modslockfilefullpath}" ]&&[ $installedmodscount -gt 0 ]; then +# Displays a detailed list of installed mods +# Requires fn_check_installed_mods and fn_mods_available_commands_from_installed to run +fn_installed_mods_detailed_list(){ + fn_check_installed_mods + fn_mods_available_commands_from_installed + # Were now based on ${installedmodslist} array's values + # We're gonna go through all available commands, get details and display them to the user + for ((index=0; index <= ${#installedmodslist[@]}; index++)); do + # Current mod is the "index" value of the array we're going through + currentmod="${installedmodslist[index]}" + # Get mod info + fn_mod_get_info_from_command + # Display mod info to the user + echo -e "\e[1m${modprettyname}\e[0m - ${moddescription} - ${modsite}" + echo -e " * \e[36m${modcommand}\e[0m" + done +} + +# Displays a detailed list of installed mods +# Requires fn_check_installed_mods and fn_mods_available_commands_from_installed to run +fn_installed_mods_medium_list(){ + fn_check_installed_mods + fn_mods_available_commands_from_installed + # Were now based on ${installedmodslist} array's values + # We're gonna go through all available commands, get details and display them to the user + for ((index=0; index <= ${#installedmodslist[@]}; index++)); do + # Current mod is the "index" value of the array we're going through + currentmod="${installedmodslist[index]}" + # Get mod info + fn_mod_get_info_from_command + # Display mod info to the user + echo -e "\e[36m${modcommand}\e[0m - \e[1m${modprettyname}\e[0m - ${moddescription}" + done +} + +# Displays a simple list of installed mods +# Requires fn_check_installed_mods and fn_mods_available_commands_from_installed to run +# This list is only displayed when some mods are installed +fn_installed_mods_light_list(){ + fn_check_installed_mods + fn_mods_available_commands_from_installed + if [ $installedmodscount -gt 0 ]; then echo "=================================" echo "Installed mods/addons" - # Set variables - installedmodsline="1" - installedmodslist=() - # Loop through mods - while [ $installedmodsline -le $installedmodscount ]; do - currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}" )" + # Were now based on ${installedmodslist} array's values + # We're gonna go through all available commands, get details and display them to the user + for ((index=0; index <= ${#installedmodslist[@]}; index++)); do + # Current mod is the "index" value of the array we're going through + currentmod="${installedmodslist[index]}" + # Get mod info fn_mod_get_info_from_command + # Display simple mod info to the user echo -e " * \e[1m${modprettyname}\e[0m" - installedmodslist+=( "${modcommand}" ) - let installedmodsline=installedmodsline+1 done fi } +# Displays a simple list of installed mods for mods-update command +# Requires fn_check_installed_mods and fn_mods_available_commands_from_installed to run +fn_installed_mods_update_list(){ + fn_check_installed_mods + fn_mods_available_commands_from_installed + echo "=================================" + echo "Installed mods/addons" + # Were now based on ${installedmodslist} array's values + # We're gonna go through all available commands, get details and display them to the user + for ((index=0; index <= ${#installedmodslist[@]}; index++)); do + # Current mod is the "index" value of the array we're going through + currentmod="${installedmodslist[index]}" + # Get mod info + fn_mod_get_info_from_command + # Display simple mod info to the user according to the update policy + # If modkeepfiles is not set for some reason, that's a problem + if [ -z "${modkeepfiles}" ]; then + fn_script_log_error "Couldn't find update policy for ${modprettyname}" + fn_print_error_nl "Couldn't find update policy for ${modprettyname}" + exitcode="1" + core_exit.sh + # If the mod won't get updated + elif [ "${modkeepfiles}" == "NOUPDATE" ]; then + echo -e " * \e[31m${modprettyname}\e[0m (won't be updated)" + # If the mode is just overwritten + elif [ "${modkeepfiles}" == "OVERWRITE" ]; then + echo -e " * \e[1m${modprettyname}\e[0m (overwrite)" + else + echo -e " * \e[33m${modprettyname}\e[0m (common custom files remain untouched)" + fi + done +} + # Get details of a mod any (relevant and unique, such as full mod name or install command) value fn_mod_get_info_from_command(){ # Variable to know when job is done @@ -488,6 +584,13 @@ fn_mod_get_info_from_command(){ break fi done + # What happens if mod is not found + if [ "${modinfocommand}" == "0" ]; then + fn_script_log_error "Couldn't find information for ${currentmod}" + fn_print_error_nl ""Couldn't find information for ${currentmod}" + exitcode="1" + core_exit.sh + fi } fn_gsm_requirements From 849c13037a0e5203cf32add675b5ac4b086897db Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 20 Jan 2017 01:16:24 +0100 Subject: [PATCH 0298/1895] Attempt for the use of cleaner core functions --- lgsm/functions/command_mods_remove.sh | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 779c86fd9..006367850 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -17,18 +17,11 @@ fn_mods_remove_init(){ echo "=================================" echo "${gamename} mods & addons removal" echo "" - # Installed mod dir is "${modslockfilefullpath}" - # How many mods are installed - installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" - # If no mods to be updated - if [ ! -f "${modslockfilefullpath}" ]||[ $installedmodscount -eq 0 ]; then - fn_print_information_nl "No mods or addons to remove" - echo " * Did you install any mod using LGSM?" - fn_script_log_info "No mods or addons to remove." - core_exit.sh - fi + # A simple function to exit if no mods were installed + # Also returns ${installedmodscount} if mods were found + fn_mods_exit_if_not_installed # Displays installed addons to the user - fn_installed_mods_list + fn_installed_mods_medium_list echo "" # Keep prompting as long as the user input doesn't correspond to an available mod while [[ ! " ${installedmodslist[@]} " =~ " ${usermodselect} " ]]; do From 9830a59ff1143eac9dff969dd13862d644ace0b4 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 20 Jan 2017 01:16:30 +0100 Subject: [PATCH 0299/1895] Attempt for the use of cleaner core functions --- lgsm/functions/command_mods_update.sh | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 40250a58d..88ac2fb31 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -14,29 +14,16 @@ mods_core.sh fn_mods_update_init(){ fn_script_log "Entering mods & addons update" + # A simple function to exit if no mods were installed + # Also returns ${installedmodscount} if mods were found + fn_mods_exit_if_not_installed echo "=================================" echo "${gamename} mods & addons update" echo "" - # Installed mod dir is "${modslockfilefullpath}" - # How many mods will be updated - installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" - # If no mods to be updated - if [ ! -f "${modslockfilefullpath}" ]||[ $installedmodscount -eq 0 ]; then - fn_print_information_nl "No mods or addons to be updated" - echo " * Did you install any mod using LGSM?" - fn_script_log_info "No mods or addons to be updated" - core_exit.sh - else - fn_print_information_nl "${installedmodscount} mods or addons will be updated:" - fn_script_log_info "${installedmodscount} mods or addons will be updated" - # Loop showing mods to update - installedmodsline=1 - while [ $installedmodsline -le $installedmodscount ]; do - echo -e " * \e[36m$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")\e[0m" - let installedmodsline=installedmodsline+1 - done - sleep 2 - fi + fn_print_information_nl "${installedmodscount} mods or addons will be updated:" + fn_script_log_info "${installedmodscount} mods or addons will be updated" + # Display a list of installed addons + fn_installed_mods_update_list } # Recursively list all installed mods and apply update From bd07a687ace5d655f4fe016fdfa7aab33aab246d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 20 Jan 2017 01:16:34 +0100 Subject: [PATCH 0300/1895] Attempt for the use of cleaner core functions --- lgsm/functions/command_mods_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index beb1ac242..c0097a5b5 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -14,7 +14,7 @@ mods_core.sh fn_mods_install_init(){ # Display installed mods - fn_installed_mods_lightlist + fn_installed_mods_light_list fn_script_log "Entering mods & addons installation" echo "=================================" echo "${gamename} mods & addons installation" From 59f5d8606b5ba4cda489083eff914d5a8f014d06 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 20 Jan 2017 01:19:05 +0100 Subject: [PATCH 0301/1895] Damn automatic double quotes --- lgsm/functions/mods_core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index fa9328e26..ce0582f60 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -587,7 +587,7 @@ fn_mod_get_info_from_command(){ # What happens if mod is not found if [ "${modinfocommand}" == "0" ]; then fn_script_log_error "Couldn't find information for ${currentmod}" - fn_print_error_nl ""Couldn't find information for ${currentmod}" + fn_print_error_nl "Couldn't find information for ${currentmod}" exitcode="1" core_exit.sh fi From 532335aa1328d7896dae99f0245ff18bfdfbf7a5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 20 Jan 2017 02:59:25 +0100 Subject: [PATCH 0302/1895] new index variables should fix issue --- lgsm/functions/mods_core.sh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index ce0582f60..d97b310e4 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -477,9 +477,9 @@ fn_installed_mods_detailed_list(){ fn_mods_available_commands_from_installed # Were now based on ${installedmodslist} array's values # We're gonna go through all available commands, get details and display them to the user - for ((index=0; index <= ${#installedmodslist[@]}; index++)); do - # Current mod is the "index" value of the array we're going through - currentmod="${installedmodslist[index]}" + for ((dlindex=0; dlindex <= ${#installedmodslist[@]}; dlindex++)); do + # Current mod is the "dlindex" value of the array we're going through + currentmod="${installedmodslist[dlindex]}" # Get mod info fn_mod_get_info_from_command # Display mod info to the user @@ -495,9 +495,9 @@ fn_installed_mods_medium_list(){ fn_mods_available_commands_from_installed # Were now based on ${installedmodslist} array's values # We're gonna go through all available commands, get details and display them to the user - for ((index=0; index <= ${#installedmodslist[@]}; index++)); do - # Current mod is the "index" value of the array we're going through - currentmod="${installedmodslist[index]}" + for ((mlindex=0; mlindex <= ${#installedmodslist[@]}; mlindex++)); do + # Current mod is the "mlindex" value of the array we're going through + currentmod="${installedmodslist[mlindex]}" # Get mod info fn_mod_get_info_from_command # Display mod info to the user @@ -516,9 +516,9 @@ fn_installed_mods_light_list(){ echo "Installed mods/addons" # Were now based on ${installedmodslist} array's values # We're gonna go through all available commands, get details and display them to the user - for ((index=0; index <= ${#installedmodslist[@]}; index++)); do - # Current mod is the "index" value of the array we're going through - currentmod="${installedmodslist[index]}" + for ((llindex=0; llindex <= ${#installedmodslist[@]}; llindex++)); do + # Current mod is the "llindex" value of the array we're going through + currentmod="${installedmodslist[llindex]}" # Get mod info fn_mod_get_info_from_command # Display simple mod info to the user @@ -536,9 +536,9 @@ fn_installed_mods_update_list(){ echo "Installed mods/addons" # Were now based on ${installedmodslist} array's values # We're gonna go through all available commands, get details and display them to the user - for ((index=0; index <= ${#installedmodslist[@]}; index++)); do - # Current mod is the "index" value of the array we're going through - currentmod="${installedmodslist[index]}" + for ((ulindex=0; ulindex <= ${#installedmodslist[@]}; ulindex++)); do + # Current mod is the "ulindex" value of the array we're going through + currentmod="${installedmodslist[ulindex]}" # Get mod info fn_mod_get_info_from_command # Display simple mod info to the user according to the update policy From 9f01c51788c74e8cd0df2e7b7b55632b104b7ecb Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 20 Jan 2017 03:13:12 +0100 Subject: [PATCH 0303/1895] < rather than <= for lists --- lgsm/functions/mods_core.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index d97b310e4..60adb8d91 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -477,7 +477,7 @@ fn_installed_mods_detailed_list(){ fn_mods_available_commands_from_installed # Were now based on ${installedmodslist} array's values # We're gonna go through all available commands, get details and display them to the user - for ((dlindex=0; dlindex <= ${#installedmodslist[@]}; dlindex++)); do + for ((dlindex=0; dlindex < ${#installedmodslist[@]}; dlindex++)); do # Current mod is the "dlindex" value of the array we're going through currentmod="${installedmodslist[dlindex]}" # Get mod info @@ -495,7 +495,7 @@ fn_installed_mods_medium_list(){ fn_mods_available_commands_from_installed # Were now based on ${installedmodslist} array's values # We're gonna go through all available commands, get details and display them to the user - for ((mlindex=0; mlindex <= ${#installedmodslist[@]}; mlindex++)); do + for ((mlindex=0; mlindex < ${#installedmodslist[@]}; mlindex++)); do # Current mod is the "mlindex" value of the array we're going through currentmod="${installedmodslist[mlindex]}" # Get mod info @@ -516,7 +516,7 @@ fn_installed_mods_light_list(){ echo "Installed mods/addons" # Were now based on ${installedmodslist} array's values # We're gonna go through all available commands, get details and display them to the user - for ((llindex=0; llindex <= ${#installedmodslist[@]}; llindex++)); do + for ((llindex=0; llindex < ${#installedmodslist[@]}; llindex++)); do # Current mod is the "llindex" value of the array we're going through currentmod="${installedmodslist[llindex]}" # Get mod info From ec68e34e862a894ed4c900761cb1f79aba684c24 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 20 Jan 2017 03:27:15 +0100 Subject: [PATCH 0304/1895] Move mods error message --- lgsm/functions/command_mods_remove.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 006367850..392f3332a 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -16,10 +16,10 @@ fn_mods_remove_init(){ fn_script_log "Entering mods & addons removal" echo "=================================" echo "${gamename} mods & addons removal" - echo "" # A simple function to exit if no mods were installed # Also returns ${installedmodscount} if mods were found fn_mods_exit_if_not_installed + echo "" # Displays installed addons to the user fn_installed_mods_medium_list echo "" From 3c966c5bc6082d1a4744b09887a347b306ce8886 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 20 Jan 2017 03:27:51 +0100 Subject: [PATCH 0305/1895] Move mods error message --- lgsm/functions/command_mods_update.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 88ac2fb31..4dd290f0f 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -14,11 +14,11 @@ mods_core.sh fn_mods_update_init(){ fn_script_log "Entering mods & addons update" + echo "=================================" + echo "${gamename} mods & addons update" # A simple function to exit if no mods were installed # Also returns ${installedmodscount} if mods were found fn_mods_exit_if_not_installed - echo "=================================" - echo "${gamename} mods & addons update" echo "" fn_print_information_nl "${installedmodscount} mods or addons will be updated:" fn_script_log_info "${installedmodscount} mods or addons will be updated" From abb4ba32c7984d0238fecc487c2836e1b3aad34a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 20 Jan 2017 03:31:10 +0100 Subject: [PATCH 0306/1895] < rather than <= --- lgsm/functions/mods_core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 60adb8d91..cd99e74a5 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -536,7 +536,7 @@ fn_installed_mods_update_list(){ echo "Installed mods/addons" # Were now based on ${installedmodslist} array's values # We're gonna go through all available commands, get details and display them to the user - for ((ulindex=0; ulindex <= ${#installedmodslist[@]}; ulindex++)); do + for ((ulindex=0; ulindex < ${#installedmodslist[@]}; ulindex++)); do # Current mod is the "ulindex" value of the array we're going through currentmod="${installedmodslist[ulindex]}" # Get mod info From 98b0b91d843c5c34f7d7c77ab9654fa5d36eb59f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 20 Jan 2017 03:31:42 +0100 Subject: [PATCH 0307/1895] no nl --- lgsm/functions/command_mods_update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 4dd290f0f..9eb257907 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -38,7 +38,7 @@ fn_mods_update_loop(){ fn_mod_get_info_from_command # Don't update the mod if it's policy is to "NOUPDATE" if [ "${modkeepfiles}" == "NOUPDATE" ]; then - fn_print_info_nl "${modprettyname} won't be updated to preserve custom files" + fn_print_info "${modprettyname} won't be updated to preserve custom files" fn_script_log "${modprettyname} won't be updated to preserve custom files." let installedmodsline=installedmodsline+1 else From d9a1030837d0b8133d14d691b88708a06639e973 Mon Sep 17 00:00:00 2001 From: Braunson Date: Fri, 20 Jan 2017 11:03:19 -0600 Subject: [PATCH 0308/1895] Lowercase engine name --- MultiTheftAuto/mtaserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver index 07ac899f0..c119ac910 100644 --- a/MultiTheftAuto/mtaserver +++ b/MultiTheftAuto/mtaserver @@ -61,7 +61,7 @@ githubbranch="master" ## LinuxGSM Server Details # Do not edit gamename="Multi Theft Auto" -engine="RenderWare" +engine="renderware" ## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers servicename="mta-server" From fa5bafbed3163d7e80b603d1653ba48d40d22cfb Mon Sep 17 00:00:00 2001 From: Braunson Date: Fri, 20 Jan 2017 11:11:24 -0600 Subject: [PATCH 0309/1895] Removed default resource question when running the install after Daniel said so --- lgsm/functions/install_mta_resources.sh | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index c1f16393a..4b6bc0c62 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -31,28 +31,7 @@ fn_install_libmysqlclient16(){ fi } -fn_install_resources(){ - echo "" - echo "Installing Default Resources" - echo "=================================" - fileurl="http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip"; filedir="${tmpdir}"; filename="multitheftauto_resources.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="97a587509698f7f010bcd6e5c6dd9c31" - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" - fn_dl_extract "${filedir}" "${filename}" "${resourcesdir}" - echo "Default Resources Installed." -} - fn_install_libmysqlclient16 -if [ -z "${autoinstall}" ]; then - echo "" - while true; do - read -e -i "y" -p "Do you want to have the default resources downloaded? (Server is inoperable without resources!) [y/N]" yn - case $yn in - [Yy]* ) fn_install_resources && break;; - [Nn]* ) break;; - * ) echo "Please answer yes or no.";; - esac - done -else -fn_print_warning_nl "./${selfname} auto-install does not download the default resources. If you require them use ./${selfname} install" -fi +fn_print_header +fn_print_information_nl "Server is inoperable by default without resources, you can install default ones by running the command install-default-resources" From bdb5ea53b9ccf32a50b371e130933aa773bc2cb8 Mon Sep 17 00:00:00 2001 From: Braunson Date: Fri, 20 Jan 2017 11:12:54 -0600 Subject: [PATCH 0310/1895] Format change --- lgsm/functions/install_mta_resources.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index 4b6bc0c62..f4fff4010 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -33,5 +33,5 @@ fn_install_libmysqlclient16(){ fn_install_libmysqlclient16 -fn_print_header fn_print_information_nl "Server is inoperable by default without resources, you can install default ones by running the command install-default-resources" +echo "" From 544d4508cdb9ad68040f310d73ecd4206d33b414 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 20 Jan 2017 17:52:54 +0000 Subject: [PATCH 0311/1895] command_install_resources_mta.sh --- lgsm/functions/command_install.sh | 2 +- lgsm/functions/command_install_resources_mta.sh | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 2da3992b7..15ed1bafd 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -35,7 +35,7 @@ elif [ "${gamename}" == "Don't Starve Together" ]; then elif [ "${gamename}" == "TeamSpeak 3" ]; then install_ts3db.sh elif [ "${gamename}" == "Multi Theft Auto" ]; then - install_mta_resources.sh + command_install_resources_mta.sh fi fix.sh diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 4748774d5..4c049115c 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -19,7 +19,6 @@ fn_install_resources(){ } fn_print_header - fn_print_warning_nl "Installing the default resources with existing resources may cause issues." while true; do read -e -i "y" -p "Do you want to install MTA default resources? [Y/n]" yn From ea018494b0758d94bcbc51bdba6c6d17fa3f154a Mon Sep 17 00:00:00 2001 From: Braunson Date: Fri, 20 Jan 2017 11:55:08 -0600 Subject: [PATCH 0312/1895] fix_mta for libmysql --- lgsm/functions/core_functions.sh | 10 +++++----- lgsm/functions/fix.sh | 2 ++ lgsm/functions/fix_mta.sh | 25 +++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 lgsm/functions/fix_mta.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 8c92f3198..df8b4980c 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -374,6 +374,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +fix_mta.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + # Info info_config.sh(){ @@ -576,11 +581,6 @@ functionfile="${FUNCNAME}" fn_fetch_function } -install_mta_resources.sh(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - # Calls the global Ctrl-C trap core_trap.sh diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 85a65a814..327fcccf9 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -47,6 +47,8 @@ if [ "${function_selfname}" != "command_install.sh" ]; then fix_ins.sh elif [ "${gamename}" == "Rust" ]; then fix_rust.sh + elif [ "${gamename}" == "Multi Theft Auto" ]; then + fix_mta.sh fi fi diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh new file mode 100644 index 000000000..72d3228bd --- /dev/null +++ b/lgsm/functions/fix_mta.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# LGSM fix_mta.sh function +# Author: Daniel Gibbs +# Contributor: ChaosMTA +# Website: https://gameservermanagers.com +# Description: Installs the libmysqlclient for database functions on the server +local commandname="FIX" +local commandaction="Fix" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +if [ ! -f /usr/lib/libmysqlclient.so.16 ]; then + fixname="libmysqlclient16 install" + fn_fix_msg_start + fn_print_warn_nl "libmysqlclient16 not installed. Installing.." + sleep 1 + fileurl="https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16"; filedir="${lgsmdir}/lib"; filename="libmysqlclient.so.16"; executecmd="executecmd" run="norun"; force="noforce"; md5="6c188e0f8fb5d7a29f4bc413b9fed6c2" + fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + fn_fix_msg_end +fi +} + +fixname="libmysqlclient16" +fn_fix_msg_start +export LD_LIBRARY_PATH=:"${libdir}" +fn_fix_msg_end From f9a6d872ccff3aed94f5d24af147ff0aae838d3a Mon Sep 17 00:00:00 2001 From: Braunson Date: Fri, 20 Jan 2017 11:56:36 -0600 Subject: [PATCH 0313/1895] Typo --- lgsm/functions/fix_mta.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index 72d3228bd..e63972e50 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -17,7 +17,6 @@ if [ ! -f /usr/lib/libmysqlclient.so.16 ]; then fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" fn_fix_msg_end fi -} fixname="libmysqlclient16" fn_fix_msg_start From 8ad76124ffcabf2c32c6c57a0302e15f917c2d32 Mon Sep 17 00:00:00 2001 From: Braunson Date: Fri, 20 Jan 2017 11:57:20 -0600 Subject: [PATCH 0314/1895] No MD5 for default resources --- lgsm/functions/command_install_resources_mta.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 4c049115c..678e412ad 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -12,13 +12,14 @@ fn_install_resources(){ echo "" echo "Installing Default Resources" echo "=================================" - fileurl="http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip"; filedir="${tmpdir}"; filename="multitheftauto_resources.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="97a587509698f7f010bcd6e5c6dd9c31" + fileurl="http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip"; filedir="${tmpdir}"; filename="multitheftauto_resources.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="nomd5" fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" fn_dl_extract "${filedir}" "${filename}" "${resourcesdir}" echo "Default Resources Installed." } fn_print_header + fn_print_warning_nl "Installing the default resources with existing resources may cause issues." while true; do read -e -i "y" -p "Do you want to install MTA default resources? [Y/n]" yn @@ -27,4 +28,4 @@ while true; do [Nn]* ) break;; * ) echo "Please answer yes or no.";; esac -done \ No newline at end of file +done From b4d3bb549e36198d332e4e5decd6bc30231791e0 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 20 Jan 2017 19:00:02 +0100 Subject: [PATCH 0315/1895] Fixed error spacing with a ! |ERROR!] is better than [ERROR ], as per @ChaosMTA and @Cedarlug mentioned. --- lgsm/functions/core_messages.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 540729af7..66a1d6d80 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -157,17 +157,17 @@ fn_print_fail_nl(){ # [ ERROR ] fn_print_error(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${red}ERROR ${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${red}ERROR!${default}] ${commandaction} ${servicename}: $@" else - echo -en "${creeol}[${red}ERROR ${default}] $@" + echo -en "${creeol}[${red}ERROR!${default}] $@" fi } fn_print_error_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${red}ERROR ${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${red}ERROR!${default}] ${commandaction} ${servicename}: $@" else - echo -en "${creeol}[${red}ERROR ${default}] $@" + echo -en "${creeol}[${red}ERROR!${default}] $@" fi sleep 0.5 echo -en "\n" From a84ba451aa2f744de6b32f63769939f1cefec5c1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 20 Jan 2017 21:01:46 +0000 Subject: [PATCH 0316/1895] Changes to the UI more to come soon --- lgsm/functions/command_mods_install.sh | 18 ++++++------- lgsm/functions/command_mods_remove.sh | 35 ++++++++++++++------------ lgsm/functions/mods_core.sh | 24 +++++++++--------- 3 files changed, 39 insertions(+), 38 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index c0097a5b5..ee7d5bdbc 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -6,35 +6,33 @@ # Description: List and installs available mods along with mods_list.sh and mods_core.sh. local commandname="MODS" -local commandaction="Mod Installation" +local commandaction="addons/mods" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh mods_core.sh fn_mods_install_init(){ + fn_print_header # Display installed mods fn_installed_mods_light_list - fn_script_log "Entering mods & addons installation" - echo "=================================" - echo "${gamename} mods & addons installation" echo "" + echo "Available addons/mods" + echo "=================================" + # Display available mods from mods_list.sh fn_mods_show_available echo "" # Keep prompting as long as the user input doesn't correspond to an available mod while [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; do - echo -en "Enter a \e[36mmod\e[0m to install (or exit to abort): " + echo -en "Enter an ${cyan}addon/mod${default} to ${green}install${default} (or exit to abort): " read -r usermodselect # Exit if user says exit or abort if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then - fn_script_log "User aborted." - echo "Aborted." core_exit.sh # Supplementary output upon invalid user input elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then - fn_print_error2_nl "${usermodselect} is not a valid mod." - echo " * Enter a valid mod or input exit to abort." + fn_print_error2_nl "${usermodselect} is not a valid addon/mod." fi done # Gives a pretty name to the user and get all mod info @@ -77,7 +75,7 @@ fn_mod_installation(){ fn_print_ok_nl "${modprettyname} installed" fn_script_log "${modprettyname} installed." else - fn_print_fail "No mod was selected" + fn_print_fail "No addon/mod was selected" exitcode="1" core_exit.sh fi diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 392f3332a..d49b81441 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -6,16 +6,16 @@ # Description: Uninstall mods along with mods_list.sh and mods_core.sh. local commandname="MODS" -local commandaction="Mod Remove" +local commandaction="addons/mods" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh mods_core.sh fn_mods_remove_init(){ - fn_script_log "Entering mods & addons removal" + fn_print_header + echo "Remove addons/mods" echo "=================================" - echo "${gamename} mods & addons removal" # A simple function to exit if no mods were installed # Also returns ${installedmodscount} if mods were found fn_mods_exit_if_not_installed @@ -25,19 +25,26 @@ fn_mods_remove_init(){ echo "" # Keep prompting as long as the user input doesn't correspond to an available mod while [[ ! " ${installedmodslist[@]} " =~ " ${usermodselect} " ]]; do - echo -en "Enter a \e[36mmod\e[0m to \e[31mremove\e[0m (or exit to abort): " + echo -en "Enter a ${cyan}mod${default} to ${red}remove${default} (or exit to abort): " read -r usermodselect # Exit if user says exit or abort if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then - fn_script_log "User aborted." - echo "Aborted." - core_exit.sh - # Supplementary output upon invalid user input - elif [[ ! " ${installedmodslist[@]} " =~ " ${usermodselect} " ]]; then - fn_print_error2_nl "${usermodselect} is not a valid mod." - echo " * Enter a valid mod or input exit to abort." + core_exit.sh + # Supplementary output upon invalid user input + elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then + fn_print_error2_nl "${usermodselect} is not a valid addon/mod." fi done + fn_print_warning_nl "You are about to remove ${usermodselect}." + echo " * Any custom files/configuration will be removed." + while true; do + read -e -i "y" -p "Continue? [Y/n]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; exit;; + * ) echo "Please answer yes or no.";; + esac + done # Gives a pretty name to the user and get all mod info currentmod="${usermodselect}" fn_mod_get_info_from_command @@ -45,17 +52,13 @@ fn_mods_remove_init(){ fn_check_files_list fn_script_log "Removing ${modsfilelistsize} files from ${modprettyname}" fn_print_dots "Removing ${modsfilelistsize} files from ${modprettyname}" - echo "" - echo " * Any mod's custom file will be deleted." - echo " * Press ctrl + c to abort." - sleep 4 } # Uninstall the mod fn_mod_remove_process(){ # Go through every file and remove it modfileline="1" - while [ $modfileline -le $modsfilelistsize ]; do + while [ "${modfileline}" -le "${modsfilelistsize}" ]; do # Current line defines current file to remove currentfileremove="$(sed "${modfileline}q;d" "${modsdatadir}/${modcommand}-files.list")" # If file or directory exists, then remove it diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index cd99e74a5..be815c3b3 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -6,7 +6,7 @@ # Description: Core functions for mods list/install/update/remove local commandname="MODS" -local commandaction="Core functions for mods" +local commandaction="addons/mods" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" ## Useful variables @@ -416,8 +416,8 @@ fn_mods_show_available(){ displayedmodsite="${compatiblemodslist[compatiblemodslistindex+2]}" displayedmoddescription="${compatiblemodslist[compatiblemodslistindex+3]}" # Output mods to the user - echo -e "\e[1m${displayedmodname}\e[0m - ${displayedmoddescription} - ${displayedmodsite}" - echo -e " * \e[36m${displayedmodcommand}\e[0m" + echo -e "\e[1m${displayedmodname}${default} - ${displayedmoddescription} - ${displayedmodsite}" + echo -e " * ${cyan}${displayedmodcommand}${default}" # Increment index from the amount of values we just displayed let "compatiblemodslistindex+=4" done @@ -483,8 +483,8 @@ fn_installed_mods_detailed_list(){ # Get mod info fn_mod_get_info_from_command # Display mod info to the user - echo -e "\e[1m${modprettyname}\e[0m - ${moddescription} - ${modsite}" - echo -e " * \e[36m${modcommand}\e[0m" + echo -e "\e[1m${modprettyname}${default} - ${moddescription} - ${modsite}" + echo -e " * ${cyan}${modcommand}${default}" done } @@ -501,7 +501,7 @@ fn_installed_mods_medium_list(){ # Get mod info fn_mod_get_info_from_command # Display mod info to the user - echo -e "\e[36m${modcommand}\e[0m - \e[1m${modprettyname}\e[0m - ${moddescription}" + echo -e "${cyan}${modcommand}${default} - \e[1m${modprettyname}${default} - ${moddescription}" done } @@ -512,8 +512,8 @@ fn_installed_mods_light_list(){ fn_check_installed_mods fn_mods_available_commands_from_installed if [ $installedmodscount -gt 0 ]; then + echo "Installed addons/mods" echo "=================================" - echo "Installed mods/addons" # Were now based on ${installedmodslist} array's values # We're gonna go through all available commands, get details and display them to the user for ((llindex=0; llindex < ${#installedmodslist[@]}; llindex++)); do @@ -522,7 +522,7 @@ fn_installed_mods_light_list(){ # Get mod info fn_mod_get_info_from_command # Display simple mod info to the user - echo -e " * \e[1m${modprettyname}\e[0m" + echo -e " * \e[1m${green}${modprettyname}${default}${default}" done fi } @@ -533,7 +533,7 @@ fn_installed_mods_update_list(){ fn_check_installed_mods fn_mods_available_commands_from_installed echo "=================================" - echo "Installed mods/addons" + echo "Installed addons/mods" # Were now based on ${installedmodslist} array's values # We're gonna go through all available commands, get details and display them to the user for ((ulindex=0; ulindex < ${#installedmodslist[@]}; ulindex++)); do @@ -550,12 +550,12 @@ fn_installed_mods_update_list(){ core_exit.sh # If the mod won't get updated elif [ "${modkeepfiles}" == "NOUPDATE" ]; then - echo -e " * \e[31m${modprettyname}\e[0m (won't be updated)" + echo -e " * \e[31m${modprettyname}${default} (won't be updated)" # If the mode is just overwritten elif [ "${modkeepfiles}" == "OVERWRITE" ]; then - echo -e " * \e[1m${modprettyname}\e[0m (overwrite)" + echo -e " * \e[1m${modprettyname}${default} (overwrite)" else - echo -e " * \e[33m${modprettyname}\e[0m (common custom files remain untouched)" + echo -e " * \e[33m${modprettyname}${default} (common custom files remain untouched)" fi done } From 63c697fe33f6c338d24893de5871860ae8eab56b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 20 Jan 2017 21:44:08 +0000 Subject: [PATCH 0317/1895] spaces --- lgsm/functions/command_mods_install.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index ee7d5bdbc..dec97c7a3 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -16,10 +16,9 @@ fn_mods_install_init(){ fn_print_header # Display installed mods fn_installed_mods_light_list - echo "" + echo "Available addons/mods" echo "=================================" - # Display available mods from mods_list.sh fn_mods_show_available echo "" From 6e407e74874d5b12c29a6f491d7a505cfa35a612 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 20 Jan 2017 21:45:15 +0000 Subject: [PATCH 0318/1895] minor ui changes --- lgsm/functions/mods_core.sh | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index be815c3b3..cc67fd4f3 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -16,14 +16,14 @@ extractdir="${modstmpdir}/extracted" modsdatadir="${lgsmdir}/data/mods" modslockfile="installed-mods-listing" modslockfilefullpath="${modsdatadir}/${modslockfile}" -# Database initialization +# Database initialisation mods_list.sh -# Sets some gsm requirements -fn_gsm_requirements(){ +# Sets some lgsm requirements +fn_lgsm_requirements(){ # If tmpdir variable doesn't exist, LGSM is too old if [ -z "${tmpdir}" ]||[ -z "${lgsmdir}" ]; then - fn_print_fail "Your LGSM version is too old." + fn_print_fail "Your LinuxGSM version is too old." echo " * Please do a full update, including ${selfname} script." core_exit.sh fi @@ -145,11 +145,11 @@ fn_mod_fileslist(){ fn_script_log "Building ${modcommand}-files.list" sleep 0.5 # ${modsdatadir}/${modcommand}-files.list - find "${extractdir}" -mindepth 1 -printf '%P\n' > ${modsdatadir}/${modcommand}-files.list + find "${extractdir}" -mindepth 1 -printf '%P\n' > "${modsdatadir}"/${modcommand}-files.list fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.list}" # Adding removed files if needed if [ -f "${modsdatadir}/.removedfiles.tmp" ]; then - cat "${modsdatadir}/.removedfiles.tmp" >> ${modsdatadir}/${modcommand}-files.list + cat "${modsdatadir}/.removedfiles.tmp" >> "${modsdatadir}"/${modcommand}-files.list fi fn_print_ok "Building ${modcommand}-files.list" sleep 0.5 @@ -511,7 +511,7 @@ fn_installed_mods_medium_list(){ fn_installed_mods_light_list(){ fn_check_installed_mods fn_mods_available_commands_from_installed - if [ $installedmodscount -gt 0 ]; then + if [ "${installedmodscount}" -gt 0 ]; then echo "Installed addons/mods" echo "=================================" # Were now based on ${installedmodslist} array's values @@ -522,8 +522,9 @@ fn_installed_mods_light_list(){ # Get mod info fn_mod_get_info_from_command # Display simple mod info to the user - echo -e " * \e[1m${green}${modprettyname}${default}${default}" + echo -e " * \e[1m${green}${modcommand}${default}${default}" done + echo "" fi } @@ -593,7 +594,7 @@ fn_mod_get_info_from_command(){ fi } -fn_gsm_requirements +fn_lgsm_requirements fn_mods_scrape_urls fn_mods_info fn_mods_available From 27b88e3baf7f3c69304a590ef956db3f4b0f3bcc Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 21 Jan 2017 01:04:13 +0000 Subject: [PATCH 0319/1895] "" --- lgsm/functions/command_dev_detect_ldd.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_dev_detect_ldd.sh b/lgsm/functions/command_dev_detect_ldd.sh index 07ad3f581..16f1f9473 100644 --- a/lgsm/functions/command_dev_detect_ldd.sh +++ b/lgsm/functions/command_dev_detect_ldd.sh @@ -22,8 +22,8 @@ elif [ -f "${filesdir}" ]; then fi echo "" -files=$(find ${filesdir} | wc -l) -find ${filesdir} -type f -print0 | +files=$(find "${filesdir}" | wc -l) +find "${filesdir}" -type f -print0 | while IFS= read -r -d $'\0' line; do #ldd -v $line 2>/dev/null|grep "=>" >>"${tmpdir}/detect_ldd.tmp" if [ -n "$(ldd $line 2>/dev/null |grep -v "not a dynamic executable")" ]; then From 4d692f59e2888661cf44f59fe3e8ff2dbb8d1747 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 21 Jan 2017 01:07:19 +0000 Subject: [PATCH 0320/1895] Various UI and code changes. --- lgsm/functions/command_mods_install.sh | 67 +++++------- lgsm/functions/command_mods_remove.sh | 6 +- lgsm/functions/mods_core.sh | 144 ++++++++++++++----------- 3 files changed, 114 insertions(+), 103 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index dec97c7a3..5dca19bf6 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -34,50 +34,41 @@ fn_mods_install_init(){ fn_print_error2_nl "${usermodselect} is not a valid addon/mod." fi done + echo "" + echo "Installing ${modprettyname}" + echo "=================================" + fn_script_log "Installing ${modprettyname}." # Gives a pretty name to the user and get all mod info currentmod="${usermodselect}" - fn_mod_get_info_from_command - fn_print_dots_nl "Installing ${modprettyname}" - sleep 1 - fn_script_log "Installing ${modprettyname}." } # Run all required operation fn_mod_installation(){ - # If a mod was selected - if [ -n "${currentmod}" ]; then - # Get mod info - fn_mod_get_info_from_command - # Check if mod is already installed - fn_mod_already_installed - # Check and create required files - fn_mods_files - # Clear lgsm/tmp/mods dir if exists then recreate it - fn_clear_tmp_mods - fn_mods_tmpdir - # Download mod - fn_mod_dl - # Extract the mod - fn_mod_extract - # Convert to lowercase if needed - fn_mod_lowercase - # Build a file list - fn_mod_fileslist - # Copying to destination - fn_mod_copy_destination - # Ending with installation routines - fn_mod_add_list - # Post install fixes - fn_postinstall_tasks - # Cleaning - fn_clear_tmp_mods - fn_print_ok_nl "${modprettyname} installed" - fn_script_log "${modprettyname} installed." - else - fn_print_fail "No addon/mod was selected" - exitcode="1" - core_exit.sh - fi + # Get mod info + fn_mod_get_info_from_command + # Check if mod is already installed + fn_mod_already_installed + # Check and create required files + fn_mods_files + # Clear lgsm/tmp/mods dir if exists then recreate it + fn_clear_tmp_mods + fn_mods_tmpdir + # Download & extract mod + fn_install_mod_dl_extract + # Convert to lowercase if needed + fn_mod_lowercase + # Build a file list + fn_mod_fileslist + # Copying to destination + fn_mod_copy_destination + # Ending with installation routines + fn_mod_add_list + # Post install fixes + fn_postinstall_tasks + # Cleaning + fn_clear_tmp_mods + echo "${modprettyname} installed" + fn_script_log "${modprettyname} installed." } fn_mods_install_init diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index d49b81441..464b2caff 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -60,7 +60,7 @@ fn_mod_remove_process(){ modfileline="1" while [ "${modfileline}" -le "${modsfilelistsize}" ]; do # Current line defines current file to remove - currentfileremove="$(sed "${modfileline}q;d" "${modsdatadir}/${modcommand}-files.list")" + currentfileremove="$(sed "${modfileline}q;d" "${modsdatadir}/${modcommand}-files.txt")" # If file or directory exists, then remove it if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then fn_script_log "Removing: ${modinstalldir}/${currentfileremove}" @@ -69,8 +69,8 @@ fn_mod_remove_process(){ let modfileline=modfileline+1 done # Remove file list - fn_script_log "Removing: ${modsdatadir}/${modcommand}-files.list" - rm -rf "${modsdatadir}/${modcommand}-files.list" + fn_script_log "Removing: ${modsdatadir}/${modcommand}-files.txt" + rm -rf "${modsdatadir}/${modcommand}-files.txt" # Remove from installed mods list fn_script_log "Removing: ${modcommand} from ${modslockfilefullpath}" sed -i "/^${modcommand}$/d" "${modslockfilefullpath}" diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index cc67fd4f3..47fa1ecf8 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -11,9 +11,10 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" ## Useful variables # Files and Directories -modstmpdir="${tmpdir}/mods" -extractdir="${modstmpdir}/extracted" -modsdatadir="${lgsmdir}/data/mods" +modsdir="${lgsmdir}/mods" +modstmpdir="${modsdir}/tmp" +extractdir="${modstmpdir}/extract" +modsdatadir="${modsdir}" modslockfile="installed-mods-listing" modslockfilefullpath="${modsdatadir}/${modslockfile}" # Database initialisation @@ -34,13 +35,11 @@ fn_lgsm_requirements(){ fn_mods_files(){ if [ ! -d "${modinstalldir}" ]; then fn_script_log_info "Creating mods directory: ${modinstalldir}" - fn_print_dots "Creating mods directory" - sleep 0.5 - mkdir -p "${modinstalldir}" - fn_print_ok "Created mods directory" + echo "Creating mods directory" sleep 0.5 + mkdir -pv "${modinstalldir}" fi - # Create lgsm/data/mods directory + # Create data/mods directory if [ ! -d "${modsdatadir}" ]; then mkdir -p "${modsdatadir}" fn_script_log "Created ${modsdatadir}" @@ -52,11 +51,11 @@ fn_mods_files(){ fi } -# Clear mod download directory so that there is only one file in it since we don't the file name and extention +# Clear mod download directory so that there is only one file in it since we don't know the file name and extention fn_clear_tmp_mods(){ if [ -d "${modstmpdir}" ]; then rm -r "${modstmpdir}" - fn_script_log "Clearing temp mod download directory: ${modstmpdir}" + fn_script_log "Clearing mod download directory: ${modstmpdir}" fi # Clear temp file list as well if [ -f "${modsdatadir}/.removedfiles.tmp" ]; then @@ -68,44 +67,49 @@ fn_clear_tmp_mods(){ fn_mods_tmpdir(){ if [ ! -d "${modstmpdir}" ]; then mkdir -p "${modstmpdir}" - fn_script_log "Creating temp mod download directory: ${modstmpdir}" + fn_script_log "Creating mod download directory: ${modstmpdir}" fi } -# Fetches mod URL -fn_mod_dl(){ - # fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" - fileurl="${modurl}" - filedir="${modstmpdir}" - filename="${modfilename}" - fn_script_log "Downloading mods to ${modstmpdir}" - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" +fn_install_mod_dl_extract(){ + fn_fetch_file "${modurl}" "${modstmpdir}" "${modfilename}" # Check if variable is valid checking if file has been downloaded and exists if [ ! -f "${modstmpdir}/${modfilename}" ]; then - fn_print_fail "An issue occurred upon downloading ${modprettyname}" + fn_print_failure "An issue occurred upon downloading ${modprettyname}" core_exit.sh fi -} - -# Extract the mod -fn_mod_extract(){ - # fn_dl_extract "${filedir}" "${filename}" "${extractdir}" - filename="${modfilename}" if [ ! -d "${extractdir}" ]; then mkdir -p "${extractdir}" fi - fn_script_log "Extracting ${modprettyname} to ${extractdir}" - fn_dl_extract "${filedir}" "${filename}" "${extractdir}" + fn_dl_extract "${modstmpdir}" "${filename}" "${extractdir}" } # Convert mod files to lowercase if needed fn_mod_lowercase(){ if [ "${modlowercase}" == "LowercaseOn" ]; then - fn_print_dots "Converting ${modprettyname} files to lowercase" + + echo -ne "converting ${modprettyname} files to lowercase..." sleep 0.5 fn_script_log "Converting ${modprettyname} files to lowercase" - find "${extractdir}" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \; - fn_print_ok "Converting ${modprettyname} files to lowercase" + files=$(find "${extractdir}" -depth | wc -l) + echo -en "\r" + while read SRC; do + DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'` + if [ "${SRC}" != "${DST}" ] + then + [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed" + ((renamedwc++)) + fi + echo -ne "${renamedwc} / ${totalfileswc} / $files converting ${modprettyname} files to lowercase..." $'\r' + ((totalfileswc++)) + done < <(find "${extractdir}" -depth) + echo -ne "${renamedwc} / ${totalfileswc} / $files converting ${modprettyname} files to lowercase..." + local exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + else + fn_print_ok_eol_nl + fi sleep 0.5 fi } @@ -139,30 +143,39 @@ fn_remove_cfg_files(){ fi } -# Create ${modcommand}-files.list containing the full extracted file/directory list +# Create ${modcommand}-files.txt containing the full extracted file/directory list fn_mod_fileslist(){ - fn_print_dots "Building ${modcommand}-files.list" - fn_script_log "Building ${modcommand}-files.list" + echo -ne "building ${modcommand}-files.txt..." + fn_script_log "Building ${modcommand}-files.txt" sleep 0.5 - # ${modsdatadir}/${modcommand}-files.list - find "${extractdir}" -mindepth 1 -printf '%P\n' > "${modsdatadir}"/${modcommand}-files.list - fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.list}" + # ${modsdatadir}/${modcommand}-files.txt + find "${extractdir}" -mindepth 1 -printf '%P\n' > "${modsdatadir}"/${modcommand}-files.txt + local exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + else + fn_print_ok_eol_nl + fi + fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.txt}" # Adding removed files if needed if [ -f "${modsdatadir}/.removedfiles.tmp" ]; then - cat "${modsdatadir}/.removedfiles.tmp" >> "${modsdatadir}"/${modcommand}-files.list + cat "${modsdatadir}/.removedfiles.tmp" >> "${modsdatadir}"/${modcommand}-files.txt fi - fn_print_ok "Building ${modcommand}-files.list" sleep 0.5 } # Copy the mod to the destination ${modinstalldir} fn_mod_copy_destination(){ - fn_print_dots "Copying ${modprettyname} to ${modinstalldir}" + echo -ne "copying ${modprettyname} to ${modinstalldir}..." fn_script_log "Copying ${modprettyname} to ${modinstalldir}" sleep 0.5 cp -Rf "${extractdir}/." "${modinstalldir}/" - fn_print_ok "Copying ${modprettyname} to ${modinstalldir}" - sleep 0.5 + local exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + else + fn_print_ok_eol_nl + fi } # Check if the mod is already installed and warn the user @@ -196,21 +209,21 @@ fn_mod_add_list(){ fn_check_files_list(){ # File list must exist and be valid before any operation on it - if [ -f "${modsdatadir}/${modcommand}-files.list" ]; then + if [ -f "${modsdatadir}/${modcommand}-files.txt" ]; then # How many lines is the file list - modsfilelistsize="$(cat "${modsdatadir}/${modcommand}-files.list" | wc -l)" + modsfilelistsize="$(cat "${modsdatadir}/${modcommand}-files.txt" | wc -l)" # If file list is empty if [ $modsfilelistsize -eq 0 ]; then - fn_print_error_nl "${modcommand}-files.list is empty" + fn_print_error_nl "${modcommand}-files.txt is empty" echo "Exiting." - fn_scrip_log_fatal "${modcommand}-files.list is empty" + fn_scrip_log_fatal "${modcommand}-files.txt is empty" exitcode="2" core_exit.sh fi else - fn_print_error_nl "${modsdatadir}/${modcommand}-files.list don't exist" + fn_print_error_nl "${modsdatadir}/${modcommand}-files.txt don't exist" echo "Exiting." - fn_scrip_log_fatal "${modsdatadir}/${modcommand}-files.list don't exist" + fn_scrip_log_fatal "${modsdatadir}/${modcommand}-files.txt don't exist" exitcode="2" core_exit.sh fi @@ -218,13 +231,13 @@ fn_check_files_list(){ # Apply some post-install fixes to make sure everything will be fine fn_postinstall_tasks(){ - # Prevent sensitive directories from being erased upon uninstall by removing them them from: ${modsdatadir}/${modcommand}-files.list + # Prevent sensitive directories from being erased upon uninstall by removing them from: ${modsdatadir}/${modcommand}-files.txt # Check file validity fn_check_files_list # Output to the user - fn_print_dots "Rearranging ${modcommand}-files.list" + echo -ne "tidy up ${modcommand}-files.txt..." sleep 0.5 - fn_script_log_info "Rearranging ${modcommand}-files.list" + fn_script_log_info "Rearranging ${modcommand}-files.txt" # What lines/files to remove from file list (end var with a ";" separator) removefromlist="cfg;addons;" # Loop through files to remove from file list, @@ -236,18 +249,25 @@ fn_postinstall_tasks(){ # Put current file into test variable removefilevar="$( echo "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }' )" # Then delete matching line(s)! - sed -i "/^${removefilevar}$/d" "${modsdatadir}/${modcommand}-files.list" - done - + sed -i "/^${removefilevar}$/d" "${modsdatadir}/${modcommand}-files.txt" + local exitcode=$? + if [ ${exitcode} -ne 0 ]; then + break + fi + done + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + else + fn_print_ok_eol_nl + fi + # Sourcemod fix # Remove metamod from sourcemod fileslist if [ "${modcommand}" == "sourcemod" ]; then - # Remove addons/metamod & addons/metamod/sourcemod.vdf from ${modcommand}-files.list - sed -i "/^addons\/metamod$/d" "${modsdatadir}/${modcommand}-files.list" - sed -i "/^addons\/metamod\/sourcemod.vdf$/d" "${modsdatadir}/${modcommand}-files.list" + # Remove addons/metamod & addons/metamod/sourcemod.vdf from ${modcommand}-files.txt + sed -i "/^addons\/metamod$/d" "${modsdatadir}/${modcommand}-files.txt" + sed -i "/^addons\/metamod\/sourcemod.vdf$/d" "${modsdatadir}/${modcommand}-files.txt" fi - fn_print_ok "Rearranging ${modcommand}-files.list" - sleep 0.5 } # Apply some post-uninstall fixes to make sure everything will be fine @@ -444,7 +464,7 @@ fn_mods_exit_if_not_installed(){ # Also returns ${installedmodscount} if mods were found fn_check_installed_mods # If no mods lockfile is found or if it is empty - if [ ! -f "${modslockfilefullpath}" ]||[ -z "${installedmodscount}" ]||[ $installedmodscount -le 0 ]; then + if [ ! -f "${modslockfilefullpath}" ]||[ -z "${installedmodscount}" ]||[ ${installedmodscount} -le 0 ]; then fn_print_information_nl "No installed mods or addons were found" echo " * Install mods using LGSM first with: ./${selfname} mods-install" fn_script_log_info "No installed mods or addons were found." @@ -459,7 +479,7 @@ fn_mods_available_commands_from_installed(){ installedmodsline="1" installedmodslist=() # Loop through every line of the installed mods list ${modslockfilefullpath} - while [ $installedmodsline -le $installedmodscount ]; do + while [ ${installedmodsline} -le ${installedmodscount} ]; do currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")" # Get mod info to make sure mod exists fn_mod_get_info_from_command @@ -556,7 +576,7 @@ fn_installed_mods_update_list(){ elif [ "${modkeepfiles}" == "OVERWRITE" ]; then echo -e " * \e[1m${modprettyname}${default} (overwrite)" else - echo -e " * \e[33m${modprettyname}${default} (common custom files remain untouched)" + echo -e " * ${yellow}${modprettyname}${default} (common custom files remain untouched)" fi done } From 1985955f3a2d9a0147877afe661e4c1392488a15 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 21 Jan 2017 22:39:39 +0000 Subject: [PATCH 0321/1895] Loads of UI improvements and fixes still lots of testing to do --- lgsm/functions/command_mods_install.sh | 4 +- lgsm/functions/command_mods_remove.sh | 54 +++++++++++++++++++---- lgsm/functions/mods_core.sh | 60 ++++++++++++++------------ lgsm/functions/mods_list.sh | 6 +-- 4 files changed, 82 insertions(+), 42 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 5dca19bf6..0169589c7 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -29,14 +29,14 @@ fn_mods_install_init(){ # Exit if user says exit or abort if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then core_exit.sh - # Supplementary output upon invalid user input + # Supplementary output upon invalid user input elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then fn_print_error2_nl "${usermodselect} is not a valid addon/mod." fi done echo "" echo "Installing ${modprettyname}" - echo "=================================" + echo "=================================" fn_script_log "Installing ${modprettyname}." # Gives a pretty name to the user and get all mod info currentmod="${usermodselect}" diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 464b2caff..060898aa8 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -19,7 +19,6 @@ fn_mods_remove_init(){ # A simple function to exit if no mods were installed # Also returns ${installedmodscount} if mods were found fn_mods_exit_if_not_installed - echo "" # Displays installed addons to the user fn_installed_mods_medium_list echo "" @@ -30,12 +29,12 @@ fn_mods_remove_init(){ # Exit if user says exit or abort if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then core_exit.sh - # Supplementary output upon invalid user input + # Supplementary output upon invalid user input elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then fn_print_error2_nl "${usermodselect} is not a valid addon/mod." fi done - fn_print_warning_nl "You are about to remove ${usermodselect}." + fn_print_warning_nl "You are about to remove ${cyan}${usermodselect}${default}." echo " * Any custom files/configuration will be removed." while true; do read -e -i "y" -p "Continue? [Y/n]" yn @@ -44,40 +43,77 @@ fn_mods_remove_init(){ [Nn]* ) echo Exiting; exit;; * ) echo "Please answer yes or no.";; esac - done + done # Gives a pretty name to the user and get all mod info currentmod="${usermodselect}" fn_mod_get_info_from_command # Check file list in order to make sure we're able to remove the mod (returns ${modsfilelistsize}) fn_check_files_list - fn_script_log "Removing ${modsfilelistsize} files from ${modprettyname}" - fn_print_dots "Removing ${modsfilelistsize} files from ${modprettyname}" + } # Uninstall the mod fn_mod_remove_process(){ + fn_script_log "Removing ${modsfilelistsize} files from ${modprettyname}" + echo -e "removing ${modprettyname}" + echo -e "* ${modsfilelistsize} files to be removed" + echo -e "* location: ${modinstalldir}" + sleep 1 # Go through every file and remove it modfileline="1" + tput sc while [ "${modfileline}" -le "${modsfilelistsize}" ]; do # Current line defines current file to remove currentfileremove="$(sed "${modfileline}q;d" "${modsdatadir}/${modcommand}-files.txt")" # If file or directory exists, then remove it + fn_script_log "Removing: ${modinstalldir}/${currentfileremove}" if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then - fn_script_log "Removing: ${modinstalldir}/${currentfileremove}" rm -rf "${modinstalldir}/${currentfileremove}" + local exitcode=$? fi + tput rc; tput el + printf "removing ${modprettyname} ${totalfileswc} / ${modsfilelistsize} : ${currentfileremove}..." + + ((totalfileswc++)) let modfileline=modfileline+1 done + tput rc; tput ed; + echo -ne "removing ${modprettyname} ${totalfileswc} / ${modsfilelistsize}..." + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi + sleep 0.5 # Remove file list + echo -en "removing ${modcommand}-files.txt..." + sleep 0.5 fn_script_log "Removing: ${modsdatadir}/${modcommand}-files.txt" rm -rf "${modsdatadir}/${modcommand}-files.txt" + local exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi # Remove from installed mods list + echo -en "removing ${modcommand} from ${modslockfile}..." + sleep 0.5 fn_script_log "Removing: ${modcommand} from ${modslockfilefullpath}" sed -i "/^${modcommand}$/d" "${modslockfilefullpath}" # Post install tasks to solve potential issues + local exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi fn_postuninstall_tasks - fn_print_ok_nl "Removed ${modprettyname}" - fn_script_log "Removed ${modprettyname}" + echo "${modprettyname} removed" + fn_script_log "${modprettyname} removed" } fn_mods_remove_init diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 47fa1ecf8..aead8e714 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -93,21 +93,23 @@ fn_mod_lowercase(){ fn_script_log "Converting ${modprettyname} files to lowercase" files=$(find "${extractdir}" -depth | wc -l) echo -en "\r" - while read SRC; do - DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'` - if [ "${SRC}" != "${DST}" ] - then - [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed" - ((renamedwc++)) - fi + while read src; do + dst=`dirname "${src}"`/`basename "${src}" | tr '[A-Z]' '[a-z]'` + if [ "${src}" != "${dst}" ] + then + [ ! -e "${dst}" ] && mv -T "${src}" "${dst}" || echo "${src} was not renamed" + local exitcode=$? + ((renamedwc++)) + fi echo -ne "${renamedwc} / ${totalfileswc} / $files converting ${modprettyname} files to lowercase..." $'\r' ((totalfileswc++)) done < <(find "${extractdir}" -depth) echo -ne "${renamedwc} / ${totalfileswc} / $files converting ${modprettyname} files to lowercase..." - local exitcode=$? + if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - else + core_exit.sh + else fn_print_ok_eol_nl fi sleep 0.5 @@ -153,7 +155,7 @@ fn_mod_fileslist(){ local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - else + else fn_print_ok_eol_nl fi fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.txt}" @@ -173,7 +175,7 @@ fn_mod_copy_destination(){ local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - else + else fn_print_ok_eol_nl fi } @@ -213,19 +215,16 @@ fn_check_files_list(){ # How many lines is the file list modsfilelistsize="$(cat "${modsdatadir}/${modcommand}-files.txt" | wc -l)" # If file list is empty - if [ $modsfilelistsize -eq 0 ]; then - fn_print_error_nl "${modcommand}-files.txt is empty" - echo "Exiting." - fn_scrip_log_fatal "${modcommand}-files.txt is empty" - exitcode="2" + if [ "${modsfilelistsize}" -eq 0 ]; then + fn_print_failure "${modcommand}-files.txt is empty" + echo "* Unable to remove ${modprettyname}" + fn_script_log_fatal "${modcommand}-files.txt is empty: Unable to remove ${modprettyname}." core_exit.sh fi else - fn_print_error_nl "${modsdatadir}/${modcommand}-files.txt don't exist" - echo "Exiting." - fn_scrip_log_fatal "${modsdatadir}/${modcommand}-files.txt don't exist" - exitcode="2" - core_exit.sh + fn_print_failure "${modsdatadir}/${modcommand}-files.txt does not exist" + fn_script_log_fatal "${modsdatadir}/${modcommand}-files.txt does not exist: Unable to remove ${modprettyname}." + core_exit.sh fi } @@ -253,11 +252,11 @@ fn_postinstall_tasks(){ local exitcode=$? if [ ${exitcode} -ne 0 ]; then break - fi - done + fi + done if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - else + else fn_print_ok_eol_nl fi @@ -527,7 +526,7 @@ fn_installed_mods_medium_list(){ # Displays a simple list of installed mods # Requires fn_check_installed_mods and fn_mods_available_commands_from_installed to run -# This list is only displayed when some mods are installed +# This list is only displayed when some mods are installed fn_installed_mods_light_list(){ fn_check_installed_mods fn_mods_available_commands_from_installed @@ -575,9 +574,11 @@ fn_installed_mods_update_list(){ # If the mode is just overwritten elif [ "${modkeepfiles}" == "OVERWRITE" ]; then echo -e " * \e[1m${modprettyname}${default} (overwrite)" - else + else echo -e " * ${yellow}${modprettyname}${default} (common custom files remain untouched)" fi + ((totalmodsinstalled++)) + fn_script_log_info "${totalmodsinstalled} are already installed" done } @@ -598,17 +599,20 @@ fn_mod_get_info_from_command(){ modinfocommand="1" break fi + ((totalmods++)) done + fi # Exit the loop if job is done if [ "${modinfocommand}" == "1" ]; then break fi done + fn_script_log_info "${totalmods} are available for install" # What happens if mod is not found if [ "${modinfocommand}" == "0" ]; then - fn_script_log_error "Couldn't find information for ${currentmod}" - fn_print_error_nl "Couldn't find information for ${currentmod}" + fn_script_log_error "Could not find information for ${currentmod}" + fn_print_error_nl "Could not find information for ${currentmod}" exitcode="1" core_exit.sh fi diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 7f795cbe1..298da3ce1 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -4,7 +4,7 @@ # Contributor: UltimateByte # Website: https://gameservermanagers.com # Description: Lists and defines available mods for LGSM supported servers. -# Usage: To add a mod, you just need to add an array variable into fn_mods_info following the guide to set proper values. +# Usage: To add a mod, you just need to add an array variable into fn_mods_info following the guide to set proper values. # Usage: Then add this array to the mods_global_array. # Usage: If needed, you can scrape to define the download URL inside the fn_mods_scrape_urls function. @@ -35,7 +35,7 @@ fn_mods_info(){ # [7] | "modinstalldir": the directory in which to install the mode ( use LGSM dir variables such as ${systemdir}) # [8] | "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" to ignore the value or "NOUPDATE" to disallow updating # [9] | "Supported Engines;": list them according to LGSM ${engine} variables, separated and ended with a semicolon, or use ENGINES to ignore the value - # [10] | "Supported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use GAMES to ignore the value + # [10] | "Supported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use GAMES to ignore the value # [11] | "Unsupported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use NOTGAMES to ignore the value (useful to exclude a game when using Supported Engines) # [12] | "AUTHOR_URL" is the author's website, displayed to the user when chosing mods to install # [13] | "Short Description" a description showed to the user upon installation @@ -64,7 +64,7 @@ fn_mods_info(){ # Get a proper URL for mods that don't provide a good one (optional) fn_mods_scrape_urls(){ - fn_script_log "Retriving latest mods URLs" + fn_script_log_info "retrieving latest mods URLs" # Metamod metamodscrapeurl="http://www.gsptalk.com/mirror/sourcemod" metamodlatestfile="$(wget "${metamodscrapeurl}/?MD" -q -O -| grep "mmsource" | grep "\-linux" | head -n1 | awk -F '>' '{ print $3 }' | awk -F '<' '{ print $1}')" From 23030d8e0e5a3a2082bb443f2e718fbc7d25d348 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 22 Jan 2017 00:00:10 +0000 Subject: [PATCH 0322/1895] Altered script log message for extracting --- 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 b1db1b8fd..f7768a7cf 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -54,7 +54,6 @@ fn_dl_extract(){ extractdir="${3}" # extracts archives echo -ne "extracting ${filename}..." - fn_script_log_info "Extracting download" mime=$(file -b --mime-type "${filedir}/${filename}") if [ "${mime}" == "application/gzip" ]||[ "${mime}" == "application/x-gzip" ]; then @@ -72,6 +71,7 @@ fn_dl_extract(){ core_exit.sh else fn_print_ok_eol_nl + fn_script_log_pass "Extracting download: OK" fi } From e0e071139f49167acc1e8af8b55f5be987ff4741 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 22 Jan 2017 00:02:07 +0000 Subject: [PATCH 0323/1895] removed color from log --- lgsm/functions/check_deps.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 924d3f19b..4a040b13a 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -78,7 +78,7 @@ fn_found_missing_deps(){ fn_print_dots "Checking dependencies" sleep 0.5 fn_print_error_nl "Checking dependencies: missing: ${red}${array_deps_missing[@]}${default}" - fn_script_log_error "Checking dependencies: missing: ${red}${array_deps_missing[@]}${default}" + fn_script_log_error "Checking dependencies: missing: ${array_deps_missing[@]}" sleep 1 sudo -v > /dev/null 2>&1 if [ $? -eq 0 ]; then @@ -204,7 +204,7 @@ if [ -n "$(command -v dpkg-query)" ]; then array_deps_required+=( zlib1g:i386 libldap-2.4-2:i386 ) # Serious Sam 3: BFE elif [ "${gamename}" == "Serious Sam 3: BFE" ]; then - array_deps_required+=( libxrandr2:i386 libglu1-mesa:i386 libxtst6:i386 libusb-1.0-0-dev:i386 libxxf86vm1:i386 libopenal1:i386 libssl1.0.0:i386 libgtk2.0-0:i386 libdbus-glib-1-2:i386 libnm-glib-dev:i386 ) + array_deps_required+=( libxrandr2:i386 libglu1-mesa:i386 libxtst6:i386 libusb-1.0-0-dev:i386 libxxf86vm1:i386 libopenal1:i386 libssl1.0.0:i386 libgtk2.0-0:i386 libdbus-glib-1-2:i386 libnm-glib-dev:i386 ) # Unreal Engine elif [ "${executable}" == "./ucc-bin" ]; then #UT2K4 From 1f566a9a4e176146efacf0a99207cec97efcd580 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 22 Jan 2017 00:10:24 +0000 Subject: [PATCH 0324/1895] Reverting [ERROR!] to [ERROR ] b4d3bb549e36198d332e4e5decd6bc30231791e0 No other message have an ! and is not consistant. Nothing I can do about the space. --- lgsm/functions/core_messages.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 66a1d6d80..632b01378 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -157,9 +157,9 @@ fn_print_fail_nl(){ # [ ERROR ] fn_print_error(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${red}ERROR!${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${red}ERROR ${default}] ${commandaction} ${servicename}: $@" else - echo -en "${creeol}[${red}ERROR!${default}] $@" + echo -en "${creeol}[${red}ERROR ${default}] $@" fi } From 5b4a172edc1da298824bd38d5beb344c6ea0f512 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 22 Jan 2017 00:57:28 +0000 Subject: [PATCH 0325/1895] removed space --- lgsm/functions/command_dev_debug.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh index 6186c0fb0..e17a8a719 100644 --- a/lgsm/functions/command_dev_debug.sh +++ b/lgsm/functions/command_dev_debug.sh @@ -8,7 +8,6 @@ local commandname="DEV-DEBUG" local commandaction="Dev-Debug" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - if [ -f "${rootdir}/.dev-debug" ]; then rm "${rootdir}/.dev-debug" fn_print_ok_nl "Disabled dev-debug" From 8b3721f25a3af83545e3ffad1bc17097fb890a34 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 22 Jan 2017 00:58:05 +0000 Subject: [PATCH 0326/1895] Many various changes Im being laxy with commits. Still work to be done --- lgsm/functions/command_mods_install.sh | 11 +- lgsm/functions/command_mods_remove.sh | 5 +- lgsm/functions/command_mods_update.sh | 4 +- lgsm/functions/mods_core.sh | 168 ++++++++++++++----------- lgsm/functions/mods_list.sh | 4 +- 5 files changed, 107 insertions(+), 85 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 0169589c7..d15250594 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -9,9 +9,6 @@ local commandname="MODS" local commandaction="addons/mods" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -check.sh -mods_core.sh - fn_mods_install_init(){ fn_print_header # Display installed mods @@ -37,7 +34,7 @@ fn_mods_install_init(){ echo "" echo "Installing ${modprettyname}" echo "=================================" - fn_script_log "Installing ${modprettyname}." + fn_script_log_info "${modprettyname} selected for install" # Gives a pretty name to the user and get all mod info currentmod="${usermodselect}" } @@ -68,9 +65,11 @@ fn_mod_installation(){ # Cleaning fn_clear_tmp_mods echo "${modprettyname} installed" - fn_script_log "${modprettyname} installed." + fn_script_log_pass "${modprettyname} installed." } +check.sh +mods_core.sh fn_mods_install_init fn_mod_installation -core_exit.sh +core_exit.sh \ No newline at end of file diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 060898aa8..6c8fdf0bb 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -9,8 +9,7 @@ local commandname="MODS" local commandaction="addons/mods" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -check.sh -mods_core.sh + fn_mods_remove_init(){ fn_print_header @@ -116,6 +115,8 @@ fn_mod_remove_process(){ fn_script_log "${modprettyname} removed" } +check.sh +mods_core.sh fn_mods_remove_init fn_mod_remove_process core_exit.sh diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 9eb257907..ad757da6c 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -9,8 +9,6 @@ local commandname="MODS" local commandaction="Mods Update" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -check.sh -mods_core.sh fn_mods_update_init(){ fn_script_log "Entering mods & addons update" @@ -84,6 +82,8 @@ fn_mods_update_loop(){ fn_script_log "Mods update complete." } +check.sh +mods_core.sh fn_mods_update_init fn_mods_update_loop core_exit.sh diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index aead8e714..4295fc478 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -9,68 +9,84 @@ local commandname="MODS" local commandaction="addons/mods" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -## Useful variables # Files and Directories modsdir="${lgsmdir}/mods" modstmpdir="${modsdir}/tmp" extractdir="${modstmpdir}/extract" -modsdatadir="${modsdir}" -modslockfile="installed-mods-listing" -modslockfilefullpath="${modsdatadir}/${modslockfile}" +modsinstalledlist="installed-mods.txt" +modsinstalledlistfullpath="${modsdir}/${modsinstalledlist}" + # Database initialisation mods_list.sh -# Sets some lgsm requirements -fn_lgsm_requirements(){ - # If tmpdir variable doesn't exist, LGSM is too old - if [ -z "${tmpdir}" ]||[ -z "${lgsmdir}" ]; then - fn_print_fail "Your LinuxGSM version is too old." - echo " * Please do a full update, including ${selfname} script." - core_exit.sh - fi -} +## Directory management # Create mods files and directories if it doesn't exist # Assuming the game is already installed as mods_list.sh checked for it. fn_mods_files(){ + # Create mod install directory if [ ! -d "${modinstalldir}" ]; then - fn_script_log_info "Creating mods directory: ${modinstalldir}" - echo "Creating mods directory" + echo "creating mods install directory ${modinstalldir}..." + mkdir -p "${modinstalldir}" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Creating mod download dir ${modstmpdir}" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "Creating mod download dir ${modstmpdir}" + fi sleep 0.5 - mkdir -pv "${modinstalldir}" fi - # Create data/mods directory - if [ ! -d "${modsdatadir}" ]; then - mkdir -p "${modsdatadir}" - fn_script_log "Created ${modsdatadir}" + + # Create lgsm/data/${modsinstalledlist} + if [ ! -f "${modsinstalledlistfullpath}" ]; then + touch "${modsinstalledlistfullpath}" + fn_script_log "Created ${modsinstalledlistfullpath}" fi - # Create lgsm/data/${modslockfile} - if [ ! -f "${modslockfilefullpath}" ]; then - touch "${modslockfilefullpath}" - fn_script_log "Created ${modslockfilefullpath}" +} + +# Create tmp download mod directory +fn_mods_tmpdir(){ + if [ ! -d "${modstmpdir}" ]; then + mkdir -p "${modstmpdir}" + exitcode=$? + echo -ne "creating mod download dir ${modstmpdir}..." + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Creating mod download dir ${modstmpdir}" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "Creating mod download dir ${modstmpdir}" + fi fi } -# Clear mod download directory so that there is only one file in it since we don't know the file name and extention +# Clear contents of mod download directory when finished fn_clear_tmp_mods(){ if [ -d "${modstmpdir}" ]; then - rm -r "${modstmpdir}" - fn_script_log "Clearing mod download directory: ${modstmpdir}" + rm -r "${modstmpdir}"/* + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Clearing mod download directory ${modstmpdir}" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "Clearing mod download directory ${modstmpdir}" + fi + fi # Clear temp file list as well - if [ -f "${modsdatadir}/.removedfiles.tmp" ]; then - rm "${modsdatadir}/.removedfiles.tmp" + if [ -f "${modsdir}/.removedfiles.tmp" ]; then + rm "${modsdir}/.removedfiles.tmp" fi } -# Create tmp download mod directory -fn_mods_tmpdir(){ - if [ ! -d "${modstmpdir}" ]; then - mkdir -p "${modstmpdir}" - fn_script_log "Creating mod download directory: ${modstmpdir}" - fi -} +## Download management fn_install_mod_dl_extract(){ fn_fetch_file "${modurl}" "${modstmpdir}" "${modfilename}" # Check if variable is valid checking if file has been downloaded and exists @@ -134,10 +150,10 @@ fn_remove_cfg_files(){ # Then delete the file! rm -r "${extractdir}/${filetoremove}" # Write this file path in a tmp file, to rebuild a full file list since it is rebuilt upon update - if [ ! -f "${modsdatadir}/.removedfiles.tmp" ]; then - touch "${modsdatadir}/.removedfiles.tmp" + if [ ! -f "${modsdir}/.removedfiles.tmp" ]; then + touch "${modsdir}/.removedfiles.tmp" fi - echo "${filetoremove}" >> "${modsdatadir}/.removedfiles.tmp" + echo "${filetoremove}" >> "${modsdir}/.removedfiles.tmp" fi done fn_print_ok "Allow for preserving ${modprettyname} config files" @@ -148,20 +164,23 @@ fn_remove_cfg_files(){ # Create ${modcommand}-files.txt containing the full extracted file/directory list fn_mod_fileslist(){ echo -ne "building ${modcommand}-files.txt..." - fn_script_log "Building ${modcommand}-files.txt" + sleep 0.5 - # ${modsdatadir}/${modcommand}-files.txt - find "${extractdir}" -mindepth 1 -printf '%P\n' > "${modsdatadir}"/${modcommand}-files.txt + # ${modsdir}/${modcommand}-files.txt + find "${extractdir}" -mindepth 1 -printf '%P\n' > "${modsdir}"/${modcommand}-files.txt local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl + fn_script_log_fatal "Building ${modcommand}-files.txt" + core_exit.sh else fn_print_ok_eol_nl + fn_script_log_pass "Building ${modcommand}-files.txt" fi - fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.txt}" + fn_script_log "Writing file list ${modsdir}/${modcommand}-files.txt" # Adding removed files if needed - if [ -f "${modsdatadir}/.removedfiles.tmp" ]; then - cat "${modsdatadir}/.removedfiles.tmp" >> "${modsdatadir}"/${modcommand}-files.txt + if [ -f "${modsdir}/.removedfiles.tmp" ]; then + cat "${modsdir}/.removedfiles.tmp" >> "${modsdir}"/${modcommand}-files.txt fi sleep 0.5 } @@ -169,24 +188,26 @@ fn_mod_fileslist(){ # Copy the mod to the destination ${modinstalldir} fn_mod_copy_destination(){ echo -ne "copying ${modprettyname} to ${modinstalldir}..." - fn_script_log "Copying ${modprettyname} to ${modinstalldir}" sleep 0.5 cp -Rf "${extractdir}/." "${modinstalldir}/" local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl + fn_script_log_fatal "Copying ${modprettyname} to ${modinstalldir}" else fn_print_ok_eol_nl + fn_script_log_pass "Copying ${modprettyname} to ${modinstalldir}" fi } # Check if the mod is already installed and warn the user fn_mod_already_installed(){ - if [ -f "${modslockfilefullpath}" ]; then - if [ -n "$(sed -n "/^${modcommand}$/p" "${modslockfilefullpath}")" ]; then - fn_print_warning_nl "${modprettyname} has already been installed" + if [ -f "${modsinstalledlistfullpath}" ]; then + if [ -n "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then + fn_print_warning_nl "${modprettyname} is already installed" + fn_script_log_warn "${modprettyname} is already installed" sleep 1 - echo " * Config files, if any, might be overwritten." + echo " * Any configs may be overwritten." while true; do read -e -i "y" -p "Continue? [Y/n]" yn case $yn in @@ -196,24 +217,24 @@ fn_mod_already_installed(){ esac done fi - fn_script_log "${modprettyname} is already installed, overwriting any file." + fn_script_log_info "User selected to continue" fi } # Add the mod to the installed mods list fn_mod_add_list(){ # Append modname to lockfile if it's not already in it - if [ ! -n "$(sed -n "/^${modcommand}$/p" "${modslockfilefullpath}")" ]; then - echo "${modcommand}" >> "${modslockfilefullpath}" - fn_script_log "${modcommand} added to ${modslockfile}" + if [ ! -n "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then + echo "${modcommand}" >> "${modsinstalledlistfullpath}" + fn_script_log_info "${modcommand} added to ${modsinstalledlist}" fi } fn_check_files_list(){ # File list must exist and be valid before any operation on it - if [ -f "${modsdatadir}/${modcommand}-files.txt" ]; then + if [ -f "${modsdir}/${modcommand}-files.txt" ]; then # How many lines is the file list - modsfilelistsize="$(cat "${modsdatadir}/${modcommand}-files.txt" | wc -l)" + modsfilelistsize="$(cat "${modsdir}/${modcommand}-files.txt" | wc -l)" # If file list is empty if [ "${modsfilelistsize}" -eq 0 ]; then fn_print_failure "${modcommand}-files.txt is empty" @@ -222,15 +243,15 @@ fn_check_files_list(){ core_exit.sh fi else - fn_print_failure "${modsdatadir}/${modcommand}-files.txt does not exist" - fn_script_log_fatal "${modsdatadir}/${modcommand}-files.txt does not exist: Unable to remove ${modprettyname}." + fn_print_failure "${modsdir}/${modcommand}-files.txt does not exist" + fn_script_log_fatal "${modsdir}/${modcommand}-files.txt does not exist: Unable to remove ${modprettyname}." core_exit.sh fi } # Apply some post-install fixes to make sure everything will be fine fn_postinstall_tasks(){ - # Prevent sensitive directories from being erased upon uninstall by removing them from: ${modsdatadir}/${modcommand}-files.txt + # Prevent sensitive directories from being erased upon uninstall by removing them from: ${modsdir}/${modcommand}-files.txt # Check file validity fn_check_files_list # Output to the user @@ -248,7 +269,7 @@ fn_postinstall_tasks(){ # Put current file into test variable removefilevar="$( echo "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }' )" # Then delete matching line(s)! - sed -i "/^${removefilevar}$/d" "${modsdatadir}/${modcommand}-files.txt" + sed -i "/^${removefilevar}$/d" "${modsdir}/${modcommand}-files.txt" local exitcode=$? if [ ${exitcode} -ne 0 ]; then break @@ -264,8 +285,8 @@ fn_postinstall_tasks(){ # Remove metamod from sourcemod fileslist if [ "${modcommand}" == "sourcemod" ]; then # Remove addons/metamod & addons/metamod/sourcemod.vdf from ${modcommand}-files.txt - sed -i "/^addons\/metamod$/d" "${modsdatadir}/${modcommand}-files.txt" - sed -i "/^addons\/metamod\/sourcemod.vdf$/d" "${modsdatadir}/${modcommand}-files.txt" + sed -i "/^addons\/metamod$/d" "${modsdir}/${modcommand}-files.txt" + sed -i "/^addons\/metamod\/sourcemod.vdf$/d" "${modsdir}/${modcommand}-files.txt" fi } @@ -392,7 +413,7 @@ fn_mod_compatible_test(){ fi } -# Checks if a mod is compatibile for installation +# Checks if a mod is compatible for installation # Provides available mods for installation # Provides commands for mods installation fn_mods_available(){ @@ -439,20 +460,22 @@ fn_mods_show_available(){ echo -e " * ${cyan}${displayedmodcommand}${default}" # Increment index from the amount of values we just displayed let "compatiblemodslistindex+=4" + ((totalmods++)) done # If no mods are found if [ -z "${compatiblemodslist}" ]; then fn_print_fail "No mods are currently available for ${gamename}." core_exit.sh fi + fn_script_log_info "${totalmods} addons/mods are available for install" } # Checks if mods have been installed # Also returns ${installedmodscount} if mods were found fn_check_installed_mods(){ # Count installed mods - if [ -f "${modslockfilefullpath}" ]; then - installedmodscount="$(cat "${modslockfilefullpath}" | wc -l)" + if [ -f "${modsinstalledlistfullpath}" ]; then + installedmodscount="$(cat "${modsinstalledlistfullpath}" | wc -l)" fi } @@ -463,7 +486,7 @@ fn_mods_exit_if_not_installed(){ # Also returns ${installedmodscount} if mods were found fn_check_installed_mods # If no mods lockfile is found or if it is empty - if [ ! -f "${modslockfilefullpath}" ]||[ -z "${installedmodscount}" ]||[ ${installedmodscount} -le 0 ]; then + if [ ! -f "${modsinstalledlistfullpath}" ]||[ -z "${installedmodscount}" ]||[ ${installedmodscount} -le 0 ]; then fn_print_information_nl "No installed mods or addons were found" echo " * Install mods using LGSM first with: ./${selfname} mods-install" fn_script_log_info "No installed mods or addons were found." @@ -477,9 +500,9 @@ fn_mods_available_commands_from_installed(){ # Set/reset variables installedmodsline="1" installedmodslist=() - # Loop through every line of the installed mods list ${modslockfilefullpath} + # Loop through every line of the installed mods list ${modsinstalledlistfullpath} while [ ${installedmodsline} -le ${installedmodscount} ]; do - currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")" + currentmod="$(sed "${installedmodsline}q;d" "${modsinstalledlistfullpath}")" # Get mod info to make sure mod exists fn_mod_get_info_from_command # Add the mod to available commands @@ -487,6 +510,9 @@ fn_mods_available_commands_from_installed(){ # Increment line check let installedmodsline=installedmodsline+1 done + if [ -n "${totalmods}" ] ;then + fn_script_log_info "${totalmods} addons/mods are already installed" + fi } # Displays a detailed list of installed mods @@ -542,6 +568,7 @@ fn_installed_mods_light_list(){ fn_mod_get_info_from_command # Display simple mod info to the user echo -e " * \e[1m${green}${modcommand}${default}${default}" + ((totalmodsinstalled++)) done echo "" fi @@ -577,8 +604,6 @@ fn_installed_mods_update_list(){ else echo -e " * ${yellow}${modprettyname}${default} (common custom files remain untouched)" fi - ((totalmodsinstalled++)) - fn_script_log_info "${totalmodsinstalled} are already installed" done } @@ -608,7 +633,7 @@ fn_mod_get_info_from_command(){ break fi done - fn_script_log_info "${totalmods} are available for install" + # What happens if mod is not found if [ "${modinfocommand}" == "0" ]; then fn_script_log_error "Could not find information for ${currentmod}" @@ -618,7 +643,6 @@ fn_mod_get_info_from_command(){ fi } -fn_lgsm_requirements fn_mods_scrape_urls fn_mods_info fn_mods_available diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 298da3ce1..73584f3dd 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -12,8 +12,6 @@ local commandname="MODS" local commandaction="List Mods" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -check.sh - ## Useful variables # Separator name modseparator="MOD" @@ -64,7 +62,7 @@ fn_mods_info(){ # Get a proper URL for mods that don't provide a good one (optional) fn_mods_scrape_urls(){ - fn_script_log_info "retrieving latest mods URLs" + fn_script_log_info "Retrieving latest mods URLs" # Metamod metamodscrapeurl="http://www.gsptalk.com/mirror/sourcemod" metamodlatestfile="$(wget "${metamodscrapeurl}/?MD" -q -O -| grep "mmsource" | grep "\-linux" | head -n1 | awk -F '>' '{ print $3 }' | awk -F '<' '{ print $1}')" From 939854cfe093779caa0d6b740cb5b8fd79cd5416 Mon Sep 17 00:00:00 2001 From: Braunson Date: Sun, 22 Jan 2017 20:11:23 -0600 Subject: [PATCH 0327/1895] MTA updater --- lgsm/functions/command_update.sh | 4 +- lgsm/functions/core_functions.sh | 5 + lgsm/functions/core_getopt.sh | 9 +- lgsm/functions/install_server_files.sh | 2 + lgsm/functions/update_mta.sh | 149 +++++++++++++++++++++++++ 5 files changed, 165 insertions(+), 4 deletions(-) create mode 100644 lgsm/functions/update_mta.sh diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index 13fff9e90..ca82f541a 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -20,7 +20,9 @@ elif [ "${engine}" == "lwjgl2" ]; then elif [ "${gamename}" == "Mumble" ]; then update_mumble.sh elif [ "${gamename}" == "Factorio" ]; then - update_factorio.sh + update_factorio.sh +elif [ "$Pgamename" == "Multi Theft Auto" ]; then + update_mta.sh else update_steamcmd.sh fi diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index df8b4980c..39737640c 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -462,6 +462,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +update_mta.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + update_factorio.sh(){ functionfile="${FUNCNAME}" fn_fetch_function diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index bc18e3292..721d317e0 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -350,6 +350,8 @@ case "${getopt}" in command_stop.sh;; r|restart) command_restart.sh;; + u|update) + command_update.sh;; uf|update-functions) command_update_functions.sh;; m|monitor) @@ -394,6 +396,7 @@ case "${getopt}" in echo -e "${blue}start\t${default}st |Start the server." echo -e "${blue}stop\t${default}sp |Stop the server." echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update\t${default}u |Checks and applies updates from linux.mtasa.com." echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." echo -e "${blue}monitor\t${default}m |Checks that the server is running." echo -e "${blue}test-alert\t${default}ta |Sends test alert." @@ -845,7 +848,7 @@ elif [ "${gamename}" == "Multi Theft Auto" ]; then # Mumble elif [ "${gamename}" == "Mumble" ]; then fn_getopt_mumble -# Teamspeak 3 +# Teamspeak 3 elif [ "${gamename}" == "TeamSpeak 3" ]; then fn_getopt_teamspeak3 # Unreal 2 Engine @@ -855,14 +858,14 @@ elif [ "${engine}" == "unreal2" ]; then else fn_getopt_unreal2 fi -# Unreal Engine +# Unreal Engine elif [ "${engine}" == "unreal" ]; then fn_getopt_unreal # Generic elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fn_getopt_generic_no_update elif [ "${gamename}" == "Factorio" ]; then - fn_getopt_generic_update_no_steam + fn_getopt_generic_update_no_steam else fn_getopt_generic fi diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index fff0e923d..8d8d8d608 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -131,6 +131,8 @@ elif [ "${gamename}" == "Minecraft" ]; then update_minecraft.sh elif [ "${gamename}" == "Mumble" ]; then update_mumble.sh +elif [ "${gamename}" == "Multi Theft Auto" ]; then + update_mta.sh elif [ "${gamename}" == "Factorio" ]; then update_factorio.sh install_factorio_save.sh diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh new file mode 100644 index 000000000..0268c5d0e --- /dev/null +++ b/lgsm/functions/update_mta.sh @@ -0,0 +1,149 @@ +#!/bin/bash +# LGSM update_mta.sh function +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +# Description: Handles updating of Multi Theft Auto servers. + +local commandname="UPDATE" +local commandaction="Update" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +fn_update_mta_dl(){ + fn_fetch_file "http://linux.mtasa.com/dl/${NUM_VERSION}/multitheftauto_linux_x64-${FUL_VERSION}.tar.gz" + fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${FUL_VERSION}.tar.gz" "${tmpdir}" + echo -e "copying to ${filesdir}...\c" + fn_script_log "Copying to ${filesdir}" + cp -R "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}.tar.gz"* "${filesdir}" + local exitcode=$? + if [ "${exitcode}" == "0" ]; then + fn_print_ok_eol_nl + else + fn_print_fail_eol_nl + fi +} + +fn_update_mta_currentbuild(){ + # Gets current build info + # Checks if current build info is available. If it fails, then a server restart will be forced to generate logs. + if [ ! -f "${consolelogdir}/${servicename}-console.log" ]; then + fn_print_error "Checking for update: linux.mtasa.com" + sleep 1 + fn_print_error_nl "Checking for update: linux.mtasa.com: No logs with server version found" + fn_script_log_error "Checking for update: linux.mtasa.com: No logs with server version found" + sleep 1 + fn_print_info_nl "Checking for update: linux.mtasa.com: Forcing server restart" + fn_script_log_info "Checking for update: linux.mtasa.com: Forcing server restart" + sleep 1 + exitbypass=1 + command_stop.sh + exitbypass=1 + command_start.sh + sleep 1 + # Check again and exit on failure. + if [ ! -f "${consolelogdir}/${servicename}-console.log" ]; then + fn_print_fail_nl "Checking for update: linux.mtasa.com: Still No logs with server version found" + fn_script_log_fatal "Checking for update: linux.mtasa.com: Still No logs with server version found" + core_exit.sh + fi + fi + + # Get current build from logs + currentbuild=$(awk -F"= Multi Theft Auto: San Andreas v" '{print $2}' "${consolelogdir}"/"${servicename}"-console.log | awk '{print $1}') + if [ -z "${currentbuild}" ]; then + fn_print_error_nl "Checking for update: linux.mtasa.com: Current build version not found" + fn_script_log_error "Checking for update: linux.mtasa.com: Current build version not found" + sleep 1 + fn_print_info_nl "Checking for update: linux.mtasa.com: Forcing server restart" + fn_script_log_info "Checking for update: linux.mtasa.com: Forcing server restart" + exitbypass=1 + command_stop.sh + exitbypass=1 + command_start.sh + currentbuild=$(awk -F"= Multi Theft Auto: San Andreas v" '{print $2}' "${consolelogdir}"/"${servicename}"-console.log | awk '{print $1}') + if [ -z "${currentbuild}" ]; then + fn_print_fail_nl "Checking for update: linux.mtasa.com: Current build version still not found" + fn_script_log_fatal "Checking for update: linux.mtasa.com: Current build version still not found" + core_exit.sh + fi + fi +} + +fn_mta_getServerVersion() +{ + fn_fetch_file "https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h" "${tmpdir}" # we need to find latest stable version here + local MAJOR_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MAJOR" | awk '{ print $3 }' | sed 's/\r//g')" + local MINOR_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MINOR" | awk '{ print $3 }' | sed 's/\r//g')" + local MAINTENANCE_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g')" + NUM_VERSION="${MAJOR_VERSION}${MINOR_VERSION}${MAINTENANCE_VERSION}" + FUL_VERSION="${MAJOR_VERSION}.${MINOR_VERSION}.${MAINTENANCE_VERSION}" + rm -f "${tmpdir}/version.h" +} + +fn_update_mta_compare(){ + # Removes dots so if can compare version numbers + currentbuilddigit=$(echo "${currentbuild}"|tr -cd '[:digit:]') + + if [ "${currentbuilddigit}" -ne "${NUM_VERSION}" ]; then + echo -e "\n" + echo -e "Update available:" + sleep 1 + echo -e " Current build: ${red}${currentbuild} ${default}" + echo -e " Available build: ${green}${FULL_VERSION} ${default}" + 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_script_log "Update available" + fn_script_log "Current build: ${currentbuild}" + fn_script_log "Available build: ${FULL_VERSION}" + fn_script_log "${currentbuild} > ${FULL_VERSION}" + + unset updateonstart + + check_status.sh + if [ "${status}" == "0" ]; then + fn_update_mta_dl + exitbypass=1 + command_start.sh + exitbypass=1 + command_stop.sh + else + exitbypass=1 + command_stop.sh + fn_update_mta_dl + exitbypass=1 + command_start.sh + fi + alert="update" + alert.sh + else + echo -e "\n" + echo -e "No update available:" + echo -e " Current version: ${green}${currentbuild}${default}" + echo -e " Available version: ${green}${FULL_VERSION}${default}" + echo -e "" + fn_print_ok_nl "No update available" + fn_script_log_info "Current build: ${currentbuild}" + fn_script_log_info "Available build: ${FULL_VERSION}" + fi +} + + +if [ "${installer}" == "1" ]; then + fn_mta_getServerVersion + fn_update_mta_dl +else + # Checks for server update from linux.mtasa.com using the github repo. + fn_print_dots "Checking for update: linux.mtasa.com" + fn_script_log_info "Checking for update: linux.mtasa.com" + sleep 1 + fn_update_mta_currentbuild + fn_mta_getServerVersion + fn_update_mta_compare +fi From dd122132e0a231c491e5166acc3efc3c1480af7f Mon Sep 17 00:00:00 2001 From: Braunson Date: Sun, 22 Jan 2017 20:14:38 -0600 Subject: [PATCH 0328/1895] File name for the fetch --- lgsm/functions/update_mta.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 0268c5d0e..ce7824dc6 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -70,7 +70,7 @@ fn_update_mta_currentbuild(){ fn_mta_getServerVersion() { - fn_fetch_file "https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h" "${tmpdir}" # we need to find latest stable version here + fn_fetch_file "https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h" "${tmpdir}" "version.h" # we need to find latest stable version here local MAJOR_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MAJOR" | awk '{ print $3 }' | sed 's/\r//g')" local MINOR_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MINOR" | awk '{ print $3 }' | sed 's/\r//g')" local MAINTENANCE_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g')" From d3ebec1514d7b5602c07e999f50b3b4de617a0c6 Mon Sep 17 00:00:00 2001 From: Braunson Date: Sun, 22 Jan 2017 20:31:43 -0600 Subject: [PATCH 0329/1895] No longer needed as this is handled in the update file --- 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 7596c4789..7355c840c 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -58,7 +58,7 @@ fn_dl_extract(){ mime=$(file -b --mime-type "${filedir}/${filename}") if [ "${mime}" == "application/gzip" ]||[ "${mime}" == "application/x-gzip" ]; then - tarcmd=$(tar -zxf "${filedir}/${filename}" -C "${extractdir}" --strip-components=1) + tarcmd=$(tar -zxf "${filedir}/${filename}" -C "${extractdir}") elif [ "${mime}" == "application/x-bzip2" ]; then tarcmd=$(tar -jxf "${filedir}/${filename}" -C "${extractdir}") elif [ "${mime}" == "application/zip" ]; then From 96b059a5b736dcc712f5b56ec9c6aceb20729f80 Mon Sep 17 00:00:00 2001 From: Braunson Date: Sun, 22 Jan 2017 20:31:53 -0600 Subject: [PATCH 0330/1895] Directory changes --- lgsm/functions/update_mta.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index ce7824dc6..76e31f451 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -9,11 +9,12 @@ local commandaction="Update" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_update_mta_dl(){ - fn_fetch_file "http://linux.mtasa.com/dl/${NUM_VERSION}/multitheftauto_linux_x64-${FUL_VERSION}.tar.gz" - fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${FUL_VERSION}.tar.gz" "${tmpdir}" + fn_fetch_file "http://linux.mtasa.com/dl/${NUM_VERSION}/multitheftauto_linux_x64-${FUL_VERSION}.tar.gz" "${tmpdir}" "multitheftauto_linux_x64-${FUL_VERSION}.tar.gz" + mkdir "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}" + fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${FUL_VERSION}.tar.gz" "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}" echo -e "copying to ${filesdir}...\c" fn_script_log "Copying to ${filesdir}" - cp -R "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}.tar.gz"* "${filesdir}" + cp -R "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}/"* "${filesdir}" local exitcode=$? if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl From fbac3e7c42805e96645efc142e4f1effb7274ea0 Mon Sep 17 00:00:00 2001 From: Braunson Date: Sun, 22 Jan 2017 20:33:34 -0600 Subject: [PATCH 0331/1895] Typo --- lgsm/functions/command_update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index ca82f541a..dd2206f00 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -21,7 +21,7 @@ elif [ "${gamename}" == "Mumble" ]; then update_mumble.sh elif [ "${gamename}" == "Factorio" ]; then update_factorio.sh -elif [ "$Pgamename" == "Multi Theft Auto" ]; then +elif [ "${gamename}" == "Multi Theft Auto" ]; then update_mta.sh else update_steamcmd.sh From c0f9078f063d4fe5be474b8d0c00b3f16d0acbd5 Mon Sep 17 00:00:00 2001 From: Braunson Date: Sun, 22 Jan 2017 20:35:16 -0600 Subject: [PATCH 0332/1895] =?UTF-8?q?Don=E2=80=99t=20attempt=20to=20change?= =?UTF-8?q?=20server=20name=20vars?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgsm/functions/install_config.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 3bb99da89..4a0cf13b2 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -367,7 +367,6 @@ elif [ "${gamename}" == "Multi Theft Auto" ]; then array_configs+=( acl.xml mtaserver.conf vehiclecolors.conf ) fn_fetch_default_config fn_default_config_remote - fn_set_config_vars elif [ "${gamename}" == "Mumble" ]; then gamedirname="Mumble" array_configs+=( murmur.ini ) From d739b9e2c3d785d3053e435c43c2a63da7cfd795 Mon Sep 17 00:00:00 2001 From: Braunson Date: Sun, 22 Jan 2017 20:51:20 -0600 Subject: [PATCH 0333/1895] Another directory fix --- lgsm/functions/update_mta.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 76e31f451..a7623d4cb 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -14,7 +14,7 @@ fn_update_mta_dl(){ fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${FUL_VERSION}.tar.gz" "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}" echo -e "copying to ${filesdir}...\c" fn_script_log "Copying to ${filesdir}" - cp -R "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}/"* "${filesdir}" + cp -R "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}/multitheftauto_linux_x64-${FUL_VERSION}"* "${filesdir}" local exitcode=$? if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl From e5176ba57dbb9fc42a44e860bf5a35624f8fbec1 Mon Sep 17 00:00:00 2001 From: Braunson Date: Sun, 22 Jan 2017 21:05:20 -0600 Subject: [PATCH 0334/1895] Forgot a slash.. --- lgsm/functions/update_mta.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index a7623d4cb..099344b71 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -14,7 +14,7 @@ fn_update_mta_dl(){ fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${FUL_VERSION}.tar.gz" "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}" echo -e "copying to ${filesdir}...\c" fn_script_log "Copying to ${filesdir}" - cp -R "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}/multitheftauto_linux_x64-${FUL_VERSION}"* "${filesdir}" + cp -R "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}/multitheftauto_linux_x64-${FUL_VERSION}/"* "${filesdir}" local exitcode=$? if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl From 29073d4dbb4b8523da86f12131e94f416ecba732 Mon Sep 17 00:00:00 2001 From: Braunson Date: Sun, 22 Jan 2017 21:07:55 -0600 Subject: [PATCH 0335/1895] Fix for where LGSM looks for the libmysqlclient file --- lgsm/functions/fix_mta.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index e63972e50..6bf11dbc9 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -8,7 +8,7 @@ local commandname="FIX" local commandaction="Fix" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -if [ ! -f /usr/lib/libmysqlclient.so.16 ]; then +if [ ! -f "${lgsmdir}/lib/libmysqlclient.so.16" ]; then fixname="libmysqlclient16 install" fn_fix_msg_start fn_print_warn_nl "libmysqlclient16 not installed. Installing.." From eb1c9b7854c39e3ce5571b021de8d93f6bc6e04e Mon Sep 17 00:00:00 2001 From: Braunson Date: Sun, 22 Jan 2017 21:13:07 -0600 Subject: [PATCH 0336/1895] Better naming --- lgsm/functions/update_mta.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 099344b71..0bc8a7d53 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -9,12 +9,12 @@ local commandaction="Update" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_update_mta_dl(){ - fn_fetch_file "http://linux.mtasa.com/dl/${NUM_VERSION}/multitheftauto_linux_x64-${FUL_VERSION}.tar.gz" "${tmpdir}" "multitheftauto_linux_x64-${FUL_VERSION}.tar.gz" - mkdir "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}" - fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${FUL_VERSION}.tar.gz" "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}" + fn_fetch_file "http://linux.mtasa.com/dl/${NUM_VERSION}/multitheftauto_linux_x64-${FULL_VERSION}.tar.gz" "${tmpdir}" "multitheftauto_linux_x64-${FULL_VERSION}.tar.gz" + mkdir "${tmpdir}/multitheftauto_linux_x64-${FULL_VERSION}" + fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${FULL_VERSION}.tar.gz" "${tmpdir}/multitheftauto_linux_x64-${FULL_VERSION}" echo -e "copying to ${filesdir}...\c" fn_script_log "Copying to ${filesdir}" - cp -R "${tmpdir}/multitheftauto_linux_x64-${FUL_VERSION}/multitheftauto_linux_x64-${FUL_VERSION}/"* "${filesdir}" + cp -R "${tmpdir}/multitheftauto_linux_x64-${FULL_VERSION}/multitheftauto_linux_x64-${FULL_VERSION}/"* "${filesdir}" local exitcode=$? if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl @@ -76,7 +76,7 @@ fn_mta_getServerVersion() local MINOR_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MINOR" | awk '{ print $3 }' | sed 's/\r//g')" local MAINTENANCE_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g')" NUM_VERSION="${MAJOR_VERSION}${MINOR_VERSION}${MAINTENANCE_VERSION}" - FUL_VERSION="${MAJOR_VERSION}.${MINOR_VERSION}.${MAINTENANCE_VERSION}" + FULL_VERSION="${MAJOR_VERSION}.${MINOR_VERSION}.${MAINTENANCE_VERSION}" rm -f "${tmpdir}/version.h" } From 475a2089438d2151a3ce9c96cc4804da4fdebd76 Mon Sep 17 00:00:00 2001 From: Braunson Date: Sun, 22 Jan 2017 21:21:41 -0600 Subject: [PATCH 0337/1895] No longer needed, handled in the update file --- lgsm/functions/install_server_files.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 8d8d8d608..dd79d9150 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -39,8 +39,6 @@ fn_install_server_files(){ fileurl="http://files.gameservermanagers.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; filedir="${tmpdir}"; filename="UT3-linux-server-2.1.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fileurl="http://files.gameservermanagers.com/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; filedir="${tmpdir}"; filename="enemy-territory.260b.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" - elif [ "${gamename}" == "Multi Theft Auto" ]; then - fileurl="https://linux.mtasa.com/dl/153/multitheftauto_linux_x64-1.5.3.tar.gz"; filedir="${tmpdir}"; filename="multitheftauto_linux_x64-1.5.3.tar.gz"; executecmd="noexecute" run="norun"; force="noforce"; md5="77caf91fe280877a8d21f8046d5f42ba" fi fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" fn_dl_extract "${filedir}" "${filename}" "${filesdir}" From bd1dabc19403908a18594a0a1e3a19839bca84e6 Mon Sep 17 00:00:00 2001 From: Chaos Date: Mon, 23 Jan 2017 14:49:08 -0600 Subject: [PATCH 0338/1895] Add a contributing guide This file will give new pull requests a warning to adhere to the projects guidelines and is a good reminder of our standards. https://help.github.com/articles/setting-guidelines-for-repository-contributors/ This is related to issue #1624 Feel free to suggest edits. --- CONTRIBUTING.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..28d8d3dac --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,40 @@ +# How to contribute + +I'm really glad you're reading this, because if you are then you have shown an interest in helping make LinuxGSM great. + +If you haven't already, come find us on [Discord](https://gameservermanagers.com/discord). From there you will have contact with other contributers of the project. We want you working on things you're excited about. + +Here are some important resources: + + * [Issues Page](https://github.com/GameServerManagers/LinuxGSM/issues) provides a list of areas that could use some work, + * [Developing LGSM](https://github.com/GameServerManagers/LinuxGSM/wiki/Developing-LGSM) gives a detailed guide on developing LGSM, + * [LGSM Exit Codes](https://github.com/GameServerManagers/LinuxGSM/wiki/LGSM-Exit-Codes) describes and gives an explanation for exit codes, + * [gsquery](https://github.com/GameServerManagers/LinuxGSM/wiki/gsquery.py) describes the uses of the gsquery.py file, and + * [Branching](https://github.com/GameServerManagers/LinuxGSM/wiki/Branching) is our final guide to submitting changes. + +## Testing + +Please make sure all the code you write is working properly **before** you create a pull request. Information on debugging can be found in the following document: +[Debug Command](https://github.com/GameServerManagers/LinuxGSM/wiki/debug) +[Debugging your code](https://github.com/GameServerManagers/LinuxGSM/wiki/Developing-LGSM#testing-and-debugging-your-code) + +## Submitting changes + +Please send a [GitHub Pull Request to LinuxGSM](https://github.com/GameServerManagers/LinuxGSM/pull/new/develop) with a clear list of what you've done (read more about [pull requests](https://help.github.com/articles/about-pull-requests/)). Please follow our coding conventions (below) and make sure all of your commits are atomic (one feature per commit). + +Always write a clear log message for your commits. One-line messages are fine for small changes, but bigger changes should look like this: + + $ git commit -m "A brief summary of the commit + > + > A paragraph describing what changed and its impact." +This will help us in understanding your code and determining where problems may arise. + +## Coding conventions + +Start reading our code and you'll get the hang of it. Explore how functions are organized and you'll see how we strive for readable code. + +Please give the following document a read and adjust your code according to its specifications. +[Syntax & Coding Conventions](https://github.com/GameServerManagers/LinuxGSM/wiki/Syntax-&-Conventions) + + + From bf1dc5b71d2068575cbca01c25812023a64c0e5e Mon Sep 17 00:00:00 2001 From: Chaos Date: Mon, 23 Jan 2017 15:43:11 -0600 Subject: [PATCH 0339/1895] Update based on code review --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 28d8d3dac..6fe85bae6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ -# How to contribute +# How to contribute to LinuxGSM -I'm really glad you're reading this, because if you are then you have shown an interest in helping make LinuxGSM great. +We are really glad you're reading this, because if you are then you have shown an interest in helping make LinuxGSM great. If you haven't already, come find us on [Discord](https://gameservermanagers.com/discord). From there you will have contact with other contributers of the project. We want you working on things you're excited about. From 1272cb42c60f4788345d84e667efdcbbbb121eaa Mon Sep 17 00:00:00 2001 From: Chaos Date: Mon, 23 Jan 2017 15:57:06 -0600 Subject: [PATCH 0340/1895] Updated to add developer commands --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6fe85bae6..edb8ebf50 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,7 +15,7 @@ Here are some important resources: ## Testing Please make sure all the code you write is working properly **before** you create a pull request. Information on debugging can be found in the following document: -[Debug Command](https://github.com/GameServerManagers/LinuxGSM/wiki/debug) +[Developer Commands](https://github.com/GameServerManagers/LinuxGSM/wiki/Developer-Commands) [Debugging your code](https://github.com/GameServerManagers/LinuxGSM/wiki/Developing-LGSM#testing-and-debugging-your-code) ## Submitting changes From 7152d821c043722423afda967d2800fb32e9ae73 Mon Sep 17 00:00:00 2001 From: Chaos Date: Mon, 23 Jan 2017 20:53:44 -0600 Subject: [PATCH 0341/1895] Support forced updates, sometimes MTA releases versions lower than maintenance versions that cannot otherwise be detected. --- lgsm/functions/core_getopt.sh | 4 ++++ lgsm/functions/update_mta.sh | 12 +++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 721d317e0..42ee3d44e 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -352,6 +352,9 @@ case "${getopt}" in command_restart.sh;; u|update) command_update.sh;; + fu|force-update|update-restart) + forceupdate=1; + command_update.sh;; uf|update-functions) command_update_functions.sh;; m|monitor) @@ -397,6 +400,7 @@ case "${getopt}" in echo -e "${blue}stop\t${default}sp |Stop the server." echo -e "${blue}restart\t${default}r |Restart the server." echo -e "${blue}update\t${default}u |Checks and applies updates from linux.mtasa.com." + echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from linux.mtasa.com." echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." echo -e "${blue}monitor\t${default}m |Checks that the server is running." echo -e "${blue}test-alert\t${default}ta |Sends test alert." diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 0bc8a7d53..365dae131 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -84,9 +84,15 @@ fn_update_mta_compare(){ # Removes dots so if can compare version numbers currentbuilddigit=$(echo "${currentbuild}"|tr -cd '[:digit:]') - if [ "${currentbuilddigit}" -ne "${NUM_VERSION}" ]; then + if [ "${currentbuilddigit}" -ne "${NUM_VERSION}" ]||[ "${forceupdate}" == "1" ]; then + if [ "${forceupdate}" == "1" ]; then + # forceupdate bypasses checks, useful for small build changes + mta_update_string="forced" + else + mta_update_string="available" + fi echo -e "\n" - echo -e "Update available:" + echo -e "Update ${mta_update_string}:" sleep 1 echo -e " Current build: ${red}${currentbuild} ${default}" echo -e " Available build: ${green}${FULL_VERSION} ${default}" @@ -100,7 +106,7 @@ fn_update_mta_compare(){ echo -en "Applying update...\r" sleep 1 echo -en "\n" - fn_script_log "Update available" + fn_script_log "Update ${mta_update_string}" fn_script_log "Current build: ${currentbuild}" fn_script_log "Available build: ${FULL_VERSION}" fn_script_log "${currentbuild} > ${FULL_VERSION}" From 3e17bc1daa6098022ccc41e5dbac732fcb41fb9f Mon Sep 17 00:00:00 2001 From: Chaos Date: Wed, 25 Jan 2017 08:41:59 -0600 Subject: [PATCH 0342/1895] Added a note about making an issue for features you work on --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index edb8ebf50..a90acec99 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,6 +4,8 @@ We are really glad you're reading this, because if you are then you have shown a If you haven't already, come find us on [Discord](https://gameservermanagers.com/discord). From there you will have contact with other contributers of the project. We want you working on things you're excited about. +Before working on a project we recommend that you create a issue in regards to the issue/feature. This will prevent duplicates while you work on the feature. If an issue already exists, make note that you are working on it so nobody else wastes their time working on the same project at the same time! + Here are some important resources: * [Issues Page](https://github.com/GameServerManagers/LinuxGSM/issues) provides a list of areas that could use some work, From f1dbdd6cc61565236a7569737c4d5b1302cc4ce4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 20:00:42 +0000 Subject: [PATCH 0343/1895] Major re-organise This is a major sort out of the new functions. To simplify and make it easier to follow the code. All functionality remains. Possible bugs in this that will be resolved after testing --- lgsm/functions/command_mods_install.sh | 160 ++++--- lgsm/functions/command_mods_remove.sh | 215 ++++----- lgsm/functions/command_mods_update.sh | 168 ++++--- lgsm/functions/mods_core.sh | 613 +++++++++---------------- lgsm/functions/mods_list.sh | 104 ++--- 5 files changed, 568 insertions(+), 692 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index d15250594..fc6f78c9e 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -9,67 +9,113 @@ local commandname="MODS" local commandaction="addons/mods" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -fn_mods_install_init(){ - fn_print_header - # Display installed mods - fn_installed_mods_light_list +check.sh +mods_core.sh + +fn_print_header + +# exits if no mods installed +fn_mods_check_installed - echo "Available addons/mods" +# Displays a list of installed mods +fn_mods_installed_list +if [ ${installedmodscount} -gt 0 ]; then + echo "Installed addons/mods" echo "=================================" - # Display available mods from mods_list.sh - fn_mods_show_available - echo "" - # Keep prompting as long as the user input doesn't correspond to an available mod - while [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; do - echo -en "Enter an ${cyan}addon/mod${default} to ${green}install${default} (or exit to abort): " - read -r usermodselect - # Exit if user says exit or abort - if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then - core_exit.sh - # Supplementary output upon invalid user input - elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then - fn_print_error2_nl "${usermodselect} is not a valid addon/mod." - fi + # Go through all available commands, get details and display them to the user + for ((llindex=0; llindex < ${#installedmodslist[@]}; llindex++)); do + # Current mod is the "llindex" value of the array we're going through + currentmod="${installedmodslist[llindex]}" + fn_mod_get_info + # Display mod info to the user + echo -e " * \e[1m${green}${modcommand}${default}${default}" + ((totalmodsinstalled++)) done echo "" - echo "Installing ${modprettyname}" - echo "=================================" - fn_script_log_info "${modprettyname} selected for install" - # Gives a pretty name to the user and get all mod info - currentmod="${usermodselect}" -} +fi -# Run all required operation -fn_mod_installation(){ - # Get mod info - fn_mod_get_info_from_command - # Check if mod is already installed - fn_mod_already_installed - # Check and create required files - fn_mods_files - # Clear lgsm/tmp/mods dir if exists then recreate it - fn_clear_tmp_mods - fn_mods_tmpdir - # Download & extract mod - fn_install_mod_dl_extract - # Convert to lowercase if needed - fn_mod_lowercase - # Build a file list - fn_mod_fileslist - # Copying to destination - fn_mod_copy_destination - # Ending with installation routines - fn_mod_add_list - # Post install fixes - fn_postinstall_tasks - # Cleaning - fn_clear_tmp_mods - echo "${modprettyname} installed" - fn_script_log_pass "${modprettyname} installed." -} +echo "Available addons/mods" +echo "=================================" +# Display available mods from mods_list.sh +# Set and reset vars +compatiblemodslistindex=0 +# As long as we're within index values +while [ "${compatiblemodslistindex}" -lt "${#compatiblemodslist[@]}" ]; do + # Set values for convenience + displayedmodname="${compatiblemodslist[compatiblemodslistindex]}" + displayedmodcommand="${compatiblemodslist[compatiblemodslistindex+1]}" + displayedmodsite="${compatiblemodslist[compatiblemodslistindex+2]}" + displayedmoddescription="${compatiblemodslist[compatiblemodslistindex+3]}" + # Output mods to the user + echo -e "\e[1m${displayedmodname}${default} - ${displayedmoddescription} - ${displayedmodsite}" + echo -e " * ${cyan}${displayedmodcommand}${default}" + # Increment index from the amount of values we just displayed + let "compatiblemodslistindex+=4" + ((totalmods++)) +done + +# If no mods are available for a specific game +if [ -z "${compatiblemodslist}" ]; then + fn_print_fail "No mods are currently available for ${gamename}." + fn_script_log_info "No mods are currently available for ${gamename}." + core_exit.sh +fi +fn_script_log_info "${totalmods} addons/mods are available for install" + +## User selects a mod +echo "" +while [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; do + echo -en "Enter an ${cyan}addon/mod${default} to ${green}install${default} (or exit to abort): " + read -r usermodselect + # Exit if user says exit or abort + if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then + core_exit.sh + # Supplementary output upon invalid user input + elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then + fn_print_error2_nl "${usermodselect} is not a valid addon/mod." + fi +done +currentmod="${usermodselect}" + +echo "" +echo "Installing ${modprettyname}" +echo "=================================" +fn_script_log_info "${modprettyname} selected for install" + +# Check if the mod is already installed and warn the user +if [ -f "${modsinstalledlistfullpath}" ]; then + if [ -n "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then + fn_print_warning_nl "${modprettyname} is already installed" + fn_script_log_warn "${modprettyname} is already installed" + sleep 1 + echo " * Any configs may be overwritten." + while true; do + read -e -i "y" -p "Continue? [Y/n]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; core_exit.sh;; + * ) echo "Please answer yes or no.";; + esac + done + fi +fn_script_log_info "User selected to continue" +fi + +## Installation + +fn_mod_get_info +fn_mod_already_installed +fn_create_mods_dir +fn_mods_clear_tmp_dir +fn_mods_create_tmp_dir +fn_mod_install_files +fn_mod_lowercase +fn_mod_create_filelist +fn_mod_copy_destination +fn_mod_add_list +fn_mod_tidy_files_list +fn_mods_clear_tmp_dir +echo "${modprettyname} installed" +fn_script_log_pass "${modprettyname} installed." -check.sh -mods_core.sh -fn_mods_install_init -fn_mod_installation core_exit.sh \ No newline at end of file diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 6c8fdf0bb..e0b1623d1 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -9,114 +9,123 @@ local commandname="MODS" local commandaction="addons/mods" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +check.sh +mods_core.sh +fn_mods_check_installed +fn_print_header +echo "Remove addons/mods" +echo "=================================" -fn_mods_remove_init(){ - fn_print_header - echo "Remove addons/mods" - echo "=================================" - # A simple function to exit if no mods were installed - # Also returns ${installedmodscount} if mods were found - fn_mods_exit_if_not_installed - # Displays installed addons to the user - fn_installed_mods_medium_list - echo "" - # Keep prompting as long as the user input doesn't correspond to an available mod - while [[ ! " ${installedmodslist[@]} " =~ " ${usermodselect} " ]]; do - echo -en "Enter a ${cyan}mod${default} to ${red}remove${default} (or exit to abort): " - read -r usermodselect - # Exit if user says exit or abort - if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then - core_exit.sh - # Supplementary output upon invalid user input - elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then - fn_print_error2_nl "${usermodselect} is not a valid addon/mod." - fi - done - fn_print_warning_nl "You are about to remove ${cyan}${usermodselect}${default}." - echo " * Any custom files/configuration will be removed." - while true; do - read -e -i "y" -p "Continue? [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; exit;; - * ) echo "Please answer yes or no.";; - esac - done - # Gives a pretty name to the user and get all mod info - currentmod="${usermodselect}" - fn_mod_get_info_from_command - # Check file list in order to make sure we're able to remove the mod (returns ${modsfilelistsize}) - fn_check_files_list +## Displays list of installed mods +# Generates list to display to user +fn_mods_installed_list +for ((mlindex=0; mlindex < ${#installedmodslist[@]}; mlindex++)); do + # Current mod is the "mlindex" value of the array we are going through + currentmod="${installedmodslist[mlindex]}" + # Get mod info + fn_mod_get_info + # Display mod info to the user + echo -e "${cyan}${modcommand}${default} - \e[1m${modprettyname}${default} - ${moddescription}" +done -} +echo "" +# Keep prompting as long as the user input doesn't correspond to an available mod +while [[ ! " ${installedmodslist[@]} " =~ " ${usermodselect} " ]]; do + echo -en "Enter an ${cyan}addon/mod${default} to ${green}install${default} (or exit to abort): " + read -r usermodselect + # Exit if user says exit or abort + if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then + core_exit.sh + # Supplementary output upon invalid user input + elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then + fn_print_error2_nl "${usermodselect} is not a valid addon/mod." + fi +done -# Uninstall the mod -fn_mod_remove_process(){ - fn_script_log "Removing ${modsfilelistsize} files from ${modprettyname}" - echo -e "removing ${modprettyname}" - echo -e "* ${modsfilelistsize} files to be removed" - echo -e "* location: ${modinstalldir}" - sleep 1 - # Go through every file and remove it - modfileline="1" - tput sc - while [ "${modfileline}" -le "${modsfilelistsize}" ]; do - # Current line defines current file to remove - currentfileremove="$(sed "${modfileline}q;d" "${modsdatadir}/${modcommand}-files.txt")" - # If file or directory exists, then remove it - fn_script_log "Removing: ${modinstalldir}/${currentfileremove}" - if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then - rm -rf "${modinstalldir}/${currentfileremove}" - local exitcode=$? - fi - tput rc; tput el - printf "removing ${modprettyname} ${totalfileswc} / ${modsfilelistsize} : ${currentfileremove}..." +fn_print_warning_nl "You are about to remove ${cyan}${usermodselect}${default}." +echo " * Any custom files/configuration will be removed." +while true; do + read -e -i "y" -p "Continue? [Y/n]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; exit;; + * ) echo "Please answer yes or no.";; +esac +done - ((totalfileswc++)) - let modfileline=modfileline+1 - done - tput rc; tput ed; - echo -ne "removing ${modprettyname} ${totalfileswc} / ${modsfilelistsize}..." - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - core_exit.sh - else - fn_print_ok_eol_nl - fi - sleep 0.5 - # Remove file list - echo -en "removing ${modcommand}-files.txt..." - sleep 0.5 - fn_script_log "Removing: ${modsdatadir}/${modcommand}-files.txt" - rm -rf "${modsdatadir}/${modcommand}-files.txt" - local exitcode=$? - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - core_exit.sh - else - fn_print_ok_eol_nl - fi - # Remove from installed mods list - echo -en "removing ${modcommand} from ${modslockfile}..." - sleep 0.5 - fn_script_log "Removing: ${modcommand} from ${modslockfilefullpath}" - sed -i "/^${modcommand}$/d" "${modslockfilefullpath}" - # Post install tasks to solve potential issues - local exitcode=$? - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - core_exit.sh - else - fn_print_ok_eol_nl +currentmod="${usermodselect}" +fn_mod_get_info +fn_check_mod_files_list + +# Uninstall the mod +fn_script_log "Removing ${modsfilelistsize} files from ${modprettyname}" +echo -e "removing ${modprettyname}" +echo -e "* ${modsfilelistsize} files to be removed" +echo -e "* location: ${modinstalldir}" +sleep 1 +# Go through every file and remove it +modfileline="1" +tput sc +while [ "${modfileline}" -le "${modsfilelistsize}" ]; do + # Current line defines current file to remove + currentfileremove="$(sed "${modfileline}q;d" "${modsdatadir}/${modcommand}-files.txt")" + # If file or directory exists, then remove it + fn_script_log "Removing: ${modinstalldir}/${currentfileremove}" + if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then + rm -rf "${modinstalldir}/${currentfileremove}" + local exitcode=$? fi - fn_postuninstall_tasks - echo "${modprettyname} removed" - fn_script_log "${modprettyname} removed" -} + tput rc; tput el + printf "removing ${modprettyname} ${modfileline} / ${modsfilelistsize} : ${currentfileremove}..." + ((modfileline++)) +done +tput rc; tput ed; +echo -ne "removing ${modprettyname} ${modfileline} / ${modsfilelistsize}..." +if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh +else + fn_print_ok_eol_nl +fi +sleep 0.5 + +# Remove file list +echo -en "removing ${modcommand}-files.txt..." +sleep 0.5 +fn_script_log "Removing: ${modsdatadir}/${modcommand}-files.txt" +rm -rf "${modsdatadir}/${modcommand}-files.txt" +local exitcode=$? +if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh +else + fn_print_ok_eol_nl +fi + +# Remove mods from installed mods list +echo -en "removing ${modcommand} from ${modslockfile}..." +sleep 0.5 +fn_script_log "Removing: ${modcommand} from ${modslockfilefullpath}" +sed -i "/^${modcommand}$/d" "${modslockfilefullpath}" +local exitcode=$? +if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh +else + fn_print_ok_eol_nl +fi + +# Oxide fix +# Oxide replaces server files, so a validate is required after uninstall +if [ "${engine}" == "unity3d" ]&&[[ "${modprettyname}" == *"Oxide"* ]]; then + fn_print_information_nl "Validating to restore original ${gamename} files replaced by Oxide" + fn_script_log "Validating to restore original ${gamename} files replaced by Oxide" + exitbypass="1" + command_validate.sh + unset exitbypass +fi +echo "${modprettyname} removed" +fn_script_log "${modprettyname} removed" -check.sh -mods_core.sh -fn_mods_remove_init -fn_mod_remove_process core_exit.sh diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index ad757da6c..123e2b4e8 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -9,81 +9,107 @@ local commandname="MODS" local commandaction="Mods Update" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +check.sh +mods_core.sh -fn_mods_update_init(){ - fn_script_log "Entering mods & addons update" - echo "=================================" - echo "${gamename} mods & addons update" - # A simple function to exit if no mods were installed - # Also returns ${installedmodscount} if mods were found - fn_mods_exit_if_not_installed - echo "" - fn_print_information_nl "${installedmodscount} mods or addons will be updated:" - fn_script_log_info "${installedmodscount} mods or addons will be updated" - # Display a list of installed addons - fn_installed_mods_update_list -} +fn_print_header -# Recursively list all installed mods and apply update -fn_mods_update_loop(){ - # Reset line value - installedmodsline="1" - while [ $installedmodsline -le $installedmodscount ]; do - # Current line defines current mod command - currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")" - if [ -n "${currentmod}" ]; then - # Get mod info - fn_mod_get_info_from_command - # Don't update the mod if it's policy is to "NOUPDATE" - if [ "${modkeepfiles}" == "NOUPDATE" ]; then - fn_print_info "${modprettyname} won't be updated to preserve custom files" - fn_script_log "${modprettyname} won't be updated to preserve custom files." - let installedmodsline=installedmodsline+1 - else - echo "" - fn_print_dots_nl "Updating ${modprettyname}" - fn_script_log "Updating ${modprettyname}." - # Check and create required files - fn_mods_files - # Clear lgsm/tmp/mods dir if exists then recreate it - fn_clear_tmp_mods - fn_mods_tmpdir - # Download mod - fn_mod_dl - # Extract the mod - fn_mod_extract - # Convert to lowercase if needed - fn_mod_lowercase - # Remove files that should not be erased - fn_remove_cfg_files - # Build a file list - fn_mod_fileslist - # Copying to destination - fn_mod_copy_destination - # Ending with installation routines - fn_mod_add_list - # Post install fixes - fn_postinstall_tasks - # Cleaning - fn_clear_tmp_mods - fn_print_ok "${modprettyname} updated" - fn_script_log "${modprettyname} updated." - let installedmodsline=installedmodsline+1 - fi +echo "Update addons/mods" +echo "=================================" +fn_mods_check_installed +fn_print_information_nl "${installedmodscount} addons/mods will be updated" +fn_script_log_info "${installedmodscount} mods or addons will be updated" +fn_mods_installed_list +echo "" +echo "Installed addons/mods" +echo "=================================" +# Go through all available commands, get details and display them to the user +for ((ulindex=0; ulindex < ${#installedmodslist[@]}; ulindex++)); do + # Current mod is the "ulindex" value of the array we're going through + currentmod="${installedmodslist[ulindex]}" + fn_mod_get_info + # Display installed mods and the update policy + if [ -z "${modkeepfiles}" ]; then + # If modkeepfiles is not set for some reason, that's a problem + fn_script_log_error "Couldn't find update policy for ${modprettyname}" + fn_print_error_nl "Couldn't find update policy for ${modprettyname}" + exitcode="1" + core_exit.sh + # If the mod won't get updated + elif [ "${modkeepfiles}" == "NOUPDATE" ]; then + echo -e " * \e[31m${modprettyname}${default} (won't be updated)" + # If the mode is just overwritten + elif [ "${modkeepfiles}" == "OVERWRITE" ]; then + echo -e " * \e[1m${modprettyname}${default} (overwrite)" + else + echo -e " * ${yellow}${modprettyname}${default} (common custom files remain untouched)" + fi +done + +## Update +# List all installed mods and apply update +# Reset line value +installedmodsline="1" +while [ ${installedmodsline} -le ${installedmodscount} ]; do + currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")" + if [ -n "${currentmod}" ]; then + fn_mod_get_info + # Don not update mod if the policy is set to "NOUPDATE" + if [ "${modkeepfiles}" == "NOUPDATE" ]; then + fn_print_info "${modprettyname} will not be updated to preserve custom files" + fn_script_log_info "${modprettyname} will not be updated to preserve custom files" else - fn_print_fail "No mod was selected" - fn_script_log_fail "No mod was selected." - exitcode="1" - core_exit.sh + echo "" + fn_create_mods_dir + fn_mods_clear_tmp_dir + fn_mods_create_tmp_dir + fn_mod_install_files + fn_mod_lowercase + fn_remove_cfg_files + fn_mod_create_filelist + fn_mod_copy_destination + fn_mod_add_list + fn_mod_tidy_files_list + fn_mods_clear_tmp_dir fi - done - echo "" - fn_print_ok_nl "Mods update complete" - fn_script_log "Mods update complete." + ((installedmodsline++)) + else + fn_print_fail "No mod was selected" + fn_script_log_fail "No mod was selected" + exitcode="1" + core_exit.sh + fi +done +echo "" +fn_print_ok_nl "Mods update complete" +fn_script_log "Mods update complete" + +# Prevents specific files being overwritten upon update (set by ${modkeepfiles}) +# For that matter, remove cfg files after extraction before copying them to destination +fn_remove_cfg_files(){ + if [ "${modkeepfiles}" != "OVERWRITE" ]&&[ "${modkeepfiles}" != "NOUPDATE" ]; then + fn_print_dots "Preventing overwriting of ${modprettyname} config files" + fn_script_log "Preventing overwriting of ${modprettyname} config files" + sleep 0.5 + # Count how many files there are to remove + removefilesamount="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" + # Test all subvalues of "modkeepfiles" using the ";" separator + for ((removefilesindex=1; removefilesindex < ${removefilesamount}; removefilesindex++)); do + # Put the current file we are looking for into a variable + filetoremove="$( echo "${modkeepfiles}" | awk -F ';' -v x=${removefilesindex} '{ print $x }' )" + # If it matches an existing file that have been extracted delete the file + if [ -f "${extractdir}/${filetoremove}" ]||[ -d "${extractdir}/${filetoremove}" ]; then + rm -r "${extractdir}/${filetoremove}" + # Write the file path in a tmp file, to rebuild a full file list as it is rebuilt upon update + if [ ! -f "${modsdir}/.removedfiles.tmp" ]; then + touch "${modsdir}/.removedfiles.tmp" + fi + echo "${filetoremove}" >> "${modsdir}/.removedfiles.tmp" + fi + done + fn_print_ok "Preventing overwriting of ${modprettyname} config files" + sleep 0.5 + fi } -check.sh -mods_core.sh -fn_mods_update_init -fn_mods_update_loop core_exit.sh diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 4295fc478..f35667c6b 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -16,82 +16,17 @@ extractdir="${modstmpdir}/extract" modsinstalledlist="installed-mods.txt" modsinstalledlistfullpath="${modsdir}/${modsinstalledlist}" -# Database initialisation -mods_list.sh - -## Directory management - -# Create mods files and directories if it doesn't exist -# Assuming the game is already installed as mods_list.sh checked for it. -fn_mods_files(){ - # Create mod install directory - if [ ! -d "${modinstalldir}" ]; then - echo "creating mods install directory ${modinstalldir}..." - mkdir -p "${modinstalldir}" - exitcode=$? - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - fn_script_log_fatal "Creating mod download dir ${modstmpdir}" - core_exit.sh - else - fn_print_ok_eol_nl - fn_script_log_pass "Creating mod download dir ${modstmpdir}" - fi - sleep 0.5 - fi - - # Create lgsm/data/${modsinstalledlist} - if [ ! -f "${modsinstalledlistfullpath}" ]; then - touch "${modsinstalledlistfullpath}" - fn_script_log "Created ${modsinstalledlistfullpath}" - fi -} - -# Create tmp download mod directory -fn_mods_tmpdir(){ - if [ ! -d "${modstmpdir}" ]; then - mkdir -p "${modstmpdir}" - exitcode=$? - echo -ne "creating mod download dir ${modstmpdir}..." - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - fn_script_log_fatal "Creating mod download dir ${modstmpdir}" - core_exit.sh - else - fn_print_ok_eol_nl - fn_script_log_pass "Creating mod download dir ${modstmpdir}" - fi - fi -} -# Clear contents of mod download directory when finished -fn_clear_tmp_mods(){ - if [ -d "${modstmpdir}" ]; then - rm -r "${modstmpdir}"/* - exitcode=$? - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - fn_script_log_fatal "Clearing mod download directory ${modstmpdir}" - core_exit.sh - else - fn_print_ok_eol_nl - fn_script_log_pass "Clearing mod download directory ${modstmpdir}" - fi - - fi - # Clear temp file list as well - if [ -f "${modsdir}/.removedfiles.tmp" ]; then - rm "${modsdir}/.removedfiles.tmp" - fi -} +## Installation -## Download management -fn_install_mod_dl_extract(){ +# Download management +fn_mod_install_files(){ fn_fetch_file "${modurl}" "${modstmpdir}" "${modfilename}" # Check if variable is valid checking if file has been downloaded and exists if [ ! -f "${modstmpdir}/${modfilename}" ]; then - fn_print_failure "An issue occurred upon downloading ${modprettyname}" + fn_print_failure "An issue occurred downloading ${modprettyname}" + fn_script_log_fail "An issue occurred downloading ${modprettyname}" core_exit.sh fi if [ ! -d "${extractdir}" ]; then @@ -132,60 +67,29 @@ fn_mod_lowercase(){ fi } -# Don't overwrite specified files upon update (set by ${modkeepfiles}) -# For that matter, remove cfg files after extraction before copying them to destination -fn_remove_cfg_files(){ - if [ "${modkeepfiles}" != "OVERWRITE" ]&&[ "${modkeepfiles}" != "NOUPDATE" ]; then - fn_print_dots "Allow for not overwriting ${modprettyname} config files" - fn_script_log "Allow for not overwriting ${modprettyname} config files" - sleep 0.5 - # Let's count how many files there are to remove - removefilesamount="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" - # Test all subvalue of "modkeepfiles" using the ";" separator - for ((removefilesindex=1; removefilesindex < ${removefilesamount}; removefilesindex++)); do - # Put current file we're looking for into a variable - filetoremove="$( echo "${modkeepfiles}" | awk -F ';' -v x=${removefilesindex} '{ print $x }' )" - # If it matches an existing file that have been extracted - if [ -f "${extractdir}/${filetoremove}" ]||[ -d "${extractdir}/${filetoremove}" ]; then - # Then delete the file! - rm -r "${extractdir}/${filetoremove}" - # Write this file path in a tmp file, to rebuild a full file list since it is rebuilt upon update - if [ ! -f "${modsdir}/.removedfiles.tmp" ]; then - touch "${modsdir}/.removedfiles.tmp" - fi - echo "${filetoremove}" >> "${modsdir}/.removedfiles.tmp" - fi - done - fn_print_ok "Allow for preserving ${modprettyname} config files" - sleep 0.5 - fi -} - # Create ${modcommand}-files.txt containing the full extracted file/directory list -fn_mod_fileslist(){ +fn_mod_create_filelist(){ echo -ne "building ${modcommand}-files.txt..." - sleep 0.5 # ${modsdir}/${modcommand}-files.txt - find "${extractdir}" -mindepth 1 -printf '%P\n' > "${modsdir}"/${modcommand}-files.txt + find "${extractdir}" -mindepth 1 -printf '%P\n' > "${modsdir}/${modcommand}-files.txt" local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "Building ${modcommand}-files.txt" + fn_script_log_fatal "Building ${modsdir}/${modcommand}-files.txt" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "Building ${modcommand}-files.txt" + fn_script_log_pass "Building ${modsdir}/${modcommand}-files.txt" fi - fn_script_log "Writing file list ${modsdir}/${modcommand}-files.txt" # Adding removed files if needed if [ -f "${modsdir}/.removedfiles.tmp" ]; then - cat "${modsdir}/.removedfiles.tmp" >> "${modsdir}"/${modcommand}-files.txt + cat "${modsdir}/.removedfiles.tmp" >> "${modsdir}/${modcommand}-files.txt" fi sleep 0.5 } -# Copy the mod to the destination ${modinstalldir} +# Copy the mod into serverfiles fn_mod_copy_destination(){ echo -ne "copying ${modprettyname} to ${modinstalldir}..." sleep 0.5 @@ -200,75 +104,32 @@ fn_mod_copy_destination(){ fi } -# Check if the mod is already installed and warn the user -fn_mod_already_installed(){ - if [ -f "${modsinstalledlistfullpath}" ]; then - if [ -n "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then - fn_print_warning_nl "${modprettyname} is already installed" - fn_script_log_warn "${modprettyname} is already installed" - sleep 1 - echo " * Any configs may be overwritten." - while true; do - read -e -i "y" -p "Continue? [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; core_exit.sh;; - * ) echo "Please answer yes or no.";; - esac - done - fi - fn_script_log_info "User selected to continue" - fi -} - -# Add the mod to the installed mods list +# Add the mod to the installed-mods.txt fn_mod_add_list(){ - # Append modname to lockfile if it's not already in it if [ ! -n "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then echo "${modcommand}" >> "${modsinstalledlistfullpath}" fn_script_log_info "${modcommand} added to ${modsinstalledlist}" fi } -fn_check_files_list(){ - # File list must exist and be valid before any operation on it - if [ -f "${modsdir}/${modcommand}-files.txt" ]; then - # How many lines is the file list - modsfilelistsize="$(cat "${modsdir}/${modcommand}-files.txt" | wc -l)" - # If file list is empty - if [ "${modsfilelistsize}" -eq 0 ]; then - fn_print_failure "${modcommand}-files.txt is empty" - echo "* Unable to remove ${modprettyname}" - fn_script_log_fatal "${modcommand}-files.txt is empty: Unable to remove ${modprettyname}." - core_exit.sh - fi - else - fn_print_failure "${modsdir}/${modcommand}-files.txt does not exist" - fn_script_log_fatal "${modsdir}/${modcommand}-files.txt does not exist: Unable to remove ${modprettyname}." - core_exit.sh - fi -} - -# Apply some post-install fixes to make sure everything will be fine -fn_postinstall_tasks(){ - # Prevent sensitive directories from being erased upon uninstall by removing them from: ${modsdir}/${modcommand}-files.txt +fn_mod_tidy_files_list(){ + # Prevent sensitive directories from being erased by removing them from: ${modcommand}-files.txt # Check file validity - fn_check_files_list + fn_check_mod_files_list # Output to the user echo -ne "tidy up ${modcommand}-files.txt..." sleep 0.5 - fn_script_log_info "Rearranging ${modcommand}-files.txt" - # What lines/files to remove from file list (end var with a ";" separator) + fn_script_log_info "Tidy up ${modcommand}-files.txt" + # Lines/files to remove from file list (end with ";" separator) removefromlist="cfg;addons;" # Loop through files to remove from file list, - # that way these files won't get removed upon uninstall - # How many elements to remove from list + # generate elements to remove from list removefromlistamount="$(echo "${removefromlist}" | awk -F ';' '{ print NF }')" # Test all subvalue of "removefromlist" using the ";" separator for ((filesindex=1; filesindex < ${removefromlistamount}; filesindex++)); do # Put current file into test variable - removefilevar="$( echo "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }' )" - # Then delete matching line(s)! + removefilevar="$(echo "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }')" + # Delete matching line(s) sed -i "/^${removefilevar}$/d" "${modsdir}/${modcommand}-files.txt" local exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -290,47 +151,112 @@ fn_postinstall_tasks(){ fi } -# Apply some post-uninstall fixes to make sure everything will be fine -fn_postuninstall_tasks(){ - # Oxide fix - # Oxide replaces server files, so a validate is required after uninstall - if [ "${engine}" == "unity3d" ]&&[[ "${modprettyname}" == *"Oxide"* ]]; then - fn_print_information_nl "Validating to restore original ${gamename} files replaced by Oxide" - fn_script_log "Validating to restore original ${gamename} files replaced by Oxide" - exitbypass="1" - command_validate.sh - unset exitbypass +## Information Gathering + +# Get details of a mod any (relevant and unique, such as full mod name or install command) value +fn_mod_get_info(){ + # Variable to know when job is done + modinfocommand="0" + # Find entry in global array + for ((index=0; index <= ${#mods_global_array[@]}; index++)); do + # When entry is found + if [ "${mods_global_array[index]}" == "${currentmod}" ]; then + # Go back to the previous "MOD" separator + for ((index=index; index <= ${#mods_global_array[@]}; index--)); do + # When "MOD" is found + if [ "${mods_global_array[index]}" == "MOD" ]; then + # Get info + if [ -z "$index" ]; then + fn_print_error "index variable not set. Please report an issue." + echo "* https://github.com/GameServerManagers/LinuxGSM/issues" + exitcode="1" + core_exit.sh + fi + modcommand="${mods_global_array[index+1]}" + modprettyname="${mods_global_array[index+2]}" + modurl="${mods_global_array[index+3]}" + modfilename="${mods_global_array[index+4]}" + modsubdirs="${mods_global_array[index+5]}" + modlowercase="${mods_global_array[index+6]}" + modinstalldir="${mods_global_array[index+7]}" + modkeepfiles="${mods_global_array[index+8]}" + modengines="${mods_global_array[index+9]}" + modgames="${mods_global_array[index+10]}" + modexcludegames="${mods_global_array[index+11]}" + modsite="${mods_global_array[index+12]}" + moddescription="${mods_global_array[index+13]}" + fi + modinfocommand="1" + break + fi + ((totalmods++)) + done + fi + # Exit the loop if job is done + if [ "${modinfocommand}" == "1" ]; then + break + fi + done + + # What happens if mod is not found + if [ "${modinfocommand}" == "0" ]; then + fn_script_log_error "Could not find information for ${currentmod}" + fn_print_error_nl "Could not find information for ${currentmod}" + exitcode="1" + core_exit.sh fi } -######################### -## mods_list.sh arrays ## -######################### - -## Define info for a mod - -# Define all variables from a mod at once when index is set to a separator -fn_mod_info(){ -# If for some reason no index is set, none of this can work -if [ -z "$index" ]; then - fn_print_error "index variable not set. Please report an issue to LGSM Team." - echo "* https://github.com/GameServerManagers/LinuxGSM/issues" - exitcode="1" - core_exit.sh -fi - modcommand="${mods_global_array[index+1]}" - modprettyname="${mods_global_array[index+2]}" - modurl="${mods_global_array[index+3]}" - modfilename="${mods_global_array[index+4]}" - modsubdirs="${mods_global_array[index+5]}" - modlowercase="${mods_global_array[index+6]}" - modinstalldir="${mods_global_array[index+7]}" - modkeepfiles="${mods_global_array[index+8]}" - modengines="${mods_global_array[index+9]}" - modgames="${mods_global_array[index+10]}" - modexcludegames="${mods_global_array[index+11]}" - modsite="${mods_global_array[index+12]}" - moddescription="${mods_global_array[index+13]}" +# Builds list of installed mods +# using installed-mods.txt grabing mod info from mods_list.sh +fn_mods_installed_list(){ + # Set/reset variables + installedmodsline="1" + installedmodslist=() + # Loop through every line of the installed mods list ${modsinstalledlistfullpath} + while [ ${installedmodsline} -le ${installedmodscount} ]; do + currentmod="$(sed "${installedmodsline}q;d" "${modsinstalledlistfullpath}")" + # Get mod info to make sure mod exists + fn_mod_get_info + # Add the mod to available commands + installedmodslist+=( "${modcommand}" ) + # Increment line check + ((installedmodsline++)) + done + if [ -n "${totalmods}" ] ;then + fn_script_log_info "${totalmods} addons/mods are already installed" + fi +} + +# Checks if a mod is compatible for installation +# Provides available mods for installation +# Provides commands for mods installation +fn_mods_available(){ + # First, reset variables + compatiblemodslist=() + availablemodscommands=() + modprettynamemaxlength="0" + modsitemaxlength="0" + moddescriptionmaxlength="0" + modcommandmaxlength="0" + # Find compatible games + # Find separators through the global array + for ((index="0"; index <= ${#mods_global_array[@]}; index++)); do + # If current value is a separator; then + if [ "${mods_global_array[index]}" == "${modseparator}" ]; then + # Set mod variables + fn_mods_define + # Test if game is compatible + fn_mod_compatible_test + # If game is compatible + if [ "${modcompatibility}" == "1" ]; then + # Put it into an array to prepare user output + compatiblemodslist+=( "${modprettyname}" "${modcommand}" "${modsite}" "${moddescription}" ) + # Keep available commands in an array to make life easier + availablemodscommands+=( "${modcommand}" ) + fi + fi + done } ## Mod compatibility check @@ -413,80 +339,82 @@ fn_mod_compatible_test(){ fi } -# Checks if a mod is compatible for installation -# Provides available mods for installation -# Provides commands for mods installation -fn_mods_available(){ - # First, reset variables - compatiblemodslist=() - availablemodscommands=() - modprettynamemaxlength="0" - modsitemaxlength="0" - moddescriptionmaxlength="0" - modcommandmaxlength="0" - # Find compatible games - # Find separators through the global array - for ((index="0"; index <= ${#mods_global_array[@]}; index++)); do - # If current value is a separator; then - if [ "${mods_global_array[index]}" == "${modseparator}" ]; then - # Set mod variables - fn_mod_info - # Test if game is compatible - fn_mod_compatible_test - # If game is compatible - if [ "${modcompatibility}" == "1" ]; then - # Put it into an array to prepare user output - compatiblemodslist+=( "${modprettyname}" "${modcommand}" "${modsite}" "${moddescription}" ) - # Keep available commands in an array to make life easier - availablemodscommands+=( "${modcommand}" ) - fi +## Directory management + +# Create mods files and directories if it doesn't exist +fn_create_mods_dir(){ + # Create mod install directory + if [ ! -d "${modinstalldir}" ]; then + echo "creating mods install directory ${modinstalldir}..." + mkdir -p "${modinstalldir}" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Creating mod download dir ${modinstalldir}" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "Creating mod download dir ${modinstalldir}" fi - done + sleep 0.5 + fi + + # Create lgsm/data/${modsinstalledlist} + if [ ! -f "${modsinstalledlistfullpath}" ]; then + touch "${modsinstalledlistfullpath}" + fn_script_log_info "Created ${modsinstalledlistfullpath}" + fi } -# Output available mods in a nice way to the user -fn_mods_show_available(){ - # Set and reset vars - compatiblemodslistindex=0 - # As long as we're within index values - while [ "${compatiblemodslistindex}" -lt "${#compatiblemodslist[@]}" ]; do - # Set values for convenience - displayedmodname="${compatiblemodslist[compatiblemodslistindex]}" - displayedmodcommand="${compatiblemodslist[compatiblemodslistindex+1]}" - displayedmodsite="${compatiblemodslist[compatiblemodslistindex+2]}" - displayedmoddescription="${compatiblemodslist[compatiblemodslistindex+3]}" - # Output mods to the user - echo -e "\e[1m${displayedmodname}${default} - ${displayedmoddescription} - ${displayedmodsite}" - echo -e " * ${cyan}${displayedmodcommand}${default}" - # Increment index from the amount of values we just displayed - let "compatiblemodslistindex+=4" - ((totalmods++)) - done - # If no mods are found - if [ -z "${compatiblemodslist}" ]; then - fn_print_fail "No mods are currently available for ${gamename}." - core_exit.sh +# Create tmp download mod directory +fn_mods_create_tmp_dir(){ + if [ ! -d "${modstmpdir}" ]; then + mkdir -p "${modstmpdir}" + exitcode=$? + echo -ne "creating mod download dir ${modstmpdir}..." + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Creating mod download dir ${modstmpdir}" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "Creating mod download dir ${modstmpdir}" + fi fi - fn_script_log_info "${totalmods} addons/mods are available for install" } -# Checks if mods have been installed -# Also returns ${installedmodscount} if mods were found -fn_check_installed_mods(){ +# Remove the tmp mod download directory when finished +fn_mods_clear_tmp_dir(){ + if [ -d "${modstmpdir}" ]; then + rm -r "${modstmpdir}" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Clearing mod download directory ${modstmpdir}" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "Clearing mod download directory ${modstmpdir}" + fi + + fi + # Clear temp file list as well + if [ -f "${modsdir}/.removedfiles.tmp" ]; then + rm "${modsdir}/.removedfiles.tmp" + fi +} + + +# Exit if no mods were installed +fn_mods_check_installed(){ # Count installed mods if [ -f "${modsinstalledlistfullpath}" ]; then installedmodscount="$(cat "${modsinstalledlistfullpath}" | wc -l)" + else + installedmodscount=0 fi -} - -# A simple function to exit if no mods were installed -# Also returns ${installedmodscount} if mods were found -fn_mods_exit_if_not_installed(){ - # Checks if mods have been installed - # Also returns ${installedmodscount} if mods were found - fn_check_installed_mods - # If no mods lockfile is found or if it is empty - if [ ! -f "${modsinstalledlistfullpath}" ]||[ -z "${installedmodscount}" ]||[ ${installedmodscount} -le 0 ]; then + # If no mods are found + if [ ${installedmodscount} -eq 0 ]; then fn_print_information_nl "No installed mods or addons were found" echo " * Install mods using LGSM first with: ./${selfname} mods-install" fn_script_log_info "No installed mods or addons were found." @@ -494,155 +422,26 @@ fn_mods_exit_if_not_installed(){ fi } -# Builds installed mods list and sets available commands according to installed mods -# (requires ${installedmodscount} from fn_check_installed_mods) -fn_mods_available_commands_from_installed(){ - # Set/reset variables - installedmodsline="1" - installedmodslist=() - # Loop through every line of the installed mods list ${modsinstalledlistfullpath} - while [ ${installedmodsline} -le ${installedmodscount} ]; do - currentmod="$(sed "${installedmodsline}q;d" "${modsinstalledlistfullpath}")" - # Get mod info to make sure mod exists - fn_mod_get_info_from_command - # Add the mod to available commands - installedmodslist+=( "${modcommand}" ) - # Increment line check - let installedmodsline=installedmodsline+1 - done - if [ -n "${totalmods}" ] ;then - fn_script_log_info "${totalmods} addons/mods are already installed" - fi -} - -# Displays a detailed list of installed mods -# Requires fn_check_installed_mods and fn_mods_available_commands_from_installed to run -fn_installed_mods_detailed_list(){ - fn_check_installed_mods - fn_mods_available_commands_from_installed - # Were now based on ${installedmodslist} array's values - # We're gonna go through all available commands, get details and display them to the user - for ((dlindex=0; dlindex < ${#installedmodslist[@]}; dlindex++)); do - # Current mod is the "dlindex" value of the array we're going through - currentmod="${installedmodslist[dlindex]}" - # Get mod info - fn_mod_get_info_from_command - # Display mod info to the user - echo -e "\e[1m${modprettyname}${default} - ${moddescription} - ${modsite}" - echo -e " * ${cyan}${modcommand}${default}" - done -} - -# Displays a detailed list of installed mods -# Requires fn_check_installed_mods and fn_mods_available_commands_from_installed to run -fn_installed_mods_medium_list(){ - fn_check_installed_mods - fn_mods_available_commands_from_installed - # Were now based on ${installedmodslist} array's values - # We're gonna go through all available commands, get details and display them to the user - for ((mlindex=0; mlindex < ${#installedmodslist[@]}; mlindex++)); do - # Current mod is the "mlindex" value of the array we're going through - currentmod="${installedmodslist[mlindex]}" - # Get mod info - fn_mod_get_info_from_command - # Display mod info to the user - echo -e "${cyan}${modcommand}${default} - \e[1m${modprettyname}${default} - ${moddescription}" - done -} - -# Displays a simple list of installed mods -# Requires fn_check_installed_mods and fn_mods_available_commands_from_installed to run -# This list is only displayed when some mods are installed -fn_installed_mods_light_list(){ - fn_check_installed_mods - fn_mods_available_commands_from_installed - if [ "${installedmodscount}" -gt 0 ]; then - echo "Installed addons/mods" - echo "=================================" - # Were now based on ${installedmodslist} array's values - # We're gonna go through all available commands, get details and display them to the user - for ((llindex=0; llindex < ${#installedmodslist[@]}; llindex++)); do - # Current mod is the "llindex" value of the array we're going through - currentmod="${installedmodslist[llindex]}" - # Get mod info - fn_mod_get_info_from_command - # Display simple mod info to the user - echo -e " * \e[1m${green}${modcommand}${default}${default}" - ((totalmodsinstalled++)) - done - echo "" - fi -} - -# Displays a simple list of installed mods for mods-update command -# Requires fn_check_installed_mods and fn_mods_available_commands_from_installed to run -fn_installed_mods_update_list(){ - fn_check_installed_mods - fn_mods_available_commands_from_installed - echo "=================================" - echo "Installed addons/mods" - # Were now based on ${installedmodslist} array's values - # We're gonna go through all available commands, get details and display them to the user - for ((ulindex=0; ulindex < ${#installedmodslist[@]}; ulindex++)); do - # Current mod is the "ulindex" value of the array we're going through - currentmod="${installedmodslist[ulindex]}" - # Get mod info - fn_mod_get_info_from_command - # Display simple mod info to the user according to the update policy - # If modkeepfiles is not set for some reason, that's a problem - if [ -z "${modkeepfiles}" ]; then - fn_script_log_error "Couldn't find update policy for ${modprettyname}" - fn_print_error_nl "Couldn't find update policy for ${modprettyname}" - exitcode="1" +fn_check_mod_files_list(){ + # File list must exist and be valid before any operation on it + if [ -f "${modsdir}/${modcommand}-files.txt" ]; then + # How many lines is the file list + modsfilelistsize="$(cat "${modsdir}/${modcommand}-files.txt" | wc -l)" + # If file list is empty + if [ "${modsfilelistsize}" -eq 0 ]; then + fn_print_failure "${modcommand}-files.txt is empty" + echo "* Unable to remove ${modprettyname}" + fn_script_log_fatal "${modcommand}-files.txt is empty: Unable to remove ${modprettyname}." core_exit.sh - # If the mod won't get updated - elif [ "${modkeepfiles}" == "NOUPDATE" ]; then - echo -e " * \e[31m${modprettyname}${default} (won't be updated)" - # If the mode is just overwritten - elif [ "${modkeepfiles}" == "OVERWRITE" ]; then - echo -e " * \e[1m${modprettyname}${default} (overwrite)" - else - echo -e " * ${yellow}${modprettyname}${default} (common custom files remain untouched)" - fi - done -} - -# Get details of a mod any (relevant and unique, such as full mod name or install command) value -fn_mod_get_info_from_command(){ - # Variable to know when job is done - modinfocommand="0" - # Find entry in global array - for ((index=0; index <= ${#mods_global_array[@]}; index++)); do - # When entry is found - if [ "${mods_global_array[index]}" == "${currentmod}" ]; then - # Go back to the previous "MOD" separator - for ((index=index; index <= ${#mods_global_array[@]}; index--)); do - # When "MOD" is found - if [ "${mods_global_array[index]}" == "MOD" ]; then - # Get info - fn_mod_info - modinfocommand="1" - break - fi - ((totalmods++)) - done - - fi - # Exit the loop if job is done - if [ "${modinfocommand}" == "1" ]; then - break fi - done - - # What happens if mod is not found - if [ "${modinfocommand}" == "0" ]; then - fn_script_log_error "Could not find information for ${currentmod}" - fn_print_error_nl "Could not find information for ${currentmod}" - exitcode="1" + else + fn_print_failure "${modsdir}/${modcommand}-files.txt does not exist" + fn_script_log_fatal "${modsdir}/${modcommand}-files.txt does not exist: Unable to remove ${modprettyname}." core_exit.sh fi } -fn_mods_scrape_urls -fn_mods_info -fn_mods_available +# Database initialisation +mods_list.sh +mods_dir.sh +fn_mods_available \ No newline at end of file diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 73584f3dd..566efedc1 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -17,61 +17,57 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" modseparator="MOD" # Define mods information (required) -fn_mods_info(){ - # REQUIRED: mod_info_name=( MOD "modcommand" "Pretty Name" "URL" "filename" "modsubdirs" "LowercaseOn/Off" "/files/to/keep;" "/install/path" "ENGINES" "GAMES" "NOTGAMES" "AUTHOR_URL" "Short Description" ) - # Example 1) Well made mod: mod_info_name=( MOD "awesomemod" "This is an Awesome Mod" "https://awesomemod.com/latest.zip" "awesomemod.zip" "0" "LowercaseOff" "OVERWRITE" "${systemdir}/addons" "source;unity3d;" "GAMES" "NOTGAMES" "https://awesomemod.com/" "This mod knows that 42 is the answer" ) - # Example 2) Poorly made mod: mod_info_name=( MOD "stupidmod" "This is a stupid mod" "${crappymodurl}" "StupidMod.zip" "2" "LowercaseOn" "cfg;data/crappymod;" "${systemdir}" "source;" "GAMES" "Garry's mod;Counter-Strike: Source;" "This mod is dumber than dumb" ) - # None of those values can be empty - # index | Usage - # [0] | MOD: separator, all mods must begin with it - # [1] | "modcommand": the LGSM name and command to install the mod (must be unique and lowercase) - # [2] | "Pretty Name": the common name people use to call the mod that will be displayed to the user - # [3] | "URL": link to the file; can be a variable defined in fn_mods_nasty_urls (make sure curl can download it) - # [4] | "filename": the output filename - # [5] | "modsubdirs": in how many subdirectories is the mod (none is 0) (not used at release, but could be in the future) - # [6] | "LowercaseOn/Off": LowercaseOff or LowercaseOn: enable/disable converting extracted files and directories to lowercase (some games require it) - # [7] | "modinstalldir": the directory in which to install the mode ( use LGSM dir variables such as ${systemdir}) - # [8] | "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" to ignore the value or "NOUPDATE" to disallow updating - # [9] | "Supported Engines;": list them according to LGSM ${engine} variables, separated and ended with a semicolon, or use ENGINES to ignore the value - # [10] | "Supported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use GAMES to ignore the value - # [11] | "Unsupported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use NOTGAMES to ignore the value (useful to exclude a game when using Supported Engines) - # [12] | "AUTHOR_URL" is the author's website, displayed to the user when chosing mods to install - # [13] | "Short Description" a description showed to the user upon installation +# REQUIRED: mod_info_name=( MOD "modcommand" "Pretty Name" "URL" "filename" "modsubdirs" "LowercaseOn/Off" "/files/to/keep;" "/install/path" "ENGINES" "GAMES" "NOTGAMES" "AUTHOR_URL" "Short Description" ) +# Example 1) Well made mod: mod_info_name=( MOD "awesomemod" "This is an Awesome Mod" "https://awesomemod.com/latest.zip" "awesomemod.zip" "0" "LowercaseOff" "OVERWRITE" "${systemdir}/addons" "source;unity3d;" "GAMES" "NOTGAMES" "https://awesomemod.com/" "This mod knows that 42 is the answer" ) +# Example 2) Poorly made mod: mod_info_name=( MOD "stupidmod" "This is a stupid mod" "${crappymodurl}" "StupidMod.zip" "2" "LowercaseOn" "cfg;data/crappymod;" "${systemdir}" "source;" "GAMES" "Garry's mod;Counter-Strike: Source;" "This mod is dumber than dumb" ) +# None of those values can be empty +# index | Usage +# [0] | MOD: separator, all mods must begin with it +# [1] | "modcommand": the LGSM name and command to install the mod (must be unique and lowercase) +# [2] | "Pretty Name": the common name people use to call the mod that will be displayed to the user +# [3] | "URL": link to the file; can be a variable defined in fn_mods_nasty_urls (make sure curl can download it) +# [4] | "filename": the output filename +# [5] | "modsubdirs": in how many subdirectories is the mod (none is 0) (not used at release, but could be in the future) +# [6] | "LowercaseOn/Off": LowercaseOff or LowercaseOn: enable/disable converting extracted files and directories to lowercase (some games require it) +# [7] | "modinstalldir": the directory in which to install the mode ( use LGSM dir variables such as ${systemdir}) +# [8] | "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" to ignore the value or "NOUPDATE" to disallow updating +# [9] | "Supported Engines;": list them according to LGSM ${engine} variables, separated and ended with a semicolon, or use ENGINES to ignore the value +# [10] | "Supported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use GAMES to ignore the value +# [11] | "Unsupported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use NOTGAMES to ignore the value (useful to exclude a game when using Supported Engines) +# [12] | "AUTHOR_URL" is the author's website, displayed to the user when chosing mods to install +# [13] | "Short Description" a description showed to the user upon installation - # Source mods - mod_info_metamod=( MOD "metamod" "MetaMod" "${metamodurl}" "${metamodlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/metaplugins.ini;" "source;" "GAMES" "NOTGAMES" "https://www.sourcemm.net" "Plugins Framework" ) - mod_info_sourcemod=( MOD "sourcemod" "SourceMod" "${sourcemodurl}" "${sourcemodlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "source;" "GAMES" "NOTGAMES" "http://www.sourcemod.net" "Admin Features (requires MetaMod)" ) - # Garry's Mod Addons - mod_info_ulib=( MOD "ulib" "ULib" "https://codeload.github.com/TeamUlysses/ulib/zip/master" "ulib-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Complete Framework" ) - mod_info_ulx=( MOD "ulx" "ULX" "https://codeload.github.com/TeamUlysses/ulx/zip/master" "ulx-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Admin Panel (requires ULib)" ) - mod_info_utime=( MOD "utime" "UTime" "https://github.com/TeamUlysses/utime/archive/master.zip" "utime-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Keep track of players play time" ) - mod_info_uclip=( MOD "uclip" "UClip" "https://github.com/TeamUlysses/uclip/archive/master.zip" "uclip-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "An alternative to noclip" ) - mod_info_acf=( MOD "acf" "Armoured Combat Framework" "https://github.com/nrlulz/ACF/archive/master.zip" "acf-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/nrlulz/ACF" "Realistic Wepons & Engines" ) - mod_info_acf_missiles=( MOD "acfmissiles" "ACF Missiles" "https://github.com/Bubbus/ACF-Missiles/archive/master.zip" "acf-missiles-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Bubbus/ACF-Missiles" "More missiles for ACF" ) - mod_info_acf_advdupe2=( MOD "advdupe2" "Advanced Duplicator 2" "https://github.com/wiremod/advdupe2/archive/master.zip" "advdupe2-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://www.wiremod.com" "Save your constructions" ) - mod_info_darkrp=( MOD "darkrp" "DarkRP" "https://github.com/FPtje/DarkRP/archive/master.zip" "darkrp-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Most popular gamemode" ) - mod_info_darkrpmodification=( MOD "darkrpmodification" "DarkRP Modification" "https://github.com/FPtje/darkrpmodification/archive/master.zip" "darkrpmodification-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "NOUPDATE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Customize DarkRP settings" ) - # Oxidemod - mod_info_rustoxide=( MOD "rustoxide" "Oxide for Rust" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-Rust.zip" "Oxide-Rust_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Rust;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-rust.1659" "Allows for the use of plugins" ) - mod_info_hwoxide=( MOD "hwoxide" "Oxide for Hurtworld" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-Hurtworld.zip" "Oxide-Hurtworld_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Hurtworld;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-hurtworld.1332" "Allows for the use of plugins" ) - mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-7DaysToDie.zip" "Oxide-7DaysToDie_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-7-days-to-die.813" "Allows for the use of plugins" ) +# Source mods +mod_info_metamod=( MOD "metamod" "MetaMod" "${metamodurl}" "${metamodlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/metaplugins.ini;" "source;" "GAMES" "NOTGAMES" "https://www.sourcemm.net" "Plugins Framework" ) +mod_info_sourcemod=( MOD "sourcemod" "SourceMod" "${sourcemodurl}" "${sourcemodlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "source;" "GAMES" "NOTGAMES" "http://www.sourcemod.net" "Admin Features (requires MetaMod)" ) +# Garry's Mod Addons +mod_info_ulib=( MOD "ulib" "ULib" "https://codeload.github.com/TeamUlysses/ulib/zip/master" "ulib-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Complete Framework" ) +mod_info_ulx=( MOD "ulx" "ULX" "https://codeload.github.com/TeamUlysses/ulx/zip/master" "ulx-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Admin Panel (requires ULib)" ) +mod_info_utime=( MOD "utime" "UTime" "https://github.com/TeamUlysses/utime/archive/master.zip" "utime-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Keep track of players play time" ) +mod_info_uclip=( MOD "uclip" "UClip" "https://github.com/TeamUlysses/uclip/archive/master.zip" "uclip-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "An alternative to noclip" ) +mod_info_acf=( MOD "acf" "Armoured Combat Framework" "https://github.com/nrlulz/ACF/archive/master.zip" "acf-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/nrlulz/ACF" "Realistic Wepons & Engines" ) +mod_info_acf_missiles=( MOD "acfmissiles" "ACF Missiles" "https://github.com/Bubbus/ACF-Missiles/archive/master.zip" "acf-missiles-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Bubbus/ACF-Missiles" "More missiles for ACF" ) +mod_info_acf_advdupe2=( MOD "advdupe2" "Advanced Duplicator 2" "https://github.com/wiremod/advdupe2/archive/master.zip" "advdupe2-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://www.wiremod.com" "Save your constructions" ) +mod_info_darkrp=( MOD "darkrp" "DarkRP" "https://github.com/FPtje/DarkRP/archive/master.zip" "darkrp-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Most popular gamemode" ) +mod_info_darkrpmodification=( MOD "darkrpmodification" "DarkRP Modification" "https://github.com/FPtje/darkrpmodification/archive/master.zip" "darkrpmodification-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "NOUPDATE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Customize DarkRP settings" ) +# Oxidemod +mod_info_rustoxide=( MOD "rustoxide" "Oxide for Rust" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-Rust.zip" "Oxide-Rust_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Rust;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-rust.1659" "Allows for the use of plugins" ) +mod_info_hwoxide=( MOD "hwoxide" "Oxide for Hurtworld" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-Hurtworld.zip" "Oxide-Hurtworld_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Hurtworld;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-hurtworld.1332" "Allows for the use of plugins" ) +mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-7DaysToDie.zip" "Oxide-7DaysToDie_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-7-days-to-die.813" "Allows for the use of plugins" ) - # REQUIRED: Set all mods info into one array for convenience - mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_sourcemod[@]}" "${mod_info_ulib[@]}" "${mod_info_ulx[@]}" "${mod_info_utime[@]}" "${mod_info_uclip[@]}" "${mod_info_acf[@]}" "${mod_info_acf_missiles[@]}" "${mod_info_acf_sweps[@]}" "${mod_info_advdupe2[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) -} +# REQUIRED: Set all mods info into one array for convenience +mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_sourcemod[@]}" "${mod_info_ulib[@]}" "${mod_info_ulx[@]}" "${mod_info_utime[@]}" "${mod_info_uclip[@]}" "${mod_info_acf[@]}" "${mod_info_acf_missiles[@]}" "${mod_info_acf_sweps[@]}" "${mod_info_advdupe2[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) # Get a proper URL for mods that don't provide a good one (optional) -fn_mods_scrape_urls(){ - fn_script_log_info "Retrieving latest mods URLs" - # Metamod - metamodscrapeurl="http://www.gsptalk.com/mirror/sourcemod" - metamodlatestfile="$(wget "${metamodscrapeurl}/?MD" -q -O -| grep "mmsource" | grep "\-linux" | head -n1 | awk -F '>' '{ print $3 }' | awk -F '<' '{ print $1}')" - metamoddownloadurl="http://cdn.probablyaserver.com/sourcemod/" - metamodurl="${metamoddownloadurl}/${metamodlatestfile}" - # Sourcemod - sourcemodmversion="1.8" - sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}/sourcemod-latest-linux" - sourcemodlatestfile="$(wget "${sourcemodscrapeurl}" -q -O -)" - sourcemoddownloadurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}" - sourcemodurl="${sourcemoddownloadurl}/${sourcemodlatestfile}" -} +fn_script_log_info "Retrieving latest mods URLs" +# Metamod +metamodscrapeurl="http://www.gsptalk.com/mirror/sourcemod" +metamodlatestfile="$(wget "${metamodscrapeurl}/?MD" -q -O -| grep "mmsource" | grep "\-linux" | head -n1 | awk -F '>' '{ print $3 }' | awk -F '<' '{ print $1}')" +metamoddownloadurl="http://cdn.probablyaserver.com/sourcemod/" +metamodurl="${metamoddownloadurl}/${metamodlatestfile}" +# Sourcemod +sourcemodmversion="1.8" +sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}/sourcemod-latest-linux" +sourcemodlatestfile="$(wget "${sourcemodscrapeurl}" -q -O -)" +sourcemoddownloadurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}" +sourcemodurl="${sourcemoddownloadurl}/${sourcemodlatestfile}" From db3e0c64ebadff7bba1963fd9b1b16e2c5613682 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 21:06:36 +0000 Subject: [PATCH 0344/1895] Bug fixes --- lgsm/functions/command_mods_install.sh | 4 -- lgsm/functions/mods_core.sh | 78 ++++++++++++++------------ 2 files changed, 43 insertions(+), 39 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index fc6f78c9e..0519c75c8 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -14,9 +14,6 @@ mods_core.sh fn_print_header -# exits if no mods installed -fn_mods_check_installed - # Displays a list of installed mods fn_mods_installed_list if [ ${installedmodscount} -gt 0 ]; then @@ -104,7 +101,6 @@ fi ## Installation fn_mod_get_info -fn_mod_already_installed fn_create_mods_dir fn_mods_clear_tmp_dir fn_mods_create_tmp_dir diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index f35667c6b..9be5127c0 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -44,7 +44,7 @@ fn_mod_lowercase(){ fn_script_log "Converting ${modprettyname} files to lowercase" files=$(find "${extractdir}" -depth | wc -l) echo -en "\r" - while read src; do + while read -r src; do dst=`dirname "${src}"`/`basename "${src}" | tr '[A-Z]' '[a-z]'` if [ "${src}" != "${dst}" ] then @@ -126,7 +126,7 @@ fn_mod_tidy_files_list(){ # generate elements to remove from list removefromlistamount="$(echo "${removefromlist}" | awk -F ';' '{ print NF }')" # Test all subvalue of "removefromlist" using the ";" separator - for ((filesindex=1; filesindex < ${removefromlistamount}; filesindex++)); do + for ((filesindex=1; filesindex < removefromlistamount; filesindex++)); do # Put current file into test variable removefilevar="$(echo "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }')" # Delete matching line(s) @@ -166,31 +166,13 @@ fn_mod_get_info(){ # When "MOD" is found if [ "${mods_global_array[index]}" == "MOD" ]; then # Get info - if [ -z "$index" ]; then - fn_print_error "index variable not set. Please report an issue." - echo "* https://github.com/GameServerManagers/LinuxGSM/issues" - exitcode="1" - core_exit.sh - fi - modcommand="${mods_global_array[index+1]}" - modprettyname="${mods_global_array[index+2]}" - modurl="${mods_global_array[index+3]}" - modfilename="${mods_global_array[index+4]}" - modsubdirs="${mods_global_array[index+5]}" - modlowercase="${mods_global_array[index+6]}" - modinstalldir="${mods_global_array[index+7]}" - modkeepfiles="${mods_global_array[index+8]}" - modengines="${mods_global_array[index+9]}" - modgames="${mods_global_array[index+10]}" - modexcludegames="${mods_global_array[index+11]}" - modsite="${mods_global_array[index+12]}" - moddescription="${mods_global_array[index+13]}" - fi + fn_mod_info modinfocommand="1" break fi ((totalmods++)) done + fi # Exit the loop if job is done if [ "${modinfocommand}" == "1" ]; then @@ -207,12 +189,40 @@ fn_mod_get_info(){ fi } +# Define all variables for a mod at once when index is set to a separator +fn_mods_define(){ +if [ -z "$index" ]; then + fn_print_error "index variable not set. Please report an issue." + echo "* https://github.com/GameServerManagers/LinuxGSM/issues" + exitcode="1" + core_exit.sh +fi + modcommand="${mods_global_array[index+1]}" + modprettyname="${mods_global_array[index+2]}" + modurl="${mods_global_array[index+3]}" + modfilename="${mods_global_array[index+4]}" + modsubdirs="${mods_global_array[index+5]}" + modlowercase="${mods_global_array[index+6]}" + modinstalldir="${mods_global_array[index+7]}" + modkeepfiles="${mods_global_array[index+8]}" + modengines="${mods_global_array[index+9]}" + modgames="${mods_global_array[index+10]}" + modexcludegames="${mods_global_array[index+11]}" + modsite="${mods_global_array[index+12]}" + moddescription="${mods_global_array[index+13]}" +} + # Builds list of installed mods # using installed-mods.txt grabing mod info from mods_list.sh fn_mods_installed_list(){ + fn_mods_count_installed # Set/reset variables installedmodsline="1" installedmodslist=() + modprettynamemaxlength="0" + modsitemaxlength="0" + moddescriptionmaxlength="0" + modcommandmaxlength="0" # Loop through every line of the installed mods list ${modsinstalledlistfullpath} while [ ${installedmodsline} -le ${installedmodscount} ]; do currentmod="$(sed "${installedmodsline}q;d" "${modsinstalledlistfullpath}")" @@ -235,10 +245,6 @@ fn_mods_available(){ # First, reset variables compatiblemodslist=() availablemodscommands=() - modprettynamemaxlength="0" - modsitemaxlength="0" - moddescriptionmaxlength="0" - modcommandmaxlength="0" # Find compatible games # Find separators through the global array for ((index="0"; index <= ${#mods_global_array[@]}; index++)); do @@ -270,7 +276,7 @@ fn_compatible_mod_games(){ # How many games we need to test gamesamount="$(echo "${modgames}" | awk -F ';' '{ print NF }')" # Test all subvalue of "modgames" using the ";" separator - for ((gamevarindex=1; gamevarindex < ${gamesamount}; gamevarindex++)); do + for ((gamevarindex=1; gamevarindex < gamesamount; gamevarindex++)); do # Put current game name into modtest variable gamemodtest="$( echo "${modgames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" # If game name matches @@ -312,7 +318,7 @@ fn_not_compatible_mod_games(){ # How many engines we need to test excludegamesamount="$(echo "${modexcludegames}" | awk -F ';' '{ print NF }')" # Test all subvalue of "modexcludegames" using the ";" separator - for ((gamevarindex=1; gamevarindex < ${excludegamesamount}; gamevarindex++)); do + for ((gamevarindex=1; gamevarindex < excludegamesamount; gamevarindex++)); do # Put current engine name into modtest variable excludegamemodtest="$( echo "${modexcludegames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" # If engine name matches @@ -404,15 +410,18 @@ fn_mods_clear_tmp_dir(){ fi } - -# Exit if no mods were installed -fn_mods_check_installed(){ - # Count installed mods +fn_mods_count_installed(){ if [ -f "${modsinstalledlistfullpath}" ]; then - installedmodscount="$(cat "${modsinstalledlistfullpath}" | wc -l)" + installedmodscount="$(wc -l < "${modsinstalledlistfullpath}")" else installedmodscount=0 fi +} + +# Exit if no mods were installed +fn_mods_check_installed(){ + # Count installed mods + # If no mods are found if [ ${installedmodscount} -eq 0 ]; then fn_print_information_nl "No installed mods or addons were found" @@ -426,7 +435,7 @@ fn_check_mod_files_list(){ # File list must exist and be valid before any operation on it if [ -f "${modsdir}/${modcommand}-files.txt" ]; then # How many lines is the file list - modsfilelistsize="$(cat "${modsdir}/${modcommand}-files.txt" | wc -l)" + modsfilelistsize="$(wc -l < "${modsdir}/${modcommand}-files.txt")" # If file list is empty if [ "${modsfilelistsize}" -eq 0 ]; then fn_print_failure "${modcommand}-files.txt is empty" @@ -443,5 +452,4 @@ fn_check_mod_files_list(){ # Database initialisation mods_list.sh -mods_dir.sh fn_mods_available \ No newline at end of file From 6422904488422178c02934e378e9d1e40824cef5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 21:09:07 +0000 Subject: [PATCH 0345/1895] fn_mods_define --- lgsm/functions/mods_core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 9be5127c0..c8aa5f492 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -166,7 +166,7 @@ fn_mod_get_info(){ # When "MOD" is found if [ "${mods_global_array[index]}" == "MOD" ]; then # Get info - fn_mod_info + fn_mods_define modinfocommand="1" break fi From 63a8193798bb03d814490a3c5efc77497f4caf00 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 21:19:01 +0000 Subject: [PATCH 0346/1895] corrected variable --- lgsm/functions/command_mods_remove.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index e0b1623d1..a19a48ae7 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -69,7 +69,7 @@ modfileline="1" tput sc while [ "${modfileline}" -le "${modsfilelistsize}" ]; do # Current line defines current file to remove - currentfileremove="$(sed "${modfileline}q;d" "${modsdatadir}/${modcommand}-files.txt")" + currentfileremove="$(sed "${modfileline}q;d" "${modsdir}/${modcommand}-files.txt")" # If file or directory exists, then remove it fn_script_log "Removing: ${modinstalldir}/${currentfileremove}" if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then @@ -93,8 +93,8 @@ sleep 0.5 # Remove file list echo -en "removing ${modcommand}-files.txt..." sleep 0.5 -fn_script_log "Removing: ${modsdatadir}/${modcommand}-files.txt" -rm -rf "${modsdatadir}/${modcommand}-files.txt" +fn_script_log "Removing: ${modsdir}/${modcommand}-files.txt" +rm -rf "${modsdir}/${modcommand}-files.txt" local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl From c2de5e9c81cc3b16cd0abbf65390905a4996570c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 21:28:25 +0000 Subject: [PATCH 0347/1895] corrected var --- lgsm/functions/command_mods_remove.sh | 6 +++--- lgsm/functions/command_mods_update.sh | 2 +- lgsm/functions/mods_core.sh | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index a19a48ae7..662f738bf 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -81,7 +81,7 @@ while [ "${modfileline}" -le "${modsfilelistsize}" ]; do ((modfileline++)) done tput rc; tput ed; -echo -ne "removing ${modprettyname} ${modfileline} / ${modsfilelistsize}..." +echo -ne "sed ${modprettyname} ${modfileline} / ${modsfilelistsize}..." if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl core_exit.sh @@ -106,8 +106,8 @@ fi # Remove mods from installed mods list echo -en "removing ${modcommand} from ${modslockfile}..." sleep 0.5 -fn_script_log "Removing: ${modcommand} from ${modslockfilefullpath}" -sed -i "/^${modcommand}$/d" "${modslockfilefullpath}" +fn_script_log "Removing: ${modcommand} from ${modsinstalledlist}" +sed -i "/^${modcommand}$/d" "${modsinstalledlist}" local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 123e2b4e8..b89fdf015 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -51,7 +51,7 @@ done # Reset line value installedmodsline="1" while [ ${installedmodsline} -le ${installedmodscount} ]; do - currentmod="$(sed "${installedmodsline}q;d" "${modslockfilefullpath}")" + currentmod="$(sed "${installedmodsline}q;d" "${modsinstalledlist}")" if [ -n "${currentmod}" ]; then fn_mod_get_info # Don not update mod if the policy is set to "NOUPDATE" diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index c8aa5f492..1760d852f 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -421,7 +421,7 @@ fn_mods_count_installed(){ # Exit if no mods were installed fn_mods_check_installed(){ # Count installed mods - + fn_mods_count_installed # If no mods are found if [ ${installedmodscount} -eq 0 ]; then fn_print_information_nl "No installed mods or addons were found" From 622a3bc8fd76216606bc78a000cf2eb7f67c7ef9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 21:42:54 +0000 Subject: [PATCH 0348/1895] messages --- lgsm/functions/mods_core.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 1760d852f..1d3edc48d 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -377,14 +377,14 @@ fn_mods_create_tmp_dir(){ if [ ! -d "${modstmpdir}" ]; then mkdir -p "${modstmpdir}" exitcode=$? - echo -ne "creating mod download dir ${modstmpdir}..." + echo -ne "creating mod download directory ${modstmpdir}..." if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "Creating mod download dir ${modstmpdir}" + fn_script_log_fatal "Creating mod download directory ${modstmpdir}" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "Creating mod download dir ${modstmpdir}" + fn_script_log_pass "Creating mod download directory ${modstmpdir}" fi fi } @@ -392,6 +392,7 @@ fn_mods_create_tmp_dir(){ # Remove the tmp mod download directory when finished fn_mods_clear_tmp_dir(){ if [ -d "${modstmpdir}" ]; then + echo -ne "clearing mod download directory ${modstmpdir}..." rm -r "${modstmpdir}" exitcode=$? if [ ${exitcode} -ne 0 ]; then From f51c520d5047d6e7d88607f9f723befc64d8d443 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 21:45:15 +0000 Subject: [PATCH 0349/1895] corrected function name --- lgsm/functions/command_mods_update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index b89fdf015..80589bc8d 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -75,7 +75,7 @@ while [ ${installedmodsline} -le ${installedmodscount} ]; do ((installedmodsline++)) else fn_print_fail "No mod was selected" - fn_script_log_fail "No mod was selected" + fn_script_log_fatal "No mod was selected" exitcode="1" core_exit.sh fi From 3ca9951ceefcc9dc65f1a76a657625ee467eea42 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 21:51:30 +0000 Subject: [PATCH 0350/1895] corrected var --- lgsm/functions/command_mods_update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 80589bc8d..4521df74d 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -51,7 +51,7 @@ done # Reset line value installedmodsline="1" while [ ${installedmodsline} -le ${installedmodscount} ]; do - currentmod="$(sed "${installedmodsline}q;d" "${modsinstalledlist}")" + currentmod="$(sed "${installedmodsline}q;d" "${modsinstalledlistfullpath}")" if [ -n "${currentmod}" ]; then fn_mod_get_info # Don not update mod if the policy is set to "NOUPDATE" From 63f2ace5f83688967d4f471a91e6a784fed8a975 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 21:55:02 +0000 Subject: [PATCH 0351/1895] Moved function in to correct place --- lgsm/functions/command_mods_update.sh | 56 +++++++++++++-------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 4521df74d..614abf6d0 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -14,6 +14,34 @@ mods_core.sh fn_print_header +# Prevents specific files being overwritten upon update (set by ${modkeepfiles}) +# For that matter, remove cfg files after extraction before copying them to destination +fn_remove_cfg_files(){ + if [ "${modkeepfiles}" != "OVERWRITE" ]&&[ "${modkeepfiles}" != "NOUPDATE" ]; then + fn_print_dots "Preventing overwriting of ${modprettyname} config files" + fn_script_log "Preventing overwriting of ${modprettyname} config files" + sleep 0.5 + # Count how many files there are to remove + removefilesamount="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" + # Test all subvalues of "modkeepfiles" using the ";" separator + for ((removefilesindex=1; removefilesindex < ${removefilesamount}; removefilesindex++)); do + # Put the current file we are looking for into a variable + filetoremove="$( echo "${modkeepfiles}" | awk -F ';' -v x=${removefilesindex} '{ print $x }' )" + # If it matches an existing file that have been extracted delete the file + if [ -f "${extractdir}/${filetoremove}" ]||[ -d "${extractdir}/${filetoremove}" ]; then + rm -r "${extractdir}/${filetoremove}" + # Write the file path in a tmp file, to rebuild a full file list as it is rebuilt upon update + if [ ! -f "${modsdir}/.removedfiles.tmp" ]; then + touch "${modsdir}/.removedfiles.tmp" + fi + echo "${filetoremove}" >> "${modsdir}/.removedfiles.tmp" + fi + done + fn_print_ok "Preventing overwriting of ${modprettyname} config files" + sleep 0.5 + fi +} + echo "Update addons/mods" echo "=================================" fn_mods_check_installed @@ -84,32 +112,4 @@ echo "" fn_print_ok_nl "Mods update complete" fn_script_log "Mods update complete" -# Prevents specific files being overwritten upon update (set by ${modkeepfiles}) -# For that matter, remove cfg files after extraction before copying them to destination -fn_remove_cfg_files(){ - if [ "${modkeepfiles}" != "OVERWRITE" ]&&[ "${modkeepfiles}" != "NOUPDATE" ]; then - fn_print_dots "Preventing overwriting of ${modprettyname} config files" - fn_script_log "Preventing overwriting of ${modprettyname} config files" - sleep 0.5 - # Count how many files there are to remove - removefilesamount="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" - # Test all subvalues of "modkeepfiles" using the ";" separator - for ((removefilesindex=1; removefilesindex < ${removefilesamount}; removefilesindex++)); do - # Put the current file we are looking for into a variable - filetoremove="$( echo "${modkeepfiles}" | awk -F ';' -v x=${removefilesindex} '{ print $x }' )" - # If it matches an existing file that have been extracted delete the file - if [ -f "${extractdir}/${filetoremove}" ]||[ -d "${extractdir}/${filetoremove}" ]; then - rm -r "${extractdir}/${filetoremove}" - # Write the file path in a tmp file, to rebuild a full file list as it is rebuilt upon update - if [ ! -f "${modsdir}/.removedfiles.tmp" ]; then - touch "${modsdir}/.removedfiles.tmp" - fi - echo "${filetoremove}" >> "${modsdir}/.removedfiles.tmp" - fi - done - fn_print_ok "Preventing overwriting of ${modprettyname} config files" - sleep 0.5 - fi -} - core_exit.sh From 33b94670093dada8287d7cfa2af236db30b68a1a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 22:03:41 +0000 Subject: [PATCH 0352/1895] used correct var --- lgsm/functions/command_mods_remove.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 662f738bf..e9c6031f3 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -107,7 +107,7 @@ fi echo -en "removing ${modcommand} from ${modslockfile}..." sleep 0.5 fn_script_log "Removing: ${modcommand} from ${modsinstalledlist}" -sed -i "/^${modcommand}$/d" "${modsinstalledlist}" +sed -i "/^${modcommand}$/d" "${modsinstalledlistfullpath}" local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl From 9cbca7b20b2478332fd70f0da7fb8fe3f9e17861 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 22:33:02 +0000 Subject: [PATCH 0353/1895] Altered UI of update function --- lgsm/functions/command_mods_update.sh | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 614abf6d0..0b42fdaa6 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -42,15 +42,13 @@ fn_remove_cfg_files(){ fi } -echo "Update addons/mods" -echo "=================================" +fn_print_dots "Update addons/mods" +sleep 0.5 fn_mods_check_installed -fn_print_information_nl "${installedmodscount} addons/mods will be updated" +fn_print_info "Update addons/mods: ${installedmodscount} addons/mods will be updated" +sleep 0.5 fn_script_log_info "${installedmodscount} mods or addons will be updated" fn_mods_installed_list -echo "" -echo "Installed addons/mods" -echo "=================================" # Go through all available commands, get details and display them to the user for ((ulindex=0; ulindex < ${#installedmodslist[@]}; ulindex++)); do # Current mod is the "ulindex" value of the array we're going through @@ -59,8 +57,8 @@ for ((ulindex=0; ulindex < ${#installedmodslist[@]}; ulindex++)); do # Display installed mods and the update policy if [ -z "${modkeepfiles}" ]; then # If modkeepfiles is not set for some reason, that's a problem - fn_script_log_error "Couldn't find update policy for ${modprettyname}" - fn_print_error_nl "Couldn't find update policy for ${modprettyname}" + fn_script_log_error "Could not find update policy for ${modprettyname}" + fn_print_error_nl "Could not find update policy for ${modprettyname}" exitcode="1" core_exit.sh # If the mod won't get updated From 57d12ceca21a99f0b2c77aabd9f81dea1e8190f0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 22:43:14 +0000 Subject: [PATCH 0354/1895] Further ui changes --- lgsm/functions/command_mods_update.sh | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 0b42fdaa6..d4233a43d 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -12,8 +12,6 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh mods_core.sh -fn_print_header - # Prevents specific files being overwritten upon update (set by ${modkeepfiles}) # For that matter, remove cfg files after extraction before copying them to destination fn_remove_cfg_files(){ @@ -45,8 +43,7 @@ fn_remove_cfg_files(){ fn_print_dots "Update addons/mods" sleep 0.5 fn_mods_check_installed -fn_print_info "Update addons/mods: ${installedmodscount} addons/mods will be updated" -sleep 0.5 +fn_print_info_nl "Update addons/mods: ${installedmodscount} addons/mods will be updated" fn_script_log_info "${installedmodscount} mods or addons will be updated" fn_mods_installed_list # Go through all available commands, get details and display them to the user @@ -63,14 +60,15 @@ for ((ulindex=0; ulindex < ${#installedmodslist[@]}; ulindex++)); do core_exit.sh # If the mod won't get updated elif [ "${modkeepfiles}" == "NOUPDATE" ]; then - echo -e " * \e[31m${modprettyname}${default} (won't be updated)" + echo -e " * \e[31m${modprettyname}${default} (won't be updated)" # If the mode is just overwritten elif [ "${modkeepfiles}" == "OVERWRITE" ]; then - echo -e " * \e[1m${modprettyname}${default} (overwrite)" + echo -e " * \e[1m${modprettyname}${default} (overwrite)" else - echo -e " * ${yellow}${modprettyname}${default} (common custom files remain untouched)" + echo -e " * ${yellow}${modprettyname}${default} (common custom files remain untouched)" fi done +sleep 1 ## Update # List all installed mods and apply update From 53b528f996ccd4ea8aa96867742d9a9dfd835c0b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 22:46:49 +0000 Subject: [PATCH 0355/1895] added header to separate mods --- lgsm/functions/command_mods_update.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index d4233a43d..73827c50c 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -84,6 +84,7 @@ while [ ${installedmodsline} -le ${installedmodscount} ]; do fn_script_log_info "${modprettyname} will not be updated to preserve custom files" else echo "" + echo "==> Updating ${modprettyname}" fn_create_mods_dir fn_mods_clear_tmp_dir fn_mods_create_tmp_dir From b8ea04d06255f35116d473c25472f5051ae7c15f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 25 Jan 2017 22:54:18 +0000 Subject: [PATCH 0356/1895] re arrainged to fix sm and mm not downloading --- lgsm/functions/mods_list.sh | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 566efedc1..4b586df1b 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -12,7 +12,20 @@ local commandname="MODS" local commandaction="List Mods" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -## Useful variables +# Get a proper URL for mods that don't provide a good one (optional) +fn_script_log_info "Retrieving latest mods URLs" +# Metamod +metamodscrapeurl="http://www.gsptalk.com/mirror/sourcemod" +metamodlatestfile="$(wget "${metamodscrapeurl}/?MD" -q -O -| grep "mmsource" | grep "\-linux" | head -n1 | awk -F '>' '{ print $3 }' | awk -F '<' '{ print $1}')" +metamoddownloadurl="http://cdn.probablyaserver.com/sourcemod/" +metamodurl="${metamoddownloadurl}/${metamodlatestfile}" +# Sourcemod +sourcemodmversion="1.8" +sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}/sourcemod-latest-linux" +sourcemodlatestfile="$(wget "${sourcemodscrapeurl}" -q -O -)" +sourcemoddownloadurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}" +sourcemodurl="${sourcemoddownloadurl}/${sourcemodlatestfile}" + # Separator name modseparator="MOD" @@ -58,16 +71,3 @@ mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "https://raw.gith # REQUIRED: Set all mods info into one array for convenience mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_sourcemod[@]}" "${mod_info_ulib[@]}" "${mod_info_ulx[@]}" "${mod_info_utime[@]}" "${mod_info_uclip[@]}" "${mod_info_acf[@]}" "${mod_info_acf_missiles[@]}" "${mod_info_acf_sweps[@]}" "${mod_info_advdupe2[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) -# Get a proper URL for mods that don't provide a good one (optional) -fn_script_log_info "Retrieving latest mods URLs" -# Metamod -metamodscrapeurl="http://www.gsptalk.com/mirror/sourcemod" -metamodlatestfile="$(wget "${metamodscrapeurl}/?MD" -q -O -| grep "mmsource" | grep "\-linux" | head -n1 | awk -F '>' '{ print $3 }' | awk -F '<' '{ print $1}')" -metamoddownloadurl="http://cdn.probablyaserver.com/sourcemod/" -metamodurl="${metamoddownloadurl}/${metamodlatestfile}" -# Sourcemod -sourcemodmversion="1.8" -sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}/sourcemod-latest-linux" -sourcemodlatestfile="$(wget "${sourcemodscrapeurl}" -q -O -)" -sourcemoddownloadurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}" -sourcemodurl="${sourcemoddownloadurl}/${sourcemodlatestfile}" From bb99b30bd1b7d416151b4ab357214586c3c06d12 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 00:03:12 +0100 Subject: [PATCH 0357/1895] get mod info at the right time --- lgsm/functions/command_mods_install.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 0519c75c8..de1be8046 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -72,7 +72,9 @@ while [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; do fn_print_error2_nl "${usermodselect} is not a valid addon/mod." fi done +# Get mod info currentmod="${usermodselect}" +fn_mod_get_info echo "" echo "Installing ${modprettyname}" @@ -100,7 +102,6 @@ fi ## Installation -fn_mod_get_info fn_create_mods_dir fn_mods_clear_tmp_dir fn_mods_create_tmp_dir @@ -114,4 +115,4 @@ fn_mods_clear_tmp_dir echo "${modprettyname} installed" fn_script_log_pass "${modprettyname} installed." -core_exit.sh \ No newline at end of file +core_exit.sh From 3c3d68fbdc18cb7794fbea76a67f7f3c7a3d628f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 00:23:37 +0100 Subject: [PATCH 0358/1895] check fails in the loop and echo the right files amount --- lgsm/functions/command_mods_remove.sh | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index e9c6031f3..3ea2c7e87 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -75,19 +75,17 @@ while [ "${modfileline}" -le "${modsfilelistsize}" ]; do if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then rm -rf "${modinstalldir}/${currentfileremove}" local exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi fi tput rc; tput el printf "removing ${modprettyname} ${modfileline} / ${modsfilelistsize} : ${currentfileremove}..." ((modfileline++)) done -tput rc; tput ed; -echo -ne "sed ${modprettyname} ${modfileline} / ${modsfilelistsize}..." -if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - core_exit.sh -else - fn_print_ok_eol_nl -fi sleep 0.5 # Remove file list From b62d58fe8515ae0d66fe53f3d1223bd9c1c22315 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 00:31:26 +0100 Subject: [PATCH 0359/1895] added missing fn_print_ok_eol_nl --- lgsm/functions/command_mods_remove.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 3ea2c7e87..28a1a6a43 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -86,8 +86,8 @@ while [ "${modfileline}" -le "${modsfilelistsize}" ]; do printf "removing ${modprettyname} ${modfileline} / ${modsfilelistsize} : ${currentfileremove}..." ((modfileline++)) done +fn_print_ok_eol_nl sleep 0.5 - # Remove file list echo -en "removing ${modcommand}-files.txt..." sleep 0.5 From 75295065d2a8a6180334b73f678931e061d22324 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 13:59:29 +0100 Subject: [PATCH 0360/1895] comments & form revision --- lgsm/functions/mods_list.sh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 4b586df1b..abbe3299e 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -3,10 +3,10 @@ # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com -# Description: Lists and defines available mods for LGSM supported servers. -# Usage: To add a mod, you just need to add an array variable into fn_mods_info following the guide to set proper values. +# Description: Lists and defines available mods for LGSM supported servers; works along with mods_core.sh. +# Usage: To add a mod, you need to add an array variable following the guide to set proper values; # Usage: Then add this array to the mods_global_array. -# Usage: If needed, you can scrape to define the download URL inside the fn_mods_scrape_urls function. +# Usage: If needed, you can scrape the download URL first. local commandname="MODS" local commandaction="List Mods" @@ -26,10 +26,11 @@ sourcemodlatestfile="$(wget "${sourcemodscrapeurl}" -q -O -)" sourcemoddownloadurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}" sourcemodurl="${sourcemoddownloadurl}/${sourcemodlatestfile}" +# Define mods information (required) + # Separator name modseparator="MOD" -# Define mods information (required) # REQUIRED: mod_info_name=( MOD "modcommand" "Pretty Name" "URL" "filename" "modsubdirs" "LowercaseOn/Off" "/files/to/keep;" "/install/path" "ENGINES" "GAMES" "NOTGAMES" "AUTHOR_URL" "Short Description" ) # Example 1) Well made mod: mod_info_name=( MOD "awesomemod" "This is an Awesome Mod" "https://awesomemod.com/latest.zip" "awesomemod.zip" "0" "LowercaseOff" "OVERWRITE" "${systemdir}/addons" "source;unity3d;" "GAMES" "NOTGAMES" "https://awesomemod.com/" "This mod knows that 42 is the answer" ) # Example 2) Poorly made mod: mod_info_name=( MOD "stupidmod" "This is a stupid mod" "${crappymodurl}" "StupidMod.zip" "2" "LowercaseOn" "cfg;data/crappymod;" "${systemdir}" "source;" "GAMES" "Garry's mod;Counter-Strike: Source;" "This mod is dumber than dumb" ) @@ -38,17 +39,17 @@ modseparator="MOD" # [0] | MOD: separator, all mods must begin with it # [1] | "modcommand": the LGSM name and command to install the mod (must be unique and lowercase) # [2] | "Pretty Name": the common name people use to call the mod that will be displayed to the user -# [3] | "URL": link to the file; can be a variable defined in fn_mods_nasty_urls (make sure curl can download it) +# [3] | "URL": link to the mod archive file; can be a variable previously defined while scraping a URL # [4] | "filename": the output filename -# [5] | "modsubdirs": in how many subdirectories is the mod (none is 0) (not used at release, but could be in the future) -# [6] | "LowercaseOn/Off": LowercaseOff or LowercaseOn: enable/disable converting extracted files and directories to lowercase (some games require it) +# [5] | "modsubdirs": in how many subdirectories is the mod (none is 0) (not used at release, but could be in the future) +# [6] | "LowercaseOn/Off": LowercaseOff or LowercaseOn: enable/disable converting extracted files and directories to lowercase (some games require it) # [7] | "modinstalldir": the directory in which to install the mode ( use LGSM dir variables such as ${systemdir}) -# [8] | "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" to ignore the value or "NOUPDATE" to disallow updating +# [8] | "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" value to ignore the value or "NOUPDATE" to disallow updating # [9] | "Supported Engines;": list them according to LGSM ${engine} variables, separated and ended with a semicolon, or use ENGINES to ignore the value # [10] | "Supported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use GAMES to ignore the value # [11] | "Unsupported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use NOTGAMES to ignore the value (useful to exclude a game when using Supported Engines) # [12] | "AUTHOR_URL" is the author's website, displayed to the user when chosing mods to install -# [13] | "Short Description" a description showed to the user upon installation +# [13] | "Short Description" a description showed to the user upon installation/removal # Source mods mod_info_metamod=( MOD "metamod" "MetaMod" "${metamodurl}" "${metamodlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/metaplugins.ini;" "source;" "GAMES" "NOTGAMES" "https://www.sourcemm.net" "Plugins Framework" ) @@ -68,6 +69,5 @@ mod_info_rustoxide=( MOD "rustoxide" "Oxide for Rust" "https://raw.githubusercon mod_info_hwoxide=( MOD "hwoxide" "Oxide for Hurtworld" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-Hurtworld.zip" "Oxide-Hurtworld_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Hurtworld;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-hurtworld.1332" "Allows for the use of plugins" ) mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-7DaysToDie.zip" "Oxide-7DaysToDie_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-7-days-to-die.813" "Allows for the use of plugins" ) -# REQUIRED: Set all mods info into one array for convenience +# REQUIRED: Set all mods info into the global array mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_sourcemod[@]}" "${mod_info_ulib[@]}" "${mod_info_ulx[@]}" "${mod_info_utime[@]}" "${mod_info_uclip[@]}" "${mod_info_acf[@]}" "${mod_info_acf_missiles[@]}" "${mod_info_acf_sweps[@]}" "${mod_info_advdupe2[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) - From eb91545efc8ac4dacd8aa6aef835650d2a988ca2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 14:00:14 +0100 Subject: [PATCH 0361/1895] tab fix --- lgsm/functions/mods_list.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index abbe3299e..46fc8f046 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -41,10 +41,10 @@ modseparator="MOD" # [2] | "Pretty Name": the common name people use to call the mod that will be displayed to the user # [3] | "URL": link to the mod archive file; can be a variable previously defined while scraping a URL # [4] | "filename": the output filename -# [5] | "modsubdirs": in how many subdirectories is the mod (none is 0) (not used at release, but could be in the future) -# [6] | "LowercaseOn/Off": LowercaseOff or LowercaseOn: enable/disable converting extracted files and directories to lowercase (some games require it) +# [5] | "modsubdirs": in how many subdirectories is the mod (none is 0) (not used at release, but could be in the future) +# [6] | "LowercaseOn/Off": LowercaseOff or LowercaseOn: enable/disable converting extracted files and directories to lowercase (some games require it) # [7] | "modinstalldir": the directory in which to install the mode ( use LGSM dir variables such as ${systemdir}) -# [8] | "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" value to ignore the value or "NOUPDATE" to disallow updating +# [8] | "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" value to ignore the value or "NOUPDATE" to disallow updating # [9] | "Supported Engines;": list them according to LGSM ${engine} variables, separated and ended with a semicolon, or use ENGINES to ignore the value # [10] | "Supported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use GAMES to ignore the value # [11] | "Unsupported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use NOTGAMES to ignore the value (useful to exclude a game when using Supported Engines) From 9819ada0a49ecce4bf7d57560e182c1fef35b374 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 14:11:48 +0100 Subject: [PATCH 0362/1895] added fn_mod_tidy_files_list info --- lgsm/functions/mods_list.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 46fc8f046..730aeb081 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -44,7 +44,7 @@ modseparator="MOD" # [5] | "modsubdirs": in how many subdirectories is the mod (none is 0) (not used at release, but could be in the future) # [6] | "LowercaseOn/Off": LowercaseOff or LowercaseOn: enable/disable converting extracted files and directories to lowercase (some games require it) # [7] | "modinstalldir": the directory in which to install the mode ( use LGSM dir variables such as ${systemdir}) -# [8] | "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" value to ignore the value or "NOUPDATE" to disallow updating +# [8] | "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" value to ignore the value or "NOUPDATE" to disallow updating; for files to keep upon uninstall, see fn_mod_tidy_files_list from mods_core.sh # [9] | "Supported Engines;": list them according to LGSM ${engine} variables, separated and ended with a semicolon, or use ENGINES to ignore the value # [10] | "Supported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use GAMES to ignore the value # [11] | "Unsupported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use NOTGAMES to ignore the value (useful to exclude a game when using Supported Engines) From d19313569594032224bf6447fb7b7dd6006ab8c6 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 14:23:47 +0100 Subject: [PATCH 0363/1895] check_logs.sh for mods commands --- 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 255ab5ee1..577579171 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -34,7 +34,7 @@ do fi done -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 command_update.sh command_validate.sh command_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 command_update.sh command_validate.sh command_update_functions.sh command_email_test.sh command_mods_install.sh command_mods_update.sh command_mods_remove.sh ) for allowed_command in "${allowed_commands_array[@]}" do if [ "${allowed_command}" == "${function_selfname}" ]; then From ef05b348aeaa77fea09675c080d14864ec791e01 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 14:44:59 +0100 Subject: [PATCH 0364/1895] Comments, output and exits improvements --- lgsm/functions/mods_core.sh | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 1d3edc48d..6169d95fb 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -112,9 +112,9 @@ fn_mod_add_list(){ fi } +# Prevent sensitive directories from being erased upon uninstall by removing them from: ${modcommand}-files.txt fn_mod_tidy_files_list(){ - # Prevent sensitive directories from being erased by removing them from: ${modcommand}-files.txt - # Check file validity + # Check file list validity fn_check_mod_files_list # Output to the user echo -ne "tidy up ${modcommand}-files.txt..." @@ -129,19 +129,18 @@ fn_mod_tidy_files_list(){ for ((filesindex=1; filesindex < removefromlistamount; filesindex++)); do # Put current file into test variable removefilevar="$(echo "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }')" - # Delete matching line(s) + # Delete line(s) matching exactly sed -i "/^${removefilevar}$/d" "${modsdir}/${modcommand}-files.txt" + # Exit on error local exitcode=$? if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Error while tidying line: ${removefilevar} from: ${modsdir}/${modcommand}-files.txt" + core_exit.sh break fi done - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - else - fn_print_ok_eol_nl - fi - + fn_print_ok_eol_nl # Sourcemod fix # Remove metamod from sourcemod fileslist if [ "${modcommand}" == "sourcemod" ]; then @@ -172,7 +171,6 @@ fn_mod_get_info(){ fi ((totalmods++)) done - fi # Exit the loop if job is done if [ "${modinfocommand}" == "1" ]; then @@ -192,9 +190,9 @@ fn_mod_get_info(){ # Define all variables for a mod at once when index is set to a separator fn_mods_define(){ if [ -z "$index" ]; then + fn_script_log_fatal "index variable not set. Please report an issue." fn_print_error "index variable not set. Please report an issue." echo "* https://github.com/GameServerManagers/LinuxGSM/issues" - exitcode="1" core_exit.sh fi modcommand="${mods_global_array[index+1]}" @@ -238,9 +236,7 @@ fn_mods_installed_list(){ fi } -# Checks if a mod is compatible for installation -# Provides available mods for installation -# Provides commands for mods installation +# Loops through mods_global_array to define available mods & provide available commands for mods installation fn_mods_available(){ # First, reset variables compatiblemodslist=() @@ -302,7 +298,7 @@ fn_compatible_mod_engines(){ enginemodtest="$( echo "${modengines}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" # If engine name matches if [ "${enginemodtest}" == "${engine}" ]; then - # Mod is compatible ! + # Mod is compatible! modcompatibleengine="1" fi done @@ -323,7 +319,7 @@ fn_not_compatible_mod_games(){ excludegamemodtest="$( echo "${modexcludegames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )" # If engine name matches if [ "${excludegamemodtest}" == "${gamename}" ]; then - # Mod is compatible ! + # Mod is compatible! modeincompatiblegame="1" fi done @@ -411,6 +407,7 @@ fn_mods_clear_tmp_dir(){ fi } +# Counts how many mods were installed fn_mods_count_installed(){ if [ -f "${modsinstalledlistfullpath}" ]; then installedmodscount="$(wc -l < "${modsinstalledlistfullpath}")" @@ -419,12 +416,13 @@ fn_mods_count_installed(){ fi } -# Exit if no mods were installed +# Exits if no mods were installed fn_mods_check_installed(){ # Count installed mods fn_mods_count_installed # If no mods are found if [ ${installedmodscount} -eq 0 ]; then + echo "" fn_print_information_nl "No installed mods or addons were found" echo " * Install mods using LGSM first with: ./${selfname} mods-install" fn_script_log_info "No installed mods or addons were found." @@ -432,6 +430,7 @@ fn_mods_check_installed(){ fi } +# Checks that mod files list exists and isn't empty fn_check_mod_files_list(){ # File list must exist and be valid before any operation on it if [ -f "${modsdir}/${modcommand}-files.txt" ]; then @@ -451,6 +450,7 @@ fn_check_mod_files_list(){ fi } -# Database initialisation +## Database initialisation + mods_list.sh -fn_mods_available \ No newline at end of file +fn_mods_available From 2b302fc0ac550e298514511b9a3fcd31ad725aac Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 14:58:02 +0100 Subject: [PATCH 0365/1895] "User selected to continue" to be in check loop --- lgsm/functions/command_mods_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index de1be8046..4e563b7b9 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -96,8 +96,8 @@ if [ -f "${modsinstalledlistfullpath}" ]; then * ) echo "Please answer yes or no.";; esac done + fn_script_log_info "User selected to continue" fi -fn_script_log_info "User selected to continue" fi ## Installation From a86030b551353596c91e710986d75820f9a7d100 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 18:40:25 +0100 Subject: [PATCH 0366/1895] Total mods fix --- lgsm/functions/mods_core.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 6169d95fb..0ccc548de 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -169,7 +169,7 @@ fn_mod_get_info(){ modinfocommand="1" break fi - ((totalmods++)) + ((totalmodsavailable++)) done fi # Exit the loop if job is done @@ -231,8 +231,8 @@ fn_mods_installed_list(){ # Increment line check ((installedmodsline++)) done - if [ -n "${totalmods}" ] ;then - fn_script_log_info "${totalmods} addons/mods are already installed" + if [ -n "${installedmodscount}" ] ;then + fn_script_log_info "${installedmodscount} addons/mods are already installed" fi } From 94c1b57f8561ea5303d11df91174711047c589a9 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 18:41:57 +0100 Subject: [PATCH 0367/1895] total mods fix --- lgsm/functions/mods_core.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 0ccc548de..8d0eaf19d 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -169,7 +169,6 @@ fn_mod_get_info(){ modinfocommand="1" break fi - ((totalmodsavailable++)) done fi # Exit the loop if job is done From 0ddc146631cb4af34cc17c9adf3153ac2277e5d2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 18:45:36 +0100 Subject: [PATCH 0368/1895] total mods fix --- lgsm/functions/command_mods_install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 4e563b7b9..f8e5a40da 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -48,7 +48,7 @@ while [ "${compatiblemodslistindex}" -lt "${#compatiblemodslist[@]}" ]; do echo -e " * ${cyan}${displayedmodcommand}${default}" # Increment index from the amount of values we just displayed let "compatiblemodslistindex+=4" - ((totalmods++)) + ((totalmodsavailable++)) done # If no mods are available for a specific game @@ -57,7 +57,7 @@ if [ -z "${compatiblemodslist}" ]; then fn_script_log_info "No mods are currently available for ${gamename}." core_exit.sh fi -fn_script_log_info "${totalmods} addons/mods are available for install" +fn_script_log_info "${totalmodsavailable} addons/mods are available for install" ## User selects a mod echo "" From 82441e5d6db0cd520e3d7798eb55640a7bef9f39 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 18:57:10 +0100 Subject: [PATCH 0369/1895] ((totalmodsinstalled++)) not needed anymore --- lgsm/functions/command_mods_install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index f8e5a40da..7e76ac727 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -26,7 +26,6 @@ if [ ${installedmodscount} -gt 0 ]; then fn_mod_get_info # Display mod info to the user echo -e " * \e[1m${green}${modcommand}${default}${default}" - ((totalmodsinstalled++)) done echo "" fi From f1c753d4159122728f7d8a7b4a99375c102fad92 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 26 Jan 2017 19:04:41 +0100 Subject: [PATCH 0370/1895] keep files usually customized for ACF mod --- lgsm/functions/mods_list.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 730aeb081..8b0beb604 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -59,7 +59,7 @@ mod_info_ulib=( MOD "ulib" "ULib" "https://codeload.github.com/TeamUlysses/ulib/ mod_info_ulx=( MOD "ulx" "ULX" "https://codeload.github.com/TeamUlysses/ulx/zip/master" "ulx-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Admin Panel (requires ULib)" ) mod_info_utime=( MOD "utime" "UTime" "https://github.com/TeamUlysses/utime/archive/master.zip" "utime-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Keep track of players play time" ) mod_info_uclip=( MOD "uclip" "UClip" "https://github.com/TeamUlysses/uclip/archive/master.zip" "uclip-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "An alternative to noclip" ) -mod_info_acf=( MOD "acf" "Armoured Combat Framework" "https://github.com/nrlulz/ACF/archive/master.zip" "acf-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/nrlulz/ACF" "Realistic Wepons & Engines" ) +mod_info_acf=( MOD "acf" "Armoured Combat Framework" "https://github.com/nrlulz/ACF/archive/master.zip" "acf-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "acf-master/lua/acf/shared/guns;" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/nrlulz/ACF" "Realistic Wepons & Engines" ) mod_info_acf_missiles=( MOD "acfmissiles" "ACF Missiles" "https://github.com/Bubbus/ACF-Missiles/archive/master.zip" "acf-missiles-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Bubbus/ACF-Missiles" "More missiles for ACF" ) mod_info_acf_advdupe2=( MOD "advdupe2" "Advanced Duplicator 2" "https://github.com/wiremod/advdupe2/archive/master.zip" "advdupe2-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://www.wiremod.com" "Save your constructions" ) mod_info_darkrp=( MOD "darkrp" "DarkRP" "https://github.com/FPtje/DarkRP/archive/master.zip" "darkrp-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Most popular gamemode" ) From ae864bb92bba5cc040ee96c9b1dc6cb8a90c8087 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 26 Jan 2017 19:46:00 +0000 Subject: [PATCH 0371/1895] More UI modifications --- lgsm/functions/command_mods_remove.sh | 19 +++++++++---------- lgsm/functions/mods_core.sh | 4 ++-- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 28a1a6a43..1a0799122 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -74,19 +74,18 @@ while [ "${modfileline}" -le "${modsfilelistsize}" ]; do fn_script_log "Removing: ${modinstalldir}/${currentfileremove}" if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then rm -rf "${modinstalldir}/${currentfileremove}" - local exitcode=$? - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - core_exit.sh - else - fn_print_ok_eol_nl - fi + ((exitcode=$?)) fi tput rc; tput el - printf "removing ${modprettyname} ${modfileline} / ${modsfilelistsize} : ${currentfileremove}..." + printf "removing ${modprettyname} ${modfileline} / ${modsfilelistsize} : ${currentfileremove}..." ((modfileline++)) done -fn_print_ok_eol_nl +if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh +else + fn_print_ok_eol_nl +fi sleep 0.5 # Remove file list echo -en "removing ${modcommand}-files.txt..." @@ -102,7 +101,7 @@ else fi # Remove mods from installed mods list -echo -en "removing ${modcommand} from ${modslockfile}..." +echo -en "removing ${modcommand} from ${modsinstalledlist}..." sleep 0.5 fn_script_log "Removing: ${modcommand} from ${modsinstalledlist}" sed -i "/^${modcommand}$/d" "${modsinstalledlistfullpath}" diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 6169d95fb..5d42e15e0 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -423,9 +423,9 @@ fn_mods_check_installed(){ # If no mods are found if [ ${installedmodscount} -eq 0 ]; then echo "" - fn_print_information_nl "No installed mods or addons were found" + fn_print_failure_nl "No installed mods or addons were found" echo " * Install mods using LGSM first with: ./${selfname} mods-install" - fn_script_log_info "No installed mods or addons were found." + fn_script_log_fail "No installed mods or addons were found." core_exit.sh fi } From 8acf2189a919ef08f2618d5a3e6c46ea55b7e163 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 26 Jan 2017 19:48:27 +0000 Subject: [PATCH 0372/1895] corrected script_log --- lgsm/functions/mods_core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 959476b2d..5fa8e21c9 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -26,7 +26,7 @@ fn_mod_install_files(){ # Check if variable is valid checking if file has been downloaded and exists if [ ! -f "${modstmpdir}/${modfilename}" ]; then fn_print_failure "An issue occurred downloading ${modprettyname}" - fn_script_log_fail "An issue occurred downloading ${modprettyname}" + fn_script_log_fatal "An issue occurred downloading ${modprettyname}" core_exit.sh fi if [ ! -d "${extractdir}" ]; then From d83666625d217d438b071fd67cbca6369552fcb3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 26 Jan 2017 20:44:10 +0000 Subject: [PATCH 0373/1895] update wording for script log --- lgsm/functions/command_mods_install.sh | 4 ++-- lgsm/functions/command_mods_remove.sh | 2 +- lgsm/functions/command_mods_update.sh | 24 +++++++++++------------- lgsm/functions/core_dl.sh | 8 ++++---- lgsm/functions/mods_core.sh | 4 ++-- 5 files changed, 20 insertions(+), 22 deletions(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 7e76ac727..2d85c12f6 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -25,7 +25,7 @@ if [ ${installedmodscount} -gt 0 ]; then currentmod="${installedmodslist[llindex]}" fn_mod_get_info # Display mod info to the user - echo -e " * \e[1m${green}${modcommand}${default}${default}" + echo -e " * ${green}${modcommand}${default}${default}" done echo "" fi @@ -43,7 +43,7 @@ while [ "${compatiblemodslistindex}" -lt "${#compatiblemodslist[@]}" ]; do displayedmodsite="${compatiblemodslist[compatiblemodslistindex+2]}" displayedmoddescription="${compatiblemodslist[compatiblemodslistindex+3]}" # Output mods to the user - echo -e "\e[1m${displayedmodname}${default} - ${displayedmoddescription} - ${displayedmodsite}" + echo -e "${displayedmodname} - ${displayedmoddescription} - ${displayedmodsite}" echo -e " * ${cyan}${displayedmodcommand}${default}" # Increment index from the amount of values we just displayed let "compatiblemodslistindex+=4" diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 1a0799122..adf30adea 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -26,7 +26,7 @@ for ((mlindex=0; mlindex < ${#installedmodslist[@]}; mlindex++)); do # Get mod info fn_mod_get_info # Display mod info to the user - echo -e "${cyan}${modcommand}${default} - \e[1m${modprettyname}${default} - ${moddescription}" + echo -e "${red}${modcommand}${default} - ${modprettyname} - ${moddescription}" done echo "" diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 73827c50c..0b12e04aa 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -16,27 +16,25 @@ mods_core.sh # For that matter, remove cfg files after extraction before copying them to destination fn_remove_cfg_files(){ if [ "${modkeepfiles}" != "OVERWRITE" ]&&[ "${modkeepfiles}" != "NOUPDATE" ]; then - fn_print_dots "Preventing overwriting of ${modprettyname} config files" - fn_script_log "Preventing overwriting of ${modprettyname} config files" + echo -e "the following files/directories will be preserved:" sleep 0.5 # Count how many files there are to remove - removefilesamount="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" + filestopreserve="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')" # Test all subvalues of "modkeepfiles" using the ";" separator - for ((removefilesindex=1; removefilesindex < ${removefilesamount}; removefilesindex++)); do + for ((preservefilesindex=1; preservefilesindex < ${filestopreserve}; preservefilesindex++)); do # Put the current file we are looking for into a variable - filetoremove="$( echo "${modkeepfiles}" | awk -F ';' -v x=${removefilesindex} '{ print $x }' )" + filetopreserve="$(echo "${modkeepfiles}" | awk -F ';' -v x=${preservefilesindex} '{ print $x }' )" + echo -e " * serverfiles/${filetopreserve}" # If it matches an existing file that have been extracted delete the file - if [ -f "${extractdir}/${filetoremove}" ]||[ -d "${extractdir}/${filetoremove}" ]; then - rm -r "${extractdir}/${filetoremove}" + if [ -f "${extractdir}/${filetopreserve}" ]||[ -d "${extractdir}/${filetopreserve}" ]; then + rm -r "${extractdir}/${filetopreserve}" # Write the file path in a tmp file, to rebuild a full file list as it is rebuilt upon update if [ ! -f "${modsdir}/.removedfiles.tmp" ]; then touch "${modsdir}/.removedfiles.tmp" fi - echo "${filetoremove}" >> "${modsdir}/.removedfiles.tmp" + echo "${filetopreserve}" >> "${modsdir}/.removedfiles.tmp" fi done - fn_print_ok "Preventing overwriting of ${modprettyname} config files" - sleep 0.5 fi } @@ -60,12 +58,12 @@ for ((ulindex=0; ulindex < ${#installedmodslist[@]}; ulindex++)); do core_exit.sh # If the mod won't get updated elif [ "${modkeepfiles}" == "NOUPDATE" ]; then - echo -e " * \e[31m${modprettyname}${default} (won't be updated)" + echo -e " * ${red}{modprettyname}${default} (won't be updated)" # If the mode is just overwritten elif [ "${modkeepfiles}" == "OVERWRITE" ]; then - echo -e " * \e[1m${modprettyname}${default} (overwrite)" + echo -e " * ${modprettyname} (overwrite)" else - echo -e " * ${yellow}${modprettyname}${default} (common custom files remain untouched)" + echo -e " * ${yellow}${modprettyname}${default} (retain common custom files)" fi done sleep 1 diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index f7768a7cf..aad8f1963 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -80,12 +80,12 @@ fn_fetch_trap(){ echo "" echo -ne "downloading ${filename}..." fn_print_canceled_eol_nl - fn_script_log_info "downloading ${filename}...CANCELED" + fn_script_log_info "Downloading ${filename}...CANCELED" sleep 1 rm -f "${filedir}/${filename}" | tee -a "${scriptlog}" echo -ne "downloading ${filename}..." fn_print_removed_eol_nl - fn_script_log_info "downloading ${filename}...REMOVED" + fn_script_log_info "Downloading ${filename}...REMOVED" core_exit.sh } @@ -130,7 +130,7 @@ fn_fetch_file(){ if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl if [ -f "${scriptlog}" ]; then - fn_script_log_fatal "downloading ${filename}: FAIL" + fn_script_log_fatal "Downloading ${filename}: FAIL" fi echo -e "${fileurl}" | tee -a "${scriptlog}" echo "${curlcmd}" | tee -a "${scriptlog}" @@ -138,7 +138,7 @@ fn_fetch_file(){ else fn_print_ok_eol_nl if [ -f "${scriptlog}" ]; then - fn_script_log_pass "downloading ${filename}: OK" + fn_script_log_pass "Downloading ${filename}: OK" fi fi # remove trap diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 5fa8e21c9..1eb5984b0 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -41,7 +41,7 @@ fn_mod_lowercase(){ echo -ne "converting ${modprettyname} files to lowercase..." sleep 0.5 - fn_script_log "Converting ${modprettyname} files to lowercase" + fn_script_log_info "Converting ${modprettyname} files to lowercase" files=$(find "${extractdir}" -depth | wc -l) echo -en "\r" while read -r src; do @@ -231,7 +231,7 @@ fn_mods_installed_list(){ ((installedmodsline++)) done if [ -n "${installedmodscount}" ] ;then - fn_script_log_info "${installedmodscount} addons/mods are already installed" + fn_script_log_info "${installedmodscount} addons/mods are currently installed" fi } From 8311e2c972aa186c72a26671bac474ed3e6e65c4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 26 Jan 2017 20:48:09 +0000 Subject: [PATCH 0374/1895] script_log to info --- lgsm/functions/command_mods_update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index 0b12e04aa..e93303016 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -105,6 +105,6 @@ while [ ${installedmodsline} -le ${installedmodscount} ]; do done echo "" fn_print_ok_nl "Mods update complete" -fn_script_log "Mods update complete" +fn_script_log_info "Mods update complete" core_exit.sh From b9f47518b955edccfba96f99f5111cbee28dfa40 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 26 Jan 2017 20:52:49 +0000 Subject: [PATCH 0375/1895] uf was missing a commandname --- lgsm/functions/command_update_functions.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 538a8dee8..e3d96d378 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -4,6 +4,7 @@ # Website: https://gameservermanagers.com # Description: Deletes the functions dir to allow re-downloading of functions from GitHub. +local commandname="UPDATE LGSM" local commandaction="Update LGSM" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" From bea65fb35ac102fa95b984013d8ecacd5e47f4f4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 26 Jan 2017 21:11:25 +0000 Subject: [PATCH 0376/1895] script log message capital --- lgsm/functions/command_backup.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 8e18a619b..b4bff70b0 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -16,12 +16,12 @@ fn_backup_trap(){ echo "" echo -ne "backup ${backupname}.tar.gz..." fn_print_canceled_eol_nl - fn_script_log_info "backup ${backupname}.tar.gz: CANCELED" + fn_script_log_info "Backup ${backupname}.tar.gz: CANCELED" sleep 1 rm -f "${backupdir}/${backupname}.tar.gz" | tee -a "${scriptlog}" echo -ne "backup ${backupname}.tar.gz..." fn_print_removed_eol_nl - fn_script_log_info "backup ${backupname}.tar.gz: REMOVED" + fn_script_log_info "Backup ${backupname}.tar.gz: REMOVED" # Remove lock file rm -f "${tmpdir}/.backup.lock" core_exit.sh From 3ea100cc723a11797160f9743303862527e442c0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 26 Jan 2017 21:18:26 +0000 Subject: [PATCH 0377/1895] improvements to script log messages --- lgsm/functions/command_mods_remove.sh | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index adf30adea..7b96503ec 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -59,7 +59,7 @@ fn_mod_get_info fn_check_mod_files_list # Uninstall the mod -fn_script_log "Removing ${modsfilelistsize} files from ${modprettyname}" +fn_script_log_info "Removing ${modsfilelistsize} files from ${modprettyname}" echo -e "removing ${modprettyname}" echo -e "* ${modsfilelistsize} files to be removed" echo -e "* location: ${modinstalldir}" @@ -71,10 +71,16 @@ while [ "${modfileline}" -le "${modsfilelistsize}" ]; do # Current line defines current file to remove currentfileremove="$(sed "${modfileline}q;d" "${modsdir}/${modcommand}-files.txt")" # If file or directory exists, then remove it - fn_script_log "Removing: ${modinstalldir}/${currentfileremove}" + if [ -f "${modinstalldir}/${currentfileremove}" ]||[ -d "${modinstalldir}/${currentfileremove}" ]; then rm -rf "${modinstalldir}/${currentfileremove}" ((exitcode=$?)) + if [ ${exitcode} -ne 0 ]; then + fn_script_log_fatal "Removing ${modinstalldir}/${currentfileremove}" + break + else + fn_script_log_pass "Removing ${modinstalldir}/${currentfileremove}" + fi fi tput rc; tput el printf "removing ${modprettyname} ${modfileline} / ${modsfilelistsize} : ${currentfileremove}..." @@ -90,26 +96,29 @@ sleep 0.5 # Remove file list echo -en "removing ${modcommand}-files.txt..." sleep 0.5 -fn_script_log "Removing: ${modsdir}/${modcommand}-files.txt" rm -rf "${modsdir}/${modcommand}-files.txt" local exitcode=$? if [ ${exitcode} -ne 0 ]; then + fn_script_log_fatal "Removing ${modsdir}/${modcommand}-files.txt" fn_print_fail_eol_nl core_exit.sh else + fn_script_log_pass "Removing ${modsdir}/${modcommand}-files.txt" fn_print_ok_eol_nl fi # Remove mods from installed mods list echo -en "removing ${modcommand} from ${modsinstalledlist}..." sleep 0.5 -fn_script_log "Removing: ${modcommand} from ${modsinstalledlist}" + sed -i "/^${modcommand}$/d" "${modsinstalledlistfullpath}" local exitcode=$? if [ ${exitcode} -ne 0 ]; then + fn_script_loga_fatal "Removing ${modcommand} from ${modsinstalledlist}" fn_print_fail_eol_nl core_exit.sh else + fn_script_loga_pass "Removing ${modcommand} from ${modsinstalledlist}" fn_print_ok_eol_nl fi From bc8083218987d3877c33c0f7bd98bdcd70fbaeaa Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 05:31:13 +0100 Subject: [PATCH 0378/1895] fn_getopt_rustserver (wipe command) --- lgsm/functions/core_getopt.sh | 88 +++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index faa9c7011..495cc7825 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -574,6 +574,92 @@ case "${getopt}" in esac } +fn_getopt_rustserver(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + u|update) + command_update.sh;; + fu|force-update|update-restart) + forceupdate=1; + command_update.sh;; + uf|update-functions) + command_update_functions.sh;; + v|validate) + command_validate.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.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;; + mi|mods-install) + command_mods_install.sh;; + mu|mods-update) + command_mods_update.sh;; + mr|mods-remove) + command_mods_remove.sh;; + wi|wipe + command_wipe.sh + dd|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update\t${default}u |Checks and applies updates from SteamCMD." + echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}validate\t${default}v |Validate server files with SteamCMD." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful information about the server." + echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + echo -e "${blue}mods-install\t${default}mi |View and install available mods/addons." + echo -e "${blue}mods-update\t${default}mu |Update installed mods/addons." + echo -e "${blue}mods-remove\t${default}mr |Remove installed mods/addons." + echo -e "${blue}wipe\t${default}wi |Wipe your Rust server." + } | column -s $'\t' -t + esac +} + fn_getopt_unreal(){ case "${getopt}" in st|start) @@ -796,6 +882,8 @@ elif [ "${gamename}" == "Mumble" ]; then # Teamspeak 3 elif [ "${gamename}" == "TeamSpeak 3" ]; then fn_getopt_teamspeak3 +elif [ "${gamename}" == "Rust" ]; then + fn_getopt_rustserver # Unreal 2 Engine elif [ "${engine}" == "unreal2" ]; then if [ "${gamename}" == "Unreal Tournament 2004" ]; then From 694b27b35ae81e51c4de42aec626a64b7f0f6c87 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 05:32:32 +0100 Subject: [PATCH 0379/1895] command_wipe.sh --- lgsm/functions/core_functions.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index cd7aa07c7..a84163921 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -212,6 +212,10 @@ functionfile="${FUNCNAME}" fn_fetch_function } +command_wipe.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} # Checks From 63e0c184c320952af0612ada908fc90b96910b72 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 06:05:53 +0100 Subject: [PATCH 0380/1895] file init --- lgsm/functions/command_wipe.sh | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 lgsm/functions/command_wipe.sh diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh new file mode 100644 index 000000000..2bdcf9c76 --- /dev/null +++ b/lgsm/functions/command_wipe.sh @@ -0,0 +1,7 @@ +#!/bin/bash +# LGSM command_backup.sh function +# Author: Daniel Gibbs +# Contributor: UltimateByte +# Website: https://gameservermanagers.com +# Description: Wipes server data for Rust, useful after monthly updates + From e830e8f9428f4045c388c1a673f6a028f713f51f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 07:29:09 +0100 Subject: [PATCH 0381/1895] various fixes --- lgsm/functions/mods_core.sh | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 1eb5984b0..9fd731c97 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -121,7 +121,7 @@ fn_mod_tidy_files_list(){ sleep 0.5 fn_script_log_info "Tidy up ${modcommand}-files.txt" # Lines/files to remove from file list (end with ";" separator) - removefromlist="cfg;addons;" + removefromlist="cfg;addons;RustDedicated_Data;RustDedicated_Data/Managed;RustDedicated_Data/Managed/x86;" # Loop through files to remove from file list, # generate elements to remove from list removefromlistamount="$(echo "${removefromlist}" | awk -F ';' '{ print NF }')" @@ -344,6 +344,21 @@ fn_mod_compatible_test(){ # Create mods files and directories if it doesn't exist fn_create_mods_dir(){ + # Create lgsm data modsdir + if [ ! -d "${modsdir}" ];then + echo "creating lgsm mods data directory ${modsdir}..." + mkdir -p "${modsdir}" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Creating mod download dir ${modsdir}" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "Creating mod download dir ${modsdir}" + fi + sleep 0.5 + fi # Create mod install directory if [ ! -d "${modinstalldir}" ]; then echo "creating mods install directory ${modinstalldir}..." @@ -351,11 +366,11 @@ fn_create_mods_dir(){ exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "Creating mod download dir ${modinstalldir}" + fn_script_log_fatal "Creating mod install directory ${modinstalldir}" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "Creating mod download dir ${modinstalldir}" + fn_script_log_pass "Creating mod install directory ${modinstalldir}" fi sleep 0.5 fi From 7b28f2b609acb5264dfe545883e6432d04031d41 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 07:30:49 +0100 Subject: [PATCH 0382/1895] missing ;; --- 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 495cc7825..121c7c244 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -618,7 +618,7 @@ case "${getopt}" in mr|mods-remove) command_mods_remove.sh;; wi|wipe - command_wipe.sh + command_wipe.sh;; dd|detect-deps) command_dev_detect_deps.sh;; dg|detect-glibc) From 332bcee4840be3d27aba2eb917881b090e6426a1 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 07:33:03 +0100 Subject: [PATCH 0383/1895] missing ), damn! --- 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 121c7c244..06dbccc43 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -617,7 +617,7 @@ case "${getopt}" in command_mods_update.sh;; mr|mods-remove) command_mods_remove.sh;; - wi|wipe + wi|wipe) command_wipe.sh;; dd|detect-deps) command_dev_detect_deps.sh;; From 451191c4777f733992917f3d8cfc480054d2cc4d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 07:42:14 +0100 Subject: [PATCH 0384/1895] escape for sed & fn_script_log_fail > fn_script_log_error --- lgsm/functions/mods_core.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 9fd731c97..f6319f284 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -121,7 +121,7 @@ fn_mod_tidy_files_list(){ sleep 0.5 fn_script_log_info "Tidy up ${modcommand}-files.txt" # Lines/files to remove from file list (end with ";" separator) - removefromlist="cfg;addons;RustDedicated_Data;RustDedicated_Data/Managed;RustDedicated_Data/Managed/x86;" + removefromlist="cfg;addons;RustDedicated_Data;RustDedicated_Data\/Managed;RustDedicated_Data\/Managed\/x86;" # Loop through files to remove from file list, # generate elements to remove from list removefromlistamount="$(echo "${removefromlist}" | awk -F ';' '{ print NF }')" @@ -439,7 +439,7 @@ fn_mods_check_installed(){ echo "" fn_print_failure_nl "No installed mods or addons were found" echo " * Install mods using LGSM first with: ./${selfname} mods-install" - fn_script_log_fail "No installed mods or addons were found." + fn_script_log_error "No installed mods or addons were found." core_exit.sh fi } From c13ab40e0d98f2aefe4683aa7673107092ebe0af Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 07:45:10 +0100 Subject: [PATCH 0385/1895] don't erase rust x64 dir --- lgsm/functions/mods_core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index f6319f284..8c5e858ab 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -121,7 +121,7 @@ fn_mod_tidy_files_list(){ sleep 0.5 fn_script_log_info "Tidy up ${modcommand}-files.txt" # Lines/files to remove from file list (end with ";" separator) - removefromlist="cfg;addons;RustDedicated_Data;RustDedicated_Data\/Managed;RustDedicated_Data\/Managed\/x86;" + removefromlist="cfg;addons;RustDedicated_Data;RustDedicated_Data\/Managed;RustDedicated_Data\/Managed\/x86;RustDedicated_Data\/Managed\/x64" # Loop through files to remove from file list, # generate elements to remove from list removefromlistamount="$(echo "${removefromlist}" | awk -F ';' '{ print NF }')" From f8072b69ded7034b813a2a20fcb9ea4d9eaa2fb0 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 07:48:33 +0100 Subject: [PATCH 0386/1895] typo: loga > log --- lgsm/functions/command_mods_remove.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index 7b96503ec..d63a00101 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -114,11 +114,11 @@ sleep 0.5 sed -i "/^${modcommand}$/d" "${modsinstalledlistfullpath}" local exitcode=$? if [ ${exitcode} -ne 0 ]; then - fn_script_loga_fatal "Removing ${modcommand} from ${modsinstalledlist}" + fn_script_log_fatal "Removing ${modcommand} from ${modsinstalledlist}" fn_print_fail_eol_nl core_exit.sh else - fn_script_loga_pass "Removing ${modcommand} from ${modsinstalledlist}" + fn_script_log_pass "Removing ${modcommand} from ${modsinstalledlist}" fn_print_ok_eol_nl fi From c972ef09257094100baf1279cec920b660f6c56e Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 07:51:32 +0100 Subject: [PATCH 0387/1895] missing semicolon for x64 dir to preserve --- lgsm/functions/mods_core.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 8c5e858ab..1e36285e1 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -121,7 +121,7 @@ fn_mod_tidy_files_list(){ sleep 0.5 fn_script_log_info "Tidy up ${modcommand}-files.txt" # Lines/files to remove from file list (end with ";" separator) - removefromlist="cfg;addons;RustDedicated_Data;RustDedicated_Data\/Managed;RustDedicated_Data\/Managed\/x86;RustDedicated_Data\/Managed\/x64" + removefromlist="cfg;addons;RustDedicated_Data;RustDedicated_Data\/Managed;RustDedicated_Data\/Managed\/x86;RustDedicated_Data\/Managed\/x64;" # Loop through files to remove from file list, # generate elements to remove from list removefromlistamount="$(echo "${removefromlist}" | awk -F ';' '{ print NF }')" From 462a653b36ff4efc6ef7a49ed4579dbc74070840 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 08:36:46 +0100 Subject: [PATCH 0388/1895] attempt for permission errors in /sys fix||alert --- lgsm/functions/check_permissions.sh | 91 +++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 1411e649c..987faef7f 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -126,5 +126,96 @@ fn_check_permissions(){ fi } +## The following fn_sys_perm_* functions checks for permission errors in /sys directory + +# Checks for permission errors in /sys directory +fn_sys_perm_errors(){ + # Reset test variables + sysdirpermerror="0" + classdirpermerror="0" + netdirpermerror="0" + # Check permissions + if [ ! -r "/sys" ]||[ ! -x "/sys" ]; then + sysdirpermerror="1" + fi + if [ ! -r "/sys/class" ]||[ ! -x "/sys/class" ]; then + classdirpermerror="1" + if [ ! -r "/sys/class/net" ]||[ ! -x "sys/class/net" ]; then + netdirpermerror="1" + fi +} + +# Displays /sys related permission errors to the user +fn_sys_perm_error_display(){ + # /sys, /sys/class and /sys/class/net should be readable & executable + # If any error was found + if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then + fn_print_error_nl "Permission error(s) found:" + fn_script_log_error "Permission error(s) found:" + if [ "${sysdirpermerror}" == "1" ]; then + echo " * /sys permissions are $(stat -c %a /sys) instead of expected 555" + fn_script_log "/sys permissions are $(stat -c %a /sys) instead of expected 555" + fi + if [ "${classdirpermerror}" == "1" ]; then + echo " * /sys/class permissions are $(stat -c %a /sys/class) instead of expected 755" + fn_script_log "/sys/class permissions are $(stat -c %a /sys/class) instead of expected 755" + fi + if [ "${netdirpermerror}" == "1" ]; then + echo " * /sys/class/net permissions are $(stat -c %a /sys/class) instead of expected 755" + fn_script_log "/sys/class/net permissions are $(stat -c %a /sys/class) instead of expected 755" + fi + echo "" + fn_print_information_nl "This error causes servers to fail starting properly" + fn_script_log_info "This error causes servers to fail starting properly." +} + +# Attempt to fix /sys related permission errors if sudo is available, exits otherwise +fn_fix_sys_perm_errors(){ + sudo -v > /dev/null 2>&1 + iif [ $? -eq 0 ]; then + fn_print_information_nl "Automatically fixing permissions" + fn_script_log_info "Automatically fixing permissions." + if [ "${sysdirpermerror}" == "1" ]; then + sudo chmod a+rx "/sys" + fi + if [ "${classdirpermerror}" == "1" ]; then + sudo chmod a+rx "/sys/class" + fi + if [ "${netdirpermerror}" == "1" ]; then + sudo a+rx "/sys/class/net" + fi + else + fn_fix_sys_perm_manually_msg + fi + # Run check again to see if it's fixed + fn_sys_perm_errors + if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then + fn_print_error "Could not fix permissions" + fn_script_log_error "Could not fix permissions." + fn_fix_sys_perm_manually_msg + else + fn_print_ok "Automatically fixing permissions" + fi +} + +# Display a message on how to fix the issue manually +fn_fix_sys_perm_manually_msg(){ + echo "" + fn_print_information_nl "To fix this issue, run this command as root:" + fn_script_log_info "To fix this issue, run this command as root:" + echo " * chmod a+rx /sys /sys/class /sys/class/net" + fn_script_log "chmod a+rx /sys /sys/class /sys/class/net" + core_exit.sh +} + +# Run perm error detect & fix/alert functions on /sys directories +fn_fix_sus_perm_run(){ + fn_sys_perm_errors + fn_sys_perm_error_display + fn_fix_sys_perm_errors +} + +## Run checks fn_check_ownership fn_check_permissions +fn_fix_sus_perm_run From 6bcf93e218e98591548124d627c719cea7838bb9 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 08:41:58 +0100 Subject: [PATCH 0389/1895] fixes & rework perms on /sys --- lgsm/functions/check_permissions.sh | 34 +++++++++++++++-------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 987faef7f..aaf75939a 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -140,6 +140,7 @@ fn_sys_perm_errors(){ fi if [ ! -r "/sys/class" ]||[ ! -x "/sys/class" ]; then classdirpermerror="1" + fi if [ ! -r "/sys/class/net" ]||[ ! -x "sys/class/net" ]; then netdirpermerror="1" fi @@ -167,12 +168,13 @@ fn_sys_perm_error_display(){ echo "" fn_print_information_nl "This error causes servers to fail starting properly" fn_script_log_info "This error causes servers to fail starting properly." + fi } # Attempt to fix /sys related permission errors if sudo is available, exits otherwise -fn_fix_sys_perm_errors(){ +fn_sys_perm_errors_fix(){ sudo -v > /dev/null 2>&1 - iif [ $? -eq 0 ]; then + if [ $? -eq 0 ]; then fn_print_information_nl "Automatically fixing permissions" fn_script_log_info "Automatically fixing permissions." if [ "${sysdirpermerror}" == "1" ]; then @@ -184,22 +186,22 @@ fn_fix_sys_perm_errors(){ if [ "${netdirpermerror}" == "1" ]; then sudo a+rx "/sys/class/net" fi + # Run check again to see if it's fixed + fn_sys_perm_errors + if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then + fn_print_error "Could not fix permissions" + fn_script_log_error "Could not fix permissions." + fn_sys_perm_fix_manually_msg + else + fn_print_ok "Automatically fixing permissions" + fi else - fn_fix_sys_perm_manually_msg - fi - # Run check again to see if it's fixed - fn_sys_perm_errors - if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then - fn_print_error "Could not fix permissions" - fn_script_log_error "Could not fix permissions." - fn_fix_sys_perm_manually_msg - else - fn_print_ok "Automatically fixing permissions" + fn_sys_perm_fix_manually_msg fi } # Display a message on how to fix the issue manually -fn_fix_sys_perm_manually_msg(){ +fn_sys_perm_fix_manually_msg(){ echo "" fn_print_information_nl "To fix this issue, run this command as root:" fn_script_log_info "To fix this issue, run this command as root:" @@ -209,13 +211,13 @@ fn_fix_sys_perm_manually_msg(){ } # Run perm error detect & fix/alert functions on /sys directories -fn_fix_sus_perm_run(){ +fn_fix_sum_perm_run(){ fn_sys_perm_errors fn_sys_perm_error_display - fn_fix_sys_perm_errors + fn_sys_perm_errors_fix } ## Run checks fn_check_ownership fn_check_permissions -fn_fix_sus_perm_run +fn_fix_sum_perm_run From 0ba392d4902233520e3f6d66ea3e0195b1d02f18 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 08:51:50 +0100 Subject: [PATCH 0390/1895] typo fixes --- 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 aaf75939a..664a5f63b 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -141,7 +141,7 @@ fn_sys_perm_errors(){ if [ ! -r "/sys/class" ]||[ ! -x "/sys/class" ]; then classdirpermerror="1" fi - if [ ! -r "/sys/class/net" ]||[ ! -x "sys/class/net" ]; then + if [ ! -r "/sys/class/net" ]||[ ! -x "/sys/class/net" ]; then netdirpermerror="1" fi } @@ -162,8 +162,8 @@ fn_sys_perm_error_display(){ fn_script_log "/sys/class permissions are $(stat -c %a /sys/class) instead of expected 755" fi if [ "${netdirpermerror}" == "1" ]; then - echo " * /sys/class/net permissions are $(stat -c %a /sys/class) instead of expected 755" - fn_script_log "/sys/class/net permissions are $(stat -c %a /sys/class) instead of expected 755" + echo " * /sys/class/net permissions are $(stat -c %a /sys/class/net) instead of expected 755" + fn_script_log "/sys/class/net permissions are $(stat -c %a /sys/class/net) instead of expected 755" fi echo "" fn_print_information_nl "This error causes servers to fail starting properly" From 416d15e76e7e994b34ffd55b9834fd8b74395624 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 08:59:14 +0100 Subject: [PATCH 0391/1895] Ordering/naming to make more sense --- lgsm/functions/check_permissions.sh | 76 ++++++++++++++--------------- 1 file changed, 37 insertions(+), 39 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 664a5f63b..087e019cc 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -129,7 +129,7 @@ fn_check_permissions(){ ## The following fn_sys_perm_* functions checks for permission errors in /sys directory # Checks for permission errors in /sys directory -fn_sys_perm_errors(){ +fn_sys_perm_errors_detect(){ # Reset test variables sysdirpermerror="0" classdirpermerror="0" @@ -146,29 +146,14 @@ fn_sys_perm_errors(){ fi } -# Displays /sys related permission errors to the user -fn_sys_perm_error_display(){ - # /sys, /sys/class and /sys/class/net should be readable & executable - # If any error was found - if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then - fn_print_error_nl "Permission error(s) found:" - fn_script_log_error "Permission error(s) found:" - if [ "${sysdirpermerror}" == "1" ]; then - echo " * /sys permissions are $(stat -c %a /sys) instead of expected 555" - fn_script_log "/sys permissions are $(stat -c %a /sys) instead of expected 555" - fi - if [ "${classdirpermerror}" == "1" ]; then - echo " * /sys/class permissions are $(stat -c %a /sys/class) instead of expected 755" - fn_script_log "/sys/class permissions are $(stat -c %a /sys/class) instead of expected 755" - fi - if [ "${netdirpermerror}" == "1" ]; then - echo " * /sys/class/net permissions are $(stat -c %a /sys/class/net) instead of expected 755" - fn_script_log "/sys/class/net permissions are $(stat -c %a /sys/class/net) instead of expected 755" - fi - echo "" - fn_print_information_nl "This error causes servers to fail starting properly" - fn_script_log_info "This error causes servers to fail starting properly." - fi +# Display a message on how to fix the issue manually +fn_sys_perm_fix_manually_msg(){ + echo "" + fn_print_information_nl "To fix this issue, run this command as root:" + fn_script_log_info "To fix this issue, run this command as root:" + echo " * chmod a+rx /sys /sys/class /sys/class/net" + fn_script_log "chmod a+rx /sys /sys/class /sys/class/net" + core_exit.sh } # Attempt to fix /sys related permission errors if sudo is available, exits otherwise @@ -187,7 +172,7 @@ fn_sys_perm_errors_fix(){ sudo a+rx "/sys/class/net" fi # Run check again to see if it's fixed - fn_sys_perm_errors + fn_sys_perm_errors_detect if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then fn_print_error "Could not fix permissions" fn_script_log_error "Could not fix permissions." @@ -200,24 +185,37 @@ fn_sys_perm_errors_fix(){ fi } -# Display a message on how to fix the issue manually -fn_sys_perm_fix_manually_msg(){ - echo "" - fn_print_information_nl "To fix this issue, run this command as root:" - fn_script_log_info "To fix this issue, run this command as root:" - echo " * chmod a+rx /sys /sys/class /sys/class/net" - fn_script_log "chmod a+rx /sys /sys/class /sys/class/net" - core_exit.sh +# Processes to the /sys related permission errors check & fix/info +fn_sys_perm_error_process(){ + fn_sys_perm_errors + # /sys, /sys/class and /sys/class/net should be readable & executable + # If any error was found + if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then + fn_print_error_nl "Permission error(s) found:" + fn_script_log_error "Permission error(s) found:" + if [ "${sysdirpermerror}" == "1" ]; then + echo " * /sys permissions are $(stat -c %a /sys) instead of expected 555" + fn_script_log "/sys permissions are $(stat -c %a /sys) instead of expected 555" + fi + if [ "${classdirpermerror}" == "1" ]; then + echo " * /sys/class permissions are $(stat -c %a /sys/class) instead of expected 755" + fn_script_log "/sys/class permissions are $(stat -c %a /sys/class) instead of expected 755" + fi + if [ "${netdirpermerror}" == "1" ]; then + echo " * /sys/class/net permissions are $(stat -c %a /sys/class/net) instead of expected 755" + fn_script_log "/sys/class/net permissions are $(stat -c %a /sys/class/net) instead of expected 755" + fi + echo "" + fn_print_information_nl "This error causes servers to fail starting properly" + fn_script_log_info "This error causes servers to fail starting properly." + # Run the fix + fn_sys_perm_errors_fix + fi } # Run perm error detect & fix/alert functions on /sys directories -fn_fix_sum_perm_run(){ - fn_sys_perm_errors - fn_sys_perm_error_display - fn_sys_perm_errors_fix -} ## Run checks fn_check_ownership fn_check_permissions -fn_fix_sum_perm_run +fn_sys_perm_error_process From 369f5cc9519980838192007b7611514bdda058b2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 09:01:14 +0100 Subject: [PATCH 0392/1895] comments location & func name --- lgsm/functions/check_permissions.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 087e019cc..10f9ce701 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -135,6 +135,7 @@ fn_sys_perm_errors_detect(){ classdirpermerror="0" netdirpermerror="0" # Check permissions + # /sys, /sys/class and /sys/class/net should be readable & executable if [ ! -r "/sys" ]||[ ! -x "/sys" ]; then sysdirpermerror="1" fi @@ -176,19 +177,20 @@ fn_sys_perm_errors_fix(){ if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then fn_print_error "Could not fix permissions" fn_script_log_error "Could not fix permissions." + # Show the user how to fix fn_sys_perm_fix_manually_msg else fn_print_ok "Automatically fixing permissions" fi else + # Show the user how to fix fn_sys_perm_fix_manually_msg fi } # Processes to the /sys related permission errors check & fix/info fn_sys_perm_error_process(){ - fn_sys_perm_errors - # /sys, /sys/class and /sys/class/net should be readable & executable + fn_sys_perm_errors_detect # If any error was found if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then fn_print_error_nl "Permission error(s) found:" From cc8273d24f4329f9b6d5d1b68c860b1b2b123443 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 09:13:18 +0100 Subject: [PATCH 0393/1895] missing chmod --- 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 10f9ce701..0f2220880 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -170,7 +170,7 @@ fn_sys_perm_errors_fix(){ sudo chmod a+rx "/sys/class" fi if [ "${netdirpermerror}" == "1" ]; then - sudo a+rx "/sys/class/net" + sudo chmod a+rx "/sys/class/net" fi # Run check again to see if it's fixed fn_sys_perm_errors_detect From 63d58bccb4ae3bb895ee17c4f8266abb01676172 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 09:17:45 +0100 Subject: [PATCH 0394/1895] better output with sleeps --- lgsm/functions/check_permissions.sh | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 0f2220880..ff9d619ee 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -154,6 +154,7 @@ fn_sys_perm_fix_manually_msg(){ fn_script_log_info "To fix this issue, run this command as root:" echo " * chmod a+rx /sys /sys/class /sys/class/net" fn_script_log "chmod a+rx /sys /sys/class /sys/class/net" + sleep 1 core_exit.sh } @@ -162,6 +163,7 @@ fn_sys_perm_errors_fix(){ sudo -v > /dev/null 2>&1 if [ $? -eq 0 ]; then fn_print_information_nl "Automatically fixing permissions" + sleep 1 fn_script_log_info "Automatically fixing permissions." if [ "${sysdirpermerror}" == "1" ]; then sudo chmod a+rx "/sys" @@ -177,10 +179,12 @@ fn_sys_perm_errors_fix(){ if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then fn_print_error "Could not fix permissions" fn_script_log_error "Could not fix permissions." + sleep 1 # Show the user how to fix fn_sys_perm_fix_manually_msg else fn_print_ok "Automatically fixing permissions" + sleep 1 fi else # Show the user how to fix @@ -195,19 +199,20 @@ fn_sys_perm_error_process(){ if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then fn_print_error_nl "Permission error(s) found:" fn_script_log_error "Permission error(s) found:" + sleep 1 if [ "${sysdirpermerror}" == "1" ]; then - echo " * /sys permissions are $(stat -c %a /sys) instead of expected 555" + echo " * /sys permissions are $(stat -c %a /sys) instead of expected 555" fn_script_log "/sys permissions are $(stat -c %a /sys) instead of expected 555" fi if [ "${classdirpermerror}" == "1" ]; then - echo " * /sys/class permissions are $(stat -c %a /sys/class) instead of expected 755" + echo " * /sys/class permissions are $(stat -c %a /sys/class) instead of expected 755" fn_script_log "/sys/class permissions are $(stat -c %a /sys/class) instead of expected 755" fi if [ "${netdirpermerror}" == "1" ]; then - echo " * /sys/class/net permissions are $(stat -c %a /sys/class/net) instead of expected 755" + echo " * /sys/class/net permissions are $(stat -c %a /sys/class/net) instead of expected 755" fn_script_log "/sys/class/net permissions are $(stat -c %a /sys/class/net) instead of expected 755" fi - echo "" + sleep 1 fn_print_information_nl "This error causes servers to fail starting properly" fn_script_log_info "This error causes servers to fail starting properly." # Run the fix From 51f6a5b25ae47bbb6417e1b772c80d0a1202cb95 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 09:23:01 +0100 Subject: [PATCH 0395/1895] warn & error in the right places --- 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 ff9d619ee..8609708e2 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -197,8 +197,8 @@ fn_sys_perm_error_process(){ fn_sys_perm_errors_detect # If any error was found if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then - fn_print_error_nl "Permission error(s) found:" - fn_script_log_error "Permission error(s) found:" + fn_print_warn_nl "Permission error(s) found:" + fn_script_log_warn "Permission error(s) found:" sleep 1 if [ "${sysdirpermerror}" == "1" ]; then echo " * /sys permissions are $(stat -c %a /sys) instead of expected 555" From 81848996fff4bf0b9b7455805d88d2e7399441e4 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 09:27:02 +0100 Subject: [PATCH 0396/1895] log_info instead of warn otherwise fails even if fixed because of exitcode from log_warn --- 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 8609708e2..ad7f30a78 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -198,7 +198,7 @@ fn_sys_perm_error_process(){ # If any error was found if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then fn_print_warn_nl "Permission error(s) found:" - fn_script_log_warn "Permission error(s) found:" + fn_script_log_info "Permission error(s) found:" sleep 1 if [ "${sysdirpermerror}" == "1" ]; then echo " * /sys permissions are $(stat -c %a /sys) instead of expected 555" From f54e5af2648d7df71eb4d05102c13d744ca7c051 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 09:42:46 +0100 Subject: [PATCH 0397/1895] output improvements --- lgsm/functions/check_permissions.sh | 30 +++++++++-------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index ad7f30a78..312f24700 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -162,9 +162,9 @@ fn_sys_perm_fix_manually_msg(){ fn_sys_perm_errors_fix(){ sudo -v > /dev/null 2>&1 if [ $? -eq 0 ]; then - fn_print_information_nl "Automatically fixing permissions" - sleep 1 - fn_script_log_info "Automatically fixing permissions." + fn_print_dots "Automatically fixing /sys permissions" + sleep 2 + fn_script_log_info "Automatically fixing /sys permissions." if [ "${sysdirpermerror}" == "1" ]; then sudo chmod a+rx "/sys" fi @@ -177,13 +177,14 @@ fn_sys_perm_errors_fix(){ # Run check again to see if it's fixed fn_sys_perm_errors_detect if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then - fn_print_error "Could not fix permissions" - fn_script_log_error "Could not fix permissions." + fn_print_error "Could not fix /sys permissions" + fn_script_log_error "Could not fix /sys permissions." sleep 1 # Show the user how to fix fn_sys_perm_fix_manually_msg else - fn_print_ok "Automatically fixing permissions" + fn_print_ok "Automatically fixing /sys permissions" + fn_script_log_pass "Permissions in /sys fixed" sleep 1 fi else @@ -197,21 +198,8 @@ fn_sys_perm_error_process(){ fn_sys_perm_errors_detect # If any error was found if [ "${sysdirpermerror}" == "1" ]||[ "${classdirpermerror}" == "1" ]||[ "${netdirpermerror}" == "1" ]; then - fn_print_warn_nl "Permission error(s) found:" - fn_script_log_info "Permission error(s) found:" - sleep 1 - if [ "${sysdirpermerror}" == "1" ]; then - echo " * /sys permissions are $(stat -c %a /sys) instead of expected 555" - fn_script_log "/sys permissions are $(stat -c %a /sys) instead of expected 555" - fi - if [ "${classdirpermerror}" == "1" ]; then - echo " * /sys/class permissions are $(stat -c %a /sys/class) instead of expected 755" - fn_script_log "/sys/class permissions are $(stat -c %a /sys/class) instead of expected 755" - fi - if [ "${netdirpermerror}" == "1" ]; then - echo " * /sys/class/net permissions are $(stat -c %a /sys/class/net) instead of expected 755" - fn_script_log "/sys/class/net permissions are $(stat -c %a /sys/class/net) instead of expected 755" - fi + fn_print_error_nl "Permission error(s) found in /sys" + fn_script_log_error "Permission error(s) found in /sys" sleep 1 fn_print_information_nl "This error causes servers to fail starting properly" fn_script_log_info "This error causes servers to fail starting properly." From f09274abc88df8a3a956d1d7278d4efbed590c5d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 09:45:31 +0100 Subject: [PATCH 0398/1895] better output & logging --- 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 312f24700..fa1e70f74 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -150,9 +150,11 @@ fn_sys_perm_errors_detect(){ # Display a message on how to fix the issue manually fn_sys_perm_fix_manually_msg(){ echo "" - fn_print_information_nl "To fix this issue, run this command as root:" - fn_script_log_info "To fix this issue, run this command as root:" - echo " * chmod a+rx /sys /sys/class /sys/class/net" + fn_print_information_nl "This error causes servers to fail starting properly" + fn_script_log_info "This error causes servers to fail starting properly." + echo " * To fix this issue, run the following command as root:" + fn_script_log_info "To fix this issue, run the following command as root:" + echo " chmod a+rx /sys /sys/class /sys/class/net" fn_script_log "chmod a+rx /sys /sys/class /sys/class/net" sleep 1 core_exit.sh @@ -201,8 +203,6 @@ fn_sys_perm_error_process(){ fn_print_error_nl "Permission error(s) found in /sys" fn_script_log_error "Permission error(s) found in /sys" sleep 1 - fn_print_information_nl "This error causes servers to fail starting properly" - fn_script_log_info "This error causes servers to fail starting properly." # Run the fix fn_sys_perm_errors_fix fi From 6a49021878d26434f3b54c4211fec340e93da50c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 27 Jan 2017 14:48:00 +0000 Subject: [PATCH 0399/1895] Minor changes to UI --- lgsm/functions/fix.sh | 8 ++++++++ lgsm/functions/fix_glibc.sh | 6 +++--- lgsm/functions/fix_mta.sh | 14 +++++--------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 327fcccf9..5bac281a3 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -17,6 +17,14 @@ fn_fix_msg_start(){ sleep 1 } +fn_fix_msg_start_nl(){ + fn_print_dots "Applying ${fixname} fix: ${gamename}" + sleep 1 + fn_print_info "Applying ${fixname} fix: ${gamename}" + fn_script_log_info "Applying ${fixname} fix: ${gamename}" + sleep 1 +} + fn_fix_msg_end(){ if [ $? -ne 0 ]; then fn_print_error_nl "Applying ${fixname} fix: ${gamename}" diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index 8580e3e71..d03b2c41e 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -46,8 +46,6 @@ do fi done -export LD_LIBRARY_PATH=:"${libdir}" - ## amd64 # libm.so.6 @@ -66,4 +64,6 @@ do if [ "${gamename}" == "${libc_server}" ]; then fn_fetch_file_github "lgsm/lib/ubuntu12.04/amd64" "libc.so.6" "${lgsmdir}/lib" "noexecutecmd" "norun" "noforce" "nomd5" fi -done \ No newline at end of file +done + +export LD_LIBRARY_PATH=:"${libdir}" \ No newline at end of file diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index 6bf11dbc9..7347201d9 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -9,16 +9,12 @@ local commandaction="Fix" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" if [ ! -f "${lgsmdir}/lib/libmysqlclient.so.16" ]; then - fixname="libmysqlclient16 install" - fn_fix_msg_start - fn_print_warn_nl "libmysqlclient16 not installed. Installing.." + fixname="libmysqlclient16" + fn_fix_msg_start_nl sleep 1 - fileurl="https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16"; filedir="${lgsmdir}/lib"; filename="libmysqlclient.so.16"; executecmd="executecmd" run="norun"; force="noforce"; md5="6c188e0f8fb5d7a29f4bc413b9fed6c2" - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + fileurl="https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16"; filedir="${lgsmdir}/lib"; filename="libmysqlclient.so.16"; executecmd="executecmd" run="norun"; force="noforce"; md5="6c188e0f8fb5d7a29f4bc413b9fed6c2" + fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" fn_fix_msg_end fi -fixname="libmysqlclient16" -fn_fix_msg_start -export LD_LIBRARY_PATH=:"${libdir}" -fn_fix_msg_end +export LD_LIBRARY_PATH=:"${libdir}" \ No newline at end of file From 185e93f38e6627311fc145567c00e675fc38b658 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 27 Jan 2017 15:48:12 +0000 Subject: [PATCH 0400/1895] minot variable changes --- lgsm/functions/update_mta.sh | 41 ++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 365dae131..fff189ca7 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -9,12 +9,12 @@ local commandaction="Update" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_update_mta_dl(){ - fn_fetch_file "http://linux.mtasa.com/dl/${NUM_VERSION}/multitheftauto_linux_x64-${FULL_VERSION}.tar.gz" "${tmpdir}" "multitheftauto_linux_x64-${FULL_VERSION}.tar.gz" - mkdir "${tmpdir}/multitheftauto_linux_x64-${FULL_VERSION}" - fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${FULL_VERSION}.tar.gz" "${tmpdir}/multitheftauto_linux_x64-${FULL_VERSION}" + fn_fetch_file "http://linux.mtasa.com/dl/${numversion}/multitheftauto_linux_x64-${fullversion}.tar.gz" "${tmpdir}" "multitheftauto_linux_x64-${fullversion}.tar.gz" + mkdir "${tmpdir}/multitheftauto_linux_x64-${fullversion}" + fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${fullversion}.tar.gz" "${tmpdir}/multitheftauto_linux_x64-${fullversion}" echo -e "copying to ${filesdir}...\c" fn_script_log "Copying to ${filesdir}" - cp -R "${tmpdir}/multitheftauto_linux_x64-${FULL_VERSION}/multitheftauto_linux_x64-${FULL_VERSION}/"* "${filesdir}" + cp -R "${tmpdir}/multitheftauto_linux_x64-${fullversion}/multitheftauto_linux_x64-${fullversion}/"* "${filesdir}" local exitcode=$? if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl @@ -69,22 +69,21 @@ fn_update_mta_currentbuild(){ fi } -fn_mta_getServerVersion() +fn_mta_get_availablebuild() { - fn_fetch_file "https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h" "${tmpdir}" "version.h" # we need to find latest stable version here - local MAJOR_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MAJOR" | awk '{ print $3 }' | sed 's/\r//g')" - local MINOR_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MINOR" | awk '{ print $3 }' | sed 's/\r//g')" - local MAINTENANCE_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g')" - NUM_VERSION="${MAJOR_VERSION}${MINOR_VERSION}${MAINTENANCE_VERSION}" - FULL_VERSION="${MAJOR_VERSION}.${MINOR_VERSION}.${MAINTENANCE_VERSION}" - rm -f "${tmpdir}/version.h" + fn_fetch_file "https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h" "${tmpdir}" "version.h" # we need to find latest stable version here + local majorversion="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MAJOR" | awk '{ print $3 }' | sed 's/\r//g')" + local minorversion="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MINOR" | awk '{ print $3 }' | sed 's/\r//g')" + local maintenanceversion="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g')" + numversion="${majorversion}${minorversion}${maintenanceversion}" + fullversion="${majorversion}.${minorversion}.${maintenanceversion}" + rm -f "${tmpdir}/version.h" } fn_update_mta_compare(){ # Removes dots so if can compare version numbers currentbuilddigit=$(echo "${currentbuild}"|tr -cd '[:digit:]') - - if [ "${currentbuilddigit}" -ne "${NUM_VERSION}" ]||[ "${forceupdate}" == "1" ]; then + if [ "${currentbuilddigit}" -ne "${numversion}" ]||[ "${forceupdate}" == "1" ]; then if [ "${forceupdate}" == "1" ]; then # forceupdate bypasses checks, useful for small build changes mta_update_string="forced" @@ -95,7 +94,7 @@ fn_update_mta_compare(){ echo -e "Update ${mta_update_string}:" sleep 1 echo -e " Current build: ${red}${currentbuild} ${default}" - echo -e " Available build: ${green}${FULL_VERSION} ${default}" + echo -e " Available build: ${green}${fullversion} ${default}" echo -e "" sleep 1 echo "" @@ -108,8 +107,8 @@ fn_update_mta_compare(){ echo -en "\n" fn_script_log "Update ${mta_update_string}" fn_script_log "Current build: ${currentbuild}" - fn_script_log "Available build: ${FULL_VERSION}" - fn_script_log "${currentbuild} > ${FULL_VERSION}" + fn_script_log "Available build: ${fullversion}" + fn_script_log "${currentbuild} > ${fullversion}" unset updateonstart @@ -133,17 +132,17 @@ fn_update_mta_compare(){ echo -e "\n" echo -e "No update available:" echo -e " Current version: ${green}${currentbuild}${default}" - echo -e " Available version: ${green}${FULL_VERSION}${default}" + echo -e " Available version: ${green}${fullversion}${default}" echo -e "" fn_print_ok_nl "No update available" fn_script_log_info "Current build: ${currentbuild}" - fn_script_log_info "Available build: ${FULL_VERSION}" + fn_script_log_info "Available build: ${fullversion}" fi } if [ "${installer}" == "1" ]; then - fn_mta_getServerVersion + fn_mta_get_availablebuild fn_update_mta_dl else # Checks for server update from linux.mtasa.com using the github repo. @@ -151,6 +150,6 @@ else fn_script_log_info "Checking for update: linux.mtasa.com" sleep 1 fn_update_mta_currentbuild - fn_mta_getServerVersion + fn_mta_get_availablebuild fn_update_mta_compare fi From 8577632c92d55c96c461048593cb926bce85ca13 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 27 Jan 2017 15:48:12 +0000 Subject: [PATCH 0401/1895] minor variable changes --- lgsm/functions/update_mta.sh | 41 ++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 365dae131..fff189ca7 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -9,12 +9,12 @@ local commandaction="Update" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_update_mta_dl(){ - fn_fetch_file "http://linux.mtasa.com/dl/${NUM_VERSION}/multitheftauto_linux_x64-${FULL_VERSION}.tar.gz" "${tmpdir}" "multitheftauto_linux_x64-${FULL_VERSION}.tar.gz" - mkdir "${tmpdir}/multitheftauto_linux_x64-${FULL_VERSION}" - fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${FULL_VERSION}.tar.gz" "${tmpdir}/multitheftauto_linux_x64-${FULL_VERSION}" + fn_fetch_file "http://linux.mtasa.com/dl/${numversion}/multitheftauto_linux_x64-${fullversion}.tar.gz" "${tmpdir}" "multitheftauto_linux_x64-${fullversion}.tar.gz" + mkdir "${tmpdir}/multitheftauto_linux_x64-${fullversion}" + fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${fullversion}.tar.gz" "${tmpdir}/multitheftauto_linux_x64-${fullversion}" echo -e "copying to ${filesdir}...\c" fn_script_log "Copying to ${filesdir}" - cp -R "${tmpdir}/multitheftauto_linux_x64-${FULL_VERSION}/multitheftauto_linux_x64-${FULL_VERSION}/"* "${filesdir}" + cp -R "${tmpdir}/multitheftauto_linux_x64-${fullversion}/multitheftauto_linux_x64-${fullversion}/"* "${filesdir}" local exitcode=$? if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl @@ -69,22 +69,21 @@ fn_update_mta_currentbuild(){ fi } -fn_mta_getServerVersion() +fn_mta_get_availablebuild() { - fn_fetch_file "https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h" "${tmpdir}" "version.h" # we need to find latest stable version here - local MAJOR_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MAJOR" | awk '{ print $3 }' | sed 's/\r//g')" - local MINOR_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MINOR" | awk '{ print $3 }' | sed 's/\r//g')" - local MAINTENANCE_VERSION="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g')" - NUM_VERSION="${MAJOR_VERSION}${MINOR_VERSION}${MAINTENANCE_VERSION}" - FULL_VERSION="${MAJOR_VERSION}.${MINOR_VERSION}.${MAINTENANCE_VERSION}" - rm -f "${tmpdir}/version.h" + fn_fetch_file "https://raw.githubusercontent.com/multitheftauto/mtasa-blue/master/Server/version.h" "${tmpdir}" "version.h" # we need to find latest stable version here + local majorversion="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MAJOR" | awk '{ print $3 }' | sed 's/\r//g')" + local minorversion="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MINOR" | awk '{ print $3 }' | sed 's/\r//g')" + local maintenanceversion="$(cat ${tmpdir}/version.h | grep "#define MTASA_VERSION_MAINTENANCE" | awk '{ print $3 }' | sed 's/\r//g')" + numversion="${majorversion}${minorversion}${maintenanceversion}" + fullversion="${majorversion}.${minorversion}.${maintenanceversion}" + rm -f "${tmpdir}/version.h" } fn_update_mta_compare(){ # Removes dots so if can compare version numbers currentbuilddigit=$(echo "${currentbuild}"|tr -cd '[:digit:]') - - if [ "${currentbuilddigit}" -ne "${NUM_VERSION}" ]||[ "${forceupdate}" == "1" ]; then + if [ "${currentbuilddigit}" -ne "${numversion}" ]||[ "${forceupdate}" == "1" ]; then if [ "${forceupdate}" == "1" ]; then # forceupdate bypasses checks, useful for small build changes mta_update_string="forced" @@ -95,7 +94,7 @@ fn_update_mta_compare(){ echo -e "Update ${mta_update_string}:" sleep 1 echo -e " Current build: ${red}${currentbuild} ${default}" - echo -e " Available build: ${green}${FULL_VERSION} ${default}" + echo -e " Available build: ${green}${fullversion} ${default}" echo -e "" sleep 1 echo "" @@ -108,8 +107,8 @@ fn_update_mta_compare(){ echo -en "\n" fn_script_log "Update ${mta_update_string}" fn_script_log "Current build: ${currentbuild}" - fn_script_log "Available build: ${FULL_VERSION}" - fn_script_log "${currentbuild} > ${FULL_VERSION}" + fn_script_log "Available build: ${fullversion}" + fn_script_log "${currentbuild} > ${fullversion}" unset updateonstart @@ -133,17 +132,17 @@ fn_update_mta_compare(){ echo -e "\n" echo -e "No update available:" echo -e " Current version: ${green}${currentbuild}${default}" - echo -e " Available version: ${green}${FULL_VERSION}${default}" + echo -e " Available version: ${green}${fullversion}${default}" echo -e "" fn_print_ok_nl "No update available" fn_script_log_info "Current build: ${currentbuild}" - fn_script_log_info "Available build: ${FULL_VERSION}" + fn_script_log_info "Available build: ${fullversion}" fi } if [ "${installer}" == "1" ]; then - fn_mta_getServerVersion + fn_mta_get_availablebuild fn_update_mta_dl else # Checks for server update from linux.mtasa.com using the github repo. @@ -151,6 +150,6 @@ else fn_script_log_info "Checking for update: linux.mtasa.com" sleep 1 fn_update_mta_currentbuild - fn_mta_getServerVersion + fn_mta_get_availablebuild fn_update_mta_compare fi From 6d63023ac23f9d173542b54bd834ec690ba63817 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 19:34:06 +0100 Subject: [PATCH 0402/1895] fn_print_ok_nl "Automatically fixing ... --- 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 fa1e70f74..defde5771 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -185,7 +185,7 @@ fn_sys_perm_errors_fix(){ # Show the user how to fix fn_sys_perm_fix_manually_msg else - fn_print_ok "Automatically fixing /sys permissions" + fn_print_ok_nl "Automatically fixing /sys permissions" fn_script_log_pass "Permissions in /sys fixed" sleep 1 fi From 0001a2136a9f64d91b9807ea4b00dadb58ce942b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 19:55:56 +0100 Subject: [PATCH 0403/1895] command_wipe.sh for check_logs.sh --- 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 577579171..a56bb2942 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -34,7 +34,7 @@ do fi done -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 command_update.sh command_validate.sh command_update_functions.sh command_email_test.sh command_mods_install.sh command_mods_update.sh command_mods_remove.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 command_update.sh command_validate.sh command_update_functions.sh command_email_test.sh command_mods_install.sh command_mods_update.sh command_mods_remove.sh command_wipe.sh ) for allowed_command in "${allowed_commands_array[@]}" do if [ "${allowed_command}" == "${function_selfname}" ]; then From e3dc66aeb2dba47e3670989d64ce51bdda3c010b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 20:01:18 +0100 Subject: [PATCH 0404/1895] code premisses --- lgsm/functions/command_wipe.sh | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 2bdcf9c76..339d9d726 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -5,3 +5,34 @@ # Website: https://gameservermanagers.com # Description: Wipes server data for Rust, useful after monthly updates +local commandname="WIPE" +local commandaction="wipe data" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +check.sh + +fn_print_header + +# Checks if there is something to wipe +fn_wipe_check(){ + if [ "${gamename}" == "Rust" ]; then + if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -f "${serveridentitydir}/proceduralmap*.sav" ]; then + fn_wipe_server_process + else + echo "Nothing to wipe" + core_exit.sh + fi +} + +fn_wipe_server_process(){ + check_status.sh + if [ "${status}" != "0" ]; then + exitbypass=1 + command_stop.sh + fn_validation + exitbypass=1 + command_start.sh +else + fn_validation +fi +} From 8240e9c93730c3789e6af1dbb2fd872ecf6428aa Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 20:24:54 +0100 Subject: [PATCH 0405/1895] should be working, needs logging & proper output --- lgsm/functions/command_wipe.sh | 75 +++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 339d9d726..ec9871108 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -3,7 +3,7 @@ # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com -# Description: Wipes server data for Rust, useful after monthly updates +# Description: Wipes server data, useful after updates for some games like Rust local commandname="WIPE" local commandaction="wipe data" @@ -14,25 +14,62 @@ check.sh fn_print_header # Checks if there is something to wipe -fn_wipe_check(){ - if [ "${gamename}" == "Rust" ]; then - if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -f "${serveridentitydir}/proceduralmap*.sav" ]; then - fn_wipe_server_process - else - echo "Nothing to wipe" - core_exit.sh - fi +fn_wipe_server(){ + # Rust Wipe + if [ "${gamename}" == "Rust" ]; then + if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -n "$(find "{serveridentitydir}" -type f -name "proceduralmap*.sav")" ]; then + echo " * Any user, storage, and map data will be erased." + while true; do + read -e -i "y" -p "Continue? [Y/n]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; core_exit.sh;; + * ) echo "Please answer yes or no.";; + esac + done + fn_script_log_info "User selected to continue" + fn_wipe_server_process + else + echo "Nothing to wipe" + core_exit.sh + fi + else + echo "Wipe is not available" + core_exit.sh + fi } +# Removes files to wipe server +fn_wipe_server_remove_files(){ + if [ "${gamename}" == "Rust" ]; then + if [ -n "$(find "{serveridentitydir}" -type f -name "proceduralmap*.sav")" ]; then + echo "Removing map" + rm -f "${serveridentitydir}/proceduralmap*.sav" + fi + if [ -d "${serveridentitydir}/user" ]; then + echo "Removing users data" + rm -rf "${serveridentitydir}/user" + fi + if [ -d "${serveridentitydir}/storage" ]; then + echo "Removing storage data" + rm -rf "${serveridentitydir}/storage" + fi + fi +} + +# Process to server wipe fn_wipe_server_process(){ - check_status.sh - if [ "${status}" != "0" ]; then - exitbypass=1 - command_stop.sh - fn_validation - exitbypass=1 - command_start.sh -else - fn_validation -fi + check_status.sh + if [ "${status}" != "0" ]; then + exitbypass=1 + command_stop.sh + fn_wipe_server_remove_files + exitbypass=1 + command_start.sh + else + fn_wipe_server_remove_files + fi + echo "Server Wiped" } + +fn_wipe_server From 526402adc16c3d30c2dccae1be96bb451e683c0d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Fri, 27 Jan 2017 20:33:36 +0100 Subject: [PATCH 0406/1895] missing $ --- lgsm/functions/command_wipe.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index ec9871108..1b90bd9eb 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -17,7 +17,7 @@ fn_print_header fn_wipe_server(){ # Rust Wipe if [ "${gamename}" == "Rust" ]; then - if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -n "$(find "{serveridentitydir}" -type f -name "proceduralmap*.sav")" ]; then + if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap*.sav")" ]; then echo " * Any user, storage, and map data will be erased." while true; do read -e -i "y" -p "Continue? [Y/n]" yn @@ -42,7 +42,7 @@ fn_wipe_server(){ # Removes files to wipe server fn_wipe_server_remove_files(){ if [ "${gamename}" == "Rust" ]; then - if [ -n "$(find "{serveridentitydir}" -type f -name "proceduralmap*.sav")" ]; then + if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap*.sav")" ]; then echo "Removing map" rm -f "${serveridentitydir}/proceduralmap*.sav" fi From 2da83d47a7d223db627b269bfdf6ba9a0f7ca1c7 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 28 Jan 2017 04:53:39 +0100 Subject: [PATCH 0407/1895] Attempt for better logging and outputs --- lgsm/functions/command_wipe.sh | 112 +++++++++++++++++++++------------ 1 file changed, 71 insertions(+), 41 deletions(-) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 1b90bd9eb..e54969b47 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -6,70 +6,100 @@ # Description: Wipes server data, useful after updates for some games like Rust local commandname="WIPE" -local commandaction="wipe data" +local commandaction="data wipe" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh - fn_print_header +fn_scripg_log "Entering ${gamename} ${commandaction}" -# Checks if there is something to wipe -fn_wipe_server(){ - # Rust Wipe - if [ "${gamename}" == "Rust" ]; then - if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap*.sav")" ]; then - echo " * Any user, storage, and map data will be erased." - while true; do - read -e -i "y" -p "Continue? [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; core_exit.sh;; - * ) echo "Please answer yes or no.";; - esac - done - fn_script_log_info "User selected to continue" - fn_wipe_server_process - else - echo "Nothing to wipe" - core_exit.sh - fi +# Process to server wipe +fn_wipe_server_process(){ + check_status.sh + if [ "${status}" != "0" ]; then + exitbypass=1 + command_stop.sh + fn_wipe_server_remove_files + exitbypass=1 + command_start.sh else - echo "Wipe is not available" + fn_wipe_server_remove_files + fi + echo "server data wiped" + fn_script_log "server data wiped." +} + +# Provides an exit code upon error +fn_wipe_exit_code(){ + ((exitcode=$?)) + if [ ${exitcode} -ne 0 ]; then + fn_script_log_fatal "${currentaction}" core_exit.sh + else + fn_print_ok_eol_nl fi } # Removes files to wipe server fn_wipe_server_remove_files(){ + # Rust Wipe if [ "${gamename}" == "Rust" ]; then if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap*.sav")" ]; then - echo "Removing map" + currentaction="Removing map ${serveridentitydir}/proceduralmap*.sav" + echo -en "${currentaction}" + fn_script_log "${currentaction}" rm -f "${serveridentitydir}/proceduralmap*.sav" + fn_wipe_exit_code fi if [ -d "${serveridentitydir}/user" ]; then - echo "Removing users data" + currentaction="Removing user ${serveridentitydir}/user" + echo -en "${currentaction}" + fn_script_log "${currentaction}" rm -rf "${serveridentitydir}/user" + fn_wipe_exit_code fi if [ -d "${serveridentitydir}/storage" ]; then - echo "Removing storage data" + currentaction="Removing storage ${serveridentitydir}/storage" + echo -en "${currentaction}" + fn_script_log "${currentaction}" rm -rf "${serveridentitydir}/storage" + fn_wipe_exit_code + fi + if [ -d "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then + currentaction="Removing storage ${serveridentitydir}/Log.*.txt" + echo -en "${currentaction}" + fn_script_log "${currentaction}" + rm -f "${serveridentitydir}/Log.*.txt" + fn_wipe_exit_code fi + # You can add an "elif" here to add another game or engine fi } -# Process to server wipe -fn_wipe_server_process(){ - check_status.sh - if [ "${status}" != "0" ]; then - exitbypass=1 - command_stop.sh - fn_wipe_server_remove_files - exitbypass=1 - command_start.sh - else - fn_wipe_server_remove_files +# Check if there is something to wipe, prompt the user, and call appropriate functions +# Rust Wipe +if [ "${gamename}" == "Rust" ]; then + if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap*.sav")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then + fn_print_warning_nl "Any user, storage, log and map data from ${serveridentitydir} will be erased." + while true; do + read -e -i "y" -p "Continue? [Y/n]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) echo Exiting; core_exit.sh;; + * ) echo "Please answer yes or no.";; + esac + done + fn_script_log_info "User selects to erase any user, storage, log and map data from ${serveridentitydir}" + fn_wipe_server_process + else + fn_print_information "No data to wipe was found" + fn_script_log_info "No data to wipe was found." + core_exit.sh fi - echo "Server Wiped" -} - -fn_wipe_server +# You can add an "elif" here to add another game or engine +else + # Game not listed + fn_print_information "Wipe is not available for this game" + fn_script_log_info "Wipe is not available for this game." + core_exit.sh +fi From 9c7e9057071719da0d52b4b0140a98d1f8022039 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 28 Jan 2017 04:54:04 +0100 Subject: [PATCH 0408/1895] typo --- lgsm/functions/command_wipe.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index e54969b47..536655fcb 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -11,7 +11,7 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh fn_print_header -fn_scripg_log "Entering ${gamename} ${commandaction}" +fn_script_log "Entering ${gamename} ${commandaction}" # Process to server wipe fn_wipe_server_process(){ From fb8c4c93c7d63bab06e9d7d1d366c79d5688d995 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 28 Jan 2017 05:04:56 +0100 Subject: [PATCH 0409/1895] sleeps & better outputs --- lgsm/functions/command_wipe.sh | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 536655fcb..11c5b920a 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -45,32 +45,40 @@ fn_wipe_server_remove_files(){ # Rust Wipe if [ "${gamename}" == "Rust" ]; then if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap*.sav")" ]; then - currentaction="Removing map ${serveridentitydir}/proceduralmap*.sav" - echo -en "${currentaction}" + currentaction="Removing map file(s): ${serveridentitydir}/proceduralmap*.sav" + echo -en "Removing map proceduralmap*.sav file(s)..." + sleep 1 fn_script_log "${currentaction}" rm -f "${serveridentitydir}/proceduralmap*.sav" fn_wipe_exit_code + sleep 0.5 fi if [ -d "${serveridentitydir}/user" ]; then - currentaction="Removing user ${serveridentitydir}/user" - echo -en "${currentaction}" + currentaction="Removing user directory: ${serveridentitydir}/user" + echo -en "Removing user directory..." + sleep 1 fn_script_log "${currentaction}" rm -rf "${serveridentitydir}/user" fn_wipe_exit_code + sleep 0.5 fi if [ -d "${serveridentitydir}/storage" ]; then - currentaction="Removing storage ${serveridentitydir}/storage" - echo -en "${currentaction}" + currentaction="Removing storage directory: ${serveridentitydir}/storage" + echo -en "Removing storage directory..." + sleep 1 fn_script_log "${currentaction}" rm -rf "${serveridentitydir}/storage" fn_wipe_exit_code + sleep 0.5 fi if [ -d "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then - currentaction="Removing storage ${serveridentitydir}/Log.*.txt" - echo -en "${currentaction}" + currentaction="Removing log files: ${serveridentitydir}/Log.*.txt" + echo -en "Removing Log files..." + sleep 1 fn_script_log "${currentaction}" rm -f "${serveridentitydir}/Log.*.txt" fn_wipe_exit_code + sleep 0.5 fi # You can add an "elif" here to add another game or engine fi @@ -90,10 +98,12 @@ if [ "${gamename}" == "Rust" ]; then esac done fn_script_log_info "User selects to erase any user, storage, log and map data from ${serveridentitydir}" + sleep 1 fn_wipe_server_process else fn_print_information "No data to wipe was found" fn_script_log_info "No data to wipe was found." + sleep 1 core_exit.sh fi # You can add an "elif" here to add another game or engine @@ -101,5 +111,6 @@ else # Game not listed fn_print_information "Wipe is not available for this game" fn_script_log_info "Wipe is not available for this game." + sleep 1 core_exit.sh fi From 70cc6996a81ef07029e3e2edaa67b01d9e981c13 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 28 Jan 2017 05:11:06 +0100 Subject: [PATCH 0410/1895] various improvements --- lgsm/functions/command_wipe.sh | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 11c5b920a..4ff3ad94f 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -44,14 +44,17 @@ fn_wipe_exit_code(){ fn_wipe_server_remove_files(){ # Rust Wipe if [ "${gamename}" == "Rust" ]; then - if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap*.sav")" ]; then - currentaction="Removing map file(s): ${serveridentitydir}/proceduralmap*.sav" - echo -en "Removing map proceduralmap*.sav file(s)..." + if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.sav")" ]; then + currentaction="Removing map file(s): ${serveridentitydir}/proceduralmap.*.sav" + echo -en "Removing map proceduralmap.*.sav file(s)..." sleep 1 fn_script_log "${currentaction}" - rm -f "${serveridentitydir}/proceduralmap*.sav" + rm -f "${serveridentitydir}/proceduralmap.*.sav" fn_wipe_exit_code sleep 0.5 + else + fn_print_information "No map file to remove" + fn_script_log_info "No map file to remove." fi if [ -d "${serveridentitydir}/user" ]; then currentaction="Removing user directory: ${serveridentitydir}/user" @@ -61,6 +64,9 @@ fn_wipe_server_remove_files(){ rm -rf "${serveridentitydir}/user" fn_wipe_exit_code sleep 0.5 + else + fn_print_information "No user directory to remove" + fn_script_log_info "No user directory to remove." fi if [ -d "${serveridentitydir}/storage" ]; then currentaction="Removing storage directory: ${serveridentitydir}/storage" @@ -70,8 +76,11 @@ fn_wipe_server_remove_files(){ rm -rf "${serveridentitydir}/storage" fn_wipe_exit_code sleep 0.5 + else + fn_print_information "No storage directory to remove" + fn_script_log_info "No storage directory to remove." fi - if [ -d "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then + if [ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then currentaction="Removing log files: ${serveridentitydir}/Log.*.txt" echo -en "Removing Log files..." sleep 1 @@ -79,6 +88,9 @@ fn_wipe_server_remove_files(){ rm -f "${serveridentitydir}/Log.*.txt" fn_wipe_exit_code sleep 0.5 + else + fn_print_information "No log files to remove" + fn_script_log_info "No log files to remove." fi # You can add an "elif" here to add another game or engine fi From fe7ac7d6b6d5b4682c6dc91182bd6023b94a657b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 28 Jan 2017 05:17:44 +0100 Subject: [PATCH 0411/1895] wildcard appear not to work for "rm" command --- lgsm/functions/command_wipe.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 4ff3ad94f..1537341ac 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -49,11 +49,11 @@ fn_wipe_server_remove_files(){ echo -en "Removing map proceduralmap.*.sav file(s)..." sleep 1 fn_script_log "${currentaction}" - rm -f "${serveridentitydir}/proceduralmap.*.sav" + find "${serveridentitydir}" -type f -name "proceduralmap.*.sav" -delete fn_wipe_exit_code sleep 0.5 else - fn_print_information "No map file to remove" + fn_print_information_nl "No map file to remove" fn_script_log_info "No map file to remove." fi if [ -d "${serveridentitydir}/user" ]; then @@ -65,7 +65,7 @@ fn_wipe_server_remove_files(){ fn_wipe_exit_code sleep 0.5 else - fn_print_information "No user directory to remove" + fn_print_information_nl "No user directory to remove" fn_script_log_info "No user directory to remove." fi if [ -d "${serveridentitydir}/storage" ]; then @@ -77,7 +77,7 @@ fn_wipe_server_remove_files(){ fn_wipe_exit_code sleep 0.5 else - fn_print_information "No storage directory to remove" + fn_print_information_nl "No storage directory to remove" fn_script_log_info "No storage directory to remove." fi if [ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then @@ -85,11 +85,11 @@ fn_wipe_server_remove_files(){ echo -en "Removing Log files..." sleep 1 fn_script_log "${currentaction}" - rm -f "${serveridentitydir}/Log.*.txt" + find "${serveridentitydir}" -type f -name "Log.*.txt" -delete fn_wipe_exit_code sleep 0.5 else - fn_print_information "No log files to remove" + fn_print_information_nl "No log files to remove" fn_script_log_info "No log files to remove." fi # You can add an "elif" here to add another game or engine From 95ad518e3b74e5c7c247e1be7b3acb006b57408a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 28 Jan 2017 05:18:38 +0100 Subject: [PATCH 0412/1895] some more sleeps --- lgsm/functions/command_wipe.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 1537341ac..56e28df55 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -55,6 +55,7 @@ fn_wipe_server_remove_files(){ else fn_print_information_nl "No map file to remove" fn_script_log_info "No map file to remove." + sleep 0.5 fi if [ -d "${serveridentitydir}/user" ]; then currentaction="Removing user directory: ${serveridentitydir}/user" @@ -67,6 +68,7 @@ fn_wipe_server_remove_files(){ else fn_print_information_nl "No user directory to remove" fn_script_log_info "No user directory to remove." + sleep 0.5 fi if [ -d "${serveridentitydir}/storage" ]; then currentaction="Removing storage directory: ${serveridentitydir}/storage" @@ -79,6 +81,7 @@ fn_wipe_server_remove_files(){ else fn_print_information_nl "No storage directory to remove" fn_script_log_info "No storage directory to remove." + sleep 0.5 fi if [ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then currentaction="Removing log files: ${serveridentitydir}/Log.*.txt" @@ -91,6 +94,7 @@ fn_wipe_server_remove_files(){ else fn_print_information_nl "No log files to remove" fn_script_log_info "No log files to remove." + sleep 0.5 fi # You can add an "elif" here to add another game or engine fi From 20314d09b298a790300cfd4e7914f7c16334cf55 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 28 Jan 2017 05:19:04 +0100 Subject: [PATCH 0413/1895] new liners --- lgsm/functions/command_wipe.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 56e28df55..fd9306dd3 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -117,7 +117,7 @@ if [ "${gamename}" == "Rust" ]; then sleep 1 fn_wipe_server_process else - fn_print_information "No data to wipe was found" + fn_print_information_nl "No data to wipe was found" fn_script_log_info "No data to wipe was found." sleep 1 core_exit.sh @@ -125,7 +125,7 @@ if [ "${gamename}" == "Rust" ]; then # You can add an "elif" here to add another game or engine else # Game not listed - fn_print_information "Wipe is not available for this game" + fn_print_information_nl "Wipe is not available for this game" fn_script_log_info "Wipe is not available for this game." sleep 1 core_exit.sh From 69e20bec520e71ac0f43786847f803f763433395 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 28 Jan 2017 05:22:42 +0100 Subject: [PATCH 0414/1895] rconweb info --- Rust/rustserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rust/rustserver b/Rust/rustserver index aa740f8b1..acd9a9590 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -29,7 +29,7 @@ ip="0.0.0.0" port="28015" rconport="28016" rconpassword="CHANGE_ME" -rconweb="1" +rconweb="1" # Value is: 1 for Facepunch's web panel; 0 for RCON tools like Rusty or Rustadmin maxplayers="50" # Advanced Start Settings seed="" # default random; range : 1 to 2147483647 ; used to change or reproduce a procedural map From 616be584d8b2de0dd0b161e3e46bec757be4b774 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 28 Jan 2017 05:32:13 +0100 Subject: [PATCH 0415/1895] always end with core_exit.sh --- lgsm/functions/command_wipe.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index fd9306dd3..440c8080e 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -130,3 +130,5 @@ else sleep 1 core_exit.sh fi + +core_exit.sh From 873a8d3f5bf4c2da517433e04a79be541c3d4845 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 28 Jan 2017 05:59:07 +0100 Subject: [PATCH 0416/1895] typo on advdupe 2 --- lgsm/functions/mods_list.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 8b0beb604..0be15b08b 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -61,7 +61,7 @@ mod_info_utime=( MOD "utime" "UTime" "https://github.com/TeamUlysses/utime/archi mod_info_uclip=( MOD "uclip" "UClip" "https://github.com/TeamUlysses/uclip/archive/master.zip" "uclip-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "An alternative to noclip" ) mod_info_acf=( MOD "acf" "Armoured Combat Framework" "https://github.com/nrlulz/ACF/archive/master.zip" "acf-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "acf-master/lua/acf/shared/guns;" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/nrlulz/ACF" "Realistic Wepons & Engines" ) mod_info_acf_missiles=( MOD "acfmissiles" "ACF Missiles" "https://github.com/Bubbus/ACF-Missiles/archive/master.zip" "acf-missiles-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Bubbus/ACF-Missiles" "More missiles for ACF" ) -mod_info_acf_advdupe2=( MOD "advdupe2" "Advanced Duplicator 2" "https://github.com/wiremod/advdupe2/archive/master.zip" "advdupe2-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://www.wiremod.com" "Save your constructions" ) +mod_info_advdupe2=( MOD "advdupe2" "Advanced Duplicator 2" "https://github.com/wiremod/advdupe2/archive/master.zip" "advdupe2-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://www.wiremod.com" "Save your constructions" ) mod_info_darkrp=( MOD "darkrp" "DarkRP" "https://github.com/FPtje/DarkRP/archive/master.zip" "darkrp-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Most popular gamemode" ) mod_info_darkrpmodification=( MOD "darkrpmodification" "DarkRP Modification" "https://github.com/FPtje/darkrpmodification/archive/master.zip" "darkrpmodification-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "NOUPDATE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Customize DarkRP settings" ) # Oxidemod From 5e5153c71c6f38d1eb9673b7c3ab440a9766231b Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Sat, 28 Jan 2017 02:00:21 -0500 Subject: [PATCH 0417/1895] update UT XAN-3270765 --- lgsm/functions/install_server_files.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 792cb5e49..4304d3b04 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -34,7 +34,7 @@ fn_install_server_files(){ elif [ "${gamename}" == "Unreal Tournament 99" ]; then fileurl="http://files.gameservermanagers.com/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; filedir="${tmpdir}"; filename="ut99-server-451-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" elif [ "${gamename}" == "Unreal Tournament" ]; then - fileurl="http://files.gameservermanagers.com/UnrealTournament/UnrealTournament-Server-XAN-3193528-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3193528-Linux.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="e3dd5853c4eb193674d5c832f60040d8" + fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Server-XAN-3270765-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3270765-Linux.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="8791dc087383061d7f7f9f523237b8b3" elif [ "${gamename}" == "Unreal Tournament 3" ]; then fileurl="http://files.gameservermanagers.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; filedir="${tmpdir}"; filename="UT3-linux-server-2.1.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then From 5756d4157d5f911cf490e3c7444028fbe17463ff Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 28 Jan 2017 10:36:56 +0000 Subject: [PATCH 0418/1895] minor update to jc2 tests --- tests/tests_jc2server.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index c9140e9d0..af06805a3 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -23,9 +23,6 @@ version="170110" ######## Settings ######## ########################## -#### Server Settings #### -# No settings available for Just Cause 2 - ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ parms="" @@ -43,6 +40,7 @@ emailfrom="" # Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet pushbulletalert="off" pushbullettoken="accesstoken" +channeltag="" ## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update updateonstart="off" From 377ecf38b5e30527a15de0e9059cb655b8b92dfe Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 28 Jan 2017 21:45:49 +0000 Subject: [PATCH 0419/1895] Updated version number 170728 --- 7DaysToDie/sdtdserver | 2 +- ARKSurvivalEvolved/arkserver | 2 +- Arma3/arma3server | 2 +- Battlefield1942/bf1942server | 2 +- BlackMesa/bmdmserver | 2 +- BladeSymphony/bsserver | 2 +- BrainBread2/bb2server | 2 +- CallOfDuty/codserver | 2 +- CallOfDuty2/cod2server | 2 +- CallOfDuty4/cod4server | 2 +- CallOfDutyUnitedOffensive/coduoserver | 2 +- CallOfDutyWorldAtWar/codwawserver | 2 +- CodenameCURE/ccserver | 2 +- CounterStrike/csserver | 2 +- CounterStrikeConditionZero/csczserver | 2 +- CounterStrikeGlobalOffensive/csgoserver | 2 +- CounterStrikeSource/cssserver | 2 +- DayOfDefeat/dodserver | 2 +- DayOfDefeatSource/dodsserver | 2 +- DayOfInfamy/doiserver | 2 +- DeathmatchClassic/dmcserver | 2 +- DontStarveTogether/dstserver | 2 +- DoubleActionBoogaloo/dabserver | 2 +- EmpiresMod/emserver | 2 +- Factorio/fctrserver | 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 +- Minecraft/mcserver | 2 +- Mumble/mumbleserver | 2 +- NS2Combat/ns2cserver | 2 +- NaturalSelection2/ns2server | 2 +- NoMoreRoomInHell/nmrihserver | 2 +- OpposingForce/opforserver | 2 +- PiratesVikingandKnightsII/pvkiiserver | 2 +- ProjectZomboid/pzserver | 2 +- Quake2/q2server | 2 +- Quake3/q3server | 2 +- QuakeLive/qlserver | 2 +- QuakeWorld/qwserver | 2 +- RedOrchestra/roserver | 2 +- Ricochet/ricochetserver | 2 +- Rust/rustserver | 2 +- SeriousSam3BFE/ss3sserver | 2 +- Starbound/sbserver | 2 +- SvenCoop/svenserver | 2 +- TeamFortress2/tf2server | 2 +- TeamFortressClassic/tfcserver | 2 +- TeamSpeak3/ts3server | 2 +- Teeworlds/twserver | 2 +- Terraria/terrariaserver | 2 +- UnrealTournament/utserver | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament3/ut3server | 2 +- UnrealTournament99/ut99server | 2 +- WolfensteinEnemyTerritory/wetserver | 2 +- tests/tests_jc2server.sh | 2 +- 66 files changed, 66 insertions(+), 66 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index 6ca116aa7..518628004 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index da408b353..a6a5080a8 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Arma3/arma3server b/Arma3/arma3server index 8d6dcb210..f6c03be06 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Battlefield1942/bf1942server b/Battlefield1942/bf1942server index 51b8dfcc0..ae7447aa9 100644 --- a/Battlefield1942/bf1942server +++ b/Battlefield1942/bf1942server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index 1b6c9d573..6baa4e739 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index 38c71ce1e..1e5ad15cc 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index df5034bb8..8668fffce 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/CallOfDuty/codserver b/CallOfDuty/codserver index d78cbaece..b13aa8ed2 100755 --- a/CallOfDuty/codserver +++ b/CallOfDuty/codserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/CallOfDuty2/cod2server b/CallOfDuty2/cod2server index db4f07af9..2939c036e 100755 --- a/CallOfDuty2/cod2server +++ b/CallOfDuty2/cod2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server index 6b4a0260e..661077042 100644 --- a/CallOfDuty4/cod4server +++ b/CallOfDuty4/cod4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/CallOfDutyUnitedOffensive/coduoserver b/CallOfDutyUnitedOffensive/coduoserver index c3d71ae8a..172af806c 100755 --- a/CallOfDutyUnitedOffensive/coduoserver +++ b/CallOfDutyUnitedOffensive/coduoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/CallOfDutyWorldAtWar/codwawserver b/CallOfDutyWorldAtWar/codwawserver index 5e3681ead..43b5c7a42 100755 --- a/CallOfDutyWorldAtWar/codwawserver +++ b/CallOfDutyWorldAtWar/codwawserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 3196b993c..30bb0a0b2 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/CounterStrike/csserver b/CounterStrike/csserver index 4add519a6..e6de0dc7e 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index 8333438b9..ba70f15f3 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 8a306dc03..3122255fc 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index bdee401bb..be253b1d8 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index efe5861f8..83929712f 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 3508e0686..60dfa9f66 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/DayOfInfamy/doiserver b/DayOfInfamy/doiserver index 5d2ed38fe..acf036430 100644 --- a/DayOfInfamy/doiserver +++ b/DayOfInfamy/doiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index 4ef098e91..fbd3ee106 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index 99239c49a..972009a08 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 245cd0c59..04ab7fdda 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/EmpiresMod/emserver b/EmpiresMod/emserver index 36cb92f5a..e628f4c42 100644 --- a/EmpiresMod/emserver +++ b/EmpiresMod/emserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 8843668e4..f6b29d916 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index 988a1b680..9039576f5 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index c432c6769..89eea5994 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index d1520cc35..228d54523 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index b5a15f78c..53cc2f4ab 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index 8ba1b8d01..b008887a9 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index c25dc3fbf..22ab2c5d1 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index 43a6e465f..24b43ca40 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Insurgency/insserver b/Insurgency/insserver index eac3777c3..d6f7a8841 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/JustCause2/jc2server b/JustCause2/jc2server index 626df4b3a..0f4ef2dba 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index baca47dcc..de04e2db9 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index 2216a5f93..915efab6f 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index 496444a20..8d9e428fa 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Minecraft/mcserver b/Minecraft/mcserver index 82999f5a3..265e07746 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index 6dd9eb2d3..e19c936cd 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index c1b39d836..41949f3c6 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index bc01063c2..272f68fef 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index 5a925ea54..0c44dd2ff 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index 945f353d4..32a668f53 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index 6a715b7b9..7442c678a 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index c39c86f5e..31cc52efa 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Quake2/q2server b/Quake2/q2server index a1ff9bb75..e86933c26 100644 --- a/Quake2/q2server +++ b/Quake2/q2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Quake3/q3server b/Quake3/q3server index 1a64eeb1b..aca7dfcde 100644 --- a/Quake3/q3server +++ b/Quake3/q3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index 73047718d..7433273d9 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/QuakeWorld/qwserver b/QuakeWorld/qwserver index 1b92190e3..800ada9cd 100644 --- a/QuakeWorld/qwserver +++ b/QuakeWorld/qwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index 0812c7f41..19d4b65cf 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index 16d9fca81..e1486d67f 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Rust/rustserver b/Rust/rustserver index acd9a9590..8d4ded872 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index 33487a651..029db5b59 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Starbound/sbserver b/Starbound/sbserver index 899d846dc..38f48c97e 100644 --- a/Starbound/sbserver +++ b/Starbound/sbserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/SvenCoop/svenserver b/SvenCoop/svenserver index 10e27db1b..b401e72ea 100644 --- a/SvenCoop/svenserver +++ b/SvenCoop/svenserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index bbc242d0b..e9982d1f8 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index 6c3a7d9eb..501ef64a4 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index d1d97c172..6df71f193 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Teeworlds/twserver b/Teeworlds/twserver index d0de5a1d0..e038f175f 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index a155828eb..1f803e45b 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/UnrealTournament/utserver b/UnrealTournament/utserver index e95414adc..6e3afdf5b 100644 --- a/UnrealTournament/utserver +++ b/UnrealTournament/utserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index 0b49bd361..1cbfd4c59 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/UnrealTournament3/ut3server b/UnrealTournament3/ut3server index 8a839fc92..5dfe1207d 100644 --- a/UnrealTournament3/ut3server +++ b/UnrealTournament3/ut3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index fff7c8cb4..237c1531a 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/WolfensteinEnemyTerritory/wetserver b/WolfensteinEnemyTerritory/wetserver index 07ec5b7d9..bfc0cbd16 100644 --- a/WolfensteinEnemyTerritory/wetserver +++ b/WolfensteinEnemyTerritory/wetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index af06805a3..fd0a0e4d7 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -17,7 +17,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170110" +version="170128" ########################## ######## Settings ######## From 3d7ee63bd7e61cf57960c38c196fe4f3b8878cb9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 28 Jan 2017 21:46:07 +0000 Subject: [PATCH 0420/1895] Updates TS3 tests to match current layout --- tests/tests_ts3server.sh | 78 ++++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 21c76309c..8e0e54c2e 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -1,54 +1,75 @@ #!/bin/bash -# TravisCI Tests: Teamspeak 3 -# Server Management Script +# Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# Purpose: TravisCI Tests: Teamspeak 3 | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki # Website: https://gameservermanagers.com -version="101716" +# Debugging if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" set -x fi -#### Variables #### +version="170128" -# Notification Alerts -# (on|off) +########################## +######## Settings ######## +########################## + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +# Edit serverfiles/ts3-server.ini after installation -# Email +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email emailalert="off" email="email@example.com" -#emailfrom="email@example.com" +emailfrom="" -# Pushbullet -# https://www.pushbullet.com/#settings +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet pushbulletalert="off" pushbullettoken="accesstoken" +channeltag="" -# Start Variables +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update updateonstart="off" +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" -fn_parms(){ -parms="" -} +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" -#### Advanced Variables #### +#### LinuxGSM Advanced Settings #### -# Github Branch Select +## Github Branch Select # Allows for the use of different function files # from a different repo and/or branch. githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="$TRAVIS_BRANCH" -# Server Details -gamename="Teamspeak 3" -servername="Teamspeak 3 Server" +## LinuxGSM Server Details +# Do not edit +gamename="TeamSpeak 3" +servername="TeamSpeak 3 Server" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers servicename="ts3-server" -# Directories +#### Directories #### +# Edit with care + +## Work Directories rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" @@ -57,6 +78,8 @@ functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" filesdir="${rootdir}/serverfiles" + +## Server Specific Directories systemdir="${filesdir}" executabledir="${filesdir}" executable="./ts3server_startscript.sh" @@ -64,20 +87,23 @@ servercfg="${servicename}.ini" servercfgdefault="ts3server.ini" servercfgdir="${filesdir}" servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory backupdir="${rootdir}/backups" -# Logging -logdays="7" +## Logging Directories gamelogdir="${filesdir}/logs" scriptlogdir="${rootdir}/log/script" - scriptlog="${scriptlogdir}/${servicename}-script.log" emaillog="${scriptlogdir}/${servicename}-email.log" -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -##### Script ##### -# Do not edit +######################## +######## Script ######## +###### Do not edit ##### +######################## # Fetches core_dl for file downloads fn_fetch_core_dl(){ From e16f1a842413cc4a31b3a5d9c4bdf0a49d67a8dd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 28 Jan 2017 22:07:46 +0000 Subject: [PATCH 0421/1895] Testing possible fix for jc2server test --- tests/tests_jc2server.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index fd0a0e4d7..8fbb910a1 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -575,12 +575,13 @@ echo "gsquery.py will fail to query port." echo "Command: ./jc2server monitor" requiredstatus="ONLINE" fn_setstatus +cp "${servercfgfullpath}" "config.lua" sed -i 's/[0-9]\+/0/' "${servercfgfullpath}" (command_monitor.sh) fn_test_result_fail echo "" fn_print_info_nl "Re-generating ${servercfg}." -install_config.sh +cp -v "config.lua" "${servercfgfullpath}" echo "=================================" echo "" From 35269a57c7ad22e69877b933fbac15927f7e88a5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 28 Jan 2017 22:47:21 +0000 Subject: [PATCH 0422/1895] Corrected header --- lgsm/functions/check_executable.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_executable.sh b/lgsm/functions/check_executable.sh index 94337a26d..94e517cb5 100644 --- a/lgsm/functions/check_executable.sh +++ b/lgsm/functions/check_executable.sh @@ -1,8 +1,8 @@ #!/bin/bash -# LGSM check_system_dir.sh function +# LGSM check_executable.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -# Description: Checks if systemdir is accessible. +# Description: Checks if executable exists. local commandname="CHECK" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" From c7f44d46304af76ce4b82c62be99899cad31d2f8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 28 Jan 2017 22:50:33 +0000 Subject: [PATCH 0423/1895] tab --- lgsm/functions/command_update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index dd2206f00..3b0176ca4 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -20,7 +20,7 @@ elif [ "${engine}" == "lwjgl2" ]; then elif [ "${gamename}" == "Mumble" ]; then update_mumble.sh elif [ "${gamename}" == "Factorio" ]; then - update_factorio.sh + update_factorio.sh elif [ "${gamename}" == "Multi Theft Auto" ]; then update_mta.sh else From d0ccb28fd4dce1b23d034e83fc28065d4d37a27b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 28 Jan 2017 22:52:40 +0000 Subject: [PATCH 0424/1895] Removed ! from error again --- lgsm/functions/core_messages.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 632b01378..540729af7 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -165,9 +165,9 @@ fn_print_error(){ fn_print_error_nl(){ if [ -n "${commandaction}" ]; then - echo -en "${creeol}[${red}ERROR!${default}] ${commandaction} ${servicename}: $@" + echo -en "${creeol}[${red}ERROR ${default}] ${commandaction} ${servicename}: $@" else - echo -en "${creeol}[${red}ERROR!${default}] $@" + echo -en "${creeol}[${red}ERROR ${default}] $@" fi sleep 0.5 echo -en "\n" From 70f4334492a03de3c85eb076bc68bea712f29e25 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 28 Jan 2017 22:53:52 +0000 Subject: [PATCH 0425/1895] Glibc is required for MTA --- lgsm/functions/info_glibc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 677ec4432..12ba262a4 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -135,7 +135,7 @@ elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then glibcrequired="2.2.4" glibcfix="no" elif [ "${gamename}" == "Multi Theft Auto" ]; then - glibcrequired="NOT REQUIRED" + glibcrequired="2.7" glibcfix="no" else glibcrequired="UNKNOWN" From eb36d6b473e31b8465b3f45a72611b0af5983e16 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 28 Jan 2017 22:58:43 +0000 Subject: [PATCH 0426/1895] Corrected header --- MultiTheftAuto/mtaserver | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver index c119ac910..1fc07fdbb 100644 --- a/MultiTheftAuto/mtaserver +++ b/MultiTheftAuto/mtaserver @@ -1,7 +1,10 @@ #!/bin/bash -# Multi Theft Auto -# Server Management Script +# Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# Purpose: Multi Theft Auto | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki # Website: https://gameservermanagers.com if [ -f ".dev-debug" ]; then exec 5>dev-debug.log From b25c430aee463ccb34e563075d0e677e7105d7c1 Mon Sep 17 00:00:00 2001 From: Chaos Date: Sun, 29 Jan 2017 13:24:14 -0600 Subject: [PATCH 0427/1895] Stopping debug message --- lgsm/functions/command_debug.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index ac1d0add8..25e855c94 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -106,6 +106,9 @@ else ${executable} ${parms} fi +fn_print_dots "Stopping debug" +sleep 1 +fn_print_ok_nl "Stopping debug" # remove trap. trap - INT core_exit.sh From c034ce60004f8516dfd905200cef9bb83e8ac23c Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Mon, 30 Jan 2017 13:16:40 -0500 Subject: [PATCH 0428/1895] adding Counter-Strike: Classic Offensive --- CounterStrikeClassicOffensive/cscoserver | 205 +++++++++++++++++++++++ lgsm/functions/install_server_files.sh | 2 + 2 files changed, 207 insertions(+) create mode 100755 CounterStrikeClassicOffensive/cscoserver diff --git a/CounterStrikeClassicOffensive/cscoserver b/CounterStrikeClassicOffensive/cscoserver new file mode 100755 index 000000000..09a247588 --- /dev/null +++ b/CounterStrikeClassicOffensive/cscoserver @@ -0,0 +1,205 @@ +#!/bin/bash +# Project: Game Server Managers - LinuxGSM +# Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# Purpose: Counter-Strike: Classic Offensive | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki +# Website: https://gameservermanagers.com + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="170128" + +########################## +######## Settings ######## +########################## + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="de_dust2_csco" +maxplayers="16" +port="27015" +sourcetvport="27020" +clientport="27005" +ip="0.0.0.0" + +## Required: Game Server Login Token +# GSLT is required for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game csco -usercon -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers_override ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="740" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Counter-Strike: Classic Offensive" +engine="source" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="csco-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}/csco" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${systemdir}/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" + +######################## +######## Script ######## +###### Do not edit ##### +######################## + +# 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 -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_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_fetch_core_dl +} + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + +core_dl.sh +core_functions.sh +getopt=$1 +core_getopt.sh \ No newline at end of file diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index a988f2644..73777c146 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -21,6 +21,8 @@ fn_install_server_files(){ fileurl="http://files.gameservermanagers.com/CallOfDuty4/cod4x18_dedrun.tar.bz2"; filedir="${tmpdir}"; filename="cod4x18_dedrun.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="bebdfc1755626462bdaad49f6f926c08" elif [ "${gamename}" == "Call of Duty: World at War" ]; then fileurl="http://files.gameservermanagers.com/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.bz2"; filedir="${tmpdir}"; filename="codwaw-lnxded-1.7-full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="0489697ff3bf678c109bfb377d1b7895" + elif [ "${gamename}" == "Counter-Strike: Classic Offensive" ]; then + fileurl="https://s3.amazonaws.com/linuxgsm/ClassicOffensive_Beta1.1d.zip"; filedir="${tmpdir}"; filename="ClassicOffensive_Beta1.1d.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="922ff1abe08ba12309b19900f1cbd33a" elif [ "${gamename}" == "GoldenEye: Source" ]; then fileurl="http://files.gameservermanagers.com/GoldenEyeSource/GoldenEye_Source_v5.0.1_full_server_linux.tar.bz2"; filedir="${tmpdir}"; filename="GoldenEye_Source_v5.0.1_server_full_Linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="ea227a150300abe346e757380325f84c" elif [ "${gamename}" == "Quake 2" ]; then From 6946a61abec822c51a5d32577feabfcbc130bbe8 Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Mon, 30 Jan 2017 13:47:56 -0500 Subject: [PATCH 0429/1895] fix --- lgsm/functions/install_server_files.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 73777c146..9b099edd4 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -136,7 +136,7 @@ elif [ "${gamename}" == "Multi Theft Auto" ]; then elif [ "${gamename}" == "Factorio" ]; then update_factorio.sh install_factorio_save.sh -elif [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]; then +elif [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]||[ "${gamename}" == "Counter-Strike: Classic Offensive" ]; then if [ "${gamename}" == "Unreal Tournament" ]; then install_unreal_tournament_eula.sh fi From f6ad588ab73f113502b4a7f01e3f31bb99f9745d Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Mon, 30 Jan 2017 14:25:15 -0500 Subject: [PATCH 0430/1895] adding Counter-Strike: Classic Offensive config --- lgsm/functions/install_config.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 4a0cf13b2..44a251d3a 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -210,6 +210,12 @@ elif [ "${gamename}" == "Counter-Strike 1.6" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Counter-Strike: Classic Offensive" ]; then + gamedirname="CounterStrikeClassicOffensive" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Counter-Strike: Condition Zero" ]; then gamedirname="CounterStrikeConditionZero" array_configs+=( server.cfg ) From b554a0e03c6b1f07f06b4469d296351a82df2c9a Mon Sep 17 00:00:00 2001 From: Chaos Date: Mon, 30 Jan 2017 23:19:41 -0600 Subject: [PATCH 0431/1895] Fix for minecraft servers being unable to start --- Minecraft/mcserver | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Minecraft/mcserver b/Minecraft/mcserver index 265e07746..cfd87fc44 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -86,7 +86,7 @@ filesdir="${rootdir}/serverfiles" ## Server Specific Directories systemdir="${filesdir}" executabledir="${filesdir}" -executable="java -Xmx${javaram}M -jar minecraft_server.jar" +executable="java -Xmx${javaram}M -jar ${filesdir}/minecraft_server.jar" servercfg="server.properties" servercfgdefault="server.properties" servercfgdir="${filesdir}" @@ -182,4 +182,4 @@ fi core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From 1ed8bd63372a4b5b4ba0a12bad0bd0b98e8fd98b Mon Sep 17 00:00:00 2001 From: Marvin Lehmann Date: Thu, 2 Feb 2017 15:47:37 +0100 Subject: [PATCH 0432/1895] Added Tower Unite WIP: A few things still need to be done like adding deps, gslt or probably a specific steamclient.so fix.. --- TowerUnite/tuserver | 197 ++++++++++++++++++++++++++++++ lgsm/functions/command_details.sh | 16 +++ lgsm/functions/info_config.sh | 17 +++ lgsm/functions/install_config.sh | 6 + 4 files changed, 236 insertions(+) create mode 100644 TowerUnite/tuserver diff --git a/TowerUnite/tuserver b/TowerUnite/tuserver new file mode 100644 index 000000000..187fee91d --- /dev/null +++ b/TowerUnite/tuserver @@ -0,0 +1,197 @@ +#!/bin/bash +# Project: Game Server Managers - LinuxGSM +# Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# Purpose: Tower Unite | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki +# Website: https://gameservermanagers.com + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="170128" + +########################## +######## Settings ######## +########################## + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +port="7777" +queryport="27015" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-log -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -TowerServerINI=${servicename}.ini" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="439660" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="feature/tuserver" + +## LinuxGSM Server Details +# Do not edit +gamename="Tower Unite" +engine="unreal4" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="tu-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}/Tower" +executabledir="${systemdir}/Binaries/Linux" +executable="./TowerServer-Linux-Shipping" +servercfgdir="${systemdir}/Saved/Config/LinuxServer" +servercfg="${servicename}.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" +servercfgdefault="${servercfgdir}/TowerServer.ini" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${systemdir}/Saved/Logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" + +######################## +######## Script ######## +###### Do not edit ##### +######################## + +# 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 -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_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_fetch_core_dl +} + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + +core_dl.sh +core_functions.sh +getopt=$1 +core_getopt.sh diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index e34f65702..14f11f025 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -675,6 +675,20 @@ fn_details_terraria(){ } | column -s $'\t' -t } +fn_details_towerunite(){ + echo -e "netstat -atunp | grep TowerServer-Linux-Shipping" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\ttcp" + # Don't do arithmetics if ever the port wasn't a numeric value + if [ "${port}" -eq "${port}" ]; then + echo -e "> Steam\tINBOUND\t$((port+1))\tudp" + fi + echo -e "> Query\tINBOUND\t${queryport}\tudp" + } | column -s $'\t' -t +} + fn_details_unreal(){ echo -e "netstat -atunp | grep ucc-bin" echo -e "" @@ -824,6 +838,8 @@ fn_display_details() { fn_details_quakelive elif [ "${gamename}" == "TeamSpeak 3" ]; then fn_details_teamspeak3 + elif [ "${gamename}" == "Tower Unite" ]; then + fn_details_towerunite elif [ "${gamename}" == "Multi Theft Auto" ]; then fn_details_mta elif [ "${gamename}" == "Mumble" ]; then diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 0164999a3..238e06ca0 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -514,6 +514,20 @@ fn_info_config_terraria(){ fi } +fn_info_config_towerunite(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + maxplayers="${zero}" + else + servername=$(grep "ServerTitle" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerTitle//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + + # Not Set + servername=${servername:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + fi +} + fn_info_config_unreal(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -705,6 +719,9 @@ elif [ "${engine}" == "teeworlds" ]; then # Terraria elif [ "${engine}" == "terraria" ]; then fn_info_config_terraria +# Tower Unite +elif [ "${gamename}" == "towerunite" ]; then + fn_info_config_towerunite # Unreal/Unreal 2 engine elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then fn_info_config_unreal diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 44a251d3a..89522de57 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -480,6 +480,12 @@ elif [ "${gamename}" == "Terraria" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Tower Unite" ]; then + gamedirname="TowerUnite" + array_configs+=( TowerServer.ini ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Unreal Tournament" ]; then gamedirname="UnrealTournament" array_configs+=( Game.ini Engine.ini ) From 4ec6b9eeba0e80a6c44b79f059415058a9a0ce23 Mon Sep 17 00:00:00 2001 From: Marvin Lehmann Date: Thu, 2 Feb 2017 15:57:46 +0100 Subject: [PATCH 0433/1895] Corrected ARK game log directory --- ARKSurvivalEvolved/arkserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index a6a5080a8..5d6464073 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -111,7 +111,7 @@ servercfgdefault="${servercfgdir}/GameUserSettings.ini" backupdir="${rootdir}/backups" ## Logging Directories -gamelogdir="${systemdir}/logs" +gamelogdir="${systemdir}/Saved/Logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" scriptlog="${scriptlogdir}/${servicename}-script.log" From e57b163c582badf672348c327147dc7ded5c34eb Mon Sep 17 00:00:00 2001 From: Marvin Lehmann Date: Thu, 2 Feb 2017 17:40:45 +0100 Subject: [PATCH 0434/1895] Fixes config stuff --- TowerUnite/tuserver | 4 ++-- lgsm/functions/info_config.sh | 2 +- lgsm/functions/install_config.sh | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/TowerUnite/tuserver b/TowerUnite/tuserver index 187fee91d..f4f8330b2 100644 --- a/TowerUnite/tuserver +++ b/TowerUnite/tuserver @@ -100,10 +100,10 @@ filesdir="${rootdir}/serverfiles" systemdir="${filesdir}/Tower" executabledir="${systemdir}/Binaries/Linux" executable="./TowerServer-Linux-Shipping" -servercfgdir="${systemdir}/Saved/Config/LinuxServer" +servercfgdir="${systemdir}/Binaries/Linux" servercfg="${servicename}.ini" servercfgfullpath="${servercfgdir}/${servercfg}" -servercfgdefault="${servercfgdir}/TowerServer.ini" +servercfgdefault="TowerServer.ini" ## Backup Directory backupdir="${rootdir}/backups" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 238e06ca0..a0ff00fee 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -720,7 +720,7 @@ elif [ "${engine}" == "teeworlds" ]; then elif [ "${engine}" == "terraria" ]; then fn_info_config_terraria # Tower Unite -elif [ "${gamename}" == "towerunite" ]; then +elif [ "${gamename}" == "Tower Unite" ]; then fn_info_config_towerunite # Unreal/Unreal 2 engine elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 89522de57..8a71bcc22 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -482,6 +482,7 @@ elif [ "${gamename}" == "Terraria" ]; then fn_set_config_vars elif [ "${gamename}" == "Tower Unite" ]; then gamedirname="TowerUnite" + fn_check_cfgdir array_configs+=( TowerServer.ini ) fn_fetch_default_config fn_default_config_remote From ac6df8490028fce2126eb0c8b26da7167804598c Mon Sep 17 00:00:00 2001 From: Marvin Lehmann Date: Thu, 2 Feb 2017 17:43:23 +0100 Subject: [PATCH 0435/1895] Added steamclient.so fix --- lgsm/functions/fix_steamcmd.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 9f08fd36a..444409cfe 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -40,4 +40,12 @@ elif [ "${gamename}" == "Hurtworld" ]; then cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${filesdir}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${scriptlog}" fn_fix_msg_end fi +elif [ "${gamename}" == "Tower Unite" ]; then + # Fixes: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam, or a local steamclient.so. + if [ ! -f "${executabledir}/steamclient.so" ]; then + fixname="steamclient.so" + fn_fix_msg_start + cp -v "${filesdir}/linux64/steamclient.so" "${executabledir}/steamclient.so" >> "${scriptlog}" + fn_fix_msg_end + fi fi From ecb71045b64b3461935dc5f6044f9bef5608cb98 Mon Sep 17 00:00:00 2001 From: Marvin Lehmann Date: Thu, 2 Feb 2017 18:26:13 +0100 Subject: [PATCH 0436/1895] Shortened program name for netstat .. because it's cut off. --- 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 14f11f025..40b719f2c 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -676,7 +676,7 @@ fn_details_terraria(){ } fn_details_towerunite(){ - echo -e "netstat -atunp | grep TowerServer-Linux-Shipping" + echo -e "netstat -atunp | grep TowerServer" echo -e "" { echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" From e69bcd732ae57f0a3da4a4aff9d2d18433fba584 Mon Sep 17 00:00:00 2001 From: Marvin Lehmann Date: Fri, 3 Feb 2017 14:17:41 +0100 Subject: [PATCH 0437/1895] Corrected servercfgdefault --- ARKSurvivalEvolved/arkserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index a6a5080a8..f5a3049db 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -104,8 +104,8 @@ executabledir="${systemdir}/Binaries/Linux" executable="./ShooterGameServer" servercfgdir="${systemdir}/Saved/Config/LinuxServer" servercfg="GameUserSettings.ini" +servercfgdefault="GameUserSettings.ini" servercfgfullpath="${servercfgdir}/${servercfg}" -servercfgdefault="${servercfgdir}/GameUserSettings.ini" ## Backup Directory backupdir="${rootdir}/backups" From 3486c20f8f40dc7eb2fce7f6bdc9600cde9f36ea Mon Sep 17 00:00:00 2001 From: Marvin Lehmann Date: Fri, 3 Feb 2017 14:19:51 +0100 Subject: [PATCH 0438/1895] Removed wrong servercfgdefault duplicate --- Minecraft/mcserver | 1 - 1 file changed, 1 deletion(-) diff --git a/Minecraft/mcserver b/Minecraft/mcserver index cfd87fc44..39db226d1 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -91,7 +91,6 @@ servercfg="server.properties" servercfgdefault="server.properties" servercfgdir="${filesdir}" servercfgfullpath="${servercfgdir}/${servercfg}" -servercfgdefault="${servercfgdir}/lgsm-default.ini" ## Backup Directory backupdir="${rootdir}/backups" From 7363190723a000bb3b0a1bd089f25357c630931b Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Fri, 3 Feb 2017 14:25:45 -0500 Subject: [PATCH 0439/1895] adding Ballistic Overkill --- BallisticOverkill/boserver | 198 +++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100755 BallisticOverkill/boserver diff --git a/BallisticOverkill/boserver b/BallisticOverkill/boserver new file mode 100755 index 000000000..c17e02b6e --- /dev/null +++ b/BallisticOverkill/boserver @@ -0,0 +1,198 @@ +#!/bin/bash +# Project: Game Server Managers - LinuxGSM +# Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# Purpose: Ballistic Overkill | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki +# Website: https://gameservermanagers.com + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="170128" + +########################## +######## Settings ######## +########################## + +#### Server Settings #### + +## Optional: Game Server Login Token +# GSLT can be used for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms=" -batchmode -nographics -logFile output.txt" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## SteamCMD Settings +# Server appid +appid="416880" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Ballistic Overkill" +engine="unity" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="bo-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./BODS.x86" +servercfg="config.txt" +servercfgdefault="${servercfg}" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directorie +gamelogdir="${systemdir}/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" + +######################## +######## Script ######## +###### Do not edit ##### +######################## + +# 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 -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_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_fetch_core_dl +} + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + +core_dl.sh +core_functions.sh +getopt=$1 +core_getopt.sh \ No newline at end of file From 54e6948d24619dfad9109875b985fc6b752c61ad Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Feb 2017 20:11:27 +0000 Subject: [PATCH 0440/1895] ] to ) --- GarrysMod/gmodserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index 89eea5994..4a790b467 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -53,7 +53,7 @@ parms="-game garrysmod -strictportbind -ip ${ip} -port ${port} -tickrate ${tickr #### LinuxGSM Settings #### ## Notification Alerts -# (on|off] +# (on|off) # Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email emailalert="off" email="email@example.com" From 5c5e0538ffce14add65c836b874da4d03df7004a Mon Sep 17 00:00:00 2001 From: Gianni Stubbe Date: Mon, 6 Feb 2017 13:46:46 +0100 Subject: [PATCH 0441/1895] Edit defaultmap for active duty map change Dust2 has been taken out of active duty. Changed map to mirage and changed mappool to mg_active following the Valve documentation: https://developer.valvesoftware.com/wiki/Counter-Strike:_Global_Offensive_Dedicated_Servers#Starting_the_Server --- CounterStrikeGlobalOffensive/csgoserver | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 3122255fc..347983ebb 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -32,8 +32,8 @@ version="170128" # Deathmatch 1 2 gametype="0" gamemode="0" -defaultmap="de_dust2" -mapgroup="random_classic" +defaultmap="de_mirage" +mapgroup="mg_active" maxplayers="16" tickrate="64" port="27015" @@ -220,4 +220,4 @@ fi core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From 3c0ed33c4a080ddb58897fe71f638a08b853d265 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 9 Feb 2017 23:10:17 +0000 Subject: [PATCH 0442/1895] Updated Glibc requirements for Sven Co-op --- lgsm/functions/info_glibc.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 12ba262a4..1736e0be6 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -68,6 +68,9 @@ elif [ "${gamename}" == "Quake 3: Arena" ]; then elif [ "${gamename}" == "Quake Live" ]; then glibcrequired="2.15" glibcfix="no" +elif [ "${gamename}" == "Sven Co-op" ]; then + glibcrequired="2.18" + glibcfix="no" elif [ "${gamename}" == "TeamSpeak 3" ]; then glibcrequired="NOT REQUIRED" glibcfix="no" From 5492cf6b0b395b8f7f56639e917976b92ac0f999 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 9 Feb 2017 23:39:19 +0000 Subject: [PATCH 0443/1895] Added glibc requirements --- lgsm/functions/info_glibc.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 12ba262a4..d698c7ba2 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -74,6 +74,9 @@ elif [ "${gamename}" == "TeamSpeak 3" ]; then elif [ "${gamename}" == "Teeworlds" ]; then glibcrequired="2.3" glibcfix="no" +elif [ "${gamename}" == "Tower Unite" ]; then + glibcrequired="2.14" + glibcfix="no" elif [ "${engine}" == "avalanche" ]; then glibcrequired="2.13" glibcfix="yes" From cd3f9299f4d6f9bcc50b2989b886d6b0f9be411e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 9 Feb 2017 23:56:48 +0000 Subject: [PATCH 0444/1895] added graceful shutdown --- lgsm/functions/command_stop.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 62d73c3da..0e5dc899b 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -58,7 +58,7 @@ fn_stop_graceful_goldsource(){ fn_stop_tmux } -fn_stop_graceful_factorio(){ +fn_stop_graceful_ctrlc(){ fn_print_dots "Graceful: console CTRL+c" fn_script_log_info "Graceful: console CTRL+c" # sends quit @@ -222,7 +222,7 @@ fn_stop_graceful_select(){ if [ "${gamename}" == "7 Days To Die" ]; then fn_stop_graceful_sdtd elif [ "${gamename}" == "Factorio" ]; then - fn_stop_graceful_factorio + fn_stop_graceful_ctrlc elif [ "${engine}" == "source" ]; then fn_stop_graceful_source elif [ "${engine}" == "goldsource" ]; then @@ -231,6 +231,8 @@ fn_stop_graceful_select(){ fn_stop_graceful_minecraft elif [ "${engine}" == "renderware" ]; then fn_stop_graceful_mta + elif [ "${engine}" == "unreal4" ]; then + fn_stop_graceful_ctrlc else fn_stop_tmux fi From 28b4b9e9da33bc7c7db30d7c2bc1eacd3b2d4f68 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 10 Feb 2017 00:02:59 +0000 Subject: [PATCH 0445/1895] Updated GSLT list --- lgsm/functions/command_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 15ed1bafd..da3f516d9 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -28,7 +28,7 @@ fi # Configuration install_config.sh -if [ "${gamename}" == "Counter-Strike: Global Offensive" ]||[ "${gamename}" == "Team Fortress 2" ]||[ "${gamename}" == "BrainBread 2" ]; then +if [ "${gamename}" == "BrainBread 2" ]||[ "${gamename}" == "Black Mesa: Deathmatch" ]||[ "${gamename}" == "Counter-Strike: Global Offensive" ]||[ "${gamename}" == "Empires Mod" ]||[ "${gamename}" == "Garry’s Mod" ]||[ "${gamename}" == "No more Room in Hell" ]||[ "${gamename}" == "Team Fortress 2" ]||[ "${gamename}" == "Tower Unite" ]; then install_gslt.sh elif [ "${gamename}" == "Don't Starve Together" ]; then install_dst_token.sh From 0901753364d3a768e61fd23851bfaf3f319696e3 Mon Sep 17 00:00:00 2001 From: s-eam Date: Wed, 8 Feb 2017 23:41:55 -0500 Subject: [PATCH 0446/1895] Abstract Y/N Prompt Logic - Modularize prompt logic into separate function (fn_prompt_yn) - Refactor scripts to utilize fn_prompt_yn - Enhance Y/N prompt interface for usability --- lgsm/functions/command_console.sh | 21 +++----- lgsm/functions/command_debug.sh | 11 ++-- lgsm/functions/command_fastdl.sh | 50 +++++++------------ .../command_install_resources_mta.sh | 11 ++-- lgsm/functions/command_mods_install.sh | 11 ++-- lgsm/functions/command_mods_remove.sh | 11 ++-- lgsm/functions/command_ts3_server_pass.sh | 11 ++-- lgsm/functions/command_wipe.sh | 13 ++--- lgsm/functions/compress_unreal2_maps.sh | 13 ++--- lgsm/functions/compress_ut99_maps.sh | 13 ++--- lgsm/functions/core_messages.sh | 24 +++++++++ lgsm/functions/install_dst_token.sh | 15 +++--- lgsm/functions/install_minecraft_eula.sh | 13 ++--- lgsm/functions/install_retry.sh | 13 ++--- lgsm/functions/install_server_dir.sh | 13 ++--- lgsm/functions/install_server_files.sh | 11 ++-- lgsm/functions/install_ts3db.sh | 11 ++-- .../install_unreal_tournament_eula.sh | 13 ++--- 18 files changed, 104 insertions(+), 174 deletions(-) diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index ee9f13b6e..e59d24a2f 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -13,13 +13,9 @@ fn_print_header fn_print_information_nl "Press \"CTRL+b\" then \"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 +if ! fn_prompt_yn "Continue?" Y; then + echo Exiting; return +fi done fn_print_dots "Accessing console" sleep 1 @@ -35,14 +31,9 @@ else fn_print_error_nl "Server not running" fn_script_log_error "Failed to access: Server not running" sleep 1 - while true; do - read -e -i "y" -p "Do you want to start the server? [Y/n]" yn - case $yn in - [Yy]* ) exitbypass=1; command_start.sh; break;; - [Nn]* ) break;; - * ) echo "Please answer yes or no.";; - esac - done + if fn_prompt_yn "Do you want to start the server?" Y; then + exitbypass=1; command_start.sh + fi fi core_exit.sh diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 25e855c94..a98048638 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -68,14 +68,9 @@ 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 +if ! fn_prompt_yn "Continue?" Y; then + echo Exiting; return +fi fn_print_info_nl "Stopping any running servers" fn_script_log_info "Stopping any running servers" diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index c66834b98..345ff765b 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -42,14 +42,9 @@ fn_fastdl_init(){ sleep 1 echo -en "\n" fn_script_log "Started FastDL creation" - 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 + if ! fn_prompt_yn "Continue?" Y; then + exit + fi fn_script_log "Initiating FastDL creation" # Check and create directories @@ -91,27 +86,21 @@ fn_fastdl_config(){ # Prompt for clearing old files if directory was already here if [ -n "${newfastdl}" ] && [ "${newfastdl}" == "0" ]; then fn_print_dots - while true; do - read -e -i "y" -p "Clear old FastDL files? [Y/n]" yn - case $yn in - [Yy]* ) clearoldfastdl="on"; fn_script_log "clearoldfastdl enabled"; fn_print_ok "Clearing Enabled"; break;; - [Nn]* ) clearoldfastdl="off"; fn_script_log "clearoldfastdl disabled"; fn_print_ok "Clearing Disabled"; break;; - * ) echo "Please answer yes or no.";; - esac - done + if fn_prompt_yn "Clear old FastDL files?" Y; then + clearoldfastdl="on"; fn_script_log "clearoldfastdl enabled"; fn_print_ok "Clearing Enabled" + else + clearoldfastdl="off"; fn_script_log "clearoldfastdl disabled"; fn_print_ok "Clearing Disabled" + fi echo -en "\n" fi # Prompt for using bzip2 if it's installed if [ ${bzip2installed} == 1 ]; then fn_print_dots - while true; do - read -e -i "y" -p "Enable file compression using bzip2? [Y/n]" yn - case $yn in - [Yy]* ) bzip2enable="on"; fn_script_log "bzip2 enabled"; fn_print_ok "bzip2 Enabled"; break;; - [Nn]* ) bzip2enable="off"; fn_script_log "bzip2 disabled"; fn_print_ok "bzip2 Disabled"; break;; - * ) echo "Please answer yes or no.";; - esac - done + if fn_prompt_yn "Enable file compression using bzip2?" Y; then + bzip2enable="on"; fn_script_log "bzip2 enabled"; fn_print_ok "bzip2 Enabled" + else + bzip2enable="off"; fn_script_log "bzip2 disabled"; fn_print_ok "bzip2 Disabled" + fi echo -en "\n" fi } @@ -119,14 +108,11 @@ fn_fastdl_config(){ fn_fastdl_gmod_config(){ # Prompt for download enforcer, that is using a .lua addfile resource generator fn_print_dots - while true; do - read -e -i "y" -p "Use client download enforcer? [Y/n]" yn - case $yn in - [Yy]* ) luaressource="on"; fn_script_log "DL enforcer Enabled"; fn_print_ok "Enforcer Enabled"; break;; - [Nn]* ) luaressource="off"; fn_script_log "DL enforcer Disabled"; fn_print_ok "Enforcer Disabled"; break;; - * ) echo "Please answer yes or no.";; - esac - done + if fn_prompt_yn "Use client download enforcer?" Y; then + luaressource="on"; fn_script_log "DL enforcer Enabled"; fn_print_ok "Enforcer Enabled" + else + luaressource="off"; fn_script_log "DL enforcer Disabled"; fn_print_ok "Enforcer Disabled" + fi echo -en "\n" } diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 678e412ad..b4432e0f5 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -21,11 +21,6 @@ fn_install_resources(){ fn_print_header fn_print_warning_nl "Installing the default resources with existing resources may cause issues." -while true; do - read -e -i "y" -p "Do you want to install MTA default resources? [Y/n]" yn - case $yn in - [Yy]* ) fn_install_resources && break;; - [Nn]* ) break;; - * ) echo "Please answer yes or no.";; - esac -done +if fn_prompt_yn "Do you want to install MTA default resources?" Y; then + fn_install_resources +fi diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 2d85c12f6..9610d5e91 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -87,14 +87,9 @@ if [ -f "${modsinstalledlistfullpath}" ]; then fn_script_log_warn "${modprettyname} is already installed" sleep 1 echo " * Any configs may be overwritten." - while true; do - read -e -i "y" -p "Continue? [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; core_exit.sh;; - * ) echo "Please answer yes or no.";; - esac - done + if ! fn_prompt_yn "Continue?" Y; then + echo Exiting; core_exit.sh + fi fn_script_log_info "User selected to continue" fi fi diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index d63a00101..932a3d733 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -45,14 +45,9 @@ done fn_print_warning_nl "You are about to remove ${cyan}${usermodselect}${default}." echo " * Any custom files/configuration will be removed." -while true; do - read -e -i "y" -p "Continue? [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; exit;; - * ) echo "Please answer yes or no.";; -esac -done +if ! fn_prompt_yn "Continue?" Y; then + echo Exiting; exit +fi currentmod="${usermodselect}" fn_mod_get_info diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index 1a9896889..529b705b1 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -19,14 +19,9 @@ fn_serveradmin_password_prompt(){ fn_print_information_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; exit;; - * ) echo "Please answer yes or no.";; - esac - done + if ! fn_prompt_yn "Continue?" Y; then + echo Exiting; exit + fi fn_script_log_info "Initiating ${gamename} ServerAdmin password change" read -p "Enter new password : " newpassword } diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 440c8080e..d50e354fc 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -105,18 +105,13 @@ fn_wipe_server_remove_files(){ if [ "${gamename}" == "Rust" ]; then if [ -d "${serveridentitydir}/storage" ]||[ -d "${serveridentitydir}/user" ]||[ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap*.sav")" ]||[ -n "$(find "${serveridentitydir}" -type f -name "Log.*.txt")" ]; then fn_print_warning_nl "Any user, storage, log and map data from ${serveridentitydir} will be erased." - while true; do - read -e -i "y" -p "Continue? [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; core_exit.sh;; - * ) echo "Please answer yes or no.";; - esac - done + if ! fn_prompt_yn "Continue?" Y; then + echo Exiting; core_exit.sh + fi fn_script_log_info "User selects to erase any user, storage, log and map data from ${serveridentitydir}" sleep 1 fn_wipe_server_process - else + else fn_print_information_nl "No data to wipe was found" fn_script_log_info "No data to wipe was found." sleep 1 diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index 67d3621e2..f2bcb2135 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -19,14 +19,9 @@ echo "Compressed maps saved to:" echo "" echo "${compressedmapsdir}" echo "" -while true; do - read -e -i "y" -p "Start compression [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return;; - * ) echo "Please answer yes or no.";; - esac -done +if ! fn_prompt_yn "Start compression?" Y; then + echo Exiting; return +fi mkdir -pv "${compressedmapsdir}" > /dev/null 2>&1 rm -rfv "${filesdir}/Maps/"*.ut2.uz2 cd "${systemdir}" @@ -34,4 +29,4 @@ for map in "${filesdir}/Maps/"*; do ./ucc-bin compress "${map}" --nohomedir done mv -fv "${filesdir}/Maps/"*.ut2.uz2 "${compressedmapsdir}" -core_exit.sh \ No newline at end of file +core_exit.sh diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh index 3ef6e140e..872b3da06 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -19,14 +19,9 @@ echo "Compressed maps saved to:" echo "" echo "${compressedmapsdir}" echo "" -while true; do - read -e -i "y" -p "Start compression [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) echo Exiting; return;; - * ) echo "Please answer yes or no.";; - esac -done +if ! fn_prompt_yn "Start compression?" Y; then + echo Exiting; return +fi mkdir -pv "${compressedmapsdir}" > /dev/null 2>&1 rm -rfv "${filesdir}/Maps/"*.unr.uz cd "${systemdir}" @@ -34,4 +29,4 @@ for map in "${filesdir}/Maps/"*; do ./ucc-bin compress "${map}" --nohomedir done mv -fv "${filesdir}/Maps/"*.unr.uz "${compressedmapsdir}" -core_exit.sh \ No newline at end of file +core_exit.sh diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 540729af7..1d3623173 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -1,6 +1,7 @@ #!/bin/bash # LGSM core_messages.sh function # Author: Daniel Gibbs +# Contributor: s-eam # Website: https://gameservermanagers.com # Description: Defines on-screen messages such as [ OK ] and how script logs look. @@ -268,6 +269,29 @@ fn_print_information_nl(){ echo -e "${cyan}Information!${default} $@" } +# Y/N Prompt +fn_prompt_yn(){ + local prompt="$1" + local initial="$2" + + if [ "${initial}" == "Y" ]; then + prompt+=" [Y/n] " + elif [ "${initial}" == "N" ]; then + prompt+=" [y/N] " + else + prompt+=" [y/n] " + fi + + while true; do + read -e -i "${initial}" -p "${prompt}" -r yn + case "${yn}" in + [Yy]|[Yy][Ee][Ss]) return 0 ;; + [Nn]|[Nn][Oo]) return 1 ;; + *) echo "Please answer yes or no." ;; + esac + done +} + # On-Screen End of Line ################################## diff --git a/lgsm/functions/install_dst_token.sh b/lgsm/functions/install_dst_token.sh index 2e9713e71..27966bcbc 100644 --- a/lgsm/functions/install_dst_token.sh +++ b/lgsm/functions/install_dst_token.sh @@ -21,15 +21,12 @@ if [ -z "${autoinstall}" ]; then if [ -s "${clustercfgdir}/cluster_token.txt" ]; then echo "The cluster token is already set. Do you want to overwrite it?" fn_script_log_info "Don't Starve Together cluster token is already set" - while true; do - read -e -i "n" -p "Continue? [Y/n]" yn - case $yn in - [Yy]* ) overwritetoken="true"; break;; - [Nn]* ) overwritetoken="false"; break;; - * ) echo "Please answer yes or no.";; - esac - done - fi + if fn_prompt_yn "Continue?" N; then + overwritetoken="true" + else + overwritetoken="false" + fi + fi if [ "${overwritetoken}" == "true" ]; then echo "Once you have the cluster token, enter it below" echo -n "Cluster Token: " diff --git a/lgsm/functions/install_minecraft_eula.sh b/lgsm/functions/install_minecraft_eula.sh index 410e283b4..e4901979b 100644 --- a/lgsm/functions/install_minecraft_eula.sh +++ b/lgsm/functions/install_minecraft_eula.sh @@ -16,18 +16,13 @@ echo "eula=false" > "${filesdir}/eula.txt" if [ -z "${autoinstall}" ]; then echo "By continuing you are indicating your agreement to the EULA." echo "" - while true; do - read -e -i "y" -p "Continue [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) core_exit.sh;; - * ) echo "Please answer yes or no.";; - esac - done + if ! fn_prompt_yn "Continue?" Y; then + core_exit.sh + fi else echo "By using auto-install you are indicating your agreement to the EULA." echo "" sleep 5 fi -sed -i "s/eula=false/eula=true/g" "${filesdir}/eula.txt" \ No newline at end of file +sed -i "s/eula=false/eula=true/g" "${filesdir}/eula.txt" diff --git a/lgsm/functions/install_retry.sh b/lgsm/functions/install_retry.sh index d0ca16fef..757dd6574 100644 --- a/lgsm/functions/install_retry.sh +++ b/lgsm/functions/install_retry.sh @@ -8,11 +8,8 @@ local commandname="INSTALL" local commandaction="Install" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -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 +if fn_prompt_yn "Retry install?" Y; then + command_install.sh; exit +else + echo Exiting; exit +fi diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index d527b6193..1cd64110d 100644 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -19,16 +19,11 @@ 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 + if ! fn_prompt_yn "Continue?" Y; then + exit + fi fi if [ ! -d "${filesdir}" ]; then mkdir -v "${filesdir}" fi -sleep 1 \ No newline at end of file +sleep 1 diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 9b099edd4..4d4dfe892 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -146,12 +146,7 @@ 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 + if ! fn_prompt_yn "Was the install successful?" Y; then + install_retry.sh + fi fi diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index bada12c0b..dec3b6773 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -48,14 +48,9 @@ fn_install_ts3db_mariadb(){ 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 + if ! fn_prompt_yn "Do you want to use MariaDB/MySQL instead of sqlite (Database Server including user and database already has to be set up!)?" N; then + fn_install_ts3db_mariadb + fi else fn_print_warning_nl "./${selfname} auto-install is uses sqlite. For MariaDB/MySQL use ./${selfname} install" fi diff --git a/lgsm/functions/install_unreal_tournament_eula.sh b/lgsm/functions/install_unreal_tournament_eula.sh index b39f9b2e2..f2a5eb445 100644 --- a/lgsm/functions/install_unreal_tournament_eula.sh +++ b/lgsm/functions/install_unreal_tournament_eula.sh @@ -16,18 +16,13 @@ echo "eula=false" > "${filesdir}/eula.txt" if [ -z "${autoinstall}" ]; then echo "By continuing you are indicating your agreement to the EULA." echo "" - while true; do - read -e -i "y" -p "Continue [Y/n]" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) core_exit.sh;; - * ) echo "Please answer yes or no.";; - esac - done + if ! fn_prompt_yn "Continue?" Y; then + core_exit.sh + fi else echo "By using auto-install you are indicating your agreement to the EULA." echo "" sleep 5 fi -sed -i "s/eula=false/eula=true/g" "${filesdir}/eula.txt" \ No newline at end of file +sed -i "s/eula=false/eula=true/g" "${filesdir}/eula.txt" From f2901c0e946c612e3a3d4cfe3dad36fb273bd8db Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 10 Feb 2017 22:02:32 +0000 Subject: [PATCH 0447/1895] Tower Unite bypasses GSLT input and only informs user --- lgsm/functions/install_gslt.sh | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh index c611e91a3..1c8f25194 100644 --- a/lgsm/functions/install_gslt.sh +++ b/lgsm/functions/install_gslt.sh @@ -26,12 +26,19 @@ fn_script_log_info "Get more info and a token here:" fn_script_log_info "https://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}" + if [ "${gamename}" != "Tower Unite" ];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 fi sleep 1 -echo "The GSLT can be changed by editing ${selfname}." -fn_script_log_info "The GSLT can be changed by editing ${selfname}." +if [ "${gamename}" == "Tower Unite" ];then + echo "The GSLT can be changed by editing ${servercfg}." + fn_script_log_info "The GSLT can be changed by editing ${servercfg}." +else + echo "The GSLT can be changed by editing ${selfname}." + fn_script_log_info "The GSLT can be changed by editing ${selfname}." +fi echo "" \ No newline at end of file From abcdfe985be3c1f5c3f4e0faac195c2db714ed5f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 10 Feb 2017 23:25:22 +0000 Subject: [PATCH 0448/1895] Increased the glibc requirements of ARK --- lgsm/functions/info_glibc.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index d698c7ba2..d4977a757 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -6,7 +6,10 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -if [ "${gamename}" == "Black Mesa: Deathmatch" ]; then +if [ "${gamename}" == "ARK: Survival Evolved" ]; then + glibcrequired="2.15" + glibcfix="no" +elif [ "${gamename}" == "Black Mesa: Deathmatch" ]; then glibcrequired="2.15" glibcfix="yes" elif [ "${gamename}" == "Blade Symphony" ]; then @@ -74,9 +77,6 @@ elif [ "${gamename}" == "TeamSpeak 3" ]; then elif [ "${gamename}" == "Teeworlds" ]; then glibcrequired="2.3" glibcfix="no" -elif [ "${gamename}" == "Tower Unite" ]; then - glibcrequired="2.14" - glibcfix="no" elif [ "${engine}" == "avalanche" ]; then glibcrequired="2.13" glibcfix="yes" From 4f75192b6cc35ab3d3ae6869a39d070ff0f8955a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 10 Feb 2017 23:34:02 +0000 Subject: [PATCH 0449/1895] Added graceful stop for all unreal engine servers --- lgsm/functions/command_stop.sh | 89 ++++++++++++++++------------------ 1 file changed, 43 insertions(+), 46 deletions(-) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 0e5dc899b..6ac9c188e 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -221,7 +221,7 @@ fn_stop_graceful_mta(){ fn_stop_graceful_select(){ if [ "${gamename}" == "7 Days To Die" ]; then fn_stop_graceful_sdtd - elif [ "${gamename}" == "Factorio" ]; then + elif [ "${gamename}" == "Factorio" ]||[ "${engine}" == "unreal4" ]||[ "${engine}" == "unreal3" ]||[ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ]; then fn_stop_graceful_ctrlc elif [ "${engine}" == "source" ]; then fn_stop_graceful_source @@ -231,53 +231,51 @@ fn_stop_graceful_select(){ fn_stop_graceful_minecraft elif [ "${engine}" == "renderware" ]; then fn_stop_graceful_mta - elif [ "${engine}" == "unreal4" ]; then - fn_stop_graceful_ctrlc else fn_stop_tmux fi } fn_stop_ark(){ - maxpiditer=15 # The maximum number of times to check if the ark pid has closed gracefully. - info_config.sh - if [ -z "${queryport}" ]; then - fn_print_warn "No queryport found using info_config.sh" - fn_script_log_warn "No queryport found using info_config.sh" - userconfigfile="${filesdir}" - userconfigfile+="/ShooterGame/Saved/Config/LinuxServer/GameUserSettings.ini" - queryport=$(grep ^QueryPort= ${userconfigfile} | cut -d= -f2 | sed "s/[^[:digit:].*].*//g") - fi - if [ -z "${queryport}" ]; then - fn_print_warn "No queryport found in the GameUsersettings.ini file" - fn_script_log_warn "No queryport found in the GameUsersettings.ini file" - return - fi + maxpiditer=15 # The maximum number of times to check if the ark pid has closed gracefully. + info_config.sh + if [ -z "${queryport}" ]; then + fn_print_warn "No queryport found using info_config.sh" + fn_script_log_warn "No queryport found using info_config.sh" + userconfigfile="${filesdir}" + userconfigfile+="/ShooterGame/Saved/Config/LinuxServer/GameUserSettings.ini" + queryport=$(grep ^QueryPort= ${userconfigfile} | cut -d= -f2 | sed "s/[^[:digit:].*].*//g") + fi + if [ -z "${queryport}" ]; then + fn_print_warn "No queryport found in the GameUsersettings.ini file" + fn_script_log_warn "No queryport found in the GameUsersettings.ini file" + return + fi - if [[ ${#queryport} -gt 0 ]] ; then - for (( pidcheck=0 ; pidcheck < ${maxpiditer} ; pidcheck++ )) ; do - pid=$(netstat -nap 2>/dev/null | grep ^udp[[:space:]] |\ - grep :${queryport}[[:space:]] | rev | awk '{print $1}' |\ - rev | cut -d\/ -f1) - # - # check for a valid pid - pid=${pid//[!0-9]/} - let pid+=0 # turns an empty string into a valid number, '0', - # and a valid numeric pid remains unchanged. - if [[ ${pid} -gt 1 && $pid -le $(cat /proc/sys/kernel/pid_max) ]] ; then - fn_print_dots "Process still bound. Awaiting graceful exit: ${pidcheck}" - sleep 1 - else - break # Our job is done here - fi # end if for pid range check - done - if [[ ${pidcheck} -eq ${maxpiditer} ]] ; then - # The process doesn't want to close after 20 seconds. - # kill it hard. - fn_print_error "Terminating reluctant Ark process: ${pid}" - kill -9 $pid - fi - fi # end if for port check + if [ "${#queryport}" -gt 0 ] ; then + for (( pidcheck=0 ; pidcheck < ${maxpiditer} ; pidcheck++ )) ; do + pid=$(netstat -nap 2>/dev/null | grep ^udp[[:space:]] |\ + grep :${queryport}[[:space:]] | rev | awk '{print $1}' |\ + rev | cut -d\/ -f1) + # + # check for a valid pid + pid=${pid//[!0-9]/} + let pid+=0 # turns an empty string into a valid number, '0', + # and a valid numeric pid remains unchanged. + if [ "${pid}" -gt 1 && "${pid}" -le $(cat /proc/sys/kernel/pid_max) ]; then + fn_print_dots "Process still bound. Awaiting graceful exit: ${pidcheck}" + sleep 1 + else + break # Our job is done here + fi # end if for pid range check + done + if [[ ${pidcheck} -eq ${maxpiditer} ]] ; then + # The process doesn't want to close after 20 seconds. + # kill it hard. + fn_print_error "Terminating reluctant Ark process: ${pid}" + kill -9 ${pid} + fi + fi # end if for port check } # end of fn_stop_ark fn_stop_teamspeak3(){ @@ -327,11 +325,10 @@ fn_stop_tmux(){ # Remove lockfile rm -f "${rootdir}/${lockselfname}" # ARK doesn't clean up immediately after tmux is killed. - # Make certain the ports are cleared before continuing. - if [ "${gamename}" == "ARK: Survival Evolved" ]; then - fn_stop_ark - echo -en "\n" - fi + # Make certain the ports are cleared before continuing. + if [ "${gamename}" == "ARK: Survival Evolved" ]; then + fn_stop_ark + fi fn_print_ok_nl "${servername}" fn_script_log_pass "Stopped ${servername}" else From 6677c2a5fe1713f9d9372338ff0415dce3e33099 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 10 Feb 2017 23:43:39 +0000 Subject: [PATCH 0450/1895] nl --- lgsm/functions/command_mods_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 2d85c12f6..4af7f8913 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -52,7 +52,7 @@ done # If no mods are available for a specific game if [ -z "${compatiblemodslist}" ]; then - fn_print_fail "No mods are currently available for ${gamename}." + fn_print_fail_nl "No mods are currently available for ${gamename}." fn_script_log_info "No mods are currently available for ${gamename}." core_exit.sh fi From fcd31bc8cb924580bfef3f1e7e5d347739242dec Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 10 Feb 2017 23:44:41 +0000 Subject: [PATCH 0451/1895] changed to master branch --- TowerUnite/tuserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TowerUnite/tuserver b/TowerUnite/tuserver index f4f8330b2..4921e7988 100644 --- a/TowerUnite/tuserver +++ b/TowerUnite/tuserver @@ -73,7 +73,7 @@ branch="" # from a different repo and/or branch. githubuser="GameServerManagers" githubrepo="LinuxGSM" -githubbranch="feature/tuserver" +githubbranch="master" ## LinuxGSM Server Details # Do not edit From 8384cd6ebac535e7c5c262e61ba488d2a82365bb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 10 Feb 2017 23:57:59 +0000 Subject: [PATCH 0452/1895] Removed servers that are not ready for release branches have been created for these --- BallisticOverkill/boserver | 198 ---------------------- CounterStrikeClassicOffensive/cscoserver | 205 ----------------------- lgsm/functions/install_config.sh | 6 - lgsm/functions/install_server_files.sh | 4 +- 4 files changed, 1 insertion(+), 412 deletions(-) delete mode 100755 BallisticOverkill/boserver delete mode 100755 CounterStrikeClassicOffensive/cscoserver diff --git a/BallisticOverkill/boserver b/BallisticOverkill/boserver deleted file mode 100755 index c17e02b6e..000000000 --- a/BallisticOverkill/boserver +++ /dev/null @@ -1,198 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Ballistic Overkill | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170128" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Optional: Game Server Login Token -# GSLT can be used for running a public server. -# More info: https://gameservermanagers.com/gslt -gslt="" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms=" -batchmode -nographics -logFile output.txt" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## SteamCMD Settings -# Server appid -appid="416880" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## LinuxGSM Server Details -# Do not edit -gamename="Ballistic Overkill" -engine="unity" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="bo-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./BODS.x86" -servercfg="config.txt" -servercfgdefault="${servercfg}" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directorie -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/CounterStrikeClassicOffensive/cscoserver b/CounterStrikeClassicOffensive/cscoserver deleted file mode 100755 index 09a247588..000000000 --- a/CounterStrikeClassicOffensive/cscoserver +++ /dev/null @@ -1,205 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Counter-Strike: Classic Offensive | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170128" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="de_dust2_csco" -maxplayers="16" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Required: Game Server Login Token -# GSLT is required for running a public server. -# More info: https://gameservermanagers.com/gslt -gslt="" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game csco -usercon -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers_override ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="740" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Counter-Strike: Classic Offensive" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="csco-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/csco" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 8a71bcc22..67290b9ec 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -210,12 +210,6 @@ elif [ "${gamename}" == "Counter-Strike 1.6" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars -elif [ "${gamename}" == "Counter-Strike: Classic Offensive" ]; then - gamedirname="CounterStrikeClassicOffensive" - array_configs+=( server.cfg ) - fn_fetch_default_config - fn_default_config_remote - fn_set_config_vars elif [ "${gamename}" == "Counter-Strike: Condition Zero" ]; then gamedirname="CounterStrikeConditionZero" array_configs+=( server.cfg ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 9b099edd4..a988f2644 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -21,8 +21,6 @@ fn_install_server_files(){ fileurl="http://files.gameservermanagers.com/CallOfDuty4/cod4x18_dedrun.tar.bz2"; filedir="${tmpdir}"; filename="cod4x18_dedrun.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="bebdfc1755626462bdaad49f6f926c08" elif [ "${gamename}" == "Call of Duty: World at War" ]; then fileurl="http://files.gameservermanagers.com/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.bz2"; filedir="${tmpdir}"; filename="codwaw-lnxded-1.7-full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="0489697ff3bf678c109bfb377d1b7895" - elif [ "${gamename}" == "Counter-Strike: Classic Offensive" ]; then - fileurl="https://s3.amazonaws.com/linuxgsm/ClassicOffensive_Beta1.1d.zip"; filedir="${tmpdir}"; filename="ClassicOffensive_Beta1.1d.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="922ff1abe08ba12309b19900f1cbd33a" elif [ "${gamename}" == "GoldenEye: Source" ]; then fileurl="http://files.gameservermanagers.com/GoldenEyeSource/GoldenEye_Source_v5.0.1_full_server_linux.tar.bz2"; filedir="${tmpdir}"; filename="GoldenEye_Source_v5.0.1_server_full_Linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="ea227a150300abe346e757380325f84c" elif [ "${gamename}" == "Quake 2" ]; then @@ -136,7 +134,7 @@ elif [ "${gamename}" == "Multi Theft Auto" ]; then elif [ "${gamename}" == "Factorio" ]; then update_factorio.sh install_factorio_save.sh -elif [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]||[ "${gamename}" == "Counter-Strike: Classic Offensive" ]; then +elif [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]; then if [ "${gamename}" == "Unreal Tournament" ]; then install_unreal_tournament_eula.sh fi From 459e7c0b171f2952c744d8955416110ee827db96 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 12 Feb 2017 18:58:42 +0000 Subject: [PATCH 0453/1895] Added Ark system requirements --- lgsm/functions/check_system_requirements.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_system_requirements.sh b/lgsm/functions/check_system_requirements.sh index 3040a8406..92766785f 100644 --- a/lgsm/functions/check_system_requirements.sh +++ b/lgsm/functions/check_system_requirements.sh @@ -11,12 +11,16 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" info_distro.sh # RAM requirements in megabytes for each game or engine. -if [ "${gamename}" == "Rust" ]; then + +if [ "${gamename}" == "ARK: Survival Evolved" ]; then ramrequirementmb="4000" - ramrequirementgb="4" + ramrequirementgb="1" elif [ "${gamename}" == "ARMA 3" ]; then ramrequirementmb="1000" ramrequirementgb="1" +elif [ "${gamename}" == "Rust" ]; then + ramrequirementmb="4000" + ramrequirementgb="4" elif [ "${gamename}" == "Minecraft" ]; then ramrequirementmb="1000" ramrequirementgb="1" From 37305e449e38d38f29e33af9a51030315e440e93 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 12 Feb 2017 19:59:40 +0000 Subject: [PATCH 0454/1895] New Release 170212 --- 7DaysToDie/sdtdserver | 2 +- ARKSurvivalEvolved/arkserver | 2 +- Arma3/arma3server | 2 +- Battlefield1942/bf1942server | 2 +- BlackMesa/bmdmserver | 2 +- BladeSymphony/bsserver | 2 +- BrainBread2/bb2server | 2 +- CallOfDuty/codserver | 2 +- CallOfDuty2/cod2server | 2 +- CallOfDuty4/cod4server | 2 +- CallOfDutyUnitedOffensive/coduoserver | 2 +- CallOfDutyWorldAtWar/codwawserver | 2 +- CodenameCURE/ccserver | 2 +- CounterStrike/csserver | 2 +- CounterStrikeConditionZero/csczserver | 2 +- CounterStrikeGlobalOffensive/csgoserver | 2 +- CounterStrikeSource/cssserver | 2 +- DayOfDefeat/dodserver | 2 +- DayOfDefeatSource/dodsserver | 2 +- DayOfInfamy/doiserver | 2 +- DeathmatchClassic/dmcserver | 2 +- DontStarveTogether/dstserver | 2 +- DoubleActionBoogaloo/dabserver | 2 +- EmpiresMod/emserver | 2 +- Factorio/fctrserver | 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 +- Minecraft/mcserver | 2 +- MultiTheftAuto/mtaserver | 2 +- Mumble/mumbleserver | 2 +- NS2Combat/ns2cserver | 2 +- NaturalSelection2/ns2server | 2 +- NoMoreRoomInHell/nmrihserver | 2 +- OpposingForce/opforserver | 2 +- PiratesVikingandKnightsII/pvkiiserver | 2 +- ProjectZomboid/pzserver | 2 +- Quake2/q2server | 2 +- Quake3/q3server | 2 +- QuakeLive/qlserver | 2 +- QuakeWorld/qwserver | 2 +- RedOrchestra/roserver | 2 +- Ricochet/ricochetserver | 2 +- Rust/rustserver | 2 +- SeriousSam3BFE/ss3sserver | 2 +- Starbound/sbserver | 2 +- SvenCoop/svenserver | 2 +- TeamFortress2/tf2server | 2 +- TeamFortressClassic/tfcserver | 2 +- TeamSpeak3/ts3server | 2 +- Teeworlds/twserver | 2 +- Terraria/terrariaserver | 2 +- TowerUnite/tuserver | 2 +- UnrealTournament/utserver | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament3/ut3server | 2 +- UnrealTournament99/ut99server | 2 +- WolfensteinEnemyTerritory/wetserver | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_ts3server.sh | 2 +- 69 files changed, 69 insertions(+), 69 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index 518628004..0ab687af9 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index cd8a603d3..d47590b77 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Arma3/arma3server b/Arma3/arma3server index f6c03be06..74b5532b6 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Battlefield1942/bf1942server b/Battlefield1942/bf1942server index ae7447aa9..7e21c0fbc 100644 --- a/Battlefield1942/bf1942server +++ b/Battlefield1942/bf1942server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index 6baa4e739..05d93a735 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index 1e5ad15cc..6a486a16e 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index 8668fffce..72700d7e3 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/CallOfDuty/codserver b/CallOfDuty/codserver index b13aa8ed2..c9fd27ae1 100755 --- a/CallOfDuty/codserver +++ b/CallOfDuty/codserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/CallOfDuty2/cod2server b/CallOfDuty2/cod2server index 2939c036e..61eac16a7 100755 --- a/CallOfDuty2/cod2server +++ b/CallOfDuty2/cod2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server index 661077042..4c9e3c48a 100644 --- a/CallOfDuty4/cod4server +++ b/CallOfDuty4/cod4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/CallOfDutyUnitedOffensive/coduoserver b/CallOfDutyUnitedOffensive/coduoserver index 172af806c..1006c9aaf 100755 --- a/CallOfDutyUnitedOffensive/coduoserver +++ b/CallOfDutyUnitedOffensive/coduoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/CallOfDutyWorldAtWar/codwawserver b/CallOfDutyWorldAtWar/codwawserver index 43b5c7a42..1af43280e 100755 --- a/CallOfDutyWorldAtWar/codwawserver +++ b/CallOfDutyWorldAtWar/codwawserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 30bb0a0b2..aa7233712 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/CounterStrike/csserver b/CounterStrike/csserver index e6de0dc7e..72eb9bb2a 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index ba70f15f3..ff72163e8 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 347983ebb..c630e9888 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index be253b1d8..2a8a0b805 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index 83929712f..cae5ce0e1 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 60dfa9f66..4fcca9610 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/DayOfInfamy/doiserver b/DayOfInfamy/doiserver index acf036430..0ea17b569 100644 --- a/DayOfInfamy/doiserver +++ b/DayOfInfamy/doiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index fbd3ee106..17e96aa9c 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index 972009a08..ec0e5a12b 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 04ab7fdda..d803cacfa 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/EmpiresMod/emserver b/EmpiresMod/emserver index e628f4c42..9f9771d57 100644 --- a/EmpiresMod/emserver +++ b/EmpiresMod/emserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Factorio/fctrserver b/Factorio/fctrserver index f6b29d916..f92db7e47 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index 9039576f5..ee2ec15c0 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index 4a790b467..d48af2545 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index 228d54523..20c639879 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index 53cc2f4ab..adb1e18e2 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index b008887a9..4c007e738 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index 22ab2c5d1..68c4b1904 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index 24b43ca40..273062307 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Insurgency/insserver b/Insurgency/insserver index d6f7a8841..5778bf628 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/JustCause2/jc2server b/JustCause2/jc2server index 0f4ef2dba..077595ecf 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index de04e2db9..5e32707a1 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index 915efab6f..d9a755c65 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index 8d9e428fa..ac3fa7edf 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Minecraft/mcserver b/Minecraft/mcserver index 39db226d1..9ebf44f4a 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver index 1fc07fdbb..1132e0cc9 100644 --- a/MultiTheftAuto/mtaserver +++ b/MultiTheftAuto/mtaserver @@ -12,7 +12,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170103" +version="170212" ########################## ######## Settings ######## diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index e19c936cd..b27f06ba5 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index 41949f3c6..b7014072f 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index 272f68fef..6f6b0cfd2 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index 0c44dd2ff..92f39d795 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index 32a668f53..17ce539fb 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index 7442c678a..e909137d3 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index 31cc52efa..3339ac2d6 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Quake2/q2server b/Quake2/q2server index e86933c26..9ebc1163e 100644 --- a/Quake2/q2server +++ b/Quake2/q2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Quake3/q3server b/Quake3/q3server index aca7dfcde..b959e7a20 100644 --- a/Quake3/q3server +++ b/Quake3/q3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index 7433273d9..ac5f4ab39 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/QuakeWorld/qwserver b/QuakeWorld/qwserver index 800ada9cd..081c5a81a 100644 --- a/QuakeWorld/qwserver +++ b/QuakeWorld/qwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index 19d4b65cf..f7b883560 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index e1486d67f..2cfc3b93f 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Rust/rustserver b/Rust/rustserver index 8d4ded872..9557f914d 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index 029db5b59..8c1b31ebd 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Starbound/sbserver b/Starbound/sbserver index 38f48c97e..c0d59f47e 100644 --- a/Starbound/sbserver +++ b/Starbound/sbserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/SvenCoop/svenserver b/SvenCoop/svenserver index b401e72ea..b320e8812 100644 --- a/SvenCoop/svenserver +++ b/SvenCoop/svenserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index e9982d1f8..313a63c3a 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index 501ef64a4..ed3d30662 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index 6df71f193..e28b52d2e 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Teeworlds/twserver b/Teeworlds/twserver index e038f175f..60d8dc5fc 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index 1f803e45b..5c5b7839c 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/TowerUnite/tuserver b/TowerUnite/tuserver index 4921e7988..5483eed93 100644 --- a/TowerUnite/tuserver +++ b/TowerUnite/tuserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/UnrealTournament/utserver b/UnrealTournament/utserver index 6e3afdf5b..037948bfe 100644 --- a/UnrealTournament/utserver +++ b/UnrealTournament/utserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index 1cbfd4c59..ae270fbb7 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/UnrealTournament3/ut3server b/UnrealTournament3/ut3server index 5dfe1207d..f03d2c9a4 100644 --- a/UnrealTournament3/ut3server +++ b/UnrealTournament3/ut3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index 237c1531a..4891a9cba 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/WolfensteinEnemyTerritory/wetserver b/WolfensteinEnemyTerritory/wetserver index bfc0cbd16..29d4f889c 100644 --- a/WolfensteinEnemyTerritory/wetserver +++ b/WolfensteinEnemyTerritory/wetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 8fbb910a1..e74fdb6c9 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -17,7 +17,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 8e0e54c2e..8a573e048 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170128" +version="170212" ########################## ######## Settings ######## From a05358dd0688e27ab3be34766c1d4e1cc262a7c9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 15 Feb 2017 21:25:56 +0000 Subject: [PATCH 0455/1895] optimsed availablebuild var no longer has so many | --- lgsm/functions/update_steamcmd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 167daf5fb..6d2b6780a 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -156,7 +156,7 @@ fn_update_steamcmd_check(){ fi # Gets availablebuild info - 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+\"${branchname}\"$" | grep -m 1 -EB 10 "^\s+}$" | grep -E "^\s+\"buildid\"\s+" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\ -f3) + availablebuild=$(./steamcmd.sh +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +app_info_print "${appid}" +quit | sed -n '/branch/,$p' | grep -m 1 buildid | tr -cd '[:digit:]') if [ -z "${availablebuild}" ]; then fn_print_fail "Checking for update: SteamCMD" sleep 1 From 89c4352c1bd549c35680fee71c803efde61fd7ea Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 00:55:34 +0000 Subject: [PATCH 0456/1895] Added Ballistic Overkill --- lgsm/functions/info_glibc.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 12ba262a4..5b821054d 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -6,7 +6,13 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -if [ "${gamename}" == "Black Mesa: Deathmatch" ]; then +if [ "${gamename}" == "ARK: Survival Evolved" ]; then + glibcrequired="2.15" + glibcfix="no" +elif [ "${gamename}" == "Ballistic Overkill" ]; then + glibcrequired="2.15" + glibcfix="yes" +elif [ "${gamename}" == "Black Mesa: Deathmatch" ]; then glibcrequired="2.15" glibcfix="yes" elif [ "${gamename}" == "Blade Symphony" ]; then @@ -68,6 +74,9 @@ elif [ "${gamename}" == "Quake 3: Arena" ]; then elif [ "${gamename}" == "Quake Live" ]; then glibcrequired="2.15" glibcfix="no" +elif [ "${gamename}" == "Sven Co-op" ]; then + glibcrequired="2.18" + glibcfix="no" elif [ "${gamename}" == "TeamSpeak 3" ]; then glibcrequired="NOT REQUIRED" glibcfix="no" From ef056b3d35b525e6e04f47ad68324e02667d2053 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 02:02:12 +0000 Subject: [PATCH 0457/1895] ballistic overkill config --- lgsm/functions/info_config.sh | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 0164999a3..90c144d80 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -554,6 +554,36 @@ fn_info_config_unreal(){ fi } +fn_info_config_ballistic_overkill(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + port="${zero}" + queryport="${zero}" + maxplayers="${unavailable}" + gamemode="${unavailable}" + gameworld="${unavailable}" + else + servername=$(grep "ServerName" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + serverpassword=$(grep "ServerPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + port=$(grep "ServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport=$((port + 1)) + + maxplayers=$(grep "ServerMaxPlayerCount" "${servercfgfullpath}" | tr -cd '[:digit:]') + gamemode=$(grep "GameMode" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + gameworld=$(grep "GameWorld" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + port=${port:-"0"} + queryport=${queryport:-"0"} + maxplayers=${maxplayers:-"NOT SET"} + gamemode=${gamemode:-"NOT SET"} + gameworld=${gameworld:-"NOT SET"} + fi +} + fn_info_config_sdtd(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -646,6 +676,9 @@ if [ "${engine}" == "avalanche" ]; then # ARK: Survival Evolved elif [ "${gamename}" == "ARK: Survivial Evolved" ]; then fn_info_config_ark +# Ballistic Overkill +elif [ "${gamename}" == "Ballistic Overkill" ]; then + fn_info_config_ballistic_overkill # Battlefield: 1942 elif [ "${gamename}" == "Battlefield: 1942" ]; then fn_info_config_bf1942 @@ -664,7 +697,7 @@ elif [ "${gamename}" == "Call of Duty: World at War" ]; then # Dont Starve Together elif [ "${engine}" == "dontstarve" ]; then fn_info_config_dontstarve -# Factorio +# Factorio elif [ "${gamename}" == "Factorio" ]; then fn_info_config_factorio # Quake 2 From 7450c599d7d245fdafbe7055a9c7ae5c54e55112 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 18:52:17 +0000 Subject: [PATCH 0458/1895] nl --- lgsm/functions/command_mods_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 2d85c12f6..4af7f8913 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -52,7 +52,7 @@ done # If no mods are available for a specific game if [ -z "${compatiblemodslist}" ]; then - fn_print_fail "No mods are currently available for ${gamename}." + fn_print_fail_nl "No mods are currently available for ${gamename}." fn_script_log_info "No mods are currently available for ${gamename}." core_exit.sh fi From 688809a92d47441c4ea0588d8b977a935da7992b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 20:04:22 +0000 Subject: [PATCH 0459/1895] Improvements to boserver --- lgsm/functions/info_config.sh | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 90c144d80..9bc0b7e80 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -562,17 +562,14 @@ fn_info_config_ballistic_overkill(){ queryport="${zero}" maxplayers="${unavailable}" gamemode="${unavailable}" - gameworld="${unavailable}" else - servername=$(grep "ServerName" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - serverpassword=$(grep "ServerPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") + servername=$(grep "ServerName" "${servercfgfullpath}" | sed 's/^.*ServerName="//' | cut -f1 -d"\"") + serverpassword=$(grep "Password" "${servercfgfullpath}" | sed 's/^.*Password="//' | cut -f1 -d"\"") port=$(grep "ServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]') queryport=$((port + 1)) maxplayers=$(grep "ServerMaxPlayerCount" "${servercfgfullpath}" | tr -cd '[:digit:]') - gamemode=$(grep "GameMode" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - gameworld=$(grep "GameWorld" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"") - + gamemode=$(grep "GameMode" "${servercfgfullpath}" | sed 's/^.*GameMode="//' | cut -f1 -d"\"") # Not Set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} @@ -580,7 +577,6 @@ fn_info_config_ballistic_overkill(){ queryport=${queryport:-"0"} maxplayers=${maxplayers:-"NOT SET"} gamemode=${gamemode:-"NOT SET"} - gameworld=${gameworld:-"NOT SET"} fi } From 0513f60794499ccc359b0d6981330db4e008805b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 20:09:06 +0000 Subject: [PATCH 0460/1895] filter # --- lgsm/functions/info_config.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 9bc0b7e80..1ba5752c1 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -563,13 +563,13 @@ fn_info_config_ballistic_overkill(){ maxplayers="${unavailable}" gamemode="${unavailable}" else - servername=$(grep "ServerName" "${servercfgfullpath}" | sed 's/^.*ServerName="//' | cut -f1 -d"\"") - serverpassword=$(grep "Password" "${servercfgfullpath}" | sed 's/^.*Password="//' | cut -f1 -d"\"") + servername=$(grep "ServerName" "${servercfgfullpath}" | sed 's/^.*ServerName="//' -e '/^#/d' | cut -f1 -d"\"") + serverpassword=$(grep "Password" "${servercfgfullpath}" | sed 's/^.*Password="//' -e '/^#/d' | cut -f1 -d"\"") port=$(grep "ServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]') queryport=$((port + 1)) maxplayers=$(grep "ServerMaxPlayerCount" "${servercfgfullpath}" | tr -cd '[:digit:]') - gamemode=$(grep "GameMode" "${servercfgfullpath}" | sed 's/^.*GameMode="//' | cut -f1 -d"\"") + gamemode=$(grep "GameMode" "${servercfgfullpath}" | sed 's/^.*GameMode="//' -e '/^#/d' | cut -f1 -d"\"") # Not Set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} From 57b319d29eb61aeaf163b5c302978e12b949bcea Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 20:17:49 +0000 Subject: [PATCH 0461/1895] boserver fixes --- lgsm/functions/info_config.sh | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 1ba5752c1..9384f5aa1 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -561,22 +561,19 @@ fn_info_config_ballistic_overkill(){ port="${zero}" queryport="${zero}" maxplayers="${unavailable}" - gamemode="${unavailable}" else - servername=$(grep "ServerName" "${servercfgfullpath}" | sed 's/^.*ServerName="//' -e '/^#/d' | cut -f1 -d"\"") - serverpassword=$(grep "Password" "${servercfgfullpath}" | sed 's/^.*Password="//' -e '/^#/d' | cut -f1 -d"\"") - port=$(grep "ServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]') + servername=$(grep "ServerName=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "Password=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + port=$(grep "ServerPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') queryport=$((port + 1)) + maxplayers=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]') - maxplayers=$(grep "ServerMaxPlayerCount" "${servercfgfullpath}" | tr -cd '[:digit:]') - gamemode=$(grep "GameMode" "${servercfgfullpath}" | sed 's/^.*GameMode="//' -e '/^#/d' | cut -f1 -d"\"") # Not Set servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} port=${port:-"0"} queryport=${queryport:-"0"} maxplayers=${maxplayers:-"NOT SET"} - gamemode=${gamemode:-"NOT SET"} fi } From a8ad9d5c74f0cba8eccf38ad7f244e661ae3285c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 20:24:48 +0000 Subject: [PATCH 0462/1895] amended config name --- BallisticOverkill/boserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BallisticOverkill/boserver b/BallisticOverkill/boserver index c17e02b6e..7061a4e74 100755 --- a/BallisticOverkill/boserver +++ b/BallisticOverkill/boserver @@ -100,7 +100,7 @@ filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}" executable="./BODS.x86" -servercfg="config.txt" +servercfg="${servicename}.txt" servercfgdefault="${servercfg}" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" From f1bb0dca1c98aac3064f67713cd4c0ec245a5346 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 20:24:58 +0000 Subject: [PATCH 0463/1895] Added Ballistic Overkill config --- lgsm/functions/install_config.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 44a251d3a..210897fb8 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -144,6 +144,12 @@ elif [ "${gamename}" == "ARMA 3" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Ballistic Overkill" ]; then + gamedirname="BladeSymphony" + array_configs+=( config.txt ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Battlefield: 1942" ]; then gamedirname="Battlefield1942" array_configs+=( serversettings.con ) From 7a74ec1e7a469530e7da7c15f41276674f08e1a5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 20:29:37 +0000 Subject: [PATCH 0464/1895] corrected gamedirname for bo --- lgsm/functions/install_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 210897fb8..ca56c2127 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -145,7 +145,7 @@ elif [ "${gamename}" == "ARMA 3" ]; then fn_default_config_remote fn_set_config_vars elif [ "${gamename}" == "Ballistic Overkill" ]; then - gamedirname="BladeSymphony" + gamedirname="BallisticOverkill" array_configs+=( config.txt ) fn_fetch_default_config fn_default_config_remote From e80b46bd16ff57a0f22af7921872b80d3bb92147 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 20:48:28 +0000 Subject: [PATCH 0465/1895] removed . --- lgsm/functions/check_steamcmd.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 25b73a70b..0908cdcfa 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -18,17 +18,17 @@ fn_install_steamcmd(){ fn_check_steamcmd_user(){ # Checks if steamuser is setup. if [ "${steamuser}" == "username" ]; then - fn_print_fail_nl "Steam login not set. Update steamuser in ${selfname}." + fn_print_fail_nl "Steam login not set. Update steamuser in ${selfname}" echo " * Change steamuser=\"username\" to a valid steam login." if [ -d "${scriptlogdir}" ]; then - fn_script_log_fatal "Steam login not set. Update steamuser in ${selfname}." + fn_script_log_fatal "Steam login not set. Update steamuser in ${selfname}" fi core_exit.sh fi # Anonymous user is set if steamuser is missing if [ -z "${steamuser}" ]; then if [ -d "${scriptlogdir}" ]; then - fn_script_log_info "Using anonymous Steam login." + fn_script_log_info "Using anonymous Steam login" fi steamuser="anonymous" steampass='' From 798d5c196427469acc2ca2d6f18a3de3c4a2b388 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 21:07:58 +0000 Subject: [PATCH 0466/1895] corrected defaultservercfg --- BallisticOverkill/boserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BallisticOverkill/boserver b/BallisticOverkill/boserver index 7061a4e74..28c39c1d6 100755 --- a/BallisticOverkill/boserver +++ b/BallisticOverkill/boserver @@ -101,7 +101,7 @@ systemdir="${filesdir}" executabledir="${filesdir}" executable="./BODS.x86" servercfg="${servicename}.txt" -servercfgdefault="${servercfg}" +servercfgdefault="config.txt" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" From 59d4310ea803ce2967bc3bc586a5a6935a1dd3eb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 21:20:22 +0000 Subject: [PATCH 0467/1895] added ballistic overkill --- lgsm/functions/command_details.sh | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index e34f65702..f37f96458 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -355,7 +355,7 @@ fn_details_ark(){ echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" echo -e "> Game\tINBOUND\t${port}\tudp" # Don't do arithmetics if ever the port wasn't a numeric value - if [ "${port}" -eq "${port}" ]; then + if [ "${port}" -eq "${port}" ]; then echo -e "> RAW\tINBOUND\t$((port+1))\tudp" fi echo -e "> Query\tINBOUND\t${queryport}\tudp" @@ -363,6 +363,16 @@ fn_details_ark(){ } | column -s $'\t' -t } +fn_details_ballisticoverkill(){ + echo -e "netstat -atunp | grep BODS.x86" + 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_avalanche(){ echo -e "netstat -atunp | grep Jcmp-Server" echo -e "" @@ -539,7 +549,7 @@ fn_details_realvirtuality(){ echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" echo -e "> Game\tINBOUND\t${port}\tudp" # Don't do arithmetics if ever the port wasn't a numeric value - if [ "${port}" -eq "${port}" ]; then + if [ "${port}" -eq "${port}" ]; then echo -e "> Steam: Query\tINBOUND\t$((port+1))\tudp" echo -e "> Steam: Master traffic\tINBOUND\t$((port+2))\tudp" echo -e "> Undocumented Port\tINBOUND\t$((port+3))\tudp" @@ -800,6 +810,8 @@ fn_display_details() { fn_details_sdtd elif [ "${gamename}" == "ARK: Survival Evolved" ]; then fn_details_ark + elif [ "${gamename}" == "Ballistic Overkill" ]; then + fn_details_ballisticoverkill elif [ "${gamename}" == "Call of Duty" ]; then fn_details_cod elif [ "${gamename}" == "Call of Duty: United Offensive" ]; then @@ -811,7 +823,7 @@ fn_display_details() { elif [ "${gamename}" == "Call of Duty: World at War" ]; then fn_details_codwaw elif [ "${gamename}" == "Factorio" ]; then - fn_details_factorio + fn_details_factorio elif [ "${gamename}" == "Hurtworld" ]; then fn_details_hurtworld elif [ "${gamename}" == "QuakeWorld" ]; then @@ -825,7 +837,7 @@ fn_display_details() { elif [ "${gamename}" == "TeamSpeak 3" ]; then fn_details_teamspeak3 elif [ "${gamename}" == "Multi Theft Auto" ]; then - fn_details_mta + fn_details_mta elif [ "${gamename}" == "Mumble" ]; then fn_details_mumble elif [ "${gamename}" == "Rust" ]; then From 8ada4c4bf4b61ea13a5f25a8336f4afe921753c1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 21:22:02 +0000 Subject: [PATCH 0468/1895] added ballistic overkill --- 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 f37f96458..99ed92b10 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -315,7 +315,7 @@ fn_details_ports(){ parmslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file - local ports_edit_array=( "avalanche" "dontstarve" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" ) + local ports_edit_array=( "avalanche" "Ballistic Overkill" "dontstarve" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" ) for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then From 11696acf5af0275847ed51f03f599ce9063b03ea Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 22:13:22 +0000 Subject: [PATCH 0469/1895] Renamed LGSM to LinuxGSM For consistant branding. --- CONTRIBUTING.md | 8 ++++---- Hurtworld/hwserver | 2 +- images/logo/README.md | 2 +- lgsm/functions/alert.sh | 12 ++++++------ 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 | 8 ++++---- lgsm/functions/check_executable.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 | 4 ++-- lgsm/functions/check_steamcmd.sh | 2 +- lgsm/functions/check_system_dir.sh | 2 +- lgsm/functions/check_system_requirements.sh | 2 +- lgsm/functions/check_tmuxception.sh | 6 +++--- lgsm/functions/command_backup.sh | 2 +- lgsm/functions/command_console.sh | 2 +- lgsm/functions/command_debug.sh | 2 +- lgsm/functions/command_details.sh | 8 ++++---- lgsm/functions/command_dev_debug.sh | 2 +- lgsm/functions/command_dev_detect_deps.sh | 2 +- lgsm/functions/command_fastdl.sh | 2 +- lgsm/functions/command_install.sh | 2 +- lgsm/functions/command_install_resources_mta.sh | 2 +- lgsm/functions/command_mods_install.sh | 2 +- lgsm/functions/command_mods_remove.sh | 2 +- lgsm/functions/command_mods_update.sh | 2 +- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/command_postdetails.sh | 2 +- lgsm/functions/command_restart.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.sh | 2 +- lgsm/functions/command_update_functions.sh | 6 +++--- lgsm/functions/command_validate.sh | 2 +- lgsm/functions/command_wipe.sh | 4 ++-- lgsm/functions/compress_unreal2_maps.sh | 2 +- lgsm/functions/compress_ut99_maps.sh | 2 +- lgsm/functions/core_dl.sh | 4 ++-- lgsm/functions/core_exit.sh | 4 ++-- lgsm/functions/core_functions.sh | 2 +- lgsm/functions/core_getopt.sh | 2 +- lgsm/functions/core_messages.sh | 2 +- lgsm/functions/core_trap.sh | 2 +- lgsm/functions/fix.sh | 2 +- lgsm/functions/fix_arma3.sh | 2 +- lgsm/functions/fix_coduo.sh | 2 +- lgsm/functions/fix_csgo.sh | 2 +- lgsm/functions/fix_dst.sh | 2 +- lgsm/functions/fix_ges.sh | 2 +- lgsm/functions/fix_glibc.sh | 2 +- lgsm/functions/fix_ins.sh | 2 +- lgsm/functions/fix_kf.sh | 2 +- lgsm/functions/fix_mta.sh | 2 +- lgsm/functions/fix_ro.sh | 2 +- lgsm/functions/fix_rust.sh | 2 +- lgsm/functions/fix_steamcmd.sh | 2 +- lgsm/functions/fix_ut.sh | 2 +- lgsm/functions/fix_ut2k4.sh | 2 +- lgsm/functions/fn_functions | 2 +- lgsm/functions/fn_getopt | 2 +- lgsm/functions/fn_update_functions | 2 +- lgsm/functions/info_config.sh | 4 ++-- lgsm/functions/info_distro.sh | 8 ++++---- 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_dst_token.sh | 4 ++-- lgsm/functions/install_factorio_save.sh | 2 +- lgsm/functions/install_gslt.sh | 2 +- lgsm/functions/install_header.sh | 2 +- lgsm/functions/install_logs.sh | 2 +- lgsm/functions/install_minecraft_eula.sh | 2 +- lgsm/functions/install_mta_resources.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_ts3db.sh | 2 +- lgsm/functions/install_unreal_tournament_eula.sh | 2 +- lgsm/functions/install_ut2k4_key.sh | 2 +- lgsm/functions/logs.sh | 2 +- lgsm/functions/mods_core.sh | 2 +- lgsm/functions/mods_list.sh | 6 +++--- lgsm/functions/monitor_gsquery.sh | 2 +- lgsm/functions/update_factorio.sh | 2 +- lgsm/functions/update_minecraft.sh | 2 +- lgsm/functions/update_mta.sh | 2 +- lgsm/functions/update_mumble.sh | 2 +- lgsm/functions/update_steamcmd.sh | 2 +- lgsm/functions/update_ts3.sh | 2 +- 99 files changed, 128 insertions(+), 128 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a90acec99..fbbbb0430 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,11 +9,11 @@ Before working on a project we recommend that you create a issue in regards to t Here are some important resources: * [Issues Page](https://github.com/GameServerManagers/LinuxGSM/issues) provides a list of areas that could use some work, - * [Developing LGSM](https://github.com/GameServerManagers/LinuxGSM/wiki/Developing-LGSM) gives a detailed guide on developing LGSM, - * [LGSM Exit Codes](https://github.com/GameServerManagers/LinuxGSM/wiki/LGSM-Exit-Codes) describes and gives an explanation for exit codes, + * [Developing LinuxGSM](https://github.com/GameServerManagers/LinuxGSM/wiki/Developing-LGSM) gives a detailed guide on developing LGSM, + * [LinuxGSM Exit Codes](https://github.com/GameServerManagers/LinuxGSM/wiki/LGSM-Exit-Codes) describes and gives an explanation for exit codes, * [gsquery](https://github.com/GameServerManagers/LinuxGSM/wiki/gsquery.py) describes the uses of the gsquery.py file, and * [Branching](https://github.com/GameServerManagers/LinuxGSM/wiki/Branching) is our final guide to submitting changes. - + ## Testing Please make sure all the code you write is working properly **before** you create a pull request. Information on debugging can be found in the following document: @@ -27,7 +27,7 @@ Please send a [GitHub Pull Request to LinuxGSM](https://github.com/GameServerMan Always write a clear log message for your commits. One-line messages are fine for small changes, but bigger changes should look like this: $ git commit -m "A brief summary of the commit - > + > > A paragraph describing what changed and its impact." This will help us in understanding your code and determining where problems may arise. diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index 273062307..2e1f7e45f 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -23,7 +23,7 @@ version="170212" #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -servername="Hurtworld LGSM Server" +servername="Hurtworld LinuxGSM Server" ip="0.0.0.0" port="12871" queryport="12881" diff --git a/images/logo/README.md b/images/logo/README.md index ef9c9c3f7..4c3b9e790 100644 --- a/images/logo/README.md +++ b/images/logo/README.md @@ -1,3 +1,3 @@ -# LGSM - Official Logos +# LinuxGSM - Official Logos For Reference the original design can be found here. http://twolofbees.com/artwork.php?iid=870 \ No newline at end of file diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index 9cef86e95..fb914a42f 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM alert.sh function +# LinuxGSM alert.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Overall function for managing alerts. @@ -9,25 +9,25 @@ local commandaction="Alert" fn_alert_test(){ fn_script_log_info "Sending test alert" - alertsubject="LGSM - Test Alert - ${servername}" - alertbody="LGSM test alert, how you read?" + alertsubject="LinuxGSM - Test Alert - ${servername}" + alertbody="LinuxGSM test alert, how you read?" } fn_alert_restart(){ fn_script_log_info "Sending restart alert: ${executable} process not running" - alertsubject="LGSM - Restarted - ${servername}" + alertsubject="LinuxGSM - Restarted - ${servername}" alertbody="${servicename} ${executable} process not running" } fn_alert_restart_query(){ fn_script_log_info "Sending restart alert: ${gsquerycmd}" - alertsubject="LGSM - Restarted - ${servername}" + alertsubject="LinuxGSM - Restarted - ${servername}" alertbody="gsquery.py failed to query: ${gsquerycmd}" } fn_alert_update(){ fn_script_log_info "Sending update alert" - alertsubject="LGSM - Updated - ${servername}" + alertsubject="LinuxGSM - Updated - ${servername}" alertbody="${servicename} received update" } diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index 6b440070c..a49dda347 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM alert_email.sh function +# LinuxGSM alert_email.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Sends email alert including server details and logs. diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh index aecf3d875..05276b010 100644 --- a/lgsm/functions/alert_pushbullet.sh +++ b/lgsm/functions/alert_pushbullet.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM alert_pushbullet.sh function +# LinuxGSM alert_pushbullet.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Sends Pushbullet alert including the server status. diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index b48edf27c..6d6c53101 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check.sh function +# LinuxGSM check.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Overall function for managing checks. diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh index 72ea95c5c..7b1ff92cf 100644 --- a/lgsm/functions/check_config.sh +++ b/lgsm/functions/check_config.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_config.sh function +# LinuxGSM check_config.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Checks if the server config is missing and warns the user if needed. diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index ea16e4b19..a159f858c 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -1,8 +1,8 @@ #!/bin/bash -# LGSM check_deps.sh function +# LinuxGSM check_deps.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -# Description: Checks if required dependencies are installed for LGSM. +# Description: Checks if required dependencies are installed for LinuxGSM. local commandname="CHECK" @@ -144,7 +144,7 @@ if [ -n "$(command -v dpkg-query)" ]; then # Generate array of missing deps array_deps_missing=() - # LGSM requirements + # LinuxGSM requirements array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python bzip2 gzip unzip ) # All servers except ts3 require tmux @@ -223,7 +223,7 @@ elif [ -n "$(command -v yum)" ]; then # Generate array of missing deps array_deps_missing=() - # LGSM requirements + # LinuxGSM requirements if [ "${distroversion}" == "6" ]; then array_deps_required=( curl wget util-linux-ng python file gzip bzip2 unzip ) else diff --git a/lgsm/functions/check_executable.sh b/lgsm/functions/check_executable.sh index 94e517cb5..14ccdb060 100644 --- a/lgsm/functions/check_executable.sh +++ b/lgsm/functions/check_executable.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_executable.sh function +# LinuxGSM check_executable.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Checks if executable exists. diff --git a/lgsm/functions/check_glibc.sh b/lgsm/functions/check_glibc.sh index a5e5c95a0..f470589ab 100644 --- a/lgsm/functions/check_glibc.sh +++ b/lgsm/functions/check_glibc.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_glibc.sh function +# LinuxGSM check_glibc.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Checks if the server has the correct Glibc version or a fix available. diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index 8141c534e..5ae639237 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_ip.sh function +# LinuxGSM check_ip.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Automatically identifies the server interface IP. diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh index 5bd69bb0f..5e9da586c 100644 --- a/lgsm/functions/check_logs.sh +++ b/lgsm/functions/check_logs.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_logs.sh function +# LinuxGSM check_logs.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Checks if log files exist. diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index defde5771..840cc9864 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_permissions.sh +# LinuxGSM check_permissions.sh # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/check_root.sh b/lgsm/functions/check_root.sh index 70067f5e5..a71c993d2 100644 --- a/lgsm/functions/check_root.sh +++ b/lgsm/functions/check_root.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_root.sh function +# LinuxGSM check_root.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Checks if the user tried to run the script as root. diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh index 4a8a381b4..036bf7269 100644 --- a/lgsm/functions/check_status.sh +++ b/lgsm/functions/check_status.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_status.sh function +# LinuxGSM check_status.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com @@ -19,7 +19,7 @@ if [ "${gamename}" == "TeamSpeak 3" ]; then ts3error="${status}" status=0 fi - + elif [ "${gamename}" == "Mumble" ]; then # Get config info info_config.sh diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 0908cdcfa..ddfcb82d4 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_steamcmd.sh function +# LinuxGSM check_steamcmd.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Checks if SteamCMD is installed correctly. diff --git a/lgsm/functions/check_system_dir.sh b/lgsm/functions/check_system_dir.sh index d06cbba05..0e5c39718 100644 --- a/lgsm/functions/check_system_dir.sh +++ b/lgsm/functions/check_system_dir.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_system_dir.sh function +# LinuxGSM check_system_dir.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Checks if systemdir is accessible. diff --git a/lgsm/functions/check_system_requirements.sh b/lgsm/functions/check_system_requirements.sh index 92766785f..56d1ffa3d 100644 --- a/lgsm/functions/check_system_requirements.sh +++ b/lgsm/functions/check_system_requirements.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_system_requirements.sh +# LinuxGSM check_system_requirements.sh # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/check_tmuxception.sh b/lgsm/functions/check_tmuxception.sh index 5b906f53e..53f6febd5 100644 --- a/lgsm/functions/check_tmuxception.sh +++ b/lgsm/functions/check_tmuxception.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM check_config.sh function +# LinuxGSM check_config.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com @@ -11,7 +11,7 @@ fn_check_is_in_tmux(){ if [ -n "${TMUX}" ];then fn_print_fail_nl "tmuxception error: Sorry Cobb you cannot start a tmux session inside of a tmux session." fn_script_log_fatal "Tmuxception error: Attempted to start a tmux session inside of a tmux session." - fn_print_information_nl "LGSM creates a tmux session when starting the server." + fn_print_information_nl "LinuxGSM creates a tmux session when starting the server." echo "It is not possible to run a tmux session inside another tmux session" echo "https://github.com/GameServerManagers/LinuxGSM/wiki/Tmux#tmuxception" core_exit.sh @@ -21,7 +21,7 @@ fn_check_is_in_screen(){ if [ -n "${STY}" ];then fn_print_fail_nl "tmuxception error: Sorry Cobb you cannot start a tmux session inside of a screen session." fn_script_log_fatal "Tmuxception error: Attempted to start a tmux session inside of a screen session." - fn_print_information_nl "LGSM creates a tmux session when starting the server." + fn_print_information_nl "LinuxGSM creates a tmux session when starting the server." echo "It is not possible to run a tmux session inside screen session" echo "https://github.com/GameServerManagers/LinuxGSM/wiki/Tmux#tmuxception" core_exit.sh diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index b4bff70b0..2ef072b0a 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_backup.sh function +# LinuxGSM command_backup.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index ee9f13b6e..bd712c51e 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_console.sh function +# LinuxGSM command_console.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Gives access to the server tmux console. diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh index 25e855c94..32cd88e9a 100644 --- a/lgsm/functions/command_debug.sh +++ b/lgsm/functions/command_debug.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_debug.sh function +# LinuxGSM command_debug.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Runs the server without tmux and directly from the terminal. diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index bf843de2a..debf5442d 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_details.sh function +# LinuxGSM command_details.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com @@ -70,7 +70,7 @@ fn_details_disk(){ # Total: 15G # Used: 8.4G # Available: 5.7G - # LGSM Total: 1G + # LinuxGSM Total: 1G # Serverfiles: 961M # Backups: 2G @@ -82,7 +82,7 @@ fn_details_disk(){ echo -e "${blue}Total:\t${default}${totalspace}" echo -e "${blue}Used:\t${default}${usedspace}" echo -e "${blue}Available:\t${default}${availspace}" - echo -e "${blue}LGSM Total:\t${default}${rootdirdu}" + echo -e "${blue}LinuxGSM Total:\t${default}${rootdirdu}" echo -e "${blue}Serverfiles:\t${default}${filesdirdu}" if [ -d "${backupdir}" ]; then echo -e "${blue}Backups:\t${default}${backupdirdu}" @@ -692,7 +692,7 @@ fn_details_towerunite(){ echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" echo -e "> Game\tINBOUND\t${port}\ttcp" # Don't do arithmetics if ever the port wasn't a numeric value - if [ "${port}" -eq "${port}" ]; then + if [ "${port}" -eq "${port}" ]; then echo -e "> Steam\tINBOUND\t$((port+1))\tudp" fi echo -e "> Query\tINBOUND\t${queryport}\tudp" diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh index e17a8a719..98d785994 100644 --- a/lgsm/functions/command_dev_debug.sh +++ b/lgsm/functions/command_dev_debug.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_dev_debug.sh function +# LinuxGSM command_dev_debug.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Dev only: Enables debugging 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 01c96ff47..f709a4603 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_dev_detect_deps.sh function +# LinuxGSM command_dev_detect_deps.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Detects dependencies the server binary requires. diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index c66834b98..8aaab29a1 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_fastdl.sh function +# LinuxGSM command_fastdl.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index da3f516d9..7bbc40f42 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_install.sh function +# LinuxGSM command_install.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 678e412ad..9dbcdb453 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_install_resources_mta.sh function +# LinuxGSM command_install_resources_mta.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Installs the default resources for Multi Theft Auto. diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh index 4af7f8913..b47a3d752 100644 --- a/lgsm/functions/command_mods_install.sh +++ b/lgsm/functions/command_mods_install.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_mods_install.sh function +# LinuxGSM command_mods_install.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh index d63a00101..3b2c8a291 100644 --- a/lgsm/functions/command_mods_remove.sh +++ b/lgsm/functions/command_mods_remove.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_mods_uninstall.sh function +# LinuxGSM command_mods_uninstall.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh index e93303016..81ac90fed 100644 --- a/lgsm/functions/command_mods_update.sh +++ b/lgsm/functions/command_mods_update.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_mods_update.sh function +# LinuxGSM command_mods_update.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 7f247795f..7bd259e30 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_monitor.sh function +# LinuxGSM command_monitor.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index 566d5c323..b4169023a 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_postdetails.sh function +# LinuxGSM command_postdetails.sh function # Author: CedarLUG # Contributor: CedarLUG # Website: https://gameservermanagers.com diff --git a/lgsm/functions/command_restart.sh b/lgsm/functions/command_restart.sh index eacebaaea..e0abc88ed 100644 --- a/lgsm/functions/command_restart.sh +++ b/lgsm/functions/command_restart.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_restart.sh function +# LinuxGSM command_restart.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Restarts the server. diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 30bbfccc8..39dc363cf 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_start.sh function +# LinuxGSM command_start.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 6ac9c188e..8483e4669 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_stop.sh function +# LinuxGSM command_stop.sh function # Author: Daniel Gibbs # Contributors: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh index 2f9749200..a21deace5 100644 --- a/lgsm/functions/command_test_alert.sh +++ b/lgsm/functions/command_test_alert.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_test_alert.sh function +# LinuxGSM command_test_alert.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Sends a test alert. diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index 1a9896889..193314bda 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_ts3_server_pass.sh function +# LinuxGSM command_ts3_server_pass.sh function # Author: Daniel Gibbs # Contributor : UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index 3b0176ca4..bc76a29b2 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_update.sh function +# LinuxGSM command_update.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Handles updating of servers. diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index e3d96d378..34dbb8115 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -1,11 +1,11 @@ #!/bin/bash -# LGSM command_update_functions.sh function +# LinuxGSM command_update_functions.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Deletes the functions dir to allow re-downloading of functions from GitHub. -local commandname="UPDATE LGSM" -local commandaction="Update LGSM" +local commandname="UPDATE LinuxGSM" +local commandaction="Update LinuxGSM" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_print_dots "Updating functions" diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 3627acdb6..eb6d13c15 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_validate.sh function +# LinuxGSM command_validate.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Runs a server validation. diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 440c8080e..8b204614f 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_backup.sh function +# LinuxGSM command_backup.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com @@ -116,7 +116,7 @@ if [ "${gamename}" == "Rust" ]; then fn_script_log_info "User selects to erase any user, storage, log and map data from ${serveridentitydir}" sleep 1 fn_wipe_server_process - else + else fn_print_information_nl "No data to wipe was found" fn_script_log_info "No data to wipe was found." sleep 1 diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index 67d3621e2..e0c6b4eb3 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM compress_unreal2_maps.sh function +# LinuxGSM compress_unreal2_maps.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Compresses unreal maps. diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh index 3ef6e140e..a834e3e5b 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM compress_ut99_maps.sh function +# LinuxGSM compress_ut99_maps.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Compresses unreal maps. diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index aad8f1963..d6c9b58ca 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -1,9 +1,9 @@ #!/bin/bash -# LGSM core_dl.sh function +# LinuxGSM core_dl.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com -# Description: Deals with all downloads for LGSM. +# Description: Deals with all downloads for LinuxGSM. # 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 diff --git a/lgsm/functions/core_exit.sh b/lgsm/functions/core_exit.sh index d5f17dfe5..02b471c78 100644 --- a/lgsm/functions/core_exit.sh +++ b/lgsm/functions/core_exit.sh @@ -1,8 +1,8 @@ #!/bin/bash -# LGSM core_exit.sh function +# LinuxGSM core_exit.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -# Description: Handles exiting of LGSM by running and reporting an exit code. +# Description: Handles exiting of LinuxGSM by running and reporting an exit code. fn_exit_dev_debug(){ if [ -f "${rootdir}/.dev-debug" ]; then diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index c0be0b856..1738928ca 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM core_functions.sh function +# LinuxGSM core_functions.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Defines all functions to allow download and execution of functions using fn_fetch_function. diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index db531ccb6..bcecc6c2d 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM core_getopt.sh function +# LinuxGSM core_getopt.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: getopt arguments. diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 540729af7..6a8f2f357 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM core_messages.sh function +# LinuxGSM core_messages.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Defines on-screen messages such as [ OK ] and how script logs look. diff --git a/lgsm/functions/core_trap.sh b/lgsm/functions/core_trap.sh index 46615cfe5..253c8b4d2 100644 --- a/lgsm/functions/core_trap.sh +++ b/lgsm/functions/core_trap.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM core_trap.sh function +# LinuxGSM core_trap.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Handles CTRL-C trap to give an exit code. diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 5bac281a3..250709cca 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix.sh function +# LinuxGSM fix.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Overall function for managing fixes. diff --git a/lgsm/functions/fix_arma3.sh b/lgsm/functions/fix_arma3.sh index e1bb4abcc..6c65bf95f 100644 --- a/lgsm/functions/fix_arma3.sh +++ b/lgsm/functions/fix_arma3.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_arma3.sh function +# LinuxGSM fix_arma3.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Resolves an issue with ARMA3. diff --git a/lgsm/functions/fix_coduo.sh b/lgsm/functions/fix_coduo.sh index 09835eadb..a092acaba 100644 --- a/lgsm/functions/fix_coduo.sh +++ b/lgsm/functions/fix_coduo.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_coduo.sh function +# LinuxGSM fix_coduo.sh function # Author: Alexander Hurd # Website: https://gameservermanagers.com # Description: Fixes for Call of Duty: United Offensive diff --git a/lgsm/functions/fix_csgo.sh b/lgsm/functions/fix_csgo.sh index 38d169532..305c0d06b 100644 --- a/lgsm/functions/fix_csgo.sh +++ b/lgsm/functions/fix_csgo.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_csgo.sh function +# LinuxGSM fix_csgo.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Resolves various issues with CS:GO. diff --git a/lgsm/functions/fix_dst.sh b/lgsm/functions/fix_dst.sh index fea58b67e..5a631a52e 100644 --- a/lgsm/functions/fix_dst.sh +++ b/lgsm/functions/fix_dst.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_dst.sh function +# LinuxGSM fix_dst.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Resolves various issues with Don't Starve Together. diff --git a/lgsm/functions/fix_ges.sh b/lgsm/functions/fix_ges.sh index c8ee7ad5d..f97ca767c 100644 --- a/lgsm/functions/fix_ges.sh +++ b/lgsm/functions/fix_ges.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_ges.sh function +# LinuxGSM fix_ges.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Resolves various issues with GoldenEye: Source. diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index d03b2c41e..a36b568ac 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_glibc.sh function +# LinuxGSM fix_glibc.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Downloads required Glibc files and applies the Glibc fix if required. diff --git a/lgsm/functions/fix_ins.sh b/lgsm/functions/fix_ins.sh index 2fab8f8ae..c132173b0 100644 --- a/lgsm/functions/fix_ins.sh +++ b/lgsm/functions/fix_ins.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_ins.sh function +# LinuxGSM fix_ins.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Resolves various issues with Insurgency. diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh index c08a34341..a70f8ce86 100644 --- a/lgsm/functions/fix_kf.sh +++ b/lgsm/functions/fix_kf.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_kf.sh function +# LinuxGSM fix_kf.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Resolves various issues with Killing Floor. diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index 7347201d9..ebefc79d2 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_mta.sh function +# LinuxGSM fix_mta.sh function # Author: Daniel Gibbs # Contributor: ChaosMTA # Website: https://gameservermanagers.com diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh index ee28aaf4a..3498ee9c8 100644 --- a/lgsm/functions/fix_ro.sh +++ b/lgsm/functions/fix_ro.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_ro.sh function +# LinuxGSM fix_ro.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Resolves various issues with Red Orchestra. diff --git a/lgsm/functions/fix_rust.sh b/lgsm/functions/fix_rust.sh index ec0b125d4..13f7fbdb0 100644 --- a/lgsm/functions/fix_rust.sh +++ b/lgsm/functions/fix_rust.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_rust.sh function +# LinuxGSM fix_rust.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Resolves startup issue with Rust diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 444409cfe..79bf5acce 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_steamcmd.sh function +# LinuxGSM fix_steamcmd.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Resolves various issues related to SteamCMD. diff --git a/lgsm/functions/fix_ut.sh b/lgsm/functions/fix_ut.sh index 74233406f..24dad6ee6 100644 --- a/lgsm/functions/fix_ut.sh +++ b/lgsm/functions/fix_ut.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_ut.sh function +# LinuxGSM fix_ut.sh function # Author: Alexander Hurd # Website: https://gameservermanagers.com # Description: Resolves various issues with Unreal Tournament. diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index 85b2334a7..913ef62e9 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fix_ut2k4.sh function +# LinuxGSM fix_ut2k4.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Resolves various issues with Unreal Tournament 2004. diff --git a/lgsm/functions/fn_functions b/lgsm/functions/fn_functions index 758af3dbc..ca45dd740 100644 --- a/lgsm/functions/fn_functions +++ b/lgsm/functions/fn_functions @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fn_functions function +# LinuxGSM fn_functions function # Author: Daniel Gibbs # Website: https://gameservermanagers.com lgsm_version="211016" diff --git a/lgsm/functions/fn_getopt b/lgsm/functions/fn_getopt index 0302cf1d5..e15a29201 100644 --- a/lgsm/functions/fn_getopt +++ b/lgsm/functions/fn_getopt @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fn_getopt function +# LinuxGSM fn_getopt function # Author: Daniel Gibbs # Website: https://gameservermanagers.com lgsm_version="211016" diff --git a/lgsm/functions/fn_update_functions b/lgsm/functions/fn_update_functions index a424d3352..7dbde6694 100644 --- a/lgsm/functions/fn_update_functions +++ b/lgsm/functions/fn_update_functions @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM fn_update_functions function +# LinuxGSM fn_update_functions function # Author: Daniel Gibbs # Website: https://gameservermanagers.com lgsm_version="211016" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 5c5fdb98e..9ce3ba242 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM info_config.sh function +# LinuxGSM info_config.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com @@ -521,7 +521,7 @@ fn_info_config_towerunite(){ else servername=$(grep "ServerTitle" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerTitle//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - + # Not Set servername=${servername:-"NOT SET"} maxplayers=${maxplayers:-"0"} diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index 16973cfc1..d8d733d64 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM info_distro.sh function +# LinuxGSM info_distro.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Variables providing useful info on the Operating System such as disk and performace info. @@ -88,19 +88,19 @@ totalspace=$(df -hP "${rootdir}" | grep -v "Filesystem" | awk '{print $2}') usedspace=$(df -hP "${rootdir}" | grep -v "Filesystem" | awk '{print $3}') availspace=$(df -hP "${rootdir}" | grep -v "Filesystem" | awk '{print $4}') -## LGSM used space total. +## LinuxGSM used space total. rootdirdu=$(du -sh "${rootdir}" 2> /dev/null | awk '{print $1}') if [ -z "${rootdirdu}" ]; then rootdirdu="0M" fi -## LGSM used space in serverfiles dir. +## LinuxGSM used space in serverfiles dir. filesdirdu=$(du -sh "${filesdir}" 2> /dev/null | awk '{print $1}') if [ -z "${filesdirdu}" ]; then filesdirdu="0M" fi -## LGSM used space total minus backup dir. +## LinuxGSM used space total minus backup dir. rootdirduexbackup=$(du -sh --exclude="${backupdir}" "${filesdir}" 2> /dev/null | awk '{print $1}') if [ -z "${rootdirduexbackup}" ]; then rootdirduexbackup="0M" diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 5b821054d..ce17c0c22 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM info_glibc.sh function +# LinuxGSM info_glibc.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Stores details on servers Glibc requirements. diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 72ef857c9..17be983fd 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM info_parms.sh function +# LinuxGSM info_parms.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Gets specific details from server parameters. diff --git a/lgsm/functions/install_complete.sh b/lgsm/functions/install_complete.sh index 4a38d79b4..d194e7a58 100644 --- a/lgsm/functions/install_complete.sh +++ b/lgsm/functions/install_complete.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_complete.sh function +# LinuxGSM install_complete.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Prints installation completion message and hints. diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 806550e9b..529f87038 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_config.sh function +# LinuxGSM install_config.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Creates default server configs. diff --git a/lgsm/functions/install_dst_token.sh b/lgsm/functions/install_dst_token.sh index 2e9713e71..0996e7e4e 100644 --- a/lgsm/functions/install_dst_token.sh +++ b/lgsm/functions/install_dst_token.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_dst_token.sh function +# LinuxGSM install_dst_token.sh function # Author: Daniel Gibbs & Marvin Lehmann (marvinl97) # Website: https://gameservermanagers.com # Description: Configures Don't Starve Together cluster with given token. @@ -29,7 +29,7 @@ if [ -z "${autoinstall}" ]; then * ) echo "Please answer yes or no.";; esac done - fi + fi if [ "${overwritetoken}" == "true" ]; then echo "Once you have the cluster token, enter it below" echo -n "Cluster Token: " diff --git a/lgsm/functions/install_factorio_save.sh b/lgsm/functions/install_factorio_save.sh index 353d57c20..e76e97e9f 100644 --- a/lgsm/functions/install_factorio_save.sh +++ b/lgsm/functions/install_factorio_save.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_factorio_save.sh function +# LinuxGSM install_factorio_save.sh function # Author: Kristian Polso # Website: https://gameservermanagers.com # Description: Creates the initial save file for Factorio diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh index 1c8f25194..5f62539d7 100644 --- a/lgsm/functions/install_gslt.sh +++ b/lgsm/functions/install_gslt.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_gslt.sh function +# LinuxGSM install_gslt.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Configures GSLT. diff --git a/lgsm/functions/install_header.sh b/lgsm/functions/install_header.sh index 499d1aec9..d830a9408 100644 --- a/lgsm/functions/install_header.sh +++ b/lgsm/functions/install_header.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_header.sh function +# LinuxGSM install_header.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Prints installation header. diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index abad81329..2019fdb13 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_logs.sh function +# LinuxGSM install_logs.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Creates log directories. diff --git a/lgsm/functions/install_minecraft_eula.sh b/lgsm/functions/install_minecraft_eula.sh index 410e283b4..391c869f2 100644 --- a/lgsm/functions/install_minecraft_eula.sh +++ b/lgsm/functions/install_minecraft_eula.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_minecraft_eula.sh function +# LinuxGSM install_minecraft_eula.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Gets user to accept the EULA. diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index f4fff4010..8156da9da 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_mta_resources.sh function +# LinuxGSM install_mta_resources.sh function # Author: Daniel Gibbs # Contributor: ChaosMTA # Website: https://gameservermanagers.com diff --git a/lgsm/functions/install_retry.sh b/lgsm/functions/install_retry.sh index d0ca16fef..0212968e3 100644 --- a/lgsm/functions/install_retry.sh +++ b/lgsm/functions/install_retry.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_retry.sh function +# LinuxGSM install_retry.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Asks for installation retry after failure. diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index d527b6193..d39957025 100644 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_server_dir.sh function +# LinuxGSM install_server_dir.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Creates the server directory. diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index a988f2644..335b0c6f5 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_server_files.sh function +# LinuxGSM install_server_files.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Installs server files. diff --git a/lgsm/functions/install_steamcmd.sh b/lgsm/functions/install_steamcmd.sh index 82cce59a6..26335c187 100644 --- a/lgsm/functions/install_steamcmd.sh +++ b/lgsm/functions/install_steamcmd.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_steamcmd.sh function +# LinuxGSM install_steamcmd.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Downloads SteamCMD on install. diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index bada12c0b..1dbf16985 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_ts3db.sh function +# LinuxGSM install_ts3db.sh function # Author: Daniel Gibbs # Contributor: PhilPhonic # Website: https://gameservermanagers.com diff --git a/lgsm/functions/install_unreal_tournament_eula.sh b/lgsm/functions/install_unreal_tournament_eula.sh index b39f9b2e2..442a108ca 100644 --- a/lgsm/functions/install_unreal_tournament_eula.sh +++ b/lgsm/functions/install_unreal_tournament_eula.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_unreal_tournament_eula.sh function +# LinuxGSM install_unreal_tournament_eula.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Gets user to accept the EULA. diff --git a/lgsm/functions/install_ut2k4_key.sh b/lgsm/functions/install_ut2k4_key.sh index b091faff3..b06cc12c3 100644 --- a/lgsm/functions/install_ut2k4_key.sh +++ b/lgsm/functions/install_ut2k4_key.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM install_ut2k4_key.sh function +# LinuxGSM install_ut2k4_key.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Activates ut2k4 server with given key. diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index 32ad0deae..ebcc8636a 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM logs.sh function +# LinuxGSM logs.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 1e36285e1..620bfa921 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_mods_install.sh function +# LinuxGSM command_mods_install.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 0be15b08b..f5768efed 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -1,9 +1,9 @@ #!/bin/bash -# LGSM mods_list.sh function +# LinuxGSM mods_list.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com -# Description: Lists and defines available mods for LGSM supported servers; works along with mods_core.sh. +# Description: Lists and defines available mods for LinuxGSM supported servers; works along with mods_core.sh. # Usage: To add a mod, you need to add an array variable following the guide to set proper values; # Usage: Then add this array to the mods_global_array. # Usage: If needed, you can scrape the download URL first. @@ -43,7 +43,7 @@ modseparator="MOD" # [4] | "filename": the output filename # [5] | "modsubdirs": in how many subdirectories is the mod (none is 0) (not used at release, but could be in the future) # [6] | "LowercaseOn/Off": LowercaseOff or LowercaseOn: enable/disable converting extracted files and directories to lowercase (some games require it) -# [7] | "modinstalldir": the directory in which to install the mode ( use LGSM dir variables such as ${systemdir}) +# [7] | "modinstalldir": the directory in which to install the mode (use LGSM dir variables such as ${systemdir}) # [8] | "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" value to ignore the value or "NOUPDATE" to disallow updating; for files to keep upon uninstall, see fn_mod_tidy_files_list from mods_core.sh # [9] | "Supported Engines;": list them according to LGSM ${engine} variables, separated and ended with a semicolon, or use ENGINES to ignore the value # [10] | "Supported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use GAMES to ignore the value diff --git a/lgsm/functions/monitor_gsquery.sh b/lgsm/functions/monitor_gsquery.sh index 2c8b2902b..dc24aaee3 100644 --- a/lgsm/functions/monitor_gsquery.sh +++ b/lgsm/functions/monitor_gsquery.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM monitor_gsquery.sh function +# LinuxGSM monitor_gsquery.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Uses gsquery.py to query the server port. diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index c3e16d802..cbb39ef18 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM update_factorio.sh function +# LinuxGSM update_factorio.sh function # Author: Daniel Gibbs # Contributor: Kristian Polso # Website: https://gameservermanagers.com diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index 746ddfb2e..cf45946b0 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM update_minecraft.sh function +# LinuxGSM update_minecraft.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Handles updating of Minecraft servers. diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index fff189ca7..0fcd7936c 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM update_mta.sh function +# LinuxGSM update_mta.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Handles updating of Multi Theft Auto servers. diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index 6f5c35a88..b77cb3ac4 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM update_mumble.sh function +# LinuxGSM update_mumble.sh function # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 6d2b6780a..028f843ee 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM update_steamcmd.sh function +# LinuxGSM update_steamcmd.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Handles updating using SteamCMD. diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index b5f403597..f810eb0f4 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LGSM command_ts3.sh function +# LinuxGSM command_ts3.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Handles updating of teamspeak 3 servers. From 4376a540fcb4115b35070254337f9e3d03ed863c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 23:11:28 +0000 Subject: [PATCH 0470/1895] Added permissions alert an alert will go out if there is a permissions issue --- lgsm/functions/alert.sh | 14 +++++++++++--- lgsm/functions/check_permissions.sh | 4 +++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh index fb914a42f..9fec83369 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -31,14 +31,22 @@ fn_alert_update(){ alertbody="${servicename} received update" } -if [ "${alert}" == "restart" ]; then +fn_alert_permissions(){ + fn_script_log_info "Sending permissions error alert" + alertsubject="LinuxGSM - Permissions Error - ${servername}" + alertbody="${servicename} has permissions issues." +} + +if [ "${alert}" == "permissions" ]; then + fn_alert_permissions +elif [ "${alert}" == "restart" ]; then fn_alert_restart elif [ "${alert}" == "restartquery" ]; then fn_alert_restart_query -elif [ "${alert}" == "update" ]; then - fn_alert_update elif [ "${alert}" == "test" ]; then fn_alert_test +elif [ "${alert}" == "update" ]; then + fn_alert_update fi if [ "${emailalert}" == "on" ]&&[ -n "${email}" ]; then diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 840cc9864..2a198d3c5 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -43,8 +43,10 @@ fn_check_ownership(){ } | column -s $'\t' -t | tee -a "${scriptlog}" echo "" - fn_print_information_nl "For more information, please see https://github.com/GameServerManagers/LinuxGSM/wiki/FAQ#-fail--starting-game-server-ownership-issues-found" + fn_print_information_nl "please see https://github.com/GameServerManagers/LinuxGSM/wiki/FAQ#-fail--starting-game-server-ownership-issues-found" fn_script_log "For more information, please see https://github.com/GameServerManagers/LinuxGSM/wiki/FAQ#-fail--starting-game-server-ownership-issues-found" + alert="permissions" + alert.sh core_exit.sh fi } From aab6dc58bbd3cc3859a47b274caeab71c06b0677 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 23:21:55 +0000 Subject: [PATCH 0471/1895] fixed issue preventing monitor from running and alerting check_permissions is bypassed for monitor as the monitor woudl not work at all and not alert of a server failure. The server will however fail to start with permissions issues --- lgsm/functions/check.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 6d6c53101..c8f659d2a 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -12,7 +12,10 @@ local commandname="CHECK" check_root.sh check_tmuxception.sh -check_permissions.sh + +if [ "${function_selfname}" != "command_monitor.sh" ] + check_permissions.sh +fi if [ "${function_selfname}" != "command_install.sh" ]&&[ "${function_selfname}" != "command_update_functions.sh" ]; then check_system_dir.sh From 4dc19ab64f442110589c768c8d3b25d8179599e0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 23:38:21 +0000 Subject: [PATCH 0472/1895] missing then --- 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 c8f659d2a..7cc1e9584 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -13,7 +13,7 @@ local commandname="CHECK" check_root.sh check_tmuxception.sh -if [ "${function_selfname}" != "command_monitor.sh" ] +if [ "${function_selfname}" != "command_monitor.sh" ];then check_permissions.sh fi From 3cc0263c5426c68d17a7424dc02694cbdf2db7a6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Feb 2017 23:39:13 +0000 Subject: [PATCH 0473/1895] Permissions Error to error --- 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 9fec83369..afcec526c 100644 --- a/lgsm/functions/alert.sh +++ b/lgsm/functions/alert.sh @@ -33,7 +33,7 @@ fn_alert_update(){ fn_alert_permissions(){ fn_script_log_info "Sending permissions error alert" - alertsubject="LinuxGSM - Permissions Error - ${servername}" + alertsubject="LinuxGSM - Error - ${servername}" alertbody="${servicename} has permissions issues." } From c1579de5e8a0d713249403c3ec449ce7d9677da2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 00:09:20 +0000 Subject: [PATCH 0474/1895] Permissions alert will only happen during monitor Monitor needs to alert about permissions issues as the admin may not be around while this issue os occuring. --- lgsm/functions/check_permissions.sh | 23 ++++++++++++++++++++--- lgsm/functions/command_monitor.sh | 1 + 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 2a198d3c5..d7bff4dee 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -6,7 +6,6 @@ # Description: Checks ownership & permissions of scripts, files and directories. local commandname="CHECK" -local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_check_ownership(){ if [ -f "${rootdir}/${selfname}" ]; then @@ -45,8 +44,10 @@ fn_check_ownership(){ echo "" fn_print_information_nl "please see https://github.com/GameServerManagers/LinuxGSM/wiki/FAQ#-fail--starting-game-server-ownership-issues-found" fn_script_log "For more information, please see https://github.com/GameServerManagers/LinuxGSM/wiki/FAQ#-fail--starting-game-server-ownership-issues-found" - alert="permissions" - alert.sh + if [ "${monitorflag}" == 1 ]; then + alert="permissions" + alert.sh + fi core_exit.sh fi } @@ -62,6 +63,10 @@ fn_check_permissions(){ echo -e "File\n" find "${functionsdir}" -type f -not -executable -printf "%p\n" } | column -s $'\t' -t | tee -a "${scriptlog}" + if [ "${monitorflag}" == 1 ]; then + alert="permissions" + alert.sh + fi core_exit.sh fi fi @@ -80,6 +85,10 @@ fn_check_permissions(){ fn_script_log_info "The following directory does not have the correct permissions:" fn_script_log_info "${rootdir}" ls -l "${rootdir}" + if [ "${monitorflag}" == 1 ]; then + alert="permissions" + alert.sh + fi core_exit.sh fi fi @@ -120,6 +129,10 @@ fn_check_permissions(){ ls -l "${executabledir}/${execname}" fn_script_log_warn "The following file could not be set executable:" fn_script_log_info "${executabledir}/${execname}" + if [ "${monitorflag}" == 1 ]; then + alert="permissions" + alert.sh + fi core_exit.sh fi fi @@ -159,6 +172,10 @@ fn_sys_perm_fix_manually_msg(){ echo " chmod a+rx /sys /sys/class /sys/class/net" fn_script_log "chmod a+rx /sys /sys/class /sys/class/net" sleep 1 + if [ "${monitorflag}" == 1 ]; then + alert="permissions" + alert.sh + fi core_exit.sh } diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 7bd259e30..0064ab439 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -98,6 +98,7 @@ fn_monitor_tmux(){ fi } +monitorflag=1 fn_print_dots "${servername}" sleep 1 check.sh From 50efa1bd23310a5bd4c1b8572d8355a100381474 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 00:30:30 +0000 Subject: [PATCH 0475/1895] removed space --- lgsm/functions/core_messages.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 565a1853e..9fd87a8a9 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -277,9 +277,9 @@ fn_prompt_yn(){ if [ "${initial}" == "Y" ]; then prompt+=" [Y/n] " elif [ "${initial}" == "N" ]; then - prompt+=" [y/N] " + prompt+=" [y/N] " else - prompt+=" [y/n] " + prompt+=" [y/n] " fi while true; do From 06825f1e9c5b90ed3253388315c6e807c458ac18 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 00:36:30 +0000 Subject: [PATCH 0476/1895] missed a space --- lgsm/functions/core_messages.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 9fd87a8a9..91f5bd75f 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -275,7 +275,7 @@ fn_prompt_yn(){ local initial="$2" if [ "${initial}" == "Y" ]; then - prompt+=" [Y/n] " + prompt+=" [Y/n] " elif [ "${initial}" == "N" ]; then prompt+=" [y/N] " else From fd0f6f730dbc63d71e96a182011a327c0f717180 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 00:41:43 +0000 Subject: [PATCH 0477/1895] tabs --- lgsm/functions/core_messages.sh | 38 ++++++++++++++++----------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 91f5bd75f..2e1286d7e 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -271,25 +271,25 @@ fn_print_information_nl(){ # Y/N Prompt fn_prompt_yn(){ - local prompt="$1" - local initial="$2" - - if [ "${initial}" == "Y" ]; then - prompt+=" [Y/n] " - elif [ "${initial}" == "N" ]; then - prompt+=" [y/N] " - else - prompt+=" [y/n] " - fi - - while true; do - read -e -i "${initial}" -p "${prompt}" -r yn - case "${yn}" in - [Yy]|[Yy][Ee][Ss]) return 0 ;; - [Nn]|[Nn][Oo]) return 1 ;; - *) echo "Please answer yes or no." ;; - esac - done + local prompt="$1" + local initial="$2" + + if [ "${initial}" == "Y" ]; then + prompt+=" [Y/n] " + elif [ "${initial}" == "N" ]; then + prompt+=" [y/N] " + else + prompt+=" [y/n] " + fi + + while true; do + read -e -i "${initial}" -p "${prompt}" -r yn + case "${yn}" in + [Yy]|[Yy][Ee][Ss]) return 0 ;; + [Nn]|[Nn][Oo]) return 1 ;; + *) echo "Please answer yes or no." ;; + esac + done } # On-Screen End of Line From b30e49b8bf42df7cb280410696bc56505382aa2b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 01:06:50 +0000 Subject: [PATCH 0478/1895] Updated Teeworlds directorys --- Teeworlds/twserver | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Teeworlds/twserver b/Teeworlds/twserver index 60d8dc5fc..2679bc45e 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -99,8 +99,8 @@ tmpdir="${lgsmdir}/tmp" filesdir="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${filesdir}/tw" +executabledir="${systemdir}" executable="./teeworlds_srv" servercfg="${servicename}.cfg" # Teeworlds can also auto load any config if an autoexec.cfg file is present in the server dir servercfgdefault="server.cfg" From ddb607d5988b7b1f7387031bfdc0f5322c631077 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 01:59:56 +0000 Subject: [PATCH 0479/1895] increased Teeworlds glibc requirements --- lgsm/functions/info_glibc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index ce17c0c22..ad505eb0e 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -81,7 +81,7 @@ elif [ "${gamename}" == "TeamSpeak 3" ]; then glibcrequired="NOT REQUIRED" glibcfix="no" elif [ "${gamename}" == "Teeworlds" ]; then - glibcrequired="2.3" + glibcrequired="2.14" glibcfix="no" elif [ "${engine}" == "avalanche" ]; then glibcrequired="2.13" From 9f1c03da948652acf2ec1222e44860ad4dc90532 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 02:00:46 +0000 Subject: [PATCH 0480/1895] Imrprovements to graceful shutdown quake servers now also do graceful shutdown --- lgsm/functions/command_stop.sh | 106 ++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 48 deletions(-) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 8483e4669..341ad4d95 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -9,73 +9,83 @@ local commandname="STOP" local commandaction="Stopping" local 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_script_log_info "Graceful: rcon quit" +# Attempts graceful shutdown by sending the 'CTRL+c'. +fn_stop_graceful_ctrlc(){ + fn_print_dots "Graceful: CTRL+c" + fn_script_log_info "Graceful: CTRL+c" # sends quit - tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 + tmux send-keys C-c -t "${servicename}" > /dev/null 2>&1 # waits up to 30 seconds giving the server time to shutdown gracefuly for seconds in {1..30}; do check_status.sh if [ "${status}" == "0" ]; then - fn_print_ok "Graceful: rcon quit: ${seconds}: " + fn_print_ok "Graceful: CTRL+c: ${seconds}: " fn_print_ok_eol_nl - fn_script_log_pass "Graceful: rcon quit: OK: ${seconds} seconds" + fn_script_log_pass "Graceful: CTRL+c: OK: ${seconds} seconds" break fi sleep 1 - fn_print_dots "Graceful: rcon quit: ${seconds}" + fn_print_dots "Graceful: CTRL+c: ${seconds}" done check_status.sh if [ "${status}" != "0" ]; then - fn_print_error "Graceful: rcon quit: " + fn_print_error "Graceful: CTRL+c: " fn_print_fail_eol_nl - fn_script_log_error "Graceful: rcon quit: FAIL" + fn_script_log_error "Graceful: CTRL+c: FAIL" fi sleep 1 fn_stop_tmux } -# 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_script_log_info "Graceful: rcon quit" +# Attempts graceful shutdown by sending the 'quit' command. +fn_stop_graceful_quit(){ + fn_print_dots "Graceful: sending \"quit\"" + fn_script_log_info "Graceful: sending \"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 + # waits up to 30 seconds giving the server time to shutdown gracefuly + for seconds in {1..30}; do + check_status.sh + if [ "${status}" == "0" ]; then + fn_print_ok "Graceful: sending \"quit\": ${seconds}: " + fn_print_ok_eol_nl + fn_script_log_pass "Graceful: sending \"quit\": OK: ${seconds} seconds" + break + fi sleep 1 - fn_print_dots "Graceful: rcon quit: ${seconds}" + fn_print_dots "Graceful: sending \"quit\": ${seconds}" done - fn_print_ok "Graceful: rcon quit: ${seconds}: " - fn_print_ok_eol_nl - fn_script_log_pass "Graceful: rcon quit: OK: ${seconds} seconds" + check_status.sh + if [ "${status}" != "0" ]; then + fn_print_error "Graceful: sending \"quit\": " + fn_print_fail_eol_nl + fn_script_log_error "Graceful: sending \"quit\": FAIL" + fi sleep 1 fn_stop_tmux } -fn_stop_graceful_ctrlc(){ - fn_print_dots "Graceful: console CTRL+c" - fn_script_log_info "Graceful: console CTRL+c" +# Attempts graceful of goldsource using rcon 'quit' command. +# Goldsource 'quit' command restarts rather than shutdown +# 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: sending \"quit\"" + fn_script_log_info "Graceful: sending \"quit\"" # sends quit - tmux send-keys C-c -t "${servicename}" > /dev/null 2>&1 + 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: console CTRL+c: ${seconds}" + fn_print_dots "Graceful: sending \"quit\": ${seconds}" done - fn_print_ok "Graceful: console CTRL+c: ${seconds}: " + fn_print_ok "Graceful: sending \"quit\": ${seconds}: " fn_print_ok_eol_nl - fn_script_log_pass "Graceful: console CTRL+c: OK: ${seconds} seconds" + fn_script_log_pass "Graceful: sending \"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 ' @@ -135,7 +145,7 @@ fn_stop_graceful_sdtd(){ break fi sleep 1 - fn_print_dots "Graceful: rcon quit: ${seconds}" + fn_print_dots "Graceful: telnet: ${seconds}" done # If telnet failed will go straight to tmux shutdown. # If cannot shutdown correctly world save may be lost @@ -164,27 +174,27 @@ fn_stop_graceful_sdtd(){ # Attempts graceful of source using rcon 'stop' command. fn_stop_graceful_minecraft(){ - fn_print_dots "Graceful: console stop" - fn_script_log_info "Graceful: console stop" + fn_print_dots "Graceful: sending \"stop\"" + fn_script_log_info "Graceful: sending \"stop\"" # sends quit tmux send -t "${servicename}" stop ENTER > /dev/null 2>&1 # waits up to 30 seconds giving the server time to shutdown gracefuly for seconds in {1..30}; do check_status.sh if [ "${status}" == "0" ]; then - fn_print_ok "Graceful: console stop: ${seconds}: " + fn_print_ok "Graceful: sending \"stop\": ${seconds}: " fn_print_ok_eol_nl - fn_script_log_pass "Graceful: console stop: OK: ${seconds} seconds" + fn_script_log_pass "Graceful: sending \"stop\": OK: ${seconds} seconds" break fi sleep 1 - fn_print_dots "Graceful: console stop: ${seconds}" + fn_print_dots "Graceful: sending \"stop\": ${seconds}" done check_status.sh if [ "${status}" != "0" ]; then - fn_print_error "Graceful: console stop: " + fn_print_error "Graceful: sending \"stop\": " fn_print_fail_eol_nl - fn_script_log_error "Graceful: console stop: FAIL" + fn_script_log_error "Graceful: sending \"stop\": FAIL" fi sleep 1 fn_stop_tmux @@ -192,27 +202,27 @@ fn_stop_graceful_minecraft(){ # Attempts graceful of mta using rcon 'quit' command. fn_stop_graceful_mta(){ - fn_print_dots "Graceful: console quit" - fn_script_log_info "Graceful: console quit" + fn_print_dots "Graceful: sending \"quit\"" + fn_script_log_info "Graceful: sending \"quit\"" # sends quit tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1 # waits up to 120 seconds giving the server time to shutdown gracefuly, we need a long wait time here as resources are stopped individually and process their own shutdowns for seconds in {1..120}; do check_status.sh if [ "${status}" == "0" ]; then - fn_print_ok "Graceful: console quit: ${seconds}: " + fn_print_ok "Graceful: sending \"quit\": ${seconds}: " fn_print_ok_eol_nl - fn_script_log_pass "Graceful: console quit: OK: ${seconds} seconds" + fn_script_log_pass "Graceful: sending \"quit\": OK: ${seconds} seconds" break fi sleep 1 - fn_print_dots "Graceful: console quit: ${seconds}" + fn_print_dots "Graceful: sending \"quit\": ${seconds}" done check_status.sh if [ "${status}" != "0" ]; then - fn_print_error "Graceful: console quit: " + fn_print_error "Graceful: sending \"quit\": " fn_print_fail_eol_nl - fn_script_log_error "Graceful: console quit: FAIL" + fn_script_log_error "Graceful: sending \"quit\": FAIL" fi sleep 1 fn_stop_tmux @@ -223,8 +233,8 @@ fn_stop_graceful_select(){ fn_stop_graceful_sdtd elif [ "${gamename}" == "Factorio" ]||[ "${engine}" == "unreal4" ]||[ "${engine}" == "unreal3" ]||[ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ]; then fn_stop_graceful_ctrlc - elif [ "${engine}" == "source" ]; then - fn_stop_graceful_source + elif [ "${engine}" == "source" ]||[ "${engine}" == "quake" ]||[ "${engine}" == "idtech2" ]||[ "${engine}" == "idtech3" ]||[ "${engine}" == "idtech3_ql" ]; then + fn_stop_graceful_quit elif [ "${engine}" == "goldsource" ]; then fn_stop_graceful_goldsource elif [ "${engine}" == "lwjgl2" ]; then From 92f748c1ca47cad2b120572c5d44402bc0c02af5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 04:01:57 +0100 Subject: [PATCH 0481/1895] Rust now supports custom log dir --- Rust/rustserver | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Rust/rustserver b/Rust/rustserver index 9557f914d..513f6b967 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -39,7 +39,7 @@ tickrate="30" # default 30; range : 15 to 100 ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="-batchmode +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${servicename}\" ${conditionalseed} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile ${gamelogfile}" +parms="-batchmode +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${servicename}\" ${conditionalseed} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile \"${gamelogdate}\"" } # Specific to Rust @@ -132,7 +132,6 @@ backupdir="${rootdir}/backups" gamelogdir="${rootdir}/log/server" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${scriptlogdir}/${servicename}-email.log" @@ -140,7 +139,7 @@ emaillog="${scriptlogdir}/${servicename}-email.log" ## Logs Naming scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" -gamelogfile="\"gamelog-$(date '+%Y-%m-%d-%H-%M-%S').log\"" +gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" ######################## ######## Script ######## From 9d603d10ceb6a264826dd2359aa0152e8c33ee44 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 04:35:46 +0100 Subject: [PATCH 0482/1895] only rotate logs if server is off Fixes #1318 --- lgsm/functions/logs.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index ebcc8636a..ac2c3d771 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -16,7 +16,8 @@ if [ -n "${consolelog}" ]; then fi # For games not displaying a console, and having logs into their game directory -if [ "${function_selfname}" == "command_start.sh" ] && [ -n "${gamelogfile}" ]; then +check_status.sh +if [ "${status}" != "0" ] && [ "${function_selfname}" == "command_start.sh" ] && [ -n "${gamelogfile}" ]; then if [ -n "$(find "${systemdir}" -name "gamelog*.log")" ]; then fn_print_info "Moving game logs to ${gamelogdir}" fn_script_log_info "Moving game logs to ${gamelogdir}" From 7a4438e8d0cc56cea90f7c0cccb3cf1a6b6dd6fa Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 04:40:22 +0100 Subject: [PATCH 0483/1895] sys permission fix only upon server start fixes #1303 --- lgsm/functions/check_permissions.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index d7bff4dee..24648f2ec 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -232,4 +232,6 @@ fn_sys_perm_error_process(){ ## Run checks fn_check_ownership fn_check_permissions -fn_sys_perm_error_process +if [ "${function_selfname}" == "command_start.sh" ]; then + fn_sys_perm_error_process +fi From 2b4262e1d5e83f71f64f20a4caf0414b175b4b5d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 04:55:16 +0100 Subject: [PATCH 0484/1895] Allow to run details with non-installed server fixes #1302 --- lgsm/functions/check.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 7cc1e9584..ec067de66 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -17,7 +17,7 @@ if [ "${function_selfname}" != "command_monitor.sh" ];then check_permissions.sh fi -if [ "${function_selfname}" != "command_install.sh" ]&&[ "${function_selfname}" != "command_update_functions.sh" ]; then +if [ "${function_selfname}" != "command_install.sh" ]&&[ "${function_selfname}" != "command_update_functions.sh" ]&&[ "${function_selfname}" != "command_details.sh" ]&&[ "${function_selfname}" != "command_postdetails.sh" ]; then check_system_dir.sh fi @@ -53,7 +53,7 @@ do fi done -local allowed_commands_array=( command_console.sh command_debug.sh command_details.sh command_monitor.sh command_start.sh command_stop.sh ) +local allowed_commands_array=( command_console.sh command_debug.sh command_monitor.sh command_start.sh command_stop.sh ) for allowed_command in "${allowed_commands_array[@]}" do if [ "${allowed_command}" == "${function_selfname}" ]; then From 15f80f1151699c38f884f9335acb7139b4e8af52 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 05:21:16 +0100 Subject: [PATCH 0485/1895] Run log manager upon update fixes #1075 --- lgsm/functions/command_update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh index bc76a29b2..ad7b76aaf 100644 --- a/lgsm/functions/command_update.sh +++ b/lgsm/functions/command_update.sh @@ -11,7 +11,7 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_print_dots "" sleep 0.5 check.sh - +logs.sh if [ "${gamename}" == "TeamSpeak 3" ]; then update_ts3.sh From 14141d4c8a2421b13207abda74f8c44e701d192c Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 05:27:01 +0100 Subject: [PATCH 0486/1895] Case where there is no console log --- lgsm/functions/update_steamcmd.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 028f843ee..e500a0fbf 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -98,7 +98,11 @@ fn_update_request_log(){ fn_print_dots "Checking for update: Server logs" fn_script_log_info "Checking for update: Server logs" sleep 1 - requestrestart=$(grep -Ec "MasterRequestRestart" "${consolelog}") + if [ -f ${consolelog} ]; then + requestrestart=$(grep -Ec "MasterRequestRestart" "${consolelog}") + else + requestrestart="0" + fi if [ "${requestrestart}" -ge "1" ]; then fn_print_ok_nl "Checking for update: Server logs: Update requested" fn_script_log_pass "Checking for update: Server logs: Update requested" From fadc79e84c1af3f0fec33a7a4b146c02cf5e3a71 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 06:18:25 +0100 Subject: [PATCH 0487/1895] Full path showed to the user fixes #1288 --- lgsm/functions/check_executable.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_executable.sh b/lgsm/functions/check_executable.sh index 14ccdb060..cc90b435d 100644 --- a/lgsm/functions/check_executable.sh +++ b/lgsm/functions/check_executable.sh @@ -9,9 +9,10 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" # Check if executable exists if [ ! -f "${executabledir}/${execname}" ]; then - fn_script_log_warn "Expected executable not found: ${executabledir}/${execname}" + fn_script_log_warn "Executable was not found: ${executabledir}/${execname}" if [ -d "${scriptlogdir}" ]; then - fn_print_fail_nl "Executable ${execname} was not found" + fn_print_fail_nl "Executable was not found:" + echo " * ${executabledir}/${execname}" fi exitcode="1" core_exit.sh From ab8ad9084c89c5871646b022d5fcf00a71aa8e7c Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 06:41:44 +0100 Subject: [PATCH 0488/1895] Only create dirs if they don't already exist --- lgsm/functions/install_logs.sh | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 2019fdb13..0c3e69a4a 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -15,12 +15,22 @@ if [ "${checklogs}" != "1" ]; then fi sleep 1 # Create dir's for the script and console logs -mkdir -v "${rootdir}/log" -mkdir -v "${scriptlogdir}" -touch "${scriptlog}" +if [ ! -d "${rootdir}/log" ]; then + mkdir -v "${rootdir}/log" +fi +if [ ! -d "${scriptlogdir}" ]; then + mkdir -v "${scriptlogdir}" +fi +if [ ! -f "${scriptlog}" ]; then + touch "${scriptlog}" +fi if [ -n "${consolelogdir}" ]; then - mkdir -v "${consolelogdir}" - touch "${consolelog}" + if [ ! -d "${consolelogdir}" ]; then + mkdir -v "${consolelogdir}" + fi + if [ ! -f "${consolelog}" ]; then + touch "${consolelog}" + fi fi # If a server is source or goldsource, TeamSpeak 3, Starbound, Project Zomhoid create a symbolic link to the game server logs. @@ -32,7 +42,9 @@ fi # If a server is unreal2 or unity3d create a dir. if [ "${engine}" == "unreal2" ]||[ "${engine}" == "unity3d" ]||[ "${gamename}" == "Teeworlds" ]||[ "${gamename}" == "seriousengine35" ]; then - mkdir -pv "${gamelogdir}" + if [ ! -d ${gamelogdir}" ]; then + mkdir -pv "${gamelogdir}" + fi fi # If server uses SteamCMD create a symbolic link to the Steam logs. @@ -42,4 +54,4 @@ if [ -d "${rootdir}/Steam/logs" ]; then fi fi sleep 1 -fn_script_log_info "Logs installed" \ No newline at end of file +fn_script_log_info "Logs installed" From 6c6fd3a33c041fb35d24ae7f98f1feeeadf523b1 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 06:49:59 +0100 Subject: [PATCH 0489/1895] Create gamelogdir if variable exists & dir doesn't --- lgsm/functions/check_logs.sh | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh index 5e9da586c..d4fec4b1a 100644 --- a/lgsm/functions/check_logs.sh +++ b/lgsm/functions/check_logs.sh @@ -7,11 +7,20 @@ local commandname="CHECK" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -# Create directories for the script and console logs -if [ ! -d "${scriptlogdir}" ]||[ ! -d "${consolelogdir}" ]&&[ "${gamename}" != "TeamSpeak 3" ]; then +fn_check_logs(){ fn_print_dots "Checking for log files" sleep 0.5 fn_print_info_nl "Checking for log files: Creating log files" checklogs=1 install_logs.sh +} + +# Create directories for the script and console logs +if [ ! -d "${scriptlogdir}" ]||[ ! -d "${consolelogdir}" ]&&[ "${gamename}" != "TeamSpeak 3" ]; then + fn_check_logs +fi + +# Create gamelogdir if variable exist but dir doesn't exist +if [ -n "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then + fn_check_logs fi From 84016558b8df2f5225c7bd4292a78c0a6b4f2e54 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 06:51:09 +0100 Subject: [PATCH 0490/1895] double quote missing --- lgsm/functions/install_logs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 0c3e69a4a..3f6020e45 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -42,7 +42,7 @@ fi # If a server is unreal2 or unity3d create a dir. if [ "${engine}" == "unreal2" ]||[ "${engine}" == "unity3d" ]||[ "${gamename}" == "Teeworlds" ]||[ "${gamename}" == "seriousengine35" ]; then - if [ ! -d ${gamelogdir}" ]; then + if [ ! -d "${gamelogdir}" ]; then mkdir -pv "${gamelogdir}" fi fi From 7edf379b81fc26406cb8766abc6174b16b5f0dbb Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 06:56:19 +0100 Subject: [PATCH 0491/1895] Do not remove legacy logs if empty --- lgsm/functions/logs.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index ac2c3d771..44467d82f 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -101,10 +101,6 @@ if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; th 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 directory if empty - if [ ! "$(ls -A "${legacyserverlogdir}")" ]; then - rm -rf "${legacyserverlogdir}" - fi fi # Count total amount of files removed From 4155af5d60939f69ee6cfebcbae0dbe55ff22d52 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 12:42:02 +0000 Subject: [PATCH 0492/1895] Reverting commit, no requirement to bypass this. Rather than get no output mkdir message states that the directory already exists. This looks better than having nothing at all. --- lgsm/functions/install_logs.sh | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 3f6020e45..2019fdb13 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -15,22 +15,12 @@ if [ "${checklogs}" != "1" ]; then fi sleep 1 # Create dir's for the script and console logs -if [ ! -d "${rootdir}/log" ]; then - mkdir -v "${rootdir}/log" -fi -if [ ! -d "${scriptlogdir}" ]; then - mkdir -v "${scriptlogdir}" -fi -if [ ! -f "${scriptlog}" ]; then - touch "${scriptlog}" -fi +mkdir -v "${rootdir}/log" +mkdir -v "${scriptlogdir}" +touch "${scriptlog}" if [ -n "${consolelogdir}" ]; then - if [ ! -d "${consolelogdir}" ]; then - mkdir -v "${consolelogdir}" - fi - if [ ! -f "${consolelog}" ]; then - touch "${consolelog}" - fi + 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. @@ -42,9 +32,7 @@ fi # If a server is unreal2 or unity3d create a dir. if [ "${engine}" == "unreal2" ]||[ "${engine}" == "unity3d" ]||[ "${gamename}" == "Teeworlds" ]||[ "${gamename}" == "seriousengine35" ]; then - if [ ! -d "${gamelogdir}" ]; then - mkdir -pv "${gamelogdir}" - fi + mkdir -pv "${gamelogdir}" fi # If server uses SteamCMD create a symbolic link to the Steam logs. @@ -54,4 +42,4 @@ if [ -d "${rootdir}/Steam/logs" ]; then fi fi sleep 1 -fn_script_log_info "Logs installed" +fn_script_log_info "Logs installed" \ No newline at end of file From 70922d953a2d3cc36c3bb7c31f3275b884de4802 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 12:44:54 +0000 Subject: [PATCH 0493/1895] comment --- lgsm/functions/check_logs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh index d4fec4b1a..bc4f13bdf 100644 --- a/lgsm/functions/check_logs.sh +++ b/lgsm/functions/check_logs.sh @@ -20,7 +20,7 @@ if [ ! -d "${scriptlogdir}" ]||[ ! -d "${consolelogdir}" ]&&[ "${gamename}" != " fn_check_logs fi -# Create gamelogdir if variable exist but dir doesn't exist +# Create gamelogdir if variable exist but dir does not exist if [ -n "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then fn_check_logs fi From 1520fea4212beee36e36eca0dca4ba6e2aa51cf6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 16:15:02 +0000 Subject: [PATCH 0494/1895] Parms have been removed as uses the config file for settings --- QuakeLive/qlserver | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index ac5f4ab39..4e88012f4 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -24,19 +24,12 @@ version="170212" ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters arch="x64" # x64 or x86 -port="27960" -rconport="28960" -rconpassword="CHANGE_ME" -statsport="${port}" -statspassword="CHANGE_ME" -mappool='mappool.txt' -ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters # Edit with care | 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}/${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}" +parms="+exec ${servercfg}" } #### LinuxGSM Settings #### From 90076ae2ba9b7b56ef0f5707ee43d11015e27921 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 17:18:12 +0000 Subject: [PATCH 0495/1895] New Release 170219 --- 7DaysToDie/sdtdserver | 2 +- ARKSurvivalEvolved/arkserver | 2 +- Arma3/arma3server | 2 +- Battlefield1942/bf1942server | 2 +- BlackMesa/bmdmserver | 2 +- BladeSymphony/bsserver | 2 +- BrainBread2/bb2server | 2 +- CallOfDuty/codserver | 2 +- CallOfDuty2/cod2server | 2 +- CallOfDuty4/cod4server | 2 +- CallOfDutyUnitedOffensive/coduoserver | 2 +- CallOfDutyWorldAtWar/codwawserver | 2 +- CodenameCURE/ccserver | 2 +- CounterStrike/csserver | 2 +- CounterStrikeConditionZero/csczserver | 2 +- CounterStrikeGlobalOffensive/csgoserver | 2 +- CounterStrikeSource/cssserver | 2 +- DayOfDefeat/dodserver | 2 +- DayOfDefeatSource/dodsserver | 2 +- DayOfInfamy/doiserver | 2 +- DeathmatchClassic/dmcserver | 2 +- DontStarveTogether/dstserver | 2 +- DoubleActionBoogaloo/dabserver | 2 +- EmpiresMod/emserver | 2 +- Factorio/fctrserver | 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 +- Minecraft/mcserver | 2 +- MultiTheftAuto/mtaserver | 2 +- Mumble/mumbleserver | 2 +- NS2Combat/ns2cserver | 2 +- NaturalSelection2/ns2server | 2 +- NoMoreRoomInHell/nmrihserver | 2 +- OpposingForce/opforserver | 2 +- PiratesVikingandKnightsII/pvkiiserver | 2 +- ProjectZomboid/pzserver | 2 +- Quake2/q2server | 2 +- Quake3/q3server | 2 +- QuakeLive/qlserver | 2 +- QuakeWorld/qwserver | 2 +- RedOrchestra/roserver | 2 +- Ricochet/ricochetserver | 2 +- Rust/rustserver | 2 +- SeriousSam3BFE/ss3sserver | 2 +- Starbound/sbserver | 2 +- SvenCoop/svenserver | 2 +- TeamFortress2/tf2server | 2 +- TeamFortressClassic/tfcserver | 2 +- TeamSpeak3/ts3server | 2 +- Teeworlds/twserver | 2 +- Terraria/terrariaserver | 2 +- TowerUnite/tuserver | 2 +- UnrealTournament/utserver | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament3/ut3server | 2 +- UnrealTournament99/ut99server | 2 +- WolfensteinEnemyTerritory/wetserver | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_ts3server.sh | 2 +- 69 files changed, 69 insertions(+), 69 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index 0ab687af9..ce73f795c 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index d47590b77..a633d728c 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Arma3/arma3server b/Arma3/arma3server index 74b5532b6..928b2a144 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Battlefield1942/bf1942server b/Battlefield1942/bf1942server index 7e21c0fbc..3111d79d6 100644 --- a/Battlefield1942/bf1942server +++ b/Battlefield1942/bf1942server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index 05d93a735..a3e1e9454 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index 6a486a16e..b0eb68e9b 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index 72700d7e3..0f5cb40d2 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/CallOfDuty/codserver b/CallOfDuty/codserver index c9fd27ae1..788db3838 100755 --- a/CallOfDuty/codserver +++ b/CallOfDuty/codserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/CallOfDuty2/cod2server b/CallOfDuty2/cod2server index 61eac16a7..21481bef6 100755 --- a/CallOfDuty2/cod2server +++ b/CallOfDuty2/cod2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server index 4c9e3c48a..4c0c79a65 100644 --- a/CallOfDuty4/cod4server +++ b/CallOfDuty4/cod4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/CallOfDutyUnitedOffensive/coduoserver b/CallOfDutyUnitedOffensive/coduoserver index 1006c9aaf..bc6b8eaf7 100755 --- a/CallOfDutyUnitedOffensive/coduoserver +++ b/CallOfDutyUnitedOffensive/coduoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/CallOfDutyWorldAtWar/codwawserver b/CallOfDutyWorldAtWar/codwawserver index 1af43280e..a8a9204cb 100755 --- a/CallOfDutyWorldAtWar/codwawserver +++ b/CallOfDutyWorldAtWar/codwawserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index aa7233712..7220ec4d8 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/CounterStrike/csserver b/CounterStrike/csserver index 72eb9bb2a..21a61c540 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index ff72163e8..4047c9128 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index c630e9888..f3954640c 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index 2a8a0b805..af7191cc9 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index cae5ce0e1..e58597264 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 4fcca9610..9a0009754 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/DayOfInfamy/doiserver b/DayOfInfamy/doiserver index 0ea17b569..27de57e53 100644 --- a/DayOfInfamy/doiserver +++ b/DayOfInfamy/doiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index 17e96aa9c..bd7540d3c 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index ec0e5a12b..84db9996f 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index d803cacfa..4bbb6795c 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/EmpiresMod/emserver b/EmpiresMod/emserver index 9f9771d57..929405368 100644 --- a/EmpiresMod/emserver +++ b/EmpiresMod/emserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Factorio/fctrserver b/Factorio/fctrserver index f92db7e47..890562fa9 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index ee2ec15c0..064b1504a 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index d48af2545..70c535bfd 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index 20c639879..0e3f44e64 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index adb1e18e2..a1830b9e7 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index 4c007e738..be1fa33ee 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index 68c4b1904..efec28f28 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index 2e1f7e45f..d43cf4114 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Insurgency/insserver b/Insurgency/insserver index 5778bf628..568da1b1f 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/JustCause2/jc2server b/JustCause2/jc2server index 077595ecf..db5974e42 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index 5e32707a1..da9de5d3c 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index d9a755c65..325ee5af9 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index ac3fa7edf..9097ee97b 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Minecraft/mcserver b/Minecraft/mcserver index 9ebf44f4a..49bed4183 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver index 1132e0cc9..74111e97c 100644 --- a/MultiTheftAuto/mtaserver +++ b/MultiTheftAuto/mtaserver @@ -12,7 +12,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index b27f06ba5..d66ec7d85 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index b7014072f..04c73b2ed 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index 6f6b0cfd2..b718a8180 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index 92f39d795..5a3318e3e 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index 17ce539fb..0b113a03d 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index e909137d3..51c0fc434 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index 3339ac2d6..92c02a44c 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Quake2/q2server b/Quake2/q2server index 9ebc1163e..ff20eaa74 100644 --- a/Quake2/q2server +++ b/Quake2/q2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Quake3/q3server b/Quake3/q3server index b959e7a20..b39697eef 100644 --- a/Quake3/q3server +++ b/Quake3/q3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index 4e88012f4..b2ae067f4 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/QuakeWorld/qwserver b/QuakeWorld/qwserver index 081c5a81a..147d65127 100644 --- a/QuakeWorld/qwserver +++ b/QuakeWorld/qwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index f7b883560..1c7fac367 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index 2cfc3b93f..2a714cc5d 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Rust/rustserver b/Rust/rustserver index 513f6b967..05355eb8c 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index 8c1b31ebd..c3db06006 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Starbound/sbserver b/Starbound/sbserver index c0d59f47e..6672a4f85 100644 --- a/Starbound/sbserver +++ b/Starbound/sbserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/SvenCoop/svenserver b/SvenCoop/svenserver index b320e8812..17348c8a9 100644 --- a/SvenCoop/svenserver +++ b/SvenCoop/svenserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index 313a63c3a..6a5461090 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index ed3d30662..caabf8bf8 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index e28b52d2e..0cae571ca 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Teeworlds/twserver b/Teeworlds/twserver index 2679bc45e..377c70088 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index 5c5b7839c..43abf5a97 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/TowerUnite/tuserver b/TowerUnite/tuserver index 5483eed93..d25bd924e 100644 --- a/TowerUnite/tuserver +++ b/TowerUnite/tuserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/UnrealTournament/utserver b/UnrealTournament/utserver index 037948bfe..2982a1d7d 100644 --- a/UnrealTournament/utserver +++ b/UnrealTournament/utserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index ae270fbb7..b5aae27ff 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/UnrealTournament3/ut3server b/UnrealTournament3/ut3server index f03d2c9a4..4ad601283 100644 --- a/UnrealTournament3/ut3server +++ b/UnrealTournament3/ut3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index 4891a9cba..002b0efe9 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/WolfensteinEnemyTerritory/wetserver b/WolfensteinEnemyTerritory/wetserver index 29d4f889c..9720fcd98 100644 --- a/WolfensteinEnemyTerritory/wetserver +++ b/WolfensteinEnemyTerritory/wetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index e74fdb6c9..aa6362168 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -17,7 +17,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 8a573e048..0b62e3668 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170212" +version="170219" ########################## ######## Settings ######## From 57a40b9c88e826eceef084cf13dc39b78d71a27f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 17:27:50 +0000 Subject: [PATCH 0496/1895] formating --- TowerUnite/tuserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TowerUnite/tuserver b/TowerUnite/tuserver index d25bd924e..500ec01ff 100644 --- a/TowerUnite/tuserver +++ b/TowerUnite/tuserver @@ -194,4 +194,4 @@ fi core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh +core_getopt.sh \ No newline at end of file From 261064738b4f6c0fcb65df9863d0dc44baeb32d1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 17:28:28 +0000 Subject: [PATCH 0497/1895] Re added boserver error caused to to be renamed tuserver --- BallisticOverkill/boserver | 198 +++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 BallisticOverkill/boserver diff --git a/BallisticOverkill/boserver b/BallisticOverkill/boserver new file mode 100644 index 000000000..6ab965bc3 --- /dev/null +++ b/BallisticOverkill/boserver @@ -0,0 +1,198 @@ +#!/bin/bash +# Project: Game Server Managers - LinuxGSM +# Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# Purpose: Ballistic Overkill | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki +# Website: https://gameservermanagers.com + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="170219" + +########################## +######## Settings ######## +########################## + +#### Server Settings #### + +## Optional: Game Server Login Token +# GSLT can be used for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms=" -batchmode -nographics -logFile output.txt" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## SteamCMD Settings +# Server appid +appid="416880" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Ballistic Overkill" +engine="unity" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="bo-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./BODS.x86" +servercfg="${servicename}.txt" +servercfgdefault="config.txt" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directorie +gamelogdir="${systemdir}/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" + +######################## +######## Script ######## +###### Do not edit ##### +######################## + +# 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 -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_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_fetch_core_dl +} + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + +core_dl.sh +core_functions.sh +getopt=$1 +core_getopt.sh \ No newline at end of file From f4759a337e4c6da86b9e6da9a976db2b2e9f4413 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 18:00:42 +0000 Subject: [PATCH 0498/1895] bb2server is an anonymous login --- BrainBread2/bb2server | 5 ----- 1 file changed, 5 deletions(-) diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index 0f5cb40d2..e01b9dbb8 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -20,11 +20,6 @@ version="170219" ######## Settings ######## ########################## -## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -# Steam login -steamuser="username" -steampass='password' - ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters defaultmap="bba_barracks" maxplayers="20" From 6106ff0c10d903fa61a9bda15211e7fa55df8432 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Feb 2017 18:28:14 +0000 Subject: [PATCH 0499/1895] Release 170219 --- BallisticOverkill/boserver | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BallisticOverkill/boserver b/BallisticOverkill/boserver index 6ab965bc3..781fc4af7 100644 --- a/BallisticOverkill/boserver +++ b/BallisticOverkill/boserver @@ -26,10 +26,10 @@ version="170219" # GSLT can be used for running a public server. # More info: https://gameservermanagers.com/gslt gslt="" - +ip="" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms=" -batchmode -nographics -logFile output.txt" +parms=" -batchmode -nographics -dedicated -configfile=${servercfgfullpath}" } #### LinuxGSM Settings #### @@ -78,7 +78,7 @@ branch="" ## LinuxGSM Server Details # Do not edit gamename="Ballistic Overkill" -engine="unity" +engine="unity3d" ## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers servicename="bo-server" From 7d7b448a10584c20a242b1f359a477daca90c84d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 22:20:44 +0100 Subject: [PATCH 0500/1895] More general way of handling logs gamelogdir needs to be created if variable is set, otherwise check_logs.sh will attempt to create it if the server wasn't started yet and directory doesn't exist, as per https://github.com/GameServerManagers/LinuxGSM/blob/master/lgsm/functions/check_logs.sh#L24 symlink is done once gamelogdir is created, if variable is set Working with "if gamelogdir" variable exists is a more general and simple way of doing it and shouldn't cause any kind of issue. --- lgsm/functions/install_logs.sh | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 2019fdb13..5082f30bc 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -14,7 +14,7 @@ if [ "${checklogs}" != "1" ]; then echo "=================================" fi sleep 1 -# Create dir's for the script and console logs +# Create dirs for script and console logs mkdir -v "${rootdir}/log" mkdir -v "${scriptlogdir}" touch "${scriptlog}" @@ -23,23 +23,23 @@ if [ -n "${consolelogdir}" ]; then 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" ]||[ "${engine}" == "unreal" ]; then +# Create gamelogdir if variable exists but directory does not +if [ -n "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then + mkdir -pv "${gamelogdir}" +fi + +# Symlink gamelogdir to lgsm logs if variable exists +if [ -n "${gamelogdir}" ]; 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 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_script_log_info "Logs installed" \ No newline at end of file +fn_script_log_info "Logs installed" From c9db31d17c4f4723330eedbed99404ce03336a93 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 22:34:57 +0100 Subject: [PATCH 0501/1895] comment --- lgsm/functions/install_logs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 5082f30bc..3feb0feea 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -14,7 +14,7 @@ if [ "${checklogs}" != "1" ]; then echo "=================================" fi sleep 1 -# Create dirs for script and console logs +# Create script and console log directories mkdir -v "${rootdir}/log" mkdir -v "${scriptlogdir}" touch "${scriptlog}" From 90f03aea5e0d98470b76ce0ebecdda6a94adc620 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 19 Feb 2017 23:50:42 +0100 Subject: [PATCH 0502/1895] repaired broken command by removing old "done" --- lgsm/functions/command_console.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 98ddcae11..0a93a94fb 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -16,7 +16,6 @@ echo "" if ! fn_prompt_yn "Continue?" Y; then echo Exiting; return fi -done fn_print_dots "Accessing console" sleep 1 check_status.sh From c043eef6efb0d0d367fcf92b0a7a82077973614e Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Sun, 19 Feb 2017 20:27:47 -0500 Subject: [PATCH 0503/1895] adding Base Defense --- BaseDefense/bdefserver | 199 +++++++++++++++++++++++++ lgsm/functions/install_config.sh | 6 + lgsm/functions/install_server_files.sh | 6 +- 3 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 BaseDefense/bdefserver diff --git a/BaseDefense/bdefserver b/BaseDefense/bdefserver new file mode 100644 index 000000000..41e27812b --- /dev/null +++ b/BaseDefense/bdefserver @@ -0,0 +1,199 @@ +#!/bin/bash +# Project: Game Server Managers - LinuxGSM +# Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# Purpose: Base Defense | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki +# Website: https://gameservermanagers.com + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="170219" + +########################## +######## Settings ######## +########################## + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="pve_tomb" +maxplayers="16" +port="27015" +clientport="27005" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game bdef -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="90" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Base Defense" +engine="goldsource" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="bdef-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}/bdfe" +executabledir="${filesdir}" +executable="./hlds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${systemdir}/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" + +######################## +######## Script ######## +###### Do not edit ##### +######################## + +# 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 -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_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_fetch_core_dl +} + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + +core_dl.sh +core_functions.sh +getopt=$1 +core_getopt.sh \ No newline at end of file diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 529f87038..05deba445 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -150,6 +150,12 @@ elif [ "${gamename}" == "Ballistic Overkill" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars +elif [ "${gamename}" == "Base Defense" ]; then + gamedirname="BaseDefense" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Battlefield: 1942" ]; then gamedirname="Battlefield1942" array_configs+=( serversettings.con ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index edee16e9f..360ffa1b2 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -9,7 +9,9 @@ local commandaction="Install" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_install_server_files(){ - if [ "${gamename}" == "Battlefield: 1942" ]; then + if [ "${gamename}" == "Base Defense" ]; then + fileurl="https://s3.amazonaws.com/linuxgsm/base_defense_1775.tar.gz"; filedir="${tmpdir}"; filename="base_defense_1775.tar.gz"; executecmd="noexecute" run="norun"; force="noforce"; md5="a272b65ab014d9e9a103fad26ce11ea5" + elif [ "${gamename}" == "Battlefield: 1942" ]; then fileurl="http://files.gameservermanagers.com/BattleField1942/bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; filedir="${tmpdir}"; filename="bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="a86a5d3cd64ca59abcc9bb9f777c2e5d" elif [ "${gamename}" == "Call of Duty" ]; then fileurl="http://files.gameservermanagers.com/CallOfDuty/cod-lnxded-1.5b-full.tar.bz2"; filedir="${tmpdir}"; filename="cod-lnxded-1.5-large.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="19629895a4cf6fd8f6d1ee198b5304cd" @@ -134,7 +136,7 @@ elif [ "${gamename}" == "Multi Theft Auto" ]; then elif [ "${gamename}" == "Factorio" ]; then update_factorio.sh install_factorio_save.sh -elif [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]; then +elif [ -z "${appid}" ]||[ "${gamename}" == "GoldenEye: Source" ]||[ "${gamename}" == "Base Defense" ]; then if [ "${gamename}" == "Unreal Tournament" ]; then install_unreal_tournament_eula.sh fi From 5a9fb8c865e7da2329b91feed36a0230fe4bf521 Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Sun, 19 Feb 2017 20:51:28 -0500 Subject: [PATCH 0504/1895] fix --- BaseDefense/bdefserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseDefense/bdefserver b/BaseDefense/bdefserver index 41e27812b..5b7916419 100644 --- a/BaseDefense/bdefserver +++ b/BaseDefense/bdefserver @@ -99,7 +99,7 @@ tmpdir="${lgsmdir}/tmp" filesdir="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}/bdfe" +systemdir="${filesdir}/bdef" executabledir="${filesdir}" executable="./hlds_run" servercfg="${servicename}.cfg" From 6f085b28c376d1edb028aede2603ec8d8419f116 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 02:58:15 +0100 Subject: [PATCH 0505/1895] Global source engine FastDL & remove non bz2 files Fixes #1322 and #721 --- lgsm/functions/command_fastdl.sh | 159 +++++++++++++++++++++++++------ 1 file changed, 129 insertions(+), 30 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 9fe7ca68b..28e4b53f5 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -6,11 +6,18 @@ # Description: Creates a FastDL directory. local commandname="FASTDL" -local commandaction="FastDL" +local commandaction="FastDL Generator" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh +# Only Source supports FastDL +if [ "${engine}" != "source" ]; then + fn_print_error "${gamename} does not support FastDL" + fn_script_log_error "${gamename} does not support FastDL" + core_exit.sh +fi + # Directories webdir="${rootdir}/public_html" fastdldir="${webdir}/fastdl" @@ -24,25 +31,27 @@ fn_check_bzip2(){ # Returns true if not installed if [ -z "$(command -v bzip2)" ]; then bzip2installed="0" - fn_print_info "bzip2 is not installed !" - fn_script_log_info "bzip2 is not installed" + fn_print_info "bzip2 is not installed! Install it to enable file compression" + fn_script_log_info "bzip2 is not installed. Install it to enable file compression." + fn_script_log_info "https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL#bzip2-compression" echo -en "\n" sleep 1 - echo "We advise using it" - echo "For more information, see https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL#bzip2-compression" + echo " * https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL#bzip2-compression" sleep 2 + echo "" else bzip2installed="1" fi } fn_fastdl_init(){ - # User confirmation - fn_print_ok "Welcome to LGSM's FastDL generator" + fn_print_header + fn_script_log "Started FastDL Generator" sleep 1 echo -en "\n" - fn_script_log "Started FastDL creation" - if ! fn_prompt_yn "Continue?" Y; then + fn_check_bzip2 + # User confirmation + if ! fn_prompt_yn "Build FastDL directory?" Y; then exit fi fn_script_log "Initiating FastDL creation" @@ -105,7 +114,7 @@ fn_fastdl_config(){ fi } -fn_fastdl_gmod_config(){ +fn_fastdl_gmod_luaenforcer(){ # Prompt for download enforcer, that is using a .lua addfile resource generator fn_print_dots if fn_prompt_yn "Use client download enforcer?" Y; then @@ -130,7 +139,7 @@ fn_clear_old_fastdl(){ fi } -fn_gmod_fastdl(){ +fn_fastdl_gmod(){ # Copy all needed files for FastDL echo "" fn_print_dots "Starting gathering all needed files" @@ -213,7 +222,7 @@ fn_gmod_fastdl(){ fn_script_log "Adjusting addon's file structure" sleep 1 cp -Rf "${fastdldir}"/addons/*/* "${fastdldir}" - #Don't remove yet rm -R "${fastdldir:?}/addons" + # Don't remove yet rm -R "${fastdldir:?}/addons" fn_print_ok "Adjusted addon's file structure" sleep 1 echo -en "\n" @@ -221,7 +230,7 @@ fn_gmod_fastdl(){ # Correct content that may be into a lua directory by mistake like some darkrpmodification addons if [ -d "${fastdldir}/lua" ]; then - fn_print_dots "Typical DarkRP shit detected, fixing" + fn_print_dots "Typical DarkRP files detected, fixing" sleep 2 cp -Rf "${fastdldir}/lua/"* "${fastdldir}" fn_print_ok "Stupid DarkRP file structure fixed" @@ -230,8 +239,80 @@ fn_gmod_fastdl(){ fi } +fn_fastdl_source(){ + # Copy all needed files for FastDL + echo "" + fn_print_dots "Starting gathering all needed files" + fn_script_log "Starting gathering all needed files" + sleep 1 + echo -en "\n" + + # Map Files + fn_print_dots "Copying map files..." + fn_script_log "Copying map files" + sleep 0.5 + mkdir "${fastdldir}/maps" + find "${systemdir}/maps" -name '*.bsp' -exec cp {} "${fastdldir}/maps" \; + find "${systemdir}/maps" -name '*.ain' -exec cp {} "${fastdldir}/maps" \; + find "${systemdir}/maps" -name '*.nav' -exec cp {} "${fastdldir}/maps" \; + find "${systemdir}/maps" -name '*.jpg' -exec cp {} "${fastdldir}/maps" \; + find "${systemdir}/maps" -name '*.txt' -exec cp {} "${fastdldir}/maps" \; + fn_print_ok "Map files copied" + sleep 0.5 + echo -en "\n" + + # Materials + fn_print_dots "Copying materials..." + fn_script_log "Copying materials" + sleep 0.5 + mkdir "${fastdldir}/materials" + find "${systemdir}/materials" -name '*.vtf' -exec cp {} "${fastdldir}/materials" \; + find "${systemdir}/materials" -name '*.vmt' -exec cp {} "${fastdldir}/materials" \; + find "${systemdir}/materials" -name '*.vbf' -exec cp {} "${fastdldir}/materials" \; + fn_print_ok "Materials copied" + sleep 0.5 + echo -en "\n" + + # Models + fn_print_dots "Copying models..." + fn_script_log "Copying models" + sleep 1 + mkdir "${fastdldir}/models" + find "${systemdir}/models" -name '*.vtx' -exec cp {} "${fastdldir}/models" \; + find "${systemdir}/models" -name '*.vvd' -exec cp {} "${fastdldir}/models" \; + find "${systemdir}/models" -name '*.mdl' -exec cp {} "${fastdldir}/models" \; + find "${systemdir}/models" -name '*.phy' -exec cp {} "${fastdldir}/models" \; + find "${systemdir}/models" -name '*.jpg' -exec cp {} "${fastdldir}/models" \; + find "${systemdir}/models" -name '*.png' -exec cp {} "${fastdldir}/models" \; + fn_print_ok "Models copied" + sleep 0.5 + echo -en "\n" + + # Particles + fn_print_dots "Copying particles..." + fn_script_log "Copying particles" + sleep 0.5 + mkdir "${fastdldir}/particles" + find "${systemdir}" -name '*.pcf' -exec cp {} "${fastdldir}/particles" \; + fn_print_ok "Particles copied" + sleep 0.5 + echo -en "\n" + + # Sounds + fn_print_dots "Copying sounds..." + fn_script_log "Copying sounds" + sleep 0.5 + mkdir "${fastdldir}/sound" + find "${systemdir}" -name '*.wav' -exec cp {} "${fastdldir}/sound" \; + find "${systemdir}" -name '*.mp3' -exec cp {} "${fastdldir}/sound" \; + find "${systemdir}" -name '*.ogg' -exec cp {} "${fastdldir}/sound" \; + fn_print_ok "Sounds copied" + sleep 0.5 + echo -en "\n" +} + # Generate lua file that will force download any file into the FastDL directory -fn_lua_fastdl(){ +fn_fastdl_gmod_lua(){ # Remove lua file if luaressource is turned off and file exists echo "" if [ "${luaressource}" == "off" ]; then @@ -286,36 +367,54 @@ fn_fastdl_bzip2(){ fn_script_log "bzip2 compression done" sleep 1 echo -en "\n" + # Prompt for clearing uncompressed files, can save some space but might cause issues for gmod + fn_print_dots + if [ "${gamename}" == "Garry's Mod" ]; then + if fn_prompt_yn "Keep original/uncompressed FastDL files?" N; then + fn_print_info "Keeping uncompressed FastDL files"; fn_script_log fn_print_info "Keeping uncompressed FastDL files" + else + find "${fastdldir}" \( -type f ! -name "*.bz2" \) -exec rm {} \; fn_print_dots "Clearing uncompressed FastDL files..."; sleep 1; fn_print_ok "Cleared uncompressed FastDL files"; fn_script_log "Cleared uncompressed FastDL files." + fi + echo -en "\n" + else + fn_print_dots "Clearing uncompressed FastDL files..." + sleep 1 + find "${fastdldir}" \( -type f ! -name "*.bz2" \) -exec rm {} \ + fn_print_ok "Cleared uncompressed FastDL files." + fn_script_log "Cleared uncompressed FastDL files." + fi fi } fn_fastdl_completed(){ # Finished message echo "" - fn_print_ok "Congratulations, it's done!" + fn_print_ok "FastDL created!" fn_script_log "FastDL job done" sleep 2 echo -en "\n" echo "" - fn_print_info "Need more documentation? See https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL" + fn_print_info_nl "Need more documentation? + echo " * https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL" echo -en "\n" if [ "$bzip2installed" == "0" ]; then - echo "By the way, you'd better install bzip2 and re-run this command!" + echo "By the way, you'd better install bzip2 and re-run this command!" fi - echo "Credits : UltimateByte" + echo "Credits: UltimateByte" } -# Game checking and functions running -# Garry's Mod +# Run functions +fn_check_bzip2 +fn_fastdl_init +fn_fastdl_config +fn_clear_old_fastdl if [ "${gamename}" == "Garry's Mod" ]; then - fn_check_bzip2 - fn_fastdl_init - fn_fastdl_config - fn_fastdl_gmod_config - fn_clear_old_fastdl - fn_gmod_fastdl - fn_lua_fastdl - fn_fastdl_bzip2 - fn_fastdl_completed - exit + fn_fastdl_gmod_luaenforcer + fn_fastdl_gmod + fn_fastdl_gmod_lua +else + fn_fastdl_source fi +fn_fastdl_bzip2 +fn_fastdl_completed +core_exit.sh From 0b3a3d72595552306745da17d8fe3dc376b79246 Mon Sep 17 00:00:00 2001 From: Alexander Hurd Date: Sun, 19 Feb 2017 21:00:30 -0500 Subject: [PATCH 0506/1895] fix --- BaseDefense/bdefserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseDefense/bdefserver b/BaseDefense/bdefserver index 5b7916419..444bf0013 100644 --- a/BaseDefense/bdefserver +++ b/BaseDefense/bdefserver @@ -83,7 +83,7 @@ gamename="Base Defense" engine="goldsource" ## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="bdef-server" +servicename="bdef_server" #### Directories #### # Edit with care From 2ac7d096a3176a7a4d52fdc790513c37e01ad5bd Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 03:02:12 +0100 Subject: [PATCH 0507/1895] added fastdl #721 Added to fn_getopt_generic for now, will need to remove from non-source games when core_getopt.sh rework comes out. --- lgsm/functions/core_getopt.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index bcecc6c2d..1d91f9bc8 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -43,6 +43,8 @@ case "${getopt}" in command_install.sh;; ai|auto-install) fn_autoinstall;; + fd|fastdl) + command_fastdl.sh;; mi|mods-install) command_mods_install.sh;; mu|mods-update) @@ -82,6 +84,7 @@ case "${getopt}" in echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." echo -e "${blue}install\t${default}i |Install the server." echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + echo -e "${blue}fastdl\t${default}fd |Generates or update a FastDL directory for your server." echo -e "${blue}mods-install\t${default}mi |View and install available mods/addons." echo -e "${blue}mods-update\t${default}mu |Update installed mods/addons." echo -e "${blue}mods-remove\t${default}mr |Remove installed mods/addons." From cdba3114a24e63e599dac9487bc30b83f0c4938a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 03:05:52 +0100 Subject: [PATCH 0508/1895] woops double quote --- lgsm/functions/command_fastdl.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 28e4b53f5..4b7584079 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -394,7 +394,7 @@ fn_fastdl_completed(){ sleep 2 echo -en "\n" echo "" - fn_print_info_nl "Need more documentation? + fn_print_info_nl "Need more documentation?" echo " * https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL" echo -en "\n" if [ "$bzip2installed" == "0" ]; then From 3a4266b9f149daa27465e3ee5feb248bd37f0c09 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 03:16:16 +0100 Subject: [PATCH 0509/1895] missing ";", attempt for fix --- lgsm/functions/command_fastdl.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 4b7584079..0f7c034cd 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -373,13 +373,13 @@ fn_fastdl_bzip2(){ if fn_prompt_yn "Keep original/uncompressed FastDL files?" N; then fn_print_info "Keeping uncompressed FastDL files"; fn_script_log fn_print_info "Keeping uncompressed FastDL files" else - find "${fastdldir}" \( -type f ! -name "*.bz2" \) -exec rm {} \; fn_print_dots "Clearing uncompressed FastDL files..."; sleep 1; fn_print_ok "Cleared uncompressed FastDL files"; fn_script_log "Cleared uncompressed FastDL files." + find "${fastdldir}" \( -type f ! -name "*.bz2" \) -exec rm {} \;;fn_print_dots "Clearing uncompressed FastDL files..."; sleep 1; fn_print_ok "Cleared uncompressed FastDL files"; fn_script_log "Cleared uncompressed FastDL files." fi echo -en "\n" else fn_print_dots "Clearing uncompressed FastDL files..." sleep 1 - find "${fastdldir}" \( -type f ! -name "*.bz2" \) -exec rm {} \ + find "${fastdldir}" \( -type f ! -name "*.bz2" \) -exec rm {} \; fn_print_ok "Cleared uncompressed FastDL files." fn_script_log "Cleared uncompressed FastDL files." fi From c9329a02fab2f0b3e38d1b85b1892eb366384697 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 03:20:38 +0100 Subject: [PATCH 0510/1895] no dots in user messages --- lgsm/functions/command_fastdl.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 0f7c034cd..edac9e494 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -380,7 +380,7 @@ fn_fastdl_bzip2(){ fn_print_dots "Clearing uncompressed FastDL files..." sleep 1 find "${fastdldir}" \( -type f ! -name "*.bz2" \) -exec rm {} \; - fn_print_ok "Cleared uncompressed FastDL files." + fn_print_ok "Cleared uncompressed FastDL files" fn_script_log "Cleared uncompressed FastDL files." fi fi From 7693392c5823774014ebbd3f63ada749ef652cd5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 03:25:35 +0100 Subject: [PATCH 0511/1895] addons' --- lgsm/functions/command_fastdl.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index edac9e494..ac16d5e64 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -219,11 +219,11 @@ fn_fastdl_gmod(){ # Correct addons directory structure for FastDL if [ -d "${fastdldir}/addons" ]; then fn_print_info "Adjusting addons' file structure" - fn_script_log "Adjusting addon's file structure" + fn_script_log "Adjusting addons' file structure" sleep 1 cp -Rf "${fastdldir}"/addons/*/* "${fastdldir}" # Don't remove yet rm -R "${fastdldir:?}/addons" - fn_print_ok "Adjusted addon's file structure" + fn_print_ok "Adjusted addons' file structure" sleep 1 echo -en "\n" fi From b4da7c532bbc234db9d236a280910f03f3fda11e Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 04:20:12 +0100 Subject: [PATCH 0512/1895] various improvements to code logic --- lgsm/functions/command_fastdl.sh | 82 ++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 36 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index ac16d5e64..1659a0a21 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -44,11 +44,11 @@ fn_check_bzip2(){ fi } +# Initiates FastDL fn_fastdl_init(){ fn_print_header fn_script_log "Started FastDL Generator" sleep 1 - echo -en "\n" fn_check_bzip2 # User confirmation if ! fn_prompt_yn "Build FastDL directory?" Y; then @@ -72,28 +72,30 @@ fn_fastdl_init(){ fi if [ ! -d "${fastdldir}" ]; then # No directory, won't ask for removing old ones - newfastdl=1 + newfastdl="true" fn_print_dots "Creating fastdl directory" sleep 0.5 mkdir "${fastdldir}" fn_print_ok "Created fastdl directory" - fn_script_log "FastDL created fastdl directory" + fn_script_log "Created fastdl directory" sleep 1 echo -en "\n" clearoldfastdl="off" # Nothing to clear elif [ "$(ls -A "${fastdldir}")" ]; then - newfastdl=0 + newfastdl="false" + else + newfastdl="true" fi } +# Prompts user for FastDL creation settings fn_fastdl_config(){ - # Global settings for FastDL creation fn_print_info "Entering configuration" fn_script_log "Configuration" sleep 2 echo -en "\n" # Prompt for clearing old files if directory was already here - if [ -n "${newfastdl}" ] && [ "${newfastdl}" == "0" ]; then + if [ "${newfastdl}" == "false" ]; then fn_print_dots if fn_prompt_yn "Clear old FastDL files?" Y; then clearoldfastdl="on"; fn_script_log "clearoldfastdl enabled"; fn_print_ok "Clearing Enabled" @@ -102,27 +104,42 @@ fn_fastdl_config(){ fi echo -en "\n" fi - # Prompt for using bzip2 if it's installed + # Settings for bzip2 users if [ ${bzip2installed} == 1 ]; then + # Prompt for using bzip2 if it's installed fn_print_dots - if fn_prompt_yn "Enable file compression using bzip2?" Y; then + if fn_prompt_yn "Enable bzip2 file compression?" Y; then bzip2enable="on"; fn_script_log "bzip2 enabled"; fn_print_ok "bzip2 Enabled" else bzip2enable="off"; fn_script_log "bzip2 disabled"; fn_print_ok "bzip2 Disabled" fi echo -en "\n" + if [ "${gamename}" == "Garry's Mod" ]&&[ "${bzip2enable}" == "on" ]; then + # Prompt for removing uncompressed FastDL files + fn_print_dots + if fn_prompt_yn "Keep original uncompressed FastDL files?" N; then + clearnonbzip2="on"; fn_script_log "Original uncompressed fastDL files won't be kept."; fn_print_ok "Original uncompressed fastDL files won't be kept" + else + clearnonbzip2="off"; fn_script_log "Original uncompressed fastDL files will be kept."; fn_print_ok "Original uncompressed fastDL files will be kept" + fi + echo -en "\n" + else + # Other games default remove non bzip2 files + clearnonbzip2="on" + fn_script_log "Original uncompressed fastDL files won't be kept." + fi fi -} - -fn_fastdl_gmod_luaenforcer(){ - # Prompt for download enforcer, that is using a .lua addfile resource generator - fn_print_dots - if fn_prompt_yn "Use client download enforcer?" Y; then - luaressource="on"; fn_script_log "DL enforcer Enabled"; fn_print_ok "Enforcer Enabled" - else - luaressource="off"; fn_script_log "DL enforcer Disabled"; fn_print_ok "Enforcer Disabled" + # Garry's Mod Specific + if [ "${gamename}" == "Garry's Mod" ]; then + # Prompt for download enforcer, which is using a .lua addfile resource generator + fn_print_dots + if fn_prompt_yn "Use client download enforcer?" Y; then + luaressource="on"; fn_script_log "DL enforcer Enabled"; fn_print_ok "Enforcer Enabled" + else + luaressource="off"; fn_script_log "DL enforcer Disabled"; fn_print_ok "Enforcer Disabled" + fi + echo -en "\n" fi - echo -en "\n" } fn_clear_old_fastdl(){ @@ -148,8 +165,8 @@ fn_fastdl_gmod(){ echo -en "\n" # No choice to cd to the directory, as find can't then display relative directory - cd "${systemdir}" - + cd "${systemdir}" || exit + # Map Files fn_print_dots "Copying map files..." fn_script_log "Copying map files" @@ -312,7 +329,7 @@ fn_fastdl_source(){ } # Generate lua file that will force download any file into the FastDL directory -fn_fastdl_gmod_lua(){ +fn_fastdl_gmod_lua_enforcer(){ # Remove lua file if luaressource is turned off and file exists echo "" if [ "${luaressource}" == "off" ]; then @@ -341,8 +358,8 @@ fn_fastdl_gmod_lua(){ fn_script_log "Generating new download enforcer" sleep 1 # Read all filenames and put them into a lua file at the right path - find "${fastdldir}" \( -type f ! -name "*.bz2" \) -printf '%P\n' | while read line; do - echo "resource.AddFile( "\""${line}"\"" )" >> ${luafastdlfullpath} + find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -printf '%P\n' | while read line; do + echo "resource.AddFile( "\""${line}"\"" )" >> "${luafastdlfullpath}" done fn_print_ok "Download enforcer generated" fn_script_log "Download enforcer generated" @@ -362,24 +379,18 @@ fn_fastdl_bzip2(){ fn_print_dots "Compressing files using bzip2..." fn_script_log "Compressing files using bzip2..." # bzip2 all files that are not already compressed (keeping original files) - find "${fastdldir}" \( -type f ! -name "*.bz2" \) -exec bzip2 -qk \{\} \; + find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -exec bzip2 -qk \{\} \; fn_print_ok "bzip2 compression done" fn_script_log "bzip2 compression done" sleep 1 echo -en "\n" # Prompt for clearing uncompressed files, can save some space but might cause issues for gmod fn_print_dots - if [ "${gamename}" == "Garry's Mod" ]; then - if fn_prompt_yn "Keep original/uncompressed FastDL files?" N; then - fn_print_info "Keeping uncompressed FastDL files"; fn_script_log fn_print_info "Keeping uncompressed FastDL files" - else - find "${fastdldir}" \( -type f ! -name "*.bz2" \) -exec rm {} \;;fn_print_dots "Clearing uncompressed FastDL files..."; sleep 1; fn_print_ok "Cleared uncompressed FastDL files"; fn_script_log "Cleared uncompressed FastDL files." - fi - echo -en "\n" - else - fn_print_dots "Clearing uncompressed FastDL files..." + # Clear non compressed FastDL files + if [ "${clearnonbzip2}" == "on" ]; then + fn_print_dots "Clearing original uncompressed FastDL files..." sleep 1 - find "${fastdldir}" \( -type f ! -name "*.bz2" \) -exec rm {} \; + find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -exec rm {} \; fn_print_ok "Cleared uncompressed FastDL files" fn_script_log "Cleared uncompressed FastDL files." fi @@ -409,9 +420,8 @@ fn_fastdl_init fn_fastdl_config fn_clear_old_fastdl if [ "${gamename}" == "Garry's Mod" ]; then - fn_fastdl_gmod_luaenforcer fn_fastdl_gmod - fn_fastdl_gmod_lua + fn_fastdl_gmod_lua_enforcer else fn_fastdl_source fi From b94bb9a29352412e3bc2357f9628e7ee2ee23705 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 04:30:07 +0100 Subject: [PATCH 0513/1895] useless print_dots --- lgsm/functions/command_fastdl.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 1659a0a21..a79aeb5e9 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -115,7 +115,7 @@ fn_fastdl_config(){ fi echo -en "\n" if [ "${gamename}" == "Garry's Mod" ]&&[ "${bzip2enable}" == "on" ]; then - # Prompt for removing uncompressed FastDL files + # Prompt for clearing uncompressed files, can save some space but might cause issues for gmod fn_print_dots if fn_prompt_yn "Keep original uncompressed FastDL files?" N; then clearnonbzip2="on"; fn_script_log "Original uncompressed fastDL files won't be kept."; fn_print_ok "Original uncompressed fastDL files won't be kept" @@ -384,8 +384,6 @@ fn_fastdl_bzip2(){ fn_script_log "bzip2 compression done" sleep 1 echo -en "\n" - # Prompt for clearing uncompressed files, can save some space but might cause issues for gmod - fn_print_dots # Clear non compressed FastDL files if [ "${clearnonbzip2}" == "on" ]; then fn_print_dots "Clearing original uncompressed FastDL files..." From c517b4624bc7a1190609d4423b03c74f6f63acf9 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 04:40:15 +0100 Subject: [PATCH 0514/1895] Inverted gmod clearnonbzip2 --- lgsm/functions/command_fastdl.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index a79aeb5e9..2c12ded38 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -118,9 +118,9 @@ fn_fastdl_config(){ # Prompt for clearing uncompressed files, can save some space but might cause issues for gmod fn_print_dots if fn_prompt_yn "Keep original uncompressed FastDL files?" N; then - clearnonbzip2="on"; fn_script_log "Original uncompressed fastDL files won't be kept."; fn_print_ok "Original uncompressed fastDL files won't be kept" - else clearnonbzip2="off"; fn_script_log "Original uncompressed fastDL files will be kept."; fn_print_ok "Original uncompressed fastDL files will be kept" + else + clearnonbzip2="on"; fn_script_log "Original uncompressed fastDL files won't be kept."; fn_print_ok "Original uncompressed fastDL files won't be kept" fi echo -en "\n" else From 828a9831b5a765c107c6a3ab1e7c3238bc485df7 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 05:55:29 +0100 Subject: [PATCH 0515/1895] chivalry init --- ChivalryMedievalWarfare/chivalrymwserver | 199 +++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 ChivalryMedievalWarfare/chivalrymwserver diff --git a/ChivalryMedievalWarfare/chivalrymwserver b/ChivalryMedievalWarfare/chivalrymwserver new file mode 100644 index 000000000..2f4179304 --- /dev/null +++ b/ChivalryMedievalWarfare/chivalrymwserver @@ -0,0 +1,199 @@ +#!/bin/bash +# Project: Game Server Managers - LinuxGSM +# Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# Purpose: Chivalry: Medieval Warfare | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki +# Website: https://gameservermanagers.com + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="170219" + +########################## +######## Settings ######## +########################## + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port=7000" +queryport="7010" +adminpassword="CHANGE_ME" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="aocffa-moor_p\?steamsockets\?adminpassword=${adminpassword}\?port=${port}\?queryport=${queryport} -seekfreeloadingserver" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="220070" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Chivalry: Medieval Warfare" +engine="unreal3" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="chivalrymw-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./UDKGameServer-Linux" +servercfg="unknown" +servercfgdefault="unknown" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${rootdir}/log/server" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +gamelog="${gamelogdir}/${servicename}-game.log" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" + +######################## +######## Script ######## +###### Do not edit ##### +######################## + +# 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 -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_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_fetch_core_dl +} + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + +core_dl.sh +core_functions.sh +getopt=$1 +core_getopt.sh From 51542d311f7d6378dbb8ae7713fb0bf3ffd3c5fa Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 05:56:39 +0100 Subject: [PATCH 0516/1895] double quote --- ChivalryMedievalWarfare/chivalrymwserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChivalryMedievalWarfare/chivalrymwserver b/ChivalryMedievalWarfare/chivalrymwserver index 2f4179304..0192710fd 100644 --- a/ChivalryMedievalWarfare/chivalrymwserver +++ b/ChivalryMedievalWarfare/chivalrymwserver @@ -24,7 +24,7 @@ version="170219" ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters ip="0.0.0.0" -port=7000" +port="7000" queryport="7010" adminpassword="CHANGE_ME" From 8f0e4c07a0e04318c5af26733db57b83e0fc1f10 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 06:05:11 +0100 Subject: [PATCH 0517/1895] execdir --- ChivalryMedievalWarfare/chivalrymwserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChivalryMedievalWarfare/chivalrymwserver b/ChivalryMedievalWarfare/chivalrymwserver index 0192710fd..ad1a83d94 100644 --- a/ChivalryMedievalWarfare/chivalrymwserver +++ b/ChivalryMedievalWarfare/chivalrymwserver @@ -99,7 +99,7 @@ filesdir="${rootdir}/serverfiles" ## Server Specific Directories systemdir="${filesdir}" -executabledir="${filesdir}" +executabledir="${filesdir}/Binaries/Linux/" executable="./UDKGameServer-Linux" servercfg="unknown" servercfgdefault="unknown" From 5f53f4c22b12e37bc42774ada7088c0adec75670 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 06:19:43 +0100 Subject: [PATCH 0518/1895] cfg files --- ChivalryMedievalWarfare/chivalrymwserver | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ChivalryMedievalWarfare/chivalrymwserver b/ChivalryMedievalWarfare/chivalrymwserver index ad1a83d94..6315fc2e3 100644 --- a/ChivalryMedievalWarfare/chivalrymwserver +++ b/ChivalryMedievalWarfare/chivalrymwserver @@ -101,9 +101,9 @@ filesdir="${rootdir}/serverfiles" systemdir="${filesdir}" executabledir="${filesdir}/Binaries/Linux/" executable="./UDKGameServer-Linux" -servercfg="unknown" -servercfgdefault="unknown" -servercfgdir="${systemdir}" +servercfg="PCServer-UDKGame.ini" +servercfgdefault="PCServer-UDKGame.ini" +servercfgdir="${systemdir}/UDKGame/Config" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory From a2a21a1e73e2b6125e08cf84ef2ae752ef8aa516 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 06:27:22 +0100 Subject: [PATCH 0519/1895] gamelog & multihome --- ChivalryMedievalWarfare/chivalrymwserver | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ChivalryMedievalWarfare/chivalrymwserver b/ChivalryMedievalWarfare/chivalrymwserver index 6315fc2e3..fab972b91 100644 --- a/ChivalryMedievalWarfare/chivalrymwserver +++ b/ChivalryMedievalWarfare/chivalrymwserver @@ -30,7 +30,7 @@ adminpassword="CHANGE_ME" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="aocffa-moor_p\?steamsockets\?adminpassword=${adminpassword}\?port=${port}\?queryport=${queryport} -seekfreeloadingserver" +parms="aocffa-moor_p\?steamsockets\?adminpassword=${adminpassword}\?port=${port}\?queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog} -seekfreeloadingserver" } #### LinuxGSM Settings #### @@ -121,6 +121,7 @@ emaillog="${scriptlogdir}/${servicename}-email.log" ## Logs Naming scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" ######################## ######## Script ######## From ec30a155cef3f6e1d695c94654dc2f0095e74823 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 06:41:47 +0100 Subject: [PATCH 0520/1895] New default ports & password through cfg file --- ChivalryMedievalWarfare/chivalrymwserver | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ChivalryMedievalWarfare/chivalrymwserver b/ChivalryMedievalWarfare/chivalrymwserver index fab972b91..6fd0d8ff0 100644 --- a/ChivalryMedievalWarfare/chivalrymwserver +++ b/ChivalryMedievalWarfare/chivalrymwserver @@ -24,13 +24,12 @@ version="170219" ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters ip="0.0.0.0" -port="7000" -queryport="7010" -adminpassword="CHANGE_ME" +port="7777" +queryport="27960" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="aocffa-moor_p\?steamsockets\?adminpassword=${adminpassword}\?port=${port}\?queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog} -seekfreeloadingserver" +parms="aocffa-moor_p\?steamsockets\?port=${port}\?queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog} -seekfreeloadingserver" } #### LinuxGSM Settings #### From ac0390719f940ba989fb9a5af7ae1986cd611fdf Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 19:17:57 +0100 Subject: [PATCH 0521/1895] fit changes to master --- lgsm/functions/install_logs.sh | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 2019fdb13..3feb0feea 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -14,7 +14,7 @@ if [ "${checklogs}" != "1" ]; then echo "=================================" fi sleep 1 -# Create dir's for the script and console logs +# Create script and console log directories mkdir -v "${rootdir}/log" mkdir -v "${scriptlogdir}" touch "${scriptlog}" @@ -23,23 +23,23 @@ if [ -n "${consolelogdir}" ]; then 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" ]||[ "${engine}" == "unreal" ]; then +# Create gamelogdir if variable exists but directory does not +if [ -n "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then + mkdir -pv "${gamelogdir}" +fi + +# Symlink gamelogdir to lgsm logs if variable exists +if [ -n "${gamelogdir}" ]; 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 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_script_log_info "Logs installed" \ No newline at end of file +fn_script_log_info "Logs installed" From 0c94a78f908228984f3448ee68feb776fea7850c Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 19:18:23 +0100 Subject: [PATCH 0522/1895] Fit changes to master --- lgsm/functions/command_console.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 98ddcae11..0a93a94fb 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -16,7 +16,6 @@ echo "" if ! fn_prompt_yn "Continue?" Y; then echo Exiting; return fi -done fn_print_dots "Accessing console" sleep 1 check_status.sh From 418fb6b9ea19870e03737b901a32b6228c2e0e19 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 19:55:21 +0100 Subject: [PATCH 0523/1895] allow addons clear + more logic output --- lgsm/functions/command_fastdl.sh | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 2c12ded38..8a02f90a4 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -117,10 +117,10 @@ fn_fastdl_config(){ if [ "${gamename}" == "Garry's Mod" ]&&[ "${bzip2enable}" == "on" ]; then # Prompt for clearing uncompressed files, can save some space but might cause issues for gmod fn_print_dots - if fn_prompt_yn "Keep original uncompressed FastDL files?" N; then - clearnonbzip2="off"; fn_script_log "Original uncompressed fastDL files will be kept."; fn_print_ok "Original uncompressed fastDL files will be kept" + if fn_prompt_yn "Clear non-bzip2 FastDL files?" Y; then + clearnonbzip2="on"; fn_script_log "Clearing non-bzip2 files Enabled."; fn_print_ok "Clearing non-bzip2 files Enabled" else - clearnonbzip2="on"; fn_script_log "Original uncompressed fastDL files won't be kept."; fn_print_ok "Original uncompressed fastDL files won't be kept" + clearnonbzip2="off"; fn_script_log "Clearing non-bzip2 files Disabled."; fn_print_ok "Clearing non-bzip2 files Disabled" fi echo -en "\n" else @@ -131,12 +131,18 @@ fn_fastdl_config(){ fi # Garry's Mod Specific if [ "${gamename}" == "Garry's Mod" ]; then + if fn_prompt_yn "Clear addons dir from fastdl dir?" Y; then + cleargmodaddons="on"; fn_script_log "Addons clearing Enabled."; fn_print_ok "Addons clearing Enabled" + else + cleargmodaddons="off"; fn_script_log "Addons clearing Disabled."; fn_print_ok "Addons clearing Disabled" + fi + echo -en "\n" # Prompt for download enforcer, which is using a .lua addfile resource generator fn_print_dots if fn_prompt_yn "Use client download enforcer?" Y; then - luaressource="on"; fn_script_log "DL enforcer Enabled"; fn_print_ok "Enforcer Enabled" + luaressource="on"; fn_script_log "DL enforcer Enabled."; fn_print_ok "Enforcer Enabled" else - luaressource="off"; fn_script_log "DL enforcer Disabled"; fn_print_ok "Enforcer Disabled" + luaressource="off"; fn_script_log "DL enforcer Disabled."; fn_print_ok "Enforcer Disabled" fi echo -en "\n" fi @@ -239,10 +245,19 @@ fn_fastdl_gmod(){ fn_script_log "Adjusting addons' file structure" sleep 1 cp -Rf "${fastdldir}"/addons/*/* "${fastdldir}" - # Don't remove yet rm -R "${fastdldir:?}/addons" fn_print_ok "Adjusted addons' file structure" sleep 1 echo -en "\n" + # Clear addons directory in fastdl + if [ "${cleargmodaddons}" == "on" ]; then + fn_print_info "Clearing addons dir from fastdl dir" + fn_script_log "Clearing addons dir from fastdl dir" + sleep 1 + rm -R "${fastdldir:?}/addons" + fn_print_ok "Cleared addons dir from fastdl dir" + sleep 1 + echo -en "\n" + fi fi # Correct content that may be into a lua directory by mistake like some darkrpmodification addons From 184396a5ebc333218c0580f00cfdf0d66e14a9d2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 19:58:59 +0100 Subject: [PATCH 0524/1895] print dots --- lgsm/functions/command_fastdl.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 8a02f90a4..5d20df759 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -131,6 +131,8 @@ fn_fastdl_config(){ fi # Garry's Mod Specific if [ "${gamename}" == "Garry's Mod" ]; then + # Prompt to clear addons dir from fastdl, can use unnecessary space or be required depending on addon's file structures + fn_print_dots if fn_prompt_yn "Clear addons dir from fastdl dir?" Y; then cleargmodaddons="on"; fn_script_log "Addons clearing Enabled."; fn_print_ok "Addons clearing Enabled" else From b00548f6bb259539a93def9140a41764b9bd86fe Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 20 Feb 2017 19:54:44 +0000 Subject: [PATCH 0525/1895] Added auto instal to mumble server --- lgsm/functions/core_getopt.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index bcecc6c2d..e738cab25 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -453,6 +453,8 @@ case "${getopt}" in command_console.sh;; i|install) command_install.sh;; + ai|auto-install) + fn_autoinstall;; dd|detect-deps) command_dev_detect_deps.sh;; dg|detect-glibc) @@ -482,6 +484,7 @@ case "${getopt}" in echo -e "${blue}backup\t${default}b |Create archive of the server." echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." } | column -s $'\t' -t esac } From 9d5097f9cd7ec243fcc9d8f2188e85a753a418c6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 20 Feb 2017 19:56:34 +0000 Subject: [PATCH 0526/1895] debug option was missing from mumbleserver --- lgsm/functions/core_getopt.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index e738cab25..a63efc6cc 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -447,6 +447,8 @@ case "${getopt}" in command_postdetails.sh;; b|backup) command_backup.sh;; + d|debug) + command_debug.sh;; dev|dev-debug) command_dev_debug.sh;; c|console) From b3c615f333d4cc27029a0e41eab8481d8344a622 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 20 Feb 2017 21:01:04 +0000 Subject: [PATCH 0527/1895] Fixed IP for MTA server --- lgsm/functions/info_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 9ce3ba242..cb17e09d5 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -663,7 +663,7 @@ fn_info_config_mta(){ ase="Disabled" fi - ip=$(grep -m 1 "serverip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]') + ip=$(grep -m 1 "serverip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's///g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<") ipsetinconfig=1 ipinconfigvar="serverip" From 73a44719ae7ce2c1709cca5f7e953dcfe2de9ae3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 20 Feb 2017 21:31:14 +0000 Subject: [PATCH 0528/1895] Added several more games to graceful shutdown --- lgsm/functions/command_stop.sh | 38 ++++++---------------------------- 1 file changed, 6 insertions(+), 32 deletions(-) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 341ad4d95..bef3ddf26 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -231,9 +231,9 @@ fn_stop_graceful_mta(){ fn_stop_graceful_select(){ if [ "${gamename}" == "7 Days To Die" ]; then fn_stop_graceful_sdtd - elif [ "${gamename}" == "Factorio" ]||[ "${engine}" == "unreal4" ]||[ "${engine}" == "unreal3" ]||[ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ]; then + elif [ "${gamename}" == "Factorio" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Multi Theft Auto" ]||[ "${engine}" == "unity3d" ]||[ "${engine}" == "unreal4" ]||[ "${engine}" == "unreal3" ]||[ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ]||[ "${gamename}" == "Mumble" ]; then fn_stop_graceful_ctrlc - elif [ "${engine}" == "source" ]||[ "${engine}" == "quake" ]||[ "${engine}" == "idtech2" ]||[ "${engine}" == "idtech3" ]||[ "${engine}" == "idtech3_ql" ]; then + elif [ "${engine}" == "source" ]||[ "${engine}" == "quake" ]||[ "${engine}" == "idtech2" ]||[ "${engine}" == "idtech3" ]||[ "${engine}" == "idtech3_ql" ]||[ "${engine}" == "Just Cause 2" ]; then fn_stop_graceful_quit elif [ "${engine}" == "goldsource" ]; then fn_stop_graceful_goldsource @@ -290,8 +290,8 @@ fn_stop_ark(){ fn_stop_teamspeak3(){ fn_print_dots "${servername}" - sleep 1 - ${filesdir}/ts3server_startscript.sh stop > /dev/null 2>&1 + sleep 0.5 + "${filesdir}"/ts3server_startscript.sh stop > /dev/null 2>&1 check_status.sh if [ "${status}" == "0" ]; then # Remove lockfile @@ -304,29 +304,10 @@ fn_stop_teamspeak3(){ fi } -fn_stop_mumble(){ - # Get needed port info - info_config.sh - fn_print_dots "Stopping ${servername}" - mumblepid=$(netstat -nap 2>/dev/null | grep udp | grep "${port}" | grep murmur | awk '{ print $6 }' | awk -F'/' '{ print $1 }') - kill ${mumblepid} - sleep 1 - check_status.sh - if [ "${status}" == "0" ]; then - # Remove lockfile - rm -f "${rootdir}/${lockselfname}" - fn_stop_tmux - fn_script_log_pass "Stopped ${servername}" - else - fn_print_fail_nl "Unable to stop ${servername}" - fn_script_log_error "Unable to stop ${servername}" - fi -} - fn_stop_tmux(){ fn_print_dots "${servername}" fn_script_log_info "tmux kill-session: ${servername}" - sleep 1 + sleep 0.5 # Kill tmux session tmux kill-session -t "${servicename}" > /dev/null 2>&1 sleep 0.5 @@ -357,13 +338,6 @@ fn_stop_pre_check(){ else fn_stop_teamspeak3 fi - elif [ "${gamename}" == "Mumble" ]; then - if [ "${status}" == "0" ]; then - fn_print_info_nl "${servername} is already stopped" - fn_script_log_error "${servername} is already stopped" - else - fn_stop_mumble - fi else if [ "${status}" == "0" ]; then fn_print_info_nl "${servername} is already stopped" @@ -375,7 +349,7 @@ fn_stop_pre_check(){ } fn_print_dots "${servername}" -sleep 1 +sleep 0.5 check.sh info_config.sh fn_stop_pre_check From b6a708fcd97c54c5a6bb6c54e27002f0ae3b900a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 23:34:52 +0100 Subject: [PATCH 0529/1895] Attempt for new op --- lgsm/functions/core_getopt.sh | 1090 ++++----------------------------- 1 file changed, 128 insertions(+), 962 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 1d91f9bc8..f87b55a0e 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -6,980 +6,146 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -fn_getopt_generic(){ -case "${getopt}" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - command_restart.sh;; - u|update) - command_update.sh;; - fu|force-update|update-restart) - forceupdate=1; - command_update.sh;; - uf|update-functions) - command_update_functions.sh;; - v|validate) - command_validate.sh;; - m|monitor) - command_monitor.sh;; - ta|test-alert) - command_test_alert.sh;; - dt|details) - command_details.sh;; - pd|postdetails) - command_postdetails.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;; - fd|fastdl) - command_fastdl.sh;; - mi|mods-install) - command_mods_install.sh;; - mu|mods-update) - command_mods_update.sh;; - mr|mods-remove) - command_mods_remove.sh;; - dd|detect-deps) - command_dev_detect_deps.sh;; - dg|detect-glibc) - command_dev_detect_glibc.sh;; - dl|detect-ldd) - command_dev_detect_ldd.sh;; - *) - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - fi - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "https://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "${lightyellow}Commands${default}" - { - echo -e "${blue}start\t${default}st |Start the server." - echo -e "${blue}stop\t${default}sp |Stop the server." - echo -e "${blue}restart\t${default}r |Restart the server." - echo -e "${blue}update\t${default}u |Checks and applies updates from SteamCMD." - echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD." - echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." - echo -e "${blue}validate\t${default}v |Validate server files with SteamCMD." - echo -e "${blue}monitor\t${default}m |Checks that the server is running." - echo -e "${blue}test-alert\t${default}ta |Sends test alert." - echo -e "${blue}details\t${default}dt |Displays useful information about the server." - echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" - echo -e "${blue}backup\t${default}b |Create archive of the server." - echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." - echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." - echo -e "${blue}install\t${default}i |Install the server." - echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." - echo -e "${blue}fastdl\t${default}fd |Generates or update a FastDL directory for your server." - echo -e "${blue}mods-install\t${default}mi |View and install available mods/addons." - echo -e "${blue}mods-update\t${default}mu |Update installed mods/addons." - echo -e "${blue}mods-remove\t${default}mr |Remove installed mods/addons." - } | column -s $'\t' -t - esac -} - -fn_getopt_generic_update_no_steam(){ -case "${getopt}" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - command_restart.sh;; - u|update) - command_update.sh;; - uf|update-functions) - command_update_functions.sh;; - m|monitor) - command_monitor.sh;; - ta|test-alert) - command_test_alert.sh;; - dt|details) - command_details.sh;; - pd|postdetails) - command_postdetails.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|detect-deps) - command_dev_detect_deps.sh;; - dg|detect-glibc) - command_dev_detect_glibc.sh;; - dl|detect-ldd) - command_dev_detect_ldd.sh;; - *) - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - fi - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "https://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "${lightyellow}Commands${default}" - { - echo -e "${blue}start\t${default}st |Start the server." - echo -e "${blue}stop\t${default}sp |Stop the server." - echo -e "${blue}restart\t${default}r |Restart the server." - echo -e "${blue}update\t${default}u |Checks and applies updates." - echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." - echo -e "${blue}monitor\t${default}m |Checks that the server is running." - echo -e "${blue}test-alert\t${default}ta |Sends test alert." - echo -e "${blue}details\t${default}dt |Displays useful information about the server." - echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" - echo -e "${blue}backup\t${default}b |Create archive of the server." - echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." - echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." - echo -e "${blue}install\t${default}i |Install the server." - echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." - } | column -s $'\t' -t - esac -} - -fn_getopt_generic_no_update(){ -case "${getopt}" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - command_restart.sh;; - uf|update-functions) - command_update_functions.sh;; - m|monitor) - command_monitor.sh;; - ta|test-alert) - command_test_alert.sh;; - dt|details) - command_details.sh;; - pd|postdetails) - command_postdetails.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|detect-deps) - command_dev_detect_deps.sh;; - dg|detect-glibc) - command_dev_detect_glibc.sh;; - dl|detect-ldd) - command_dev_detect_ldd.sh;; - *) - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - fi - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "https://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "${lightyellow}Commands${default}" - { - echo -e "${blue}start\t${default}st |Start the server." - echo -e "${blue}stop\t${default}sp |Stop the server." - echo -e "${blue}restart\t${default}r |Restart the server." - echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." - echo -e "${blue}monitor\t${default}m |Checks that the server is running." - echo -e "${blue}test-alert\t${default}ta |Sends test alert." - echo -e "${blue}details\t${default}dt |Displays useful infomation about the server." - echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" - echo -e "${blue}backup\t${default}b |Create archive of the server." - echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." - echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." - echo -e "${blue}install\t${default}i |Install the server." - echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." - } | column -s $'\t' -t - esac -} - -fn_getopt_teamspeak3(){ -case "${getopt}" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - command_restart.sh;; - u|update) - command_update.sh;; - uf|update-functions) - command_update_functions.sh;; - m|monitor) - command_monitor.sh;; - ta|test-alert) - command_test_alert.sh;; - dt|details) - command_details.sh;; - pd|postdetails) - command_postdetails.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|detect-deps) - command_dev_detect_deps.sh;; - dg|detect-glibc) - command_dev_detect_glibc.sh;; - dl|detect-ldd) - command_dev_detect_ldd.sh;; - *) - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - fi - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "https://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "${lightyellow}Commands${default}" - { - echo -e "${blue}start\t${default}st |Start the server." - echo -e "${blue}stop\t${default}sp |Stop the server." - echo -e "${blue}restart\t${default}r |Restart the server." - echo -e "${blue}update\t${default}u |Checks and applies updates from teamspeak.com." - echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." - echo -e "${blue}monitor\t${default}m |Checks that the server is running." - echo -e "${blue}test-alert\t${default}ta |Sends test alert." - echo -e "${blue}details\t${default}dt |Displays useful information about the server." - echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" - echo -e "${blue}change-password\t${default}pw |Changes TS3 serveradmin password." - echo -e "${blue}backup\t${default}b |Create archive of the server." - echo -e "${blue}install\t${default}i |Install the server." - echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." - } | column -s $'\t' -t - esac -} - -fn_getopt_minecraft(){ -case "${getopt}" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - command_restart.sh;; - u|update) - command_update.sh;; - uf|update-functions) - command_update_functions.sh;; - m|monitor) - command_monitor.sh;; - ta|test-alert) - command_test_alert.sh;; - dt|details) - command_details.sh;; - pd|postdetails) - command_postdetails.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|detect-deps) - command_dev_detect_deps.sh;; - dg|detect-glibc) - command_dev_detect_glibc.sh;; - dl|detect-ldd) - command_dev_detect_ldd.sh;; - *) - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - fi - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "https://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "${lightyellow}Commands${default}" - { - echo -e "${blue}start\t${default}st |Start the server." - echo -e "${blue}stop\t${default}sp |Stop the server." - echo -e "${blue}restart\t${default}r |Restart the server." - echo -e "${blue}update\t${default}u |Checks and applies updates from mojang.com." - echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." - echo -e "${blue}monitor\t${default}m |Checks that the server is running." - echo -e "${blue}test-alert\t${default}ta |Sends test alert." - echo -e "${blue}details\t${default}dt |Displays useful infomation about the server." - echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" - echo -e "${blue}backup\t${default}b |Create archive of the server." - echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." - echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." - echo -e "${blue}install\t${default}i |Install the server." - echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." - } | column -s $'\t' -t - esac -} - -fn_getopt_mta(){ -case "${getopt}" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - command_restart.sh;; - u|update) - command_update.sh;; - fu|force-update|update-restart) - forceupdate=1; - command_update.sh;; - uf|update-functions) - command_update_functions.sh;; - m|monitor) - command_monitor.sh;; - ta|test-alert) - command_test_alert.sh;; - dt|details) - command_details.sh;; - pd|postdetails) - command_postdetails.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;; - ir|install-default-resources) - command_install_resources_mta.sh;; - ai|auto-install) - fn_autoinstall;; - dd|detect-deps) - command_dev_detect_deps.sh;; - dg|detect-glibc) - command_dev_detect_glibc.sh;; - dl|detect-ldd) - command_dev_detect_ldd.sh;; - *) - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - fi - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "https://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "${lightyellow}Commands${default}" - { - echo -e "${blue}start\t${default}st |Start the server." - echo -e "${blue}stop\t${default}sp |Stop the server." - echo -e "${blue}restart\t${default}r |Restart the server." - echo -e "${blue}update\t${default}u |Checks and applies updates from linux.mtasa.com." - echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from linux.mtasa.com." - echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." - echo -e "${blue}monitor\t${default}m |Checks that the server is running." - echo -e "${blue}test-alert\t${default}ta |Sends test alert." - echo -e "${blue}details\t${default}dt |Displays useful infomation about the server." - echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" - echo -e "${blue}backup\t${default}b |Create archive of the server." - echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." - echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." - echo -e "${blue}install\t${default}i |Install the server." - echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." - echo -e "${blue}install-default-resources\t${default}ir |Install the MTA default resources." - } | column -s $'\t' -t - esac -} - -fn_getopt_mumble(){ -case "${getopt}" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - command_restart.sh;; - u|update) - command_update.sh;; - uf|update-functions) - command_update_functions.sh;; - m|monitor) - command_monitor.sh;; - ta|test-alert) - command_test_alert.sh;; - dt|details) - command_details.sh;; - pd|postdetails) - command_postdetails.sh;; - b|backup) - command_backup.sh;; - dev|dev-debug) - command_dev_debug.sh;; - c|console) - command_console.sh;; - i|install) - command_install.sh;; - dd|detect-deps) - command_dev_detect_deps.sh;; - dg|detect-glibc) - command_dev_detect_glibc.sh;; - dl|detect-ldd) - command_dev_detect_ldd.sh;; - *) - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - fi - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "https://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "${lightyellow}Commands${default}" - { - echo -e "${blue}start\t${default}st |Start the server." - echo -e "${blue}stop\t${default}sp |Stop the server." - echo -e "${blue}restart\t${default}r |Restart the server." - echo -e "${blue}update\t${default}u |Checks and applies updates from GitHub." - echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." - echo -e "${blue}monitor\t${default}m |Checks that the server is running." - echo -e "${blue}test-alert\t${default}ta |Sends test alert." - echo -e "${blue}details\t${default}dt |Displays useful information about the server." - echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" - echo -e "${blue}backup\t${default}b |Create archive of the server." - echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." - echo -e "${blue}install\t${default}i |Install the server." - } | column -s $'\t' -t - esac -} - -fn_getopt_dstserver(){ -case "${getopt}" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - command_restart.sh;; - u|update) - command_update.sh;; - fu|force-update|update-restart) - forceupdate=1; - command_update.sh;; - uf|update-functions) - command_update_functions.sh;; - v|validate) - command_validate.sh;; - m|monitor) - command_monitor.sh;; - ta|test-alert) - command_test_alert.sh;; - dt|details) - command_details.sh;; - pd|postdetails) - command_postdetails.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;; - ct|cluster-token) - install_dst_token.sh;; - dd|detect-deps) - command_dev_detect_deps.sh;; - dg|detect-glibc) - command_dev_detect_glibc.sh;; - dl|detect-ldd) - command_dev_detect_ldd.sh;; - *) - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - fi - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "https://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "${lightyellow}Commands${default}" - { - echo -e "${blue}start\t${default}st |Start the server." - echo -e "${blue}stop\t${default}sp |Stop the server." - echo -e "${blue}restart\t${default}r |Restart the server." - echo -e "${blue}update\t${default}u |Checks and applies updates from SteamCMD." - echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD." - echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." - echo -e "${blue}validate\t${default}v |Validate server files with SteamCMD." - echo -e "${blue}monitor\t${default}m |Checks that the server is running." - echo -e "${blue}test-alert\t${default}ta |Sends test alert." - echo -e "${blue}details\t${default}dt |Displays useful information about the server." - echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" - echo -e "${blue}backup\t${default}b |Create archive of the server." - echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." - echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." - echo -e "${blue}install\t${default}i |Install the server." - echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." - echo -e "${blue}cluster-token\t${default}ct |Configure cluster token." - } | column -s $'\t' -t - esac -} - -fn_getopt_gmodserver(){ -case "${getopt}" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - command_restart.sh;; - u|update) - command_update.sh;; - fu|force-update|update-restart) - forceupdate=1; - command_update.sh;; - uf|update-functions) - command_update_functions.sh;; - v|validate) - command_validate.sh;; - m|monitor) - command_monitor.sh;; - ta|test-alert) - command_test_alert.sh;; - dt|details) - command_details.sh;; - pd|postdetails) - command_postdetails.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;; - fd|fastdl) - command_fastdl.sh;; - mi|mods-install) - command_mods_install.sh;; - mu|mods-update) - command_mods_update.sh;; - mr|mods-remove) - command_mods_remove.sh;; - dd|detect-deps) - command_dev_detect_deps.sh;; - dg|detect-glibc) - command_dev_detect_glibc.sh;; - dl|detect-ldd) - command_dev_detect_ldd.sh;; - *) - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - fi - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "https://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "${lightyellow}Commands${default}" - { - echo -e "${blue}start\t${default}st |Start the server." - echo -e "${blue}stop\t${default}sp |Stop the server." - echo -e "${blue}restart\t${default}r |Restart the server." - echo -e "${blue}update\t${default}u |Checks and applies updates from SteamCMD." - echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD." - echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." - echo -e "${blue}validate\t${default}v |Validate server files with SteamCMD." - echo -e "${blue}monitor\t${default}m |Checks that the server is running." - echo -e "${blue}test-alert\t${default}ta |Sends test alert." - echo -e "${blue}details\t${default}dt |Displays useful information about the server." - echo -e "${blue}backup\t${default}b |Create archive of the server." - echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." - echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." - echo -e "${blue}install\t${default}i |Install the server." - echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." - echo -e "${blue}fastdl\t${default}fd |Generates or update a FastDL directory for your server." - echo -e "${blue}mods-install\t${default}mi |View and install available mods/addons." - echo -e "${blue}mods-update\t${default}mu |Update installed mods/addons." - echo -e "${blue}mods-remove\t${default}mr |Remove installed mods/addons." - } | column -s $'\t' -t - esac -} - -fn_getopt_rustserver(){ -case "${getopt}" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - command_restart.sh;; - u|update) - command_update.sh;; - fu|force-update|update-restart) - forceupdate=1; - command_update.sh;; - uf|update-functions) - command_update_functions.sh;; - v|validate) - command_validate.sh;; - m|monitor) - command_monitor.sh;; - ta|test-alert) - command_test_alert.sh;; - dt|details) - command_details.sh;; - pd|postdetails) - command_postdetails.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;; - mi|mods-install) - command_mods_install.sh;; - mu|mods-update) - command_mods_update.sh;; - mr|mods-remove) - command_mods_remove.sh;; - wi|wipe) - command_wipe.sh;; - dd|detect-deps) - command_dev_detect_deps.sh;; - dg|detect-glibc) - command_dev_detect_glibc.sh;; - dl|detect-ldd) - command_dev_detect_ldd.sh;; - *) - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - fi - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "https://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "${lightyellow}Commands${default}" - { - echo -e "${blue}start\t${default}st |Start the server." - echo -e "${blue}stop\t${default}sp |Stop the server." - echo -e "${blue}restart\t${default}r |Restart the server." - echo -e "${blue}update\t${default}u |Checks and applies updates from SteamCMD." - echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD." - echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." - echo -e "${blue}validate\t${default}v |Validate server files with SteamCMD." - echo -e "${blue}monitor\t${default}m |Checks that the server is running." - echo -e "${blue}test-alert\t${default}ta |Sends test alert." - echo -e "${blue}details\t${default}dt |Displays useful information about the server." - echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" - echo -e "${blue}backup\t${default}b |Create archive of the server." - echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." - echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." - echo -e "${blue}install\t${default}i |Install the server." - echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." - echo -e "${blue}mods-install\t${default}mi |View and install available mods/addons." - echo -e "${blue}mods-update\t${default}mu |Update installed mods/addons." - echo -e "${blue}mods-remove\t${default}mr |Remove installed mods/addons." - echo -e "${blue}wipe\t${default}wi |Wipe your Rust server." - } | column -s $'\t' -t - esac -} - -fn_getopt_unreal(){ -case "${getopt}" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - command_restart.sh;; - uf|update-functions) - command_update_functions.sh;; - m|monitor) - command_monitor.sh;; - ta|test-alert) - command_test_alert.sh;; - dt|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|detect-deps) - command_dev_detect_deps.sh;; - dg|detect-glibc) - command_dev_detect_glibc.sh;; - dl|detect-ldd) - command_dev_detect_ldd.sh;; - *) - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - fi - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "https://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "${lightyellow}Commands${default}" - { - echo -e "${blue}start\t${default}st |Start the server." - echo -e "${blue}stop\t${default}sp |Stop the server." - echo -e "${blue}restart\t${default}r |Restart the server." - echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." - echo -e "${blue}monitor\t${default}m |Checks that the server is running." - echo -e "${blue}test-alert\t${default}ta |Sends test alert." - echo -e "${blue}details\t${default}dt |Displays useful information about the server." - echo -e "${blue}backup\t${default}b |Create archive of the server." - echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." - echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." - echo -e "${blue}install\t${default}i |Install the server." - echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." - echo -e "${blue}map-compressor\t${default}mc |Compresses all ${gamename} server maps." - } | column -s $'\t' -t - esac -} +### Define all commands here ### +## User commands | Trigger commands | Description +# Standard commands +cmd_install=( "i;install" "command_install.sh" "Install the server." ) +cmd_auto_install=( "ai;auto-install" "command_autoinstall.sh" "Install the server without prompts." ) +cmd_start=( "st;start" "command_start.sh" "Start the server." ) +cmd_stop=( "sp;stop" "command_stop.sh" "Stop the server." ) +cmd_restart=( "r;restart" "command_restart.sh" "Restart the server." ) +cmd_details=( "dt;details" "command_details.sh" "Display relevant server information." ) +cmd_postdetails=( "pd;postdetails" "command_postdetails.sh" "Post stripped details to pastebin for support." ) +cmd_backup=( "b;backup;" "command_backup.sh" "Create archives of the server." ) +cmd_update_functions=( "uf;update-functions" "command_update_functions.sh" "Update LinuxGSM functions." ) +cmd_test_alert=( "ta;test-alert" "command_test_alert.sh" "Send a test alert." ) +cmd_monitor=( "m;monitor" "command_monitor.sh" "Check server status and restart it if crashed." ) +# Console servers only +cmd_console=( "c;console" "command_console.sh" "Access server console." ) +cmd_debug=( "d;debug" "command_debug.sh" "Start server directly in your terminal." ) +# Update servers only +cmd_update=( "u;update" "command_update.sh" "Check for updates and apply if available." ) +cmd_force_update=( "fu;force-update;update-restart;ur" "forceupdate=1; command_update.sh" "Unconditionally update the server." ) +# SteamCMD servers only +cmd_validate=( "v;validate" "command_validate.sh" "Validate server files with SteamCMD." ) +# Server with mods-install +cmd_mods_install=( "mi;mods-install" "command_mods_install.sh" "View and install available mods/addons." ) +cmd_mods_remove=( "mr;mods-remove" "command_mods_remove.sh" "View and remove an installed mod/addon." ) +cmd_mods_update=( "mu;mods-update" "command_mods_update.sh" "Update installed mods/addons." ) +# Server specific +cmd_change_password=( "pw;change-password" "command_ts3_server_pass.sh" "Change TS3 serveradmin password." ) +cmd_install_default_ressources=( "ir;install-default-ressources" "command_install_resources_mta.sh" "Install the MTA default resources." ) +cmd_wipe=( "wi;wipe" "command_wipe.sh" "Wipe your server data." ) +cmd_map_compressor_u99=( "mc;map-compressor" "compress_ut99_maps.sh" "Compresses all ${gamename} server maps." ) +cmd_map_compressor_u2=( "mc;map-compressor" "compress_unreal2_maps.sh" "Compresses all ${gamename} server maps." ) +cmd_install_cdkey=( "cd;server-cd-key" "install_ut2k4_key.sh" "Add your server cd key." ) +cmd_install_dst_token=( "ct;cluster-token" "install_dst_token.sh" "Configure cluster token." ) +# Dev commands +cmd_dev_detect_deps=( "dd;detect-depts" "command_dev_detect_deps.sh" "Detect server dependencies." ) +cmd_dev_detect_glibc=( "dg;detect-glibc" "command_dev_detect_glibc.sh" "Detect server glibc requirements." ) +cmd_dev_detect_ldd=( "dl;detect-ldd" "command_dev_detect_ldd.sh" "Detect server ldd requirements." ) + +### Set specific opt here ### + +## Common opt to all servers + +currentopt=( "${cmd_install[@]}" "${cmd_auto_install[@]}" "${cmd_start[@]}" "${cmd_stop[@]}" "${cmd_restart[@]}" "${cmd_details[@]}" ) +currentopt+=( "${cmd_backup[@]}" "${cmd_update_functions[@]}" "${cmd_test_alert[@]}" "${cmd_monitor[@]}" ) + +## Servers that do not have a feature + +# Exclude games without a console +if [ "${gamename}" != "TeamSpeak 3" ]; then + currentopt+=( "${cmd_console[@]}" ) +fi +# Exclude noupdated games here +if [ "${gamename}" != "Battlefield: 1942" ]&&[ "${gamename}" != "Call of Duty" ]&&[ "${gamename}" != "Call of Duty: United Offensive" ]&&[ "${gamename}" != "Call of Duty 2" ]&&[ "${gamename}" != "Call of Duty 4" ]&&[ "${gamename}" != "Call of Duty: World at War" ]&&[ "${gamename}" != "QuakeWorld" ]&&[ "${gamename}" != "Quake 2" ]&&[ "${gamename}" != "Quake 3: Arena" ]&&[ "${gamename}" != "Wolfenstein: Enemy Territory" ]; then + currentopt+=( "${cmd_update[@]}" ) +fi +## Include games that have access to specific commands +# Validate command +if [ -n "${appid}" ]; then + currentopt+=( "${cmd_validate[@]}" ) +fi +# FastDL command +if [ "${engine}" == "source" ]; then + currentopt+=( "${cmd_fastdl[@]}" ) +fi +# Wipe command +if [ "${gamename}" == "Rust" ]; then + currentopt+=( "${cmd_wipe[@]}" ) +fi +# Mods commands +if [ "${engine}" == "source" ]||[ "${gamename}" == "Rust" ]|[ "${gamename}" == "Hurtworld" ]|[ "${gamename}" == "7 Days To Die" ]; then + currentopt+=( "${cmd_mods_install[@]}" "${cmd_mods_remove[@]}" "${cmd_mods_update[@]}" ) +fi -fn_getopt_unreal2(){ -case "${getopt}" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - command_restart.sh;; - u|update) - command_update.sh;; - fu|force-update|update-restart) - forceupdate=1; - command_update.sh;; - uf|update-functions) - command_update_functions.sh;; - v|validate) - command_validate.sh;; - m|monitor) - command_monitor.sh;; - ta|test-alert) - command_test_alert.sh;; - dt|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|detect-deps) - command_dev_detect_deps.sh;; - dg|detect-glibc) - command_dev_detect_glibc.sh;; - dl|detect-ldd) - command_dev_detect_ldd.sh;; - mc|map-compressor) - compress_unreal2_maps.sh;; - *) - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 +## Game server exclusive commands +# TeamSpeak exclusive +if [ "${gamename}" == "TeamSpeak 3" ]; then + currentopt+=( "${cmd_change_password[@]}" ) +fi +# Unreal exclusive +if [ "${engine}" == "unreal2" ]; then + if [ "${gamename}" == "Unreal Tournament 2004" ]; then + currentopt+=( "${cmd_install_cdkey[@]}" "${cmd_map_compressor_u2[@]}" ) + else + currentopt+=( "${cmd_map_compressor_u2[@]}" ) fi - echo "Usage: $0 [option]" - echo "${gamename} - Linux Game Server Manager - Version ${version}" - echo "https://gameservermanagers.com/${selfname}" - echo -e "" - echo -e "${lightyellow}Commands${default}" - { - echo -e "${blue}start\t${default}st |Start the server." - echo -e "${blue}stop\t${default}sp |Stop the server." - echo -e "${blue}restart\t${default}r |Restart the server." - echo -e "${blue}update\t${default}Checks and applies updates from SteamCMD." - echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD." - echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." - echo -e "${blue}validate\t${default}v |Validate server files with SteamCMD." - echo -e "${blue}monitor\t${default}m |Checks that the server is running." - echo -e "${blue}test-alert\t${default}ta |Sends test alert." - echo -e "${blue}details\t${default}dt |Displays useful information about the server." - echo -e "${blue}backup\t${default}b |Create archive of the server." - echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." - echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." - echo -e "${blue}install\t${default}i |Install the server." - echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." - echo -e "${blue}map-compressor\t${default}mc |Compresses all ${gamename} server maps." - } | column -s $'\t' -t - esac -} +fi +if [ "${engine}" == "unreal" ]; then + currentopt+=( "${cmd_map_compressor_u99[@]}" ) +fi +# DST exclusive +if [ "${gamename}" == "Don't Starve Together" ]; then + currentopt+=( "${cmd_install_dst_token[@]}" ) +fi +# MTA exclusive +if [ "${gamename}" == "Multi Theft Auto" ]; then + currentopt+=( "${cmd_install_default_ressources[@]}" ) +fi -fn_getopt_ut2k4(){ -case "${getopt}" in - st|start) - command_start.sh;; - sp|stop) - command_stop.sh;; - r|restart) - command_restart.sh;; - uf|update-functions) - command_update_functions.sh;; - m|monitor) - command_monitor.sh;; - ta|test-alert) - command_test_alert.sh;; - dt|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;; - cd|server-cd-key) - install_ut2k4_key.sh;; - mc|map-compressor) - compress_unreal2_maps.sh;; - dd|detect-deps) - command_dev_detect_deps.sh;; - dg|detect-glibc) - command_dev_detect_glibc.sh;; - dl|detect-ldd) - command_dev_detect_ldd.sh;; - *) - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - fi +### Build list of available commands +optcommands=() +index="0" +for ((index="0"; index <= ${#currentopt[@]}; index+3)); do + cmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" + for ((cmdindex=1; cmdindex <= ${cmdamount}; cmdindex++)); do + optcommands+=( "$(echo "${currentopt[index]}"| awk -F ';' '{ print $cmdindex }')" ) + done +done + +### Check if user command exists or run the command +if [ ! " ${optcommands[@]} " =~ "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 echo "Usage: $0 [option]" echo "${gamename} - Linux Game Server Manager - Version ${version}" echo "https://gameservermanagers.com/${selfname}" echo -e "" echo -e "${lightyellow}Commands${default}" + # Display available commands + index="0" { - echo -e "${blue}start\t${default}st |Start the server." - echo -e "${blue}stop\t${default}sp |Stop the server." - echo -e "${blue}restart\t${default}r |Restart the server." - echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." - echo -e "${blue}monitor\t${default}m |Checks that the server is running." - echo -e "${blue}test-alert\t${default}ta |Sends test alert." - echo -e "${blue}details\t${default}dt |Displays useful information about the server." - echo -e "${blue}backup\t${default}b |Create archive of the server." - echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." - echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." - echo -e "${blue}install\t${default}i |Install the server." - echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." - echo -e "${blue}server-cd-key\t${default}cd |Add your server cd key" - echo -e "${blue}map-compressor\t${default}mc |Compresses all ${gamename} server maps." + for ((index="0"; index <= ${#currentopt[@]}; index++)); do + echo -e "${blue}$(echo "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo "${currentopt[index]}" | awk -F ';' '{ print $1 }') |"${currentopt[index+2]}" + done } | column -s $'\t' -t - esac -} - -# Don't Starve Together -if [ "${gamename}" == "Don't Starve Together" ]; then - fn_getopt_dstserver -# Garry's Mod -elif [ "${gamename}" == "Garry's Mod" ]; then - fn_getopt_gmodserver -# Minecraft -elif [ "${engine}" == "lwjgl2" ]; then - fn_getopt_minecraft -# Multi Theft Auto -elif [ "${gamename}" == "Multi Theft Auto" ]; then - fn_getopt_mta -# Mumble -elif [ "${gamename}" == "Mumble" ]; then - fn_getopt_mumble -# Teamspeak 3 -elif [ "${gamename}" == "TeamSpeak 3" ]; then - fn_getopt_teamspeak3 -elif [ "${gamename}" == "Rust" ]; then - fn_getopt_rustserver -# Unreal 2 Engine -elif [ "${engine}" == "unreal2" ]; then - if [ "${gamename}" == "Unreal Tournament 2004" ]; then - fn_getopt_ut2k4 - else - fn_getopt_unreal2 - fi -# Unreal Engine -elif [ "${engine}" == "unreal" ]; then - fn_getopt_unreal -# Generic -elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then - fn_getopt_generic_no_update -elif [ "${gamename}" == "Factorio" ]; then - fn_getopt_generic_update_no_steam else - fn_getopt_generic + # Seek and run command + index="0" + for ((index="0"; index <= ${#currentopt[@]}; index+3)); do + currcmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" + for ((currcmdindex=1; cmdindex <= ${currcmdamount}; currcmdindex++)); do + if [ "$(echo "${currentopt[index]}"| awk -F ';' '{ print $cmdindex }')" == "${getopt}" ]; then + # Run command + ${currentopt[index+1]} + break + fi + done + done fi + core_exit.sh From 2dc25226ed7592b0fd6ad7ab29ef0ca3caee2f20 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Mon, 20 Feb 2017 23:40:58 +0100 Subject: [PATCH 0530/1895] new opt test --- lgsm/functions/core_getopt.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index f87b55a0e..94024ff79 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -118,7 +118,7 @@ for ((index="0"; index <= ${#currentopt[@]}; index+3)); do done ### Check if user command exists or run the command -if [ ! " ${optcommands[@]} " =~ "${getopt}" ]; then +if [[ ! "${optcommands[@]}" =~ "${getopt}" ]]; then echo -e "${red}Unknown command${default}: $0 ${getopt}" exitcode=2 echo "Usage: $0 [option]" @@ -130,7 +130,7 @@ if [ ! " ${optcommands[@]} " =~ "${getopt}" ]; then index="0" { for ((index="0"; index <= ${#currentopt[@]}; index++)); do - echo -e "${blue}$(echo "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo "${currentopt[index]}" | awk -F ';' '{ print $1 }') |"${currentopt[index+2]}" + echo -e "${blue}$(echo "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo "${currentopt[index]}" | awk -F ';' '{ print $1 }') |${currentopt[index+2]}" done } | column -s $'\t' -t else From 75547557a8a4e8085a3556de5df16abeaf43ba99 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Feb 2017 00:29:17 +0100 Subject: [PATCH 0531/1895] fixing awk, probably not infinite loop --- lgsm/functions/core_getopt.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 94024ff79..ad5ee730d 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -113,7 +113,7 @@ index="0" for ((index="0"; index <= ${#currentopt[@]}; index+3)); do cmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" for ((cmdindex=1; cmdindex <= ${cmdamount}; cmdindex++)); do - optcommands+=( "$(echo "${currentopt[index]}"| awk -F ';' '{ print $cmdindex }')" ) + optcommands+=( "$(echo "${currentopt[index]}"| awk -F ';' -v x=${cmdindex} '{ print $x }')" ) done done @@ -139,7 +139,7 @@ else for ((index="0"; index <= ${#currentopt[@]}; index+3)); do currcmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" for ((currcmdindex=1; cmdindex <= ${currcmdamount}; currcmdindex++)); do - if [ "$(echo "${currentopt[index]}"| awk -F ';' '{ print $cmdindex }')" == "${getopt}" ]; then + if [ "$(echo "${currentopt[index]}"| awk -F ';' -v x=${cmdindex} '{ print $x }')" == "${getopt}" ]; then # Run command ${currentopt[index+1]} break From 1be3076dba3fcd9f7ffd5ea77127db277022190e Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Feb 2017 00:41:14 +0100 Subject: [PATCH 0532/1895] first loop fixes --- lgsm/functions/core_getopt.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index ad5ee730d..9a2695c86 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -110,9 +110,9 @@ fi ### Build list of available commands optcommands=() index="0" -for ((index="0"; index <= ${#currentopt[@]}; index+3)); do +for ((index="0"; index < ${#currentopt[@]}; index+=3)); do cmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" - for ((cmdindex=1; cmdindex <= ${cmdamount}; cmdindex++)); do + for ((cmdindex=1; cmdindex < ${cmdamount}; cmdindex++)); do optcommands+=( "$(echo "${currentopt[index]}"| awk -F ';' -v x=${cmdindex} '{ print $x }')" ) done done @@ -136,9 +136,9 @@ if [[ ! "${optcommands[@]}" =~ "${getopt}" ]]; then else # Seek and run command index="0" - for ((index="0"; index <= ${#currentopt[@]}; index+3)); do + for ((index="0"; index < ${#currentopt[@]}; index+=3)); do currcmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" - for ((currcmdindex=1; cmdindex <= ${currcmdamount}; currcmdindex++)); do + for ((currcmdindex=1; cmdindex < ${currcmdamount}; currcmdindex++)); do if [ "$(echo "${currentopt[index]}"| awk -F ';' -v x=${cmdindex} '{ print $x }')" == "${getopt}" ]; then # Run command ${currentopt[index+1]} From d125a72b0732ed3b457f2edcfcf249ea06151986 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Feb 2017 00:58:14 +0100 Subject: [PATCH 0533/1895] fix --- lgsm/functions/core_getopt.sh | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 9a2695c86..c651f105d 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -16,7 +16,7 @@ cmd_stop=( "sp;stop" "command_stop.sh" "Stop the server." ) cmd_restart=( "r;restart" "command_restart.sh" "Restart the server." ) cmd_details=( "dt;details" "command_details.sh" "Display relevant server information." ) cmd_postdetails=( "pd;postdetails" "command_postdetails.sh" "Post stripped details to pastebin for support." ) -cmd_backup=( "b;backup;" "command_backup.sh" "Create archives of the server." ) +cmd_backup=( "b;backup" "command_backup.sh" "Create archives of the server." ) cmd_update_functions=( "uf;update-functions" "command_update_functions.sh" "Update LinuxGSM functions." ) cmd_test_alert=( "ta;test-alert" "command_test_alert.sh" "Send a test alert." ) cmd_monitor=( "m;monitor" "command_monitor.sh" "Check server status and restart it if crashed." ) @@ -112,16 +112,18 @@ optcommands=() index="0" for ((index="0"; index < ${#currentopt[@]}; index+=3)); do cmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" - for ((cmdindex=1; cmdindex < ${cmdamount}; cmdindex++)); do + for ((cmdindex=1; cmdindex <= ${cmdamount}; cmdindex++)); do optcommands+=( "$(echo "${currentopt[index]}"| awk -F ';' -v x=${cmdindex} '{ print $x }')" ) done done ### Check if user command exists or run the command -if [[ ! "${optcommands[@]}" =~ "${getopt}" ]]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - echo "Usage: $0 [option]" +if [[ ! "${optcommands[@]}" =~ "${getopt}" ]]||[ -z "${getopt}" ]; then + if [ -z "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + echo "Usage: $0 [option]" + fi echo "${gamename} - Linux Game Server Manager - Version ${version}" echo "https://gameservermanagers.com/${selfname}" echo -e "" @@ -129,7 +131,7 @@ if [[ ! "${optcommands[@]}" =~ "${getopt}" ]]; then # Display available commands index="0" { - for ((index="0"; index <= ${#currentopt[@]}; index++)); do + for ((index="0"; index <= ${#currentopt[@]}; index+=3)); do echo -e "${blue}$(echo "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo "${currentopt[index]}" | awk -F ';' '{ print $1 }') |${currentopt[index+2]}" done } | column -s $'\t' -t From 3cafcc0e684a2a3f58cd6b825f697243fa3dbe21 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Feb 2017 01:11:07 +0100 Subject: [PATCH 0534/1895] fixes --- lgsm/functions/core_getopt.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index c651f105d..22adbb52d 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -131,8 +131,8 @@ if [[ ! "${optcommands[@]}" =~ "${getopt}" ]]||[ -z "${getopt}" ]; then # Display available commands index="0" { - for ((index="0"; index <= ${#currentopt[@]}; index+=3)); do - echo -e "${blue}$(echo "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo "${currentopt[index]}" | awk -F ';' '{ print $1 }') |${currentopt[index+2]}" + for ((index="0"; index < ${#currentopt[@]}; index+=3)); do + echo -e "${blue}$(echo "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo "${currentopt[index]}" | awk -F ';' '{ print $1 }')\t|${currentopt[index+2]}" done } | column -s $'\t' -t else @@ -141,7 +141,7 @@ else for ((index="0"; index < ${#currentopt[@]}; index+=3)); do currcmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" for ((currcmdindex=1; cmdindex < ${currcmdamount}; currcmdindex++)); do - if [ "$(echo "${currentopt[index]}"| awk -F ';' -v x=${cmdindex} '{ print $x }')" == "${getopt}" ]; then + if [ "$(echo "${currentopt[index]}"| awk -F ';' -v x=${currcmdindex} '{ print $x }')" == "${getopt}" ]; then # Run command ${currentopt[index+1]} break From cfc5bf75fc19eff39c6c3afabffb1cc3462deb17 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Feb 2017 01:16:42 +0100 Subject: [PATCH 0535/1895] fixes --- lgsm/functions/core_getopt.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 22adbb52d..6b230b5f8 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -118,8 +118,8 @@ for ((index="0"; index < ${#currentopt[@]}; index+=3)); do done ### Check if user command exists or run the command -if [[ ! "${optcommands[@]}" =~ "${getopt}" ]]||[ -z "${getopt}" ]; then - if [ -z "${getopt}" ]; then +if [ -z "${getopt}" ]||[[ ! "${optcommands[@]}" =~ "${getopt}" ]]; then + if [ -n "${getopt}" ]; then echo -e "${red}Unknown command${default}: $0 ${getopt}" exitcode=2 echo "Usage: $0 [option]" @@ -140,7 +140,7 @@ else index="0" for ((index="0"; index < ${#currentopt[@]}; index+=3)); do currcmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" - for ((currcmdindex=1; cmdindex < ${currcmdamount}; currcmdindex++)); do + for ((currcmdindex=1; currcmdindex < ${currcmdamount}; currcmdindex++)); do if [ "$(echo "${currentopt[index]}"| awk -F ';' -v x=${currcmdindex} '{ print $x }')" == "${getopt}" ]; then # Run command ${currentopt[index+1]} From 007a373d5d7205a30fcdfe29e90b87101b22849b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Feb 2017 01:19:11 +0100 Subject: [PATCH 0536/1895] appearance --- lgsm/functions/core_getopt.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 6b230b5f8..7e02b584a 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -122,17 +122,17 @@ if [ -z "${getopt}" ]||[[ ! "${optcommands[@]}" =~ "${getopt}" ]]; then if [ -n "${getopt}" ]; then echo -e "${red}Unknown command${default}: $0 ${getopt}" exitcode=2 - echo "Usage: $0 [option]" fi echo "${gamename} - Linux Game Server Manager - Version ${version}" echo "https://gameservermanagers.com/${selfname}" + echo "Usage: $0 [option]" echo -e "" echo -e "${lightyellow}Commands${default}" # Display available commands index="0" { for ((index="0"; index < ${#currentopt[@]}; index+=3)); do - echo -e "${blue}$(echo "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo "${currentopt[index]}" | awk -F ';' '{ print $1 }')\t|${currentopt[index+2]}" + echo -e "${cyan}$(echo "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo "${currentopt[index]}" | awk -F ';' '{ print $1 }')\t|${currentopt[index+2]}" done } | column -s $'\t' -t else From 021a86c737b925f8e412214d8e1ecf7ad882235b Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Feb 2017 01:35:21 +0100 Subject: [PATCH 0537/1895] missing commands --- lgsm/functions/core_getopt.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 7e02b584a..884a0f9c9 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -40,6 +40,7 @@ cmd_map_compressor_u99=( "mc;map-compressor" "compress_ut99_maps.sh" "Compresses cmd_map_compressor_u2=( "mc;map-compressor" "compress_unreal2_maps.sh" "Compresses all ${gamename} server maps." ) cmd_install_cdkey=( "cd;server-cd-key" "install_ut2k4_key.sh" "Add your server cd key." ) cmd_install_dst_token=( "ct;cluster-token" "install_dst_token.sh" "Configure cluster token." ) +cmd_fastdl=( "fd;fastdl" "command_fastdl.sh" "Build a FastDL directory." # Dev commands cmd_dev_detect_deps=( "dd;detect-depts" "command_dev_detect_deps.sh" "Detect server dependencies." ) cmd_dev_detect_glibc=( "dg;detect-glibc" "command_dev_detect_glibc.sh" "Detect server glibc requirements." ) @@ -56,11 +57,11 @@ currentopt+=( "${cmd_backup[@]}" "${cmd_update_functions[@]}" "${cmd_test_alert[ # Exclude games without a console if [ "${gamename}" != "TeamSpeak 3" ]; then - currentopt+=( "${cmd_console[@]}" ) + currentopt+=( "${cmd_console[@]}" "${cmd_debug[@]}" ) fi # Exclude noupdated games here if [ "${gamename}" != "Battlefield: 1942" ]&&[ "${gamename}" != "Call of Duty" ]&&[ "${gamename}" != "Call of Duty: United Offensive" ]&&[ "${gamename}" != "Call of Duty 2" ]&&[ "${gamename}" != "Call of Duty 4" ]&&[ "${gamename}" != "Call of Duty: World at War" ]&&[ "${gamename}" != "QuakeWorld" ]&&[ "${gamename}" != "Quake 2" ]&&[ "${gamename}" != "Quake 3: Arena" ]&&[ "${gamename}" != "Wolfenstein: Enemy Territory" ]; then - currentopt+=( "${cmd_update[@]}" ) + currentopt+=( "${cmd_update[@]}" "${cmd_force_update[@]}") fi ## Include games that have access to specific commands @@ -123,9 +124,9 @@ if [ -z "${getopt}" ]||[[ ! "${optcommands[@]}" =~ "${getopt}" ]]; then echo -e "${red}Unknown command${default}: $0 ${getopt}" exitcode=2 fi + echo "Usage: $0 [option]" echo "${gamename} - Linux Game Server Manager - Version ${version}" echo "https://gameservermanagers.com/${selfname}" - echo "Usage: $0 [option]" echo -e "" echo -e "${lightyellow}Commands${default}" # Display available commands From b9162f1c69079d4508f710a3c4f9f5529351940d Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Feb 2017 01:36:30 +0100 Subject: [PATCH 0538/1895] hm ) --- 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 884a0f9c9..914ab0790 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -40,7 +40,7 @@ cmd_map_compressor_u99=( "mc;map-compressor" "compress_ut99_maps.sh" "Compresses cmd_map_compressor_u2=( "mc;map-compressor" "compress_unreal2_maps.sh" "Compresses all ${gamename} server maps." ) cmd_install_cdkey=( "cd;server-cd-key" "install_ut2k4_key.sh" "Add your server cd key." ) cmd_install_dst_token=( "ct;cluster-token" "install_dst_token.sh" "Configure cluster token." ) -cmd_fastdl=( "fd;fastdl" "command_fastdl.sh" "Build a FastDL directory." +cmd_fastdl=( "fd;fastdl" "command_fastdl.sh" "Build a FastDL directory." ) # Dev commands cmd_dev_detect_deps=( "dd;detect-depts" "command_dev_detect_deps.sh" "Detect server dependencies." ) cmd_dev_detect_glibc=( "dg;detect-glibc" "command_dev_detect_glibc.sh" "Detect server glibc requirements." ) From edf5b787a941699620d40e79a291cfb8446ab4bf Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Feb 2017 02:36:08 +0100 Subject: [PATCH 0539/1895] fix for full commands to work --- 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 914ab0790..52f72dfaa 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -141,7 +141,7 @@ else index="0" for ((index="0"; index < ${#currentopt[@]}; index+=3)); do currcmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" - for ((currcmdindex=1; currcmdindex < ${currcmdamount}; currcmdindex++)); do + for ((currcmdindex=1; currcmdindex <= ${currcmdamount}; currcmdindex++)); do if [ "$(echo "${currentopt[index]}"| awk -F ';' -v x=${currcmdindex} '{ print $x }')" == "${getopt}" ]; then # Run command ${currentopt[index+1]} From 6e8afb5e2a01b0545eb19b1330def039a6dd3ef0 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Feb 2017 02:53:09 +0100 Subject: [PATCH 0540/1895] dev commands --- lgsm/functions/core_getopt.sh | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 52f72dfaa..a8374493f 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -42,9 +42,10 @@ cmd_install_cdkey=( "cd;server-cd-key" "install_ut2k4_key.sh" "Add your server c cmd_install_dst_token=( "ct;cluster-token" "install_dst_token.sh" "Configure cluster token." ) cmd_fastdl=( "fd;fastdl" "command_fastdl.sh" "Build a FastDL directory." ) # Dev commands -cmd_dev_detect_deps=( "dd;detect-depts" "command_dev_detect_deps.sh" "Detect server dependencies." ) -cmd_dev_detect_glibc=( "dg;detect-glibc" "command_dev_detect_glibc.sh" "Detect server glibc requirements." ) -cmd_dev_detect_ldd=( "dl;detect-ldd" "command_dev_detect_ldd.sh" "Detect server ldd requirements." ) +cmd_dev_debug=( "dev;dev-debug" "command_dev_debug.sh" "DEVCOMMAND" +cmd_dev_detect_deps=( "dd;detect-depts" "command_dev_detect_deps.sh" "DEVCOMMAND" ) +cmd_dev_detect_glibc=( "dg;detect-glibc" "command_dev_detect_glibc.sh" "DEVCOMMAND" ) +cmd_dev_detect_ldd=( "dl;detect-ldd" "command_dev_detect_ldd.sh" "DEVCOMMAND" ) ### Set specific opt here ### @@ -107,6 +108,9 @@ if [ "${gamename}" == "Multi Theft Auto" ]; then currentopt+=( "${cmd_install_default_ressources[@]}" ) fi +## Developer commands +currentopt+=( "${cmd_dev_debug[@]}" "${cmd_dev_detect_deps[@]}" "${cmd_dev_detect_glibc[@]}" "${cmd_dev_detect_ldd[@]}" ) + ### Build list of available commands optcommands=() @@ -133,7 +137,10 @@ if [ -z "${getopt}" ]||[[ ! "${optcommands[@]}" =~ "${getopt}" ]]; then index="0" { for ((index="0"; index < ${#currentopt[@]}; index+=3)); do - echo -e "${cyan}$(echo "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo "${currentopt[index]}" | awk -F ';' '{ print $1 }')\t|${currentopt[index+2]}" + # Hide developer commands + if [ "${currentopt[index+3]}" != "DEVCOMMAND" ]; then + echo -e "${cyan}$(echo "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo "${currentopt[index]}" | awk -F ';' '{ print $1 }')\t| ${currentopt[index+2]}" + fi done } | column -s $'\t' -t else From 73be10ffa08ab3ba04519724e4740f263ecac257 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Feb 2017 02:54:22 +0100 Subject: [PATCH 0541/1895] typo + missing ) --- lgsm/functions/core_getopt.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index a8374493f..a8ddc89b0 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -42,8 +42,8 @@ cmd_install_cdkey=( "cd;server-cd-key" "install_ut2k4_key.sh" "Add your server c cmd_install_dst_token=( "ct;cluster-token" "install_dst_token.sh" "Configure cluster token." ) cmd_fastdl=( "fd;fastdl" "command_fastdl.sh" "Build a FastDL directory." ) # Dev commands -cmd_dev_debug=( "dev;dev-debug" "command_dev_debug.sh" "DEVCOMMAND" -cmd_dev_detect_deps=( "dd;detect-depts" "command_dev_detect_deps.sh" "DEVCOMMAND" ) +cmd_dev_debug=( "dev;dev-debug" "command_dev_debug.sh" "DEVCOMMAND" ) +cmd_dev_detect_deps=( "dd;detect-deps" "command_dev_detect_deps.sh" "DEVCOMMAND" ) cmd_dev_detect_glibc=( "dg;detect-glibc" "command_dev_detect_glibc.sh" "DEVCOMMAND" ) cmd_dev_detect_ldd=( "dl;detect-ldd" "command_dev_detect_ldd.sh" "DEVCOMMAND" ) From a49de6bcbd878e3233b5026cfa4efe54da1527e5 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Feb 2017 03:21:05 +0100 Subject: [PATCH 0542/1895] new algorithm to find commands --- lgsm/functions/core_getopt.sh | 51 ++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index a8ddc89b0..55f4c3beb 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -122,13 +122,10 @@ for ((index="0"; index < ${#currentopt[@]}; index+=3)); do done done -### Check if user command exists or run the command -if [ -z "${getopt}" ]||[[ ! "${optcommands[@]}" =~ "${getopt}" ]]; then - if [ -n "${getopt}" ]; then - echo -e "${red}Unknown command${default}: $0 ${getopt}" - exitcode=2 - fi +# Shows LinuxGSM usage +fn_opt_usage(){ echo "Usage: $0 [option]" + echo -e "" echo "${gamename} - Linux Game Server Manager - Version ${version}" echo "https://gameservermanagers.com/${selfname}" echo -e "" @@ -143,19 +140,35 @@ if [ -z "${getopt}" ]||[[ ! "${optcommands[@]}" =~ "${getopt}" ]]; then fi done } | column -s $'\t' -t -else - # Seek and run command - index="0" - for ((index="0"; index < ${#currentopt[@]}; index+=3)); do - currcmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" - for ((currcmdindex=1; currcmdindex <= ${currcmdamount}; currcmdindex++)); do - if [ "$(echo "${currentopt[index]}"| awk -F ';' -v x=${currcmdindex} '{ print $x }')" == "${getopt}" ]; then - # Run command - ${currentopt[index+1]} - break - fi - done - done + core_exit.sh +} + +### Check if user commands exist and run corresponding scripts, or display script usage +if [ -z "${getopt}" ]; then + fn_opt_usage fi +# Command exists +for i in "${optcommands[@]}"; do + if [ "${i}" == "${getopt}" ] ; then + # Seek and run command + index="0" + for ((index="0"; index < ${#currentopt[@]}; index+=3)); do + currcmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" + for ((currcmdindex=1; currcmdindex <= ${currcmdamount}; currcmdindex++)); do + if [ "$(echo "${currentopt[index]}"| awk -F ';' -v x=${currcmdindex} '{ print $x }')" == "${getopt}" ]; then + # Run command + ${currentopt[index+1]} + break + fi + done + done + break + core_exit.sh + fi +done +# If we're executing this, it means command was not found +echo -e "${red}Unknown command${default}: $0 ${getopt}" +exitcode=2 +fn_opt_usage core_exit.sh From f126f52de9e83918b8066351b7d91e08586d2ed2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Tue, 21 Feb 2017 03:23:50 +0100 Subject: [PATCH 0543/1895] hide "DEVCOMMAND" description commands --- 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 55f4c3beb..78b097398 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -135,7 +135,7 @@ fn_opt_usage(){ { for ((index="0"; index < ${#currentopt[@]}; index+=3)); do # Hide developer commands - if [ "${currentopt[index+3]}" != "DEVCOMMAND" ]; then + if [ "${currentopt[index+2]}" != "DEVCOMMAND" ]; then echo -e "${cyan}$(echo "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo "${currentopt[index]}" | awk -F ';' '{ print $1 }')\t| ${currentopt[index+2]}" fi done From 9b62ec9fd454e9b62ced634bd0650657eec6f91f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Wed, 22 Feb 2017 18:06:38 +0100 Subject: [PATCH 0544/1895] Removed chivalry for now --- ChivalryMedievalWarfare/chivalrymwserver | 199 ----------------------- 1 file changed, 199 deletions(-) delete mode 100644 ChivalryMedievalWarfare/chivalrymwserver diff --git a/ChivalryMedievalWarfare/chivalrymwserver b/ChivalryMedievalWarfare/chivalrymwserver deleted file mode 100644 index 6fd0d8ff0..000000000 --- a/ChivalryMedievalWarfare/chivalrymwserver +++ /dev/null @@ -1,199 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Chivalry: Medieval Warfare | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170219" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -ip="0.0.0.0" -port="7777" -queryport="27960" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="aocffa-moor_p\?steamsockets\?port=${port}\?queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog} -seekfreeloadingserver" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="220070" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Chivalry: Medieval Warfare" -engine="unreal3" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="chivalrymw-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}/Binaries/Linux/" -executable="./UDKGameServer-Linux" -servercfg="PCServer-UDKGame.ini" -servercfgdefault="PCServer-UDKGame.ini" -servercfgdir="${systemdir}/UDKGame/Config" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" -gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh From 3f9eeb42192993f221b8a16fd4add7fd43b09d54 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 23 Feb 2017 02:55:40 +0100 Subject: [PATCH 0545/1895] Slight improvement to Rust Wipe feature More safety with rm -r "${var:?}" instead of rm -r "${var}" even though there is an if [ -d "${var}" ] check before And now also removes map file, not only map save. --- lgsm/functions/command_wipe.sh | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh index 67ea65164..27ccfbf2f 100644 --- a/lgsm/functions/command_wipe.sh +++ b/lgsm/functions/command_wipe.sh @@ -45,11 +45,24 @@ fn_wipe_server_remove_files(){ # Rust Wipe if [ "${gamename}" == "Rust" ]; then if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.sav")" ]; then - currentaction="Removing map file(s): ${serveridentitydir}/proceduralmap.*.sav" - echo -en "Removing map proceduralmap.*.sav file(s)..." + currentaction="Removing map save(s): ${serveridentitydir}/proceduralmap.*.sav" + echo -en "Removing map saves proceduralmap.*.sav file(s)..." sleep 1 fn_script_log "${currentaction}" - find "${serveridentitydir}" -type f -name "proceduralmap.*.sav" -delete + find "${serveridentitydir:?}" -type f -name "proceduralmap.*.sav" -delete + fn_wipe_exit_code + sleep 0.5 + else + fn_print_information_nl "No map save to remove" + fn_script_log_info "No map save to remove." + sleep 0.5 + fi + if [ -n "$(find "${serveridentitydir}" -type f -name "proceduralmap.*.map")" ]; then + currentaction="Removing map file(s): ${serveridentitydir}/proceduralmap.*.map" + echo -en "Removing map proceduralmap.*.map file(s)..." + sleep 1 + fn_script_log "${currentaction}" + find "${serveridentitydir:?}" -type f -name "proceduralmap.*.map" -delete fn_wipe_exit_code sleep 0.5 else @@ -62,7 +75,7 @@ fn_wipe_server_remove_files(){ echo -en "Removing user directory..." sleep 1 fn_script_log "${currentaction}" - rm -rf "${serveridentitydir}/user" + rm -rf "${serveridentitydir:?}/user" fn_wipe_exit_code sleep 0.5 else @@ -75,7 +88,7 @@ fn_wipe_server_remove_files(){ echo -en "Removing storage directory..." sleep 1 fn_script_log "${currentaction}" - rm -rf "${serveridentitydir}/storage" + rm -rf "${serveridentitydir:?}/storage" fn_wipe_exit_code sleep 0.5 else @@ -88,7 +101,7 @@ fn_wipe_server_remove_files(){ echo -en "Removing Log files..." sleep 1 fn_script_log "${currentaction}" - find "${serveridentitydir}" -type f -name "Log.*.txt" -delete + find "${serveridentitydir:?}" -type f -name "Log.*.txt" -delete fn_wipe_exit_code sleep 0.5 else From 99aeb89b8594b065bc5d7bc3784e3ff23ed26aec Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 23 Feb 2017 03:39:13 +0100 Subject: [PATCH 0546/1895] fn_print_header As per #1035 --- lgsm/functions/compress_ut99_maps.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh index 2a3b6a71f..e74ec727c 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -8,9 +8,7 @@ local commandaction="Unreal Map Compressor" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh -clear -echo "${gamename} Map Compressor" -echo "=================================" +fn_print_header echo "Will compress all maps in:" echo "" pwd From a45412c175100721b0470d69a5fb72d69f87dd77 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 23 Feb 2017 03:39:15 +0100 Subject: [PATCH 0547/1895] fn_print_header As per #1035 --- lgsm/functions/compress_unreal2_maps.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index 9e0488095..7ef8bfeea 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -8,9 +8,7 @@ local commandaction="Unreal Map Compressor" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh -clear -echo "${gamename} Map Compressor" -echo "=================================" +fn_print_header echo "Will compress all maps in:" echo "" pwd From dd55ccf979689812fa6e5d8f17ed7bb94a340597 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 23 Feb 2017 03:41:53 +0100 Subject: [PATCH 0548/1895] fn_print_header As per #1035 --- lgsm/functions/command_ts3_server_pass.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index 5cdb59e6c..964b93211 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -6,15 +6,12 @@ # Description: Changes TS3 serveradmin password. local commandname="TS3-CHANGE-PASS" -local commandaction="TS3 Change Password" +local commandaction="ServerAdmin Password Change" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_serveradmin_password_prompt(){ - echo "" - echo "${gamename} ServerAdmin Password Change" - echo "=================================" - echo "" + fn_print_header echo "Press \"CTRL+b d\" to exit console." fn_print_information_nl "You are about to change the ${gamename} ServerAdmin password." fn_print_warning_nl "${gamename} will restart during this process." From 10396a233478bd6c3b50aaddbf3d224c37253ae3 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 23 Feb 2017 03:54:03 +0100 Subject: [PATCH 0549/1895] Minor log issue fix Fixes #1307 --- lgsm/functions/command_start.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 39dc363cf..c544dd9cf 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -85,15 +85,15 @@ fn_start_tmux(){ # 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 "https://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" - echo "Currently installed: $(tmux -V)" >> "${consolelog}" + echo "Console logging disabled: Tmux => 1.6 required + https://gameservermanagers.com/tmux-upgrade + 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 "https://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" - echo "Currently installed: $(tmux -V)" >> "${consolelog}" + echo "Console logging disabled: Bug in tmux 1.8 breaks logging + https://gameservermanagers.com/tmux-upgrade + Currently installed: $(tmux -V)" > "${consolelog}" # Console logging enable or not set elif [ "${consolelogging}" == "on" ]||[ -z "${consolelogging}" ]; then From 9dae232b4af4e27003f0f99986435a89881cd38a Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 23 Feb 2017 09:02:19 +0100 Subject: [PATCH 0550/1895] Try reverting changes to check why travis fails --- lgsm/functions/command_start.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index c544dd9cf..39dc363cf 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -85,15 +85,15 @@ fn_start_tmux(){ # 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 - https://gameservermanagers.com/tmux-upgrade - Currently installed: $(tmux -V)" > "${consolelog}" + echo "Console logging disabled: Tmux => 1.6 required" >> "${consolelog}" + echo "https://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 - https://gameservermanagers.com/tmux-upgrade - Currently installed: $(tmux -V)" > "${consolelog}" + echo "Console logging disabled: Bug in tmux 1.8 breaks logging" >> "${consolelog}" + echo "https://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" + echo "Currently installed: $(tmux -V)" >> "${consolelog}" # Console logging enable or not set elif [ "${consolelogging}" == "on" ]||[ -z "${consolelogging}" ]; then From ed51b44818a070f2c8289af4050572538cbe60d4 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 23 Feb 2017 09:21:18 +0100 Subject: [PATCH 0551/1895] Minor log issue fix (again) Trying to re-add the commit to see if it was just a temporary Travis bug or not. Fixes #1307 (again) --- lgsm/functions/command_start.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 39dc363cf..c544dd9cf 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -85,15 +85,15 @@ fn_start_tmux(){ # 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 "https://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" - echo "Currently installed: $(tmux -V)" >> "${consolelog}" + echo "Console logging disabled: Tmux => 1.6 required + https://gameservermanagers.com/tmux-upgrade + 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 "https://gameservermanagers.com/tmux-upgrade" >> "${consolelog}" - echo "Currently installed: $(tmux -V)" >> "${consolelog}" + echo "Console logging disabled: Bug in tmux 1.8 breaks logging + https://gameservermanagers.com/tmux-upgrade + Currently installed: $(tmux -V)" > "${consolelog}" # Console logging enable or not set elif [ "${consolelogging}" == "on" ]||[ -z "${consolelogging}" ]; then From 98854eacffbff62e01891d57cde7d5e32f7e6d67 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 25 Feb 2017 01:03:23 +0100 Subject: [PATCH 0552/1895] Fixed function syntax breaking Ark stop Fixes #1335 --- lgsm/functions/command_stop.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 341ad4d95..ccb7dbbf0 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -272,7 +272,7 @@ fn_stop_ark(){ pid=${pid//[!0-9]/} let pid+=0 # turns an empty string into a valid number, '0', # and a valid numeric pid remains unchanged. - if [ "${pid}" -gt 1 && "${pid}" -le $(cat /proc/sys/kernel/pid_max) ]; then + if [ "${pid}" -gt 1 ]&&[ "${pid}" -le $(cat /proc/sys/kernel/pid_max) ]; then fn_print_dots "Process still bound. Awaiting graceful exit: ${pidcheck}" sleep 1 else From e59865c6aaf8e9ecc4aa879836d4462c7fa645b5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Feb 2017 00:32:53 +0000 Subject: [PATCH 0553/1895] Removed insecure from Codename CURE servers are now VAC protected --- CodenameCURE/ccserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 7220ec4d8..63ca1091c 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -32,7 +32,7 @@ ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="-game cure -insecure -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +parms="-game cure -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" } #### LinuxGSM Settings #### From f8b95ab9b8698cfd86b3e529ed22dfcc937be7f4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Feb 2017 11:15:43 +0000 Subject: [PATCH 0554/1895] TF2 now required libcurl --- lgsm/functions/check_deps.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index a159f858c..a256c6abc 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -180,8 +180,8 @@ if [ -n "$(command -v dpkg-query)" ]; then else array_deps_required+=( libtinfo5 ) fi - # Brainbread 2 and Don't Starve Together - elif [ "${gamename}" == "Brainbread 2" ]||[ "${gamename}" == "Don't Starve Together" ]; then + # Brainbread 2 ,Don't Starve Together & Team Fortress 2 + elif [ "${gamename}" == "Brainbread 2" ]||[ "${gamename}" == "Don't Starve Together" ]||[ "${gamename}" == "Team Fortress 2" ]; then array_deps_required+=( libcurl4-gnutls-dev:i386 ) # Battlefield: 1942 elif [ "${gamename}" == "Battlefield: 1942" ]; then @@ -255,8 +255,8 @@ elif [ -n "$(command -v yum)" ]; then # No More Room in Hell, Counter-Strike: Source and Garry's Mod elif [ "${gamename}" == "No More Room in Hell" ]||[ "${gamename}" == "Counter-Strike: Source" ]||[ "${gamename}" == "Garry's Mod" ]; then array_deps_required+=( ncurses-libs.i686 ) - # Brainbread 2 and Don't Starve Together - elif [ "${gamename}" == "Brainbread 2" ]||[ "${gamename}" == "Don't Starve Together" ]; then + # Brainbread 2, Don't Starve Together & Team Fortress 2 + elif [ "${gamename}" == "Brainbread 2" ]||[ "${gamename}" == "Don't Starve Together" ]||[ "${gamename}" == "Team Fortress 2" ]; then array_deps_required+=( libcurl.i686 ) # Battlefield: 1942 elif [ "${gamename}" == "Battlefield: 1942" ]; then From 5ac52b631d38f9fc3bd3768676091206aa880554 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Feb 2017 11:39:02 +0000 Subject: [PATCH 0555/1895] removed white spaces --- lgsm/functions/command_fastdl.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 5d20df759..3d39f49ea 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -122,7 +122,7 @@ fn_fastdl_config(){ else clearnonbzip2="off"; fn_script_log "Clearing non-bzip2 files Disabled."; fn_print_ok "Clearing non-bzip2 files Disabled" fi - echo -en "\n" + echo -en "\n" else # Other games default remove non bzip2 files clearnonbzip2="on" @@ -174,7 +174,7 @@ fn_fastdl_gmod(){ # No choice to cd to the directory, as find can't then display relative directory cd "${systemdir}" || exit - + # Map Files fn_print_dots "Copying map files..." fn_script_log "Copying map files" @@ -408,7 +408,7 @@ fn_fastdl_bzip2(){ find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -exec rm {} \; fn_print_ok "Cleared uncompressed FastDL files" fn_script_log "Cleared uncompressed FastDL files." - fi + fi fi } From fca87cde2d65b3ffbc360b58697f78fb83ced75e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Feb 2017 14:11:51 +0000 Subject: [PATCH 0556/1895] Changed noupdate servers to use engines shortens the if statement --- lgsm/functions/core_getopt.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 78b097398..0889dbd19 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -34,7 +34,7 @@ cmd_mods_remove=( "mr;mods-remove" "command_mods_remove.sh" "View and remove an cmd_mods_update=( "mu;mods-update" "command_mods_update.sh" "Update installed mods/addons." ) # Server specific cmd_change_password=( "pw;change-password" "command_ts3_server_pass.sh" "Change TS3 serveradmin password." ) -cmd_install_default_ressources=( "ir;install-default-ressources" "command_install_resources_mta.sh" "Install the MTA default resources." ) +cmd_install_default_resources=( "ir;install-default-resources" "command_install_resources_mta.sh" "Install the MTA default resources." ) cmd_wipe=( "wi;wipe" "command_wipe.sh" "Wipe your server data." ) cmd_map_compressor_u99=( "mc;map-compressor" "compress_ut99_maps.sh" "Compresses all ${gamename} server maps." ) cmd_map_compressor_u2=( "mc;map-compressor" "compress_unreal2_maps.sh" "Compresses all ${gamename} server maps." ) @@ -61,7 +61,7 @@ if [ "${gamename}" != "TeamSpeak 3" ]; then currentopt+=( "${cmd_console[@]}" "${cmd_debug[@]}" ) fi # Exclude noupdated games here -if [ "${gamename}" != "Battlefield: 1942" ]&&[ "${gamename}" != "Call of Duty" ]&&[ "${gamename}" != "Call of Duty: United Offensive" ]&&[ "${gamename}" != "Call of Duty 2" ]&&[ "${gamename}" != "Call of Duty 4" ]&&[ "${gamename}" != "Call of Duty: World at War" ]&&[ "${gamename}" != "QuakeWorld" ]&&[ "${gamename}" != "Quake 2" ]&&[ "${gamename}" != "Quake 3: Arena" ]&&[ "${gamename}" != "Wolfenstein: Enemy Territory" ]; then +if [ "${gamename}" != "Battlefield: 1942" ]&&[ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "idtech3" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]&&; then currentopt+=( "${cmd_update[@]}" "${cmd_force_update[@]}") fi @@ -79,7 +79,7 @@ if [ "${gamename}" == "Rust" ]; then currentopt+=( "${cmd_wipe[@]}" ) fi # Mods commands -if [ "${engine}" == "source" ]||[ "${gamename}" == "Rust" ]|[ "${gamename}" == "Hurtworld" ]|[ "${gamename}" == "7 Days To Die" ]; then +if [ "${engine}" == "source" ]||[ "${gamename}" == "Rust" ]||[ "${gamename}" == "Hurtworld" ]||[ "${gamename}" == "7 Days To Die" ]; then currentopt+=( "${cmd_mods_install[@]}" "${cmd_mods_remove[@]}" "${cmd_mods_update[@]}" ) fi @@ -105,7 +105,7 @@ if [ "${gamename}" == "Don't Starve Together" ]; then fi # MTA exclusive if [ "${gamename}" == "Multi Theft Auto" ]; then - currentopt+=( "${cmd_install_default_ressources[@]}" ) + currentopt+=( "${cmd_install_default_resources[@]}" ) fi ## Developer commands @@ -160,7 +160,7 @@ for i in "${optcommands[@]}"; do ${currentopt[index+1]} break fi - done + done done break core_exit.sh From 8ee9fdbb3cdb49b4707fbba0ba09734229d27115 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Feb 2017 14:33:56 +0000 Subject: [PATCH 0557/1895] stray && --- 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 0889dbd19..e853ea890 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -61,7 +61,7 @@ if [ "${gamename}" != "TeamSpeak 3" ]; then currentopt+=( "${cmd_console[@]}" "${cmd_debug[@]}" ) fi # Exclude noupdated games here -if [ "${gamename}" != "Battlefield: 1942" ]&&[ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "idtech3" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]&&; then +if [ "${gamename}" != "Battlefield: 1942" ]&&[ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "idtech3" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]; then currentopt+=( "${cmd_update[@]}" "${cmd_force_update[@]}") fi From 7e1bc80fe1e6e203fea1ec8a065f23badafec04e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Feb 2017 17:36:39 +0000 Subject: [PATCH 0558/1895] A re shuffle and changed some commands --- lgsm/functions/core_getopt.sh | 66 ++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index e853ea890..1fa60fd69 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -10,14 +10,14 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" ## User commands | Trigger commands | Description # Standard commands cmd_install=( "i;install" "command_install.sh" "Install the server." ) -cmd_auto_install=( "ai;auto-install" "command_autoinstall.sh" "Install the server without prompts." ) +cmd_auto_install=( "ai;auto-install" "fn_autoinstall" "Install the server without prompts." ) cmd_start=( "st;start" "command_start.sh" "Start the server." ) cmd_stop=( "sp;stop" "command_stop.sh" "Stop the server." ) cmd_restart=( "r;restart" "command_restart.sh" "Restart the server." ) cmd_details=( "dt;details" "command_details.sh" "Display relevant server information." ) cmd_postdetails=( "pd;postdetails" "command_postdetails.sh" "Post stripped details to pastebin for support." ) cmd_backup=( "b;backup" "command_backup.sh" "Create archives of the server." ) -cmd_update_functions=( "uf;update-functions" "command_update_functions.sh" "Update LinuxGSM functions." ) +cmd_update_functions=( "ul;update-lgsm;uf;update-functions" "command_update_functions.sh" "Update LinuxGSM functions." ) cmd_test_alert=( "ta;test-alert" "command_test_alert.sh" "Send a test alert." ) cmd_monitor=( "m;monitor" "command_monitor.sh" "Check server status and restart it if crashed." ) # Console servers only @@ -25,7 +25,7 @@ cmd_console=( "c;console" "command_console.sh" "Access server console." ) cmd_debug=( "d;debug" "command_debug.sh" "Start server directly in your terminal." ) # Update servers only cmd_update=( "u;update" "command_update.sh" "Check for updates and apply if available." ) -cmd_force_update=( "fu;force-update;update-restart;ur" "forceupdate=1; command_update.sh" "Unconditionally update the server." ) +cmd_force_update=( "fu;force-update;update-restart;ur" "forceupdate=1; command_update.sh" "Force update the server." ) # SteamCMD servers only cmd_validate=( "v;validate" "command_validate.sh" "Validate server files with SteamCMD." ) # Server with mods-install @@ -42,46 +42,46 @@ cmd_install_cdkey=( "cd;server-cd-key" "install_ut2k4_key.sh" "Add your server c cmd_install_dst_token=( "ct;cluster-token" "install_dst_token.sh" "Configure cluster token." ) cmd_fastdl=( "fd;fastdl" "command_fastdl.sh" "Build a FastDL directory." ) # Dev commands -cmd_dev_debug=( "dev;dev-debug" "command_dev_debug.sh" "DEVCOMMAND" ) -cmd_dev_detect_deps=( "dd;detect-deps" "command_dev_detect_deps.sh" "DEVCOMMAND" ) -cmd_dev_detect_glibc=( "dg;detect-glibc" "command_dev_detect_glibc.sh" "DEVCOMMAND" ) -cmd_dev_detect_ldd=( "dl;detect-ldd" "command_dev_detect_ldd.sh" "DEVCOMMAND" ) +cmd_dev_debug=( "dev;developer" "command_dev_debug.sh" "Enable developer Mode." ) +cmd_dev_detect_deps=( "dd;detect-deps" "command_dev_detect_deps.sh" "Detect required dependencies." ) +cmd_dev_detect_glibc=( "dg;detect-glibc" "command_dev_detect_glibc.sh" "Detect required glibc." ) +cmd_dev_detect_ldd=( "dl;detect-ldd" "command_dev_detect_ldd.sh" "Detect required dynamic dependencies." ) ### Set specific opt here ### ## Common opt to all servers +currentopt=( "${cmd_start[@]}" "${cmd_stop[@]}" "${cmd_restart[@]}" "${cmd_monitor[@]}" "${cmd_test_alert[@]}" "${cmd_details[@]}" "${cmd_postdetails[@]}" ) -currentopt=( "${cmd_install[@]}" "${cmd_auto_install[@]}" "${cmd_start[@]}" "${cmd_stop[@]}" "${cmd_restart[@]}" "${cmd_details[@]}" ) -currentopt+=( "${cmd_backup[@]}" "${cmd_update_functions[@]}" "${cmd_test_alert[@]}" "${cmd_monitor[@]}" ) - -## Servers that do not have a feature - -# Exclude games without a console -if [ "${gamename}" != "TeamSpeak 3" ]; then - currentopt+=( "${cmd_console[@]}" "${cmd_debug[@]}" ) -fi # Exclude noupdated games here if [ "${gamename}" != "Battlefield: 1942" ]&&[ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "idtech3" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]; then - currentopt+=( "${cmd_update[@]}" "${cmd_force_update[@]}") + currentopt+=( "${cmd_update[@]}" ) + # force update for SteamCMD only + if [ -n "${appid}" ]; then + currentopt+=( "${cmd_force_update[@]}" ) + fi fi -## Include games that have access to specific commands # Validate command if [ -n "${appid}" ]; then currentopt+=( "${cmd_validate[@]}" ) fi + +# Update LGSM +currentopt+=( "${cmd_update_functions[@]}" ) + +#Backup +currentopt+=( "${cmd_backup[@]}" ) + + +# Exclude games without a console +if [ "${gamename}" != "TeamSpeak 3" ]; then + currentopt+=( "${cmd_console[@]}" "${cmd_debug[@]}" ) +fi + # FastDL command if [ "${engine}" == "source" ]; then currentopt+=( "${cmd_fastdl[@]}" ) fi -# Wipe command -if [ "${gamename}" == "Rust" ]; then - currentopt+=( "${cmd_wipe[@]}" ) -fi -# Mods commands -if [ "${engine}" == "source" ]||[ "${gamename}" == "Rust" ]||[ "${gamename}" == "Hurtworld" ]||[ "${gamename}" == "7 Days To Die" ]; then - currentopt+=( "${cmd_mods_install[@]}" "${cmd_mods_remove[@]}" "${cmd_mods_update[@]}" ) -fi ## Game server exclusive commands # TeamSpeak exclusive @@ -89,6 +89,9 @@ if [ "${gamename}" == "TeamSpeak 3" ]; then currentopt+=( "${cmd_change_password[@]}" ) fi # Unreal exclusive +if [ "${gamename}" == "Rust" ]; then + currentopt+=( "${cmd_wipe[@]}" ) +fi if [ "${engine}" == "unreal2" ]; then if [ "${gamename}" == "Unreal Tournament 2004" ]; then currentopt+=( "${cmd_install_cdkey[@]}" "${cmd_map_compressor_u2[@]}" ) @@ -108,9 +111,16 @@ if [ "${gamename}" == "Multi Theft Auto" ]; then currentopt+=( "${cmd_install_default_resources[@]}" ) fi -## Developer commands -currentopt+=( "${cmd_dev_debug[@]}" "${cmd_dev_detect_deps[@]}" "${cmd_dev_detect_glibc[@]}" "${cmd_dev_detect_ldd[@]}" ) +## Mods commands +if [ "${engine}" == "source" ]||[ "${gamename}" == "Rust" ]||[ "${gamename}" == "Hurtworld" ]||[ "${gamename}" == "7 Days To Die" ]; then + currentopt+=( "${cmd_mods_install[@]}" "${cmd_mods_remove[@]}" "${cmd_mods_update[@]}" ) +fi +## Developer commands +currentopt+=( "${cmd_dev_debug[@]}" ) +if [ -f ".dev-debug" ]; then + currentopt+=( "${cmd_dev_detect_deps[@]}" "${cmd_dev_detect_glibc[@]}" "${cmd_dev_detect_ldd[@]}" ) +fi ### Build list of available commands optcommands=() From 0398f33c621f692b8dbe352d1701af381aeb454b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Feb 2017 17:43:24 +0000 Subject: [PATCH 0559/1895] re wording --- lgsm/functions/core_getopt.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 1fa60fd69..2e46278f1 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -14,18 +14,18 @@ cmd_auto_install=( "ai;auto-install" "fn_autoinstall" "Install the server withou cmd_start=( "st;start" "command_start.sh" "Start the server." ) cmd_stop=( "sp;stop" "command_stop.sh" "Stop the server." ) cmd_restart=( "r;restart" "command_restart.sh" "Restart the server." ) -cmd_details=( "dt;details" "command_details.sh" "Display relevant server information." ) -cmd_postdetails=( "pd;postdetails" "command_postdetails.sh" "Post stripped details to pastebin for support." ) -cmd_backup=( "b;backup" "command_backup.sh" "Create archives of the server." ) +cmd_details=( "dt;details" "command_details.sh" "Display server information." ) +cmd_postdetails=( "pd;postdetails" "command_postdetails.sh" "Post details to hastebin (removing passwords)." ) +cmd_backup=( "b;backup" "command_backup.sh" "Create backup archives of the server." ) cmd_update_functions=( "ul;update-lgsm;uf;update-functions" "command_update_functions.sh" "Update LinuxGSM functions." ) cmd_test_alert=( "ta;test-alert" "command_test_alert.sh" "Send a test alert." ) -cmd_monitor=( "m;monitor" "command_monitor.sh" "Check server status and restart it if crashed." ) +cmd_monitor=( "m;monitor" "command_monitor.sh" "Check server status and restart if crashed." ) # Console servers only cmd_console=( "c;console" "command_console.sh" "Access server console." ) cmd_debug=( "d;debug" "command_debug.sh" "Start server directly in your terminal." ) # Update servers only -cmd_update=( "u;update" "command_update.sh" "Check for updates and apply if available." ) -cmd_force_update=( "fu;force-update;update-restart;ur" "forceupdate=1; command_update.sh" "Force update the server." ) +cmd_update=( "u;update" "command_update.sh" "Check and apply any updates." ) +cmd_force_update=( "fu;force-update;update-restart;ur" "forceupdate=1; command_update.sh" "Bypass update check and apply any updates." ) # SteamCMD servers only cmd_validate=( "v;validate" "command_validate.sh" "Validate server files with SteamCMD." ) # Server with mods-install From 3229ae3b1fc8702d2605ef056e93310f4e4f0fd0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Feb 2017 17:48:32 +0000 Subject: [PATCH 0560/1895] minor tidy --- lgsm/functions/core_getopt.sh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 2e46278f1..3c3fe0f43 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -49,10 +49,9 @@ cmd_dev_detect_ldd=( "dl;detect-ldd" "command_dev_detect_ldd.sh" "Detect require ### Set specific opt here ### -## Common opt to all servers currentopt=( "${cmd_start[@]}" "${cmd_stop[@]}" "${cmd_restart[@]}" "${cmd_monitor[@]}" "${cmd_test_alert[@]}" "${cmd_details[@]}" "${cmd_postdetails[@]}" ) -# Exclude noupdated games here +# Exclude noupdate games here if [ "${gamename}" != "Battlefield: 1942" ]&&[ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "idtech3" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]; then currentopt+=( "${cmd_update[@]}" ) # force update for SteamCMD only @@ -78,16 +77,18 @@ if [ "${gamename}" != "TeamSpeak 3" ]; then currentopt+=( "${cmd_console[@]}" "${cmd_debug[@]}" ) fi +## Game server exclusive commands + # FastDL command if [ "${engine}" == "source" ]; then currentopt+=( "${cmd_fastdl[@]}" ) fi -## Game server exclusive commands # TeamSpeak exclusive if [ "${gamename}" == "TeamSpeak 3" ]; then currentopt+=( "${cmd_change_password[@]}" ) fi + # Unreal exclusive if [ "${gamename}" == "Rust" ]; then currentopt+=( "${cmd_wipe[@]}" ) @@ -102,10 +103,12 @@ fi if [ "${engine}" == "unreal" ]; then currentopt+=( "${cmd_map_compressor_u99[@]}" ) fi + # DST exclusive if [ "${gamename}" == "Don't Starve Together" ]; then currentopt+=( "${cmd_install_dst_token[@]}" ) fi + # MTA exclusive if [ "${gamename}" == "Multi Theft Auto" ]; then currentopt+=( "${cmd_install_default_resources[@]}" ) @@ -181,4 +184,4 @@ done echo -e "${red}Unknown command${default}: $0 ${getopt}" exitcode=2 fn_opt_usage -core_exit.sh +core_exit.sh \ No newline at end of file From c0891101c17b35b641d082f67f4449d9105767c0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 25 Feb 2017 22:14:36 +0000 Subject: [PATCH 0561/1895] display fix --- lgsm/functions/mods_core.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 620bfa921..35ab904e4 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -346,7 +346,7 @@ fn_mod_compatible_test(){ fn_create_mods_dir(){ # Create lgsm data modsdir if [ ! -d "${modsdir}" ];then - echo "creating lgsm mods data directory ${modsdir}..." + echo -en "creating LinuxGSM mods data directory ${modsdir}..." mkdir -p "${modsdir}" exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -361,7 +361,7 @@ fn_create_mods_dir(){ fi # Create mod install directory if [ ! -d "${modinstalldir}" ]; then - echo "creating mods install directory ${modinstalldir}..." + echo -en "creating mods install directory ${modinstalldir}..." mkdir -p "${modinstalldir}" exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -438,7 +438,7 @@ fn_mods_check_installed(){ if [ ${installedmodscount} -eq 0 ]; then echo "" fn_print_failure_nl "No installed mods or addons were found" - echo " * Install mods using LGSM first with: ./${selfname} mods-install" + echo " * Install mods using LinuxGSM first with: ./${selfname} mods-install" fn_script_log_error "No installed mods or addons were found." core_exit.sh fi From cd2d7d1f34dae7e928b3d3faabf9cd91322eac0d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 26 Feb 2017 14:56:40 +0000 Subject: [PATCH 0562/1895] files to fileswc --- lgsm/functions/mods_core.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 35ab904e4..7e9c1cdf9 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -42,7 +42,7 @@ fn_mod_lowercase(){ echo -ne "converting ${modprettyname} files to lowercase..." sleep 0.5 fn_script_log_info "Converting ${modprettyname} files to lowercase" - files=$(find "${extractdir}" -depth | wc -l) + fileswc=$(find "${extractdir}" -depth | wc -l) echo -en "\r" while read -r src; do dst=`dirname "${src}"`/`basename "${src}" | tr '[A-Z]' '[a-z]'` @@ -52,10 +52,10 @@ fn_mod_lowercase(){ local exitcode=$? ((renamedwc++)) fi - echo -ne "${renamedwc} / ${totalfileswc} / $files converting ${modprettyname} files to lowercase..." $'\r' + echo -ne "${renamedwc} / ${totalfileswc} / ${fileswc} converting ${modprettyname} files to lowercase..." $'\r' ((totalfileswc++)) done < <(find "${extractdir}" -depth) - echo -ne "${renamedwc} / ${totalfileswc} / $files converting ${modprettyname} files to lowercase..." + echo -ne "${renamedwc} / ${totalfileswc} / ${fileswc} converting ${modprettyname} files to lowercase..." if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl From 8c17f44d24bcb31b16dccabd67d6ea94bee245fa Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 26 Feb 2017 14:57:05 +0000 Subject: [PATCH 0563/1895] Forgot to add installer --- lgsm/functions/core_getopt.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 3c3fe0f43..39efa37e4 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -119,6 +119,9 @@ if [ "${engine}" == "source" ]||[ "${gamename}" == "Rust" ]||[ "${gamename}" == currentopt+=( "${cmd_mods_install[@]}" "${cmd_mods_remove[@]}" "${cmd_mods_update[@]}" ) fi +## Installer +currentopt+=( "${cmd_install[@]}" "${cmd_auto_install[@]}" ) + ## Developer commands currentopt+=( "${cmd_dev_debug[@]}" ) if [ -f ".dev-debug" ]; then From f152d66d55af303bf4e15ee113da71573f685b24 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 26 Feb 2017 15:03:56 +0000 Subject: [PATCH 0564/1895] altered the look slightly --- lgsm/functions/install_server_dir.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index 12762df57..426e25a2b 100644 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -12,12 +12,11 @@ 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 +pwd +echo "" if [ -z "${autoinstall}" ]; then if ! fn_prompt_yn "Continue?" Y; then exit From 753612106cc1c560f57dc8c6e3cf28c4bfa87185 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 26 Feb 2017 20:31:46 +0000 Subject: [PATCH 0565/1895] Large refactor of command_fastdl (not finished yet) improving the look and efficiency of teh code --- lgsm/functions/command_fastdl.sh | 481 ++++++++++++++++++------------- 1 file changed, 280 insertions(+), 201 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 5d20df759..3a85ed788 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -6,18 +6,11 @@ # Description: Creates a FastDL directory. local commandname="FASTDL" -local commandaction="FastDL Generator" +local commandaction="FastDL" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh -# Only Source supports FastDL -if [ "${engine}" != "source" ]; then - fn_print_error "${gamename} does not support FastDL" - fn_script_log_error "${gamename} does not support FastDL" - core_exit.sh -fi - # Directories webdir="${rootdir}/public_html" fastdldir="${webdir}/fastdl" @@ -44,123 +37,90 @@ fn_check_bzip2(){ fi } -# Initiates FastDL -fn_fastdl_init(){ - fn_print_header - fn_script_log "Started FastDL Generator" - sleep 1 - fn_check_bzip2 - # User confirmation - if ! fn_prompt_yn "Build FastDL directory?" Y; then - exit - fi - fn_script_log "Initiating FastDL creation" - - # Check and create directories - if [ ! -d "${webdir}" ]; then - echo "" - fn_print_info "Creating FastDL directories" - echo -en "\n" - sleep 1 - fn_print_dots "Creating ${webdir} directory" - sleep 0.5 - mkdir "${webdir}" - fn_print_ok "Created ${webdir} directory" - fn_script_log "FastDL created ${webdir} directory" - sleep 1 - echo -en "\n" - fi - if [ ! -d "${fastdldir}" ]; then - # No directory, won't ask for removing old ones - newfastdl="true" - fn_print_dots "Creating fastdl directory" - sleep 0.5 - mkdir "${fastdldir}" - fn_print_ok "Created fastdl directory" - fn_script_log "Created fastdl directory" - sleep 1 - echo -en "\n" - clearoldfastdl="off" # Nothing to clear - elif [ "$(ls -A "${fastdldir}")" ]; then - newfastdl="false" - else - newfastdl="true" - fi -} - # Prompts user for FastDL creation settings fn_fastdl_config(){ - fn_print_info "Entering configuration" - fn_script_log "Configuration" - sleep 2 - echo -en "\n" + echo "FastDL setup" + echo "=================================" + # Prompt for clearing old files if directory was already here - if [ "${newfastdl}" == "false" ]; then - fn_print_dots - if fn_prompt_yn "Clear old FastDL files?" Y; then - clearoldfastdl="on"; fn_script_log "clearoldfastdl enabled"; fn_print_ok "Clearing Enabled" - else - clearoldfastdl="off"; fn_script_log "clearoldfastdl disabled"; fn_print_ok "Clearing Disabled" - fi - echo -en "\n" - fi - # Settings for bzip2 users - if [ ${bzip2installed} == 1 ]; then - # Prompt for using bzip2 if it's installed - fn_print_dots - if fn_prompt_yn "Enable bzip2 file compression?" Y; then - bzip2enable="on"; fn_script_log "bzip2 enabled"; fn_print_ok "bzip2 Enabled" - else - bzip2enable="off"; fn_script_log "bzip2 disabled"; fn_print_ok "bzip2 Disabled" - fi - echo -en "\n" - if [ "${gamename}" == "Garry's Mod" ]&&[ "${bzip2enable}" == "on" ]; then - # Prompt for clearing uncompressed files, can save some space but might cause issues for gmod - fn_print_dots - if fn_prompt_yn "Clear non-bzip2 FastDL files?" Y; then - clearnonbzip2="on"; fn_script_log "Clearing non-bzip2 files Enabled."; fn_print_ok "Clearing non-bzip2 files Enabled" - else - clearnonbzip2="off"; fn_script_log "Clearing non-bzip2 files Disabled."; fn_print_ok "Clearing non-bzip2 files Disabled" - fi - echo -en "\n" + if [ -d "${fastdldir}" ]; then + fn_print_warning_nl "FastDL directory already exists." + echo "${fastdldir}" + echo "" + if fn_prompt_yn "Overwrite existing directory?" Y; then + clearoldfastdl="on" else - # Other games default remove non bzip2 files - clearnonbzip2="on" - fn_script_log "Original uncompressed fastDL files won't be kept." + clearoldfastdl="off" fi fi + # Garry's Mod Specific if [ "${gamename}" == "Garry's Mod" ]; then # Prompt to clear addons dir from fastdl, can use unnecessary space or be required depending on addon's file structures fn_print_dots if fn_prompt_yn "Clear addons dir from fastdl dir?" Y; then - cleargmodaddons="on"; fn_script_log "Addons clearing Enabled."; fn_print_ok "Addons clearing Enabled" + cleargmodaddons="on"; else - cleargmodaddons="off"; fn_script_log "Addons clearing Disabled."; fn_print_ok "Addons clearing Disabled" + cleargmodaddons="off"; fi - echo -en "\n" + # Prompt for download enforcer, which is using a .lua addfile resource generator fn_print_dots if fn_prompt_yn "Use client download enforcer?" Y; then - luaressource="on"; fn_script_log "DL enforcer Enabled."; fn_print_ok "Enforcer Enabled" + luaressource="on" else - luaressource="off"; fn_script_log "DL enforcer Disabled."; fn_print_ok "Enforcer Disabled" + luaressource="off" fi - echo -en "\n" + fi +} + +fn_fastdl_dirs(){ + # Check and create directories + if [ ! -d "${modsdir}" ];then + echo -en "creating web directory ${webdir}..." + mkdir -p "${webdir}" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "creating web directory ${webdir}..." + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "creating web directory ${webdir}..." + fi + sleep 0.5 + fi + if [ ! -d "${fastdldir}" ];then + echo -en "creating fastdl directory ${fastdldir}..." + mkdir -p "${fastdldir}" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "creating fastdl directory ${fastdldir}..." + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "creating fastdl directory ${fastdldir}..." + fi + sleep 0.5 fi } fn_clear_old_fastdl(){ # Clearing old FastDL if user answered yes - if [ "${clearoldfastdl}" == "on" ]; then - fn_print_info "Clearing existing FastDL directory" - fn_script_log "Clearing existing FastDL directory" - sleep 0.5 + if [ ! -d "${modsdir}" ];then + echo -en "clearing existing FastDL directory ${fastdldir}..." rm -R "${fastdldir:?}"/* - fn_print_ok "Old FastDL directory cleared" - fn_script_log "Old FastDL directory cleared" - sleep 1 - echo -en "\n" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "clearing existing FastDL directory ${fastdldir}..." + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "clearing existing FastDL directory ${fastdldir}..." + fi + sleep 0.5 fi } @@ -174,7 +134,7 @@ fn_fastdl_gmod(){ # No choice to cd to the directory, as find can't then display relative directory cd "${systemdir}" || exit - + # Map Files fn_print_dots "Copying map files..." fn_script_log "Copying map files" @@ -273,76 +233,206 @@ fn_fastdl_gmod(){ fi } +# Using this gist https://gist.github.com/agunnerson-ibm/efca449565a3e7356906 +fn_human_readable_file_size() { + local abbrevs=( + $((1 << 60)):ZB + $((1 << 50)):EB + $((1 << 40)):TB + $((1 << 30)):GB + $((1 << 20)):MB + $((1 << 10)):KB + $((1)):bytes + ) + + local bytes="${1}" + local precision="${2}" + + if [[ "${bytes}" == "1" ]]; then + echo "1 byte" + else + for item in "${abbrevs[@]}"; do + local factor="${item%:*}" + local abbrev="${item#*:}" + if [[ "${bytes}" -ge "${factor}" ]]; then + local size="$(bc -l <<< "${bytes} / ${factor}")" + printf "%.*f %s\n" "${precision}" "${size}" "${abbrev}" + break + fi + done + fi +} + fn_fastdl_source(){ # Copy all needed files for FastDL - echo "" - fn_print_dots "Starting gathering all needed files" - fn_script_log "Starting gathering all needed files" - sleep 1 - echo -en "\n" + if [ -n "${copyflag}" ]; then + # Removes all existing FastDL files. + if [ -d "${fastdldir}" ]; then + echo -e "removing existing FastDL files" + sleep 0.1 + fileswc=1 + totalfileswc=$(find "${fastdldir}" | wc -l) + tput sc + while read -r filetoremove; do + tput rc; tput el + printf "removing ${fileswc} / ${totalfileswc} : ${filetoremove}..." + ((fileswc++)) + rm -rf "${filetoremove}" + ((exitcode=$?)) + if [ ${exitcode} -ne 0 ]; then + fn_script_log_fatal "Removing ${filetoremove}" + break + else + fn_script_log_pass "Removing ${filetoremove}" + fi + sleep 0.01 + done < <(find "${fastdldir}") + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi + fi + fn_fastdl_dirs - # Map Files - fn_print_dots "Copying map files..." - fn_script_log "Copying map files" - sleep 0.5 - mkdir "${fastdldir}/maps" - find "${systemdir}/maps" -name '*.bsp' -exec cp {} "${fastdldir}/maps" \; - find "${systemdir}/maps" -name '*.ain' -exec cp {} "${fastdldir}/maps" \; - find "${systemdir}/maps" -name '*.nav' -exec cp {} "${fastdldir}/maps" \; - find "${systemdir}/maps" -name '*.jpg' -exec cp {} "${fastdldir}/maps" \; - find "${systemdir}/maps" -name '*.txt' -exec cp {} "${fastdldir}/maps" \; - fn_print_ok "Map files copied" - sleep 0.5 - echo -en "\n" + echo -e "copying files to ${fastdldir}" + fn_script_log "copying files to ${fastdldir}" + else + if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then + rm -f "${tmpdir}/fastdl_files_to_compress.txt" + fi + echo -e "analyzing required files" + fn_script_log "analyzing required files" + fi + + # Maps + if [ -d "${systemdir}/maps" ]; then + local allowed_extentions_array=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) + for allowed_extention in "${allowed_extentions_array[@]}" + do + fileswc=0 + tput sc + if [ -z "${copyflag}" ]; then + tput rc; tput el + printf "gathering maps ${allowed_extention} : ${fileswc}..." + fi + while read -r mapfile; do + ((fileswc++)) + if [ -n "${copyflag}" ]; then + tput rc; tput el + printf "copying maps ${allowed_extention} : ${fileswc}..." + if [ ! -d "${fastdldir}/maps" ]; then + mkdir "${fastdldir}/maps" + fi + cp "${mapfile}" "${fastdldir}/maps" + else + tput rc; tput el + printf "gathering maps ${allowed_extention} : ${fileswc}..." + sleep 0.01 + echo "${mapfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" + fi + done < <(find "${systemdir}/maps" -type f -iname ${allowed_extention}) + + if [ -z "${copyflag}" ]; then + tput rc; tput el + printf "gathering maps ${allowed_extention} : ${fileswc}..." + fi + if [ ${fileswc} != 0 ]&&[ -n "${copyflag}" ]||[ -z "${copyflag}" ]; then + fn_print_ok_eol_nl + fi + done + fi # Materials - fn_print_dots "Copying materials..." - fn_script_log "Copying materials" - sleep 0.5 - mkdir "${fastdldir}/materials" - find "${systemdir}/materials" -name '*.vtf' -exec cp {} "${fastdldir}/materials" \; - find "${systemdir}/materials" -name '*.vmt' -exec cp {} "${fastdldir}/materials" \; - find "${systemdir}/materials" -name '*.vbf' -exec cp {} "${fastdldir}/materials" \; - fn_print_ok "Materials copied" - sleep 0.5 - echo -en "\n" + if [ -d "${systemdir}/materials" ]; then + local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) + for allowed_extention in "${allowed_extentions_array[@]}" + do + while read -r materialfile; do + ((totalfileswc++)) + echo -en "materials: ${allowed_extention} : ${totalfileswc}..." $'\r' + sleep 0.01 + echo "${materialfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" + done < <(find "${systemdir}/materials" -type f -iname ${allowed_extention}) + echo -en "materials: ${allowed_extention} : ${totalfileswc}..." + fn_print_ok_eol_nl + totalfileswc=0 + done + fi # Models - fn_print_dots "Copying models..." - fn_script_log "Copying models" - sleep 1 - mkdir "${fastdldir}/models" - find "${systemdir}/models" -name '*.vtx' -exec cp {} "${fastdldir}/models" \; - find "${systemdir}/models" -name '*.vvd' -exec cp {} "${fastdldir}/models" \; - find "${systemdir}/models" -name '*.mdl' -exec cp {} "${fastdldir}/models" \; - find "${systemdir}/models" -name '*.phy' -exec cp {} "${fastdldir}/models" \; - find "${systemdir}/models" -name '*.jpg' -exec cp {} "${fastdldir}/models" \; - find "${systemdir}/models" -name '*.png' -exec cp {} "${fastdldir}/models" \; - fn_print_ok "Models copied" - sleep 0.5 - echo -en "\n" + if [ -d "${systemdir}/models" ]; then + local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) + for allowed_extention in "${allowed_extentions_array[@]}" + do + while read -r modelfile; do + ((totalfileswc++)) + echo -en "models: ${allowed_extention} : ${totalfileswc}..." $'\r' + sleep 0.01 + echo "${modelfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" + done < <(find "${systemdir}/materials" -type f -iname ${allowed_extention}) + echo -en "models: ${allowed_extention} : ${totalfileswc}..." + fn_print_ok_eol_nl + totalfileswc=0 + done + fi # Particles - fn_print_dots "Copying particles..." - fn_script_log "Copying particles" - sleep 0.5 - mkdir "${fastdldir}/particles" - find "${systemdir}" -name '*.pcf' -exec cp {} "${fastdldir}/particles" \; - fn_print_ok "Particles copied" - sleep 0.5 - echo -en "\n" + if [ -d "${systemdir}/particles" ]; then + local allowed_extentions_array=( "*.pcf" ) + for allowed_extention in "${allowed_extentions_array[@]}" + do + while read -r particlefile; do + ((totalfileswc++)) + echo -en "models: ${allowed_extention} : ${totalfileswc}..." $'\r' + sleep 0.01 + echo "${particlefile}" >> "${tmpdir}/fastdl_files_to_compress.txt" + done < <(find "${systemdir}/models" -type f -iname ${allowed_extention}) + echo -en "models: ${allowed_extention} : ${totalfileswc}..." + fn_print_ok_eol_nl + totalfileswc=0 + done + fi # Sounds - fn_print_dots "Copying sounds..." - fn_script_log "Copying sounds" - sleep 0.5 - mkdir "${fastdldir}/sound" - find "${systemdir}" -name '*.wav' -exec cp {} "${fastdldir}/sound" \; - find "${systemdir}" -name '*.mp3' -exec cp {} "${fastdldir}/sound" \; - find "${systemdir}" -name '*.ogg' -exec cp {} "${fastdldir}/sound" \; - fn_print_ok "Sounds copied" - sleep 0.5 - echo -en "\n" + if [ -d "${systemdir}/sounds" ]; then + local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.mdl" "*.phy" "*.jpg" "*.png" ) + for allowed_extention in "${allowed_extentions_array[@]}" + do + while read -r soundfile; do + ((totalfileswc++)) + echo -en "sounds: ${allowed_extention} : ${totalfileswc}..." $'\r' + sleep 0.01 + echo "${soundfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" + done < <(find "${systemdir}/models" -type f -iname ${allowed_extention}) + echo -en "sounds: ${allowed_extention} : ${totalfileswc}..." + fn_print_ok_eol_nl + totalfileswc=0 + done + fi + +if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then + totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt") + # Calculates total file size + while read dufile; do + filesize=$(du -b "${dufile}"| awk '{ print $1 }') + filesizetotal=$(( ${filesizetotal} + ${filesize} )) + done <"${tmpdir}/fastdl_files_to_compress.txt" +fi + +if [ -z "${copyflag}" ]; then + echo "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0) " + rm "${tmpdir}/fastdl_files_to_compress.txt" + if fn_prompt_yn "Continue?" Y; then + copyflag=1 + fn_fastdl_source + else + core_exit.sh + fi +else + fn_fastdl_bzip2 +fi } # Generate lua file that will force download any file into the FastDL directory @@ -387,59 +477,48 @@ fn_fastdl_gmod_lua_enforcer(){ } fn_fastdl_bzip2(){ - # Compressing using bzip2 if user said yes - echo "" - if [ ${bzip2enable} == "on" ]; then - fn_print_info "Have a break, this step could take a while..." - echo -en "\n" - echo "" - fn_print_dots "Compressing files using bzip2..." - fn_script_log "Compressing files using bzip2..." - # bzip2 all files that are not already compressed (keeping original files) - find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -exec bzip2 -qk \{\} \; - fn_print_ok "bzip2 compression done" - fn_script_log "bzip2 compression done" - sleep 1 - echo -en "\n" - # Clear non compressed FastDL files - if [ "${clearnonbzip2}" == "on" ]; then - fn_print_dots "Clearing original uncompressed FastDL files..." - sleep 1 - find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -exec rm {} \; - fn_print_ok "Cleared uncompressed FastDL files" - fn_script_log "Cleared uncompressed FastDL files." - fi - fi + while read -r filetocompress; do + echo -en "compressing ${filetocompress}..." + bzip2 "${filetocompress}" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "creating web directory ${webdir}..." + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "creating web directory ${webdir}..." + fi + done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \)) } fn_fastdl_completed(){ # Finished message - echo "" - fn_print_ok "FastDL created!" - fn_script_log "FastDL job done" - sleep 2 - echo -en "\n" - echo "" - fn_print_info_nl "Need more documentation?" - echo " * https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL" - echo -en "\n" - if [ "$bzip2installed" == "0" ]; then - echo "By the way, you'd better install bzip2 and re-run this command!" - fi - echo "Credits: UltimateByte" + echo "FastDL files are located in:" + echo "${webdir}" + echo "FastDL completed" + fn_script_log "FastDL completed" } +# Only Source supports FastDL +if [ "${engine}" != "source" ]; then + fn_print_fatal "${gamename} does not support FastDL" + fn_script_log_fatal "${gamename} does not support FastDL" + core_exit.sh +fi + # Run functions -fn_check_bzip2 -fn_fastdl_init +fn_print_header +echo "More info: https://git.io/vyk9a" +echo "" fn_fastdl_config -fn_clear_old_fastdl + + if [ "${gamename}" == "Garry's Mod" ]; then fn_fastdl_gmod fn_fastdl_gmod_lua_enforcer else fn_fastdl_source fi -fn_fastdl_bzip2 fn_fastdl_completed core_exit.sh From c4d31412a482509b8a59acce2b34bbdd82a6981b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 26 Feb 2017 21:20:28 +0000 Subject: [PATCH 0566/1895] Further improvements --- lgsm/functions/command_fastdl.sh | 140 ++++++++++++++++++++----------- 1 file changed, 89 insertions(+), 51 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 3a85ed788..76b9a4d69 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -308,7 +308,7 @@ fn_fastdl_source(){ # Maps if [ -d "${systemdir}/maps" ]; then - local allowed_extentions_array=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) + local allowed_extentions_array_=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) for allowed_extention in "${allowed_extentions_array[@]}" do fileswc=0 @@ -349,32 +349,36 @@ fn_fastdl_source(){ local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) for allowed_extention in "${allowed_extentions_array[@]}" do - while read -r materialfile; do - ((totalfileswc++)) - echo -en "materials: ${allowed_extention} : ${totalfileswc}..." $'\r' - sleep 0.01 - echo "${materialfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" + fileswc=0 + tput sc + if [ -z "${copyflag}" ]; then + tput rc; tput el + printf "gathering materials ${allowed_extention} : ${fileswc}..." + fi + while read -r mapfile; do + ((fileswc++)) + if [ -n "${copyflag}" ]; then + tput rc; tput el + printf "copying materials ${allowed_extention} : ${fileswc}..." + if [ ! -d "${fastdldir}/materials" ]; then + mkdir "${fastdldir}/materials" + fi + cp "${mapfile}" "${fastdldir}/materials" + else + tput rc; tput el + printf "gathering materials ${allowed_extention} : ${fileswc}..." + sleep 0.01 + echo "${mapfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" + fi done < <(find "${systemdir}/materials" -type f -iname ${allowed_extention}) - echo -en "materials: ${allowed_extention} : ${totalfileswc}..." - fn_print_ok_eol_nl - totalfileswc=0 - done - fi - # Models - if [ -d "${systemdir}/models" ]; then - local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) - for allowed_extention in "${allowed_extentions_array[@]}" - do - while read -r modelfile; do - ((totalfileswc++)) - echo -en "models: ${allowed_extention} : ${totalfileswc}..." $'\r' - sleep 0.01 - echo "${modelfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" - done < <(find "${systemdir}/materials" -type f -iname ${allowed_extention}) - echo -en "models: ${allowed_extention} : ${totalfileswc}..." - fn_print_ok_eol_nl - totalfileswc=0 + if [ -z "${copyflag}" ]; then + tput rc; tput el + printf "gathering materials ${allowed_extention} : ${fileswc}..." + fi + if [ ${fileswc} != 0 ]&&[ -n "${copyflag}" ]||[ -z "${copyflag}" ]; then + fn_print_ok_eol_nl + fi done fi @@ -383,15 +387,36 @@ fn_fastdl_source(){ local allowed_extentions_array=( "*.pcf" ) for allowed_extention in "${allowed_extentions_array[@]}" do - while read -r particlefile; do - ((totalfileswc++)) - echo -en "models: ${allowed_extention} : ${totalfileswc}..." $'\r' - sleep 0.01 - echo "${particlefile}" >> "${tmpdir}/fastdl_files_to_compress.txt" - done < <(find "${systemdir}/models" -type f -iname ${allowed_extention}) - echo -en "models: ${allowed_extention} : ${totalfileswc}..." - fn_print_ok_eol_nl - totalfileswc=0 + fileswc=0 + tput sc + if [ -z "${copyflag}" ]; then + tput rc; tput el + printf "gathering particles ${allowed_extention} : ${fileswc}..." + fi + while read -r mapfile; do + ((fileswc++)) + if [ -n "${copyflag}" ]; then + tput rc; tput el + printf "copying particles ${allowed_extention} : ${fileswc}..." + if [ ! -d "${fastdldir}/particles" ]; then + mkdir "${fastdldir}/particles" + fi + cp "${mapfile}" "${fastdldir}/particles" + else + tput rc; tput el + printf "gathering particles ${allowed_extention} : ${fileswc}..." + sleep 0.01 + echo "${mapfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" + fi + done < <(find "${systemdir}/particles" -type f -iname ${allowed_extention}) + + if [ -z "${copyflag}" ]; then + tput rc; tput el + printf "gathering particles ${allowed_extention} : ${fileswc}..." + fi + if [ ${fileswc} != 0 ]&&[ -n "${copyflag}" ]||[ -z "${copyflag}" ]; then + fn_print_ok_eol_nl + fi done fi @@ -400,15 +425,36 @@ fn_fastdl_source(){ local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.mdl" "*.phy" "*.jpg" "*.png" ) for allowed_extention in "${allowed_extentions_array[@]}" do - while read -r soundfile; do - ((totalfileswc++)) - echo -en "sounds: ${allowed_extention} : ${totalfileswc}..." $'\r' - sleep 0.01 - echo "${soundfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" - done < <(find "${systemdir}/models" -type f -iname ${allowed_extention}) - echo -en "sounds: ${allowed_extention} : ${totalfileswc}..." - fn_print_ok_eol_nl - totalfileswc=0 + fileswc=0 + tput sc + if [ -z "${copyflag}" ]; then + tput rc; tput el + printf "gathering sounds ${allowed_extention} : ${fileswc}..." + fi + while read -r mapfile; do + ((fileswc++)) + if [ -n "${copyflag}" ]; then + tput rc; tput el + printf "copying soundss ${allowed_extention} : ${fileswc}..." + if [ ! -d "${fastdldir}/sounds" ]; then + mkdir "${fastdldir}/sounds" + fi + cp "${mapfile}" "${fastdldir}/sounds" + else + tput rc; tput el + printf "gathering sounds ${allowed_extention} : ${fileswc}..." + sleep 0.01 + echo "${mapfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" + fi + done < <(find "${systemdir}/sounds" -type f -iname ${allowed_extention}) + + if [ -z "${copyflag}" ]; then + tput rc; tput el + printf "gathering sounds ${allowed_extention} : ${fileswc}..." + fi + if [ ${fileswc} != 0 ]&&[ -n "${copyflag}" ]||[ -z "${copyflag}" ]; then + fn_print_ok_eol_nl + fi done fi @@ -500,20 +546,12 @@ fn_fastdl_completed(){ fn_script_log "FastDL completed" } -# Only Source supports FastDL -if [ "${engine}" != "source" ]; then - fn_print_fatal "${gamename} does not support FastDL" - fn_script_log_fatal "${gamename} does not support FastDL" - core_exit.sh -fi - # Run functions fn_print_header echo "More info: https://git.io/vyk9a" echo "" fn_fastdl_config - if [ "${gamename}" == "Garry's Mod" ]; then fn_fastdl_gmod fn_fastdl_gmod_lua_enforcer From 09cafb0e6a08897d20d889f4d1521a12fdeb16d2 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Thu, 2 Mar 2017 10:53:03 +0100 Subject: [PATCH 0567/1895] Fixing ts3db prompt's opposite behavior --- lgsm/functions/install_ts3db.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index ceb91afa7..ebceecfa7 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -48,7 +48,7 @@ fn_install_ts3db_mariadb(){ if [ -z "${autoinstall}" ]; then echo "" - if ! fn_prompt_yn "Do you want to use MariaDB/MySQL instead of sqlite (Database Server including user and database already has to be set up!)?" N; then + if fn_prompt_yn "Do you want to use MariaDB/MySQL instead of sqlite (Database Server including user and database already has to be set up!)?" N; then fn_install_ts3db_mariadb fi else From 7a9af83b0ceaea023939d3ffc2eccec28e0c249c Mon Sep 17 00:00:00 2001 From: Luke Spragg Date: Thu, 2 Mar 2017 16:12:09 -0500 Subject: [PATCH 0568/1895] Update Oxide mod download URLs Per http://oxidemod.org/threads/new-snapshot-build-server-and-download-locations.23770/ --- lgsm/functions/mods_list.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index f5768efed..1709f9cdf 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -65,9 +65,9 @@ mod_info_advdupe2=( MOD "advdupe2" "Advanced Duplicator 2" "https://github.com/w mod_info_darkrp=( MOD "darkrp" "DarkRP" "https://github.com/FPtje/DarkRP/archive/master.zip" "darkrp-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Most popular gamemode" ) mod_info_darkrpmodification=( MOD "darkrpmodification" "DarkRP Modification" "https://github.com/FPtje/darkrpmodification/archive/master.zip" "darkrpmodification-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "NOUPDATE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Customize DarkRP settings" ) # Oxidemod -mod_info_rustoxide=( MOD "rustoxide" "Oxide for Rust" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-Rust.zip" "Oxide-Rust_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Rust;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-rust.1659" "Allows for the use of plugins" ) -mod_info_hwoxide=( MOD "hwoxide" "Oxide for Hurtworld" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-Hurtworld.zip" "Oxide-Hurtworld_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Hurtworld;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-hurtworld.1332" "Allows for the use of plugins" ) -mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "https://raw.githubusercontent.com/OxideMod/Snapshots/master/Oxide-7DaysToDie.zip" "Oxide-7DaysToDie_Linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-7-days-to-die.813" "Allows for the use of plugins" ) +mod_info_rustoxide=( MOD "rustoxide" "Oxide for Rust" "https://dl.bintray.com/oxidemod/builds/Oxide-Rust.zip" "Oxide-Rust.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Rust;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-rust.1659/" "Allows for the use of plugins" ) +mod_info_hwoxide=( MOD "hwoxide" "Oxide for Hurtworld" "https://dl.bintray.com/oxidemod/builds/Oxide-Hurtworld.zip" "Oxide-Hurtworld.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Hurtworld;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-hurtworld.1332/" "Allows for the use of plugins" ) +mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "https://dl.bintray.com/oxidemod/builds/Oxide-7DaysToDie.zip" "Oxide-7DaysToDie.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "http://oxidemod.org/downloads/oxide-for-7-days-to-die.813/" "Allows for the use of plugins" ) # REQUIRED: Set all mods info into the global array mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_sourcemod[@]}" "${mod_info_ulib[@]}" "${mod_info_ulx[@]}" "${mod_info_utime[@]}" "${mod_info_uclip[@]}" "${mod_info_acf[@]}" "${mod_info_acf_missiles[@]}" "${mod_info_acf_sweps[@]}" "${mod_info_advdupe2[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" ) From 96ac99b543c5148763a49b5757b2277f57a54e15 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 3 Mar 2017 17:35:53 +0000 Subject: [PATCH 0569/1895] merged copy code in to one --- lgsm/functions/command_fastdl.sh | 219 ++++++++----------------------- 1 file changed, 58 insertions(+), 161 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 76b9a4d69..6343e5ab7 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -306,179 +306,76 @@ fn_fastdl_source(){ fn_script_log "analyzing required files" fi - # Maps - if [ -d "${systemdir}/maps" ]; then - local allowed_extentions_array_=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) - for allowed_extention in "${allowed_extentions_array[@]}" - do - fileswc=0 - tput sc - if [ -z "${copyflag}" ]; then - tput rc; tput el - printf "gathering maps ${allowed_extention} : ${fileswc}..." + local directorys_array_=( "maps" "materials" "particles" "sounds" "*.txt" ) + for directory in "${directorys_array[@]}" + do + if [ -d "${systemdir}/${directory}" ]; then + if [ "${directory}" == "maps" ]; then + local allowed_extentions_array_=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) + elif [ "${directory}" == "materials" ]; then + local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) + elif [ "${directory}" == "particles" ]; then + local allowed_extentions_array=( "*.pcf" ) + elif [ "${directory}" == "sounds" ]; then + local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.mdl" "*.phy" "*.jpg" "*.png" ) fi - while read -r mapfile; do - ((fileswc++)) - if [ -n "${copyflag}" ]; then + for allowed_extention in "${allowed_extentions_array[@]}" + do + fileswc=0 + tput sc + if [ -z "${copyflag}" ]; then tput rc; tput el - printf "copying maps ${allowed_extention} : ${fileswc}..." - if [ ! -d "${fastdldir}/maps" ]; then - mkdir "${fastdldir}/maps" - fi - cp "${mapfile}" "${fastdldir}/maps" - else - tput rc; tput el - printf "gathering maps ${allowed_extention} : ${fileswc}..." - sleep 0.01 - echo "${mapfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" + printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." fi - done < <(find "${systemdir}/maps" -type f -iname ${allowed_extention}) - - if [ -z "${copyflag}" ]; then - tput rc; tput el - printf "gathering maps ${allowed_extention} : ${fileswc}..." - fi - if [ ${fileswc} != 0 ]&&[ -n "${copyflag}" ]||[ -z "${copyflag}" ]; then - fn_print_ok_eol_nl - fi - done - fi - - # Materials - if [ -d "${systemdir}/materials" ]; then - local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) - for allowed_extention in "${allowed_extentions_array[@]}" - do - fileswc=0 - tput sc - if [ -z "${copyflag}" ]; then - tput rc; tput el - printf "gathering materials ${allowed_extention} : ${fileswc}..." - fi - while read -r mapfile; do - ((fileswc++)) - if [ -n "${copyflag}" ]; then - tput rc; tput el - printf "copying materials ${allowed_extention} : ${fileswc}..." - if [ ! -d "${fastdldir}/materials" ]; then - mkdir "${fastdldir}/materials" + while read -r mapfile; do + ((fileswc++)) + if [ -n "${copyflag}" ]; then + tput rc; tput el + printf "copying ${directory} ${allowed_extention} : ${fileswc}..." + if [ ! -d "${fastdldir}/${directory}" ]; then + mkdir "${fastdldir}/${directory}" + fi + cp "${mapfile}" "${fastdldir}/${directory}" + else + tput rc; tput el + printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." + sleep 0.01 + echo "${mapfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" fi - cp "${mapfile}" "${fastdldir}/materials" - else - tput rc; tput el - printf "gathering materials ${allowed_extention} : ${fileswc}..." - sleep 0.01 - echo "${mapfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" - fi - done < <(find "${systemdir}/materials" -type f -iname ${allowed_extention}) + done < <(find "${systemdir}/${directory}" -type f -iname ${allowed_extention}) - if [ -z "${copyflag}" ]; then - tput rc; tput el - printf "gathering materials ${allowed_extention} : ${fileswc}..." - fi - if [ ${fileswc} != 0 ]&&[ -n "${copyflag}" ]||[ -z "${copyflag}" ]; then - fn_print_ok_eol_nl - fi - done - fi - - # Particles - if [ -d "${systemdir}/particles" ]; then - local allowed_extentions_array=( "*.pcf" ) - for allowed_extention in "${allowed_extentions_array[@]}" - do - fileswc=0 - tput sc - if [ -z "${copyflag}" ]; then - tput rc; tput el - printf "gathering particles ${allowed_extention} : ${fileswc}..." - fi - while read -r mapfile; do - ((fileswc++)) - if [ -n "${copyflag}" ]; then + if [ -z "${copyflag}" ]; then tput rc; tput el - printf "copying particles ${allowed_extention} : ${fileswc}..." - if [ ! -d "${fastdldir}/particles" ]; then - mkdir "${fastdldir}/particles" - fi - cp "${mapfile}" "${fastdldir}/particles" - else - tput rc; tput el - printf "gathering particles ${allowed_extention} : ${fileswc}..." - sleep 0.01 - echo "${mapfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" + printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." fi - done < <(find "${systemdir}/particles" -type f -iname ${allowed_extention}) - - if [ -z "${copyflag}" ]; then - tput rc; tput el - printf "gathering particles ${allowed_extention} : ${fileswc}..." - fi - if [ ${fileswc} != 0 ]&&[ -n "${copyflag}" ]||[ -z "${copyflag}" ]; then - fn_print_ok_eol_nl - fi - done - fi - - # Sounds - if [ -d "${systemdir}/sounds" ]; then - local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.mdl" "*.phy" "*.jpg" "*.png" ) - for allowed_extention in "${allowed_extentions_array[@]}" - do - fileswc=0 - tput sc - if [ -z "${copyflag}" ]; then - tput rc; tput el - printf "gathering sounds ${allowed_extention} : ${fileswc}..." - fi - while read -r mapfile; do - ((fileswc++)) - if [ -n "${copyflag}" ]; then - tput rc; tput el - printf "copying soundss ${allowed_extention} : ${fileswc}..." - if [ ! -d "${fastdldir}/sounds" ]; then - mkdir "${fastdldir}/sounds" - fi - cp "${mapfile}" "${fastdldir}/sounds" - else - tput rc; tput el - printf "gathering sounds ${allowed_extention} : ${fileswc}..." - sleep 0.01 - echo "${mapfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" + if [ ${fileswc} != 0 ]&&[ -n "${copyflag}" ]||[ -z "${copyflag}" ]; then + fn_print_ok_eol_nl fi - done < <(find "${systemdir}/sounds" -type f -iname ${allowed_extention}) - - if [ -z "${copyflag}" ]; then - tput rc; tput el - printf "gathering sounds ${allowed_extention} : ${fileswc}..." - fi - if [ ${fileswc} != 0 ]&&[ -n "${copyflag}" ]||[ -z "${copyflag}" ]; then - fn_print_ok_eol_nl - fi - done + done + fi + done + + if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then + totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt") + # Calculates total file size + while read dufile; do + filesize=$(du -b "${dufile}"| awk '{ print $1 }') + filesizetotal=$(( ${filesizetotal} + ${filesize} )) + done <"${tmpdir}/fastdl_files_to_compress.txt" fi -if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then - totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt") - # Calculates total file size - while read dufile; do - filesize=$(du -b "${dufile}"| awk '{ print $1 }') - filesizetotal=$(( ${filesizetotal} + ${filesize} )) - done <"${tmpdir}/fastdl_files_to_compress.txt" -fi - -if [ -z "${copyflag}" ]; then - echo "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0) " - rm "${tmpdir}/fastdl_files_to_compress.txt" - if fn_prompt_yn "Continue?" Y; then - copyflag=1 - fn_fastdl_source + if [ -z "${copyflag}" ]; then + echo "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0) " + rm "${tmpdir}/fastdl_files_to_compress.txt" + if fn_prompt_yn "Continue?" Y; then + copyflag=1 + fn_fastdl_source + else + core_exit.sh + fi else - core_exit.sh + fn_fastdl_bzip2 fi -else - fn_fastdl_bzip2 -fi } # Generate lua file that will force download any file into the FastDL directory From 91525dcbbf4cb235d1763b7573aadc25d1a7fd37 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 3 Mar 2017 17:37:26 +0000 Subject: [PATCH 0570/1895] added if --- lgsm/functions/command_fastdl.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 6343e5ab7..e2c787ce1 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -366,7 +366,9 @@ fn_fastdl_source(){ if [ -z "${copyflag}" ]; then echo "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0) " - rm "${tmpdir}/fastdl_files_to_compress.txt" + if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then + rm "${tmpdir}/fastdl_files_to_compress.txt" + fi if fn_prompt_yn "Continue?" Y; then copyflag=1 fn_fastdl_source From 7ffe904a0609d1611234a7055a591786bda48a05 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 3 Mar 2017 17:57:39 +0000 Subject: [PATCH 0571/1895] fixes for fn_fastdl_source --- lgsm/functions/command_fastdl.sh | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index e2c787ce1..f0e09fd6d 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -306,12 +306,12 @@ fn_fastdl_source(){ fn_script_log "analyzing required files" fi - local directorys_array_=( "maps" "materials" "particles" "sounds" "*.txt" ) + local directorys_array=( "maps" "materials" "particles" "sounds" ) for directory in "${directorys_array[@]}" do if [ -d "${systemdir}/${directory}" ]; then if [ "${directory}" == "maps" ]; then - local allowed_extentions_array_=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) + local allowed_extentions_array=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) elif [ "${directory}" == "materials" ]; then local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) elif [ "${directory}" == "particles" ]; then @@ -366,9 +366,7 @@ fn_fastdl_source(){ if [ -z "${copyflag}" ]; then echo "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0) " - if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then - rm "${tmpdir}/fastdl_files_to_compress.txt" - fi + rm "${tmpdir}/fastdl_files_to_compress.txt" if fn_prompt_yn "Continue?" Y; then copyflag=1 fn_fastdl_source From 0abbe793be1e9af03becc8509617e6b940cc4e06 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 3 Mar 2017 21:49:48 +0000 Subject: [PATCH 0572/1895] Getting gmod version up and running --- lgsm/functions/command_fastdl.sh | 225 ++++++++++++------------------- 1 file changed, 83 insertions(+), 142 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index f0e09fd6d..dc39a3792 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -23,17 +23,9 @@ luafastdlfullpath="${luasvautorundir}/${luafastdlfile}" fn_check_bzip2(){ # Returns true if not installed if [ -z "$(command -v bzip2)" ]; then - bzip2installed="0" - fn_print_info "bzip2 is not installed! Install it to enable file compression" - fn_script_log_info "bzip2 is not installed. Install it to enable file compression." - fn_script_log_info "https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL#bzip2-compression" - echo -en "\n" - sleep 1 - echo " * https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL#bzip2-compression" - sleep 2 - echo "" - else - bzip2installed="1" + fn_print_fail "bzip2 is not installed" + fn_script_log_fatal "bzip2 is not installed" + core_exit.sh fi } @@ -56,9 +48,9 @@ fn_fastdl_config(){ # Garry's Mod Specific if [ "${gamename}" == "Garry's Mod" ]; then - # Prompt to clear addons dir from fastdl, can use unnecessary space or be required depending on addon's file structures + # Prompt to clear addons dir from fastdl, can use unnecessary space or not be required depending on addon's file structures fn_print_dots - if fn_prompt_yn "Clear addons dir from fastdl dir?" Y; then + if fn_prompt_yn "Clear addons directory from FastDL?" Y; then cleargmodaddons="on"; else cleargmodaddons="off"; @@ -125,111 +117,51 @@ fn_clear_old_fastdl(){ } fn_fastdl_gmod(){ - # Copy all needed files for FastDL - echo "" - fn_print_dots "Starting gathering all needed files" - fn_script_log "Starting gathering all needed files" - sleep 1 - echo -en "\n" - - # No choice to cd to the directory, as find can't then display relative directory - cd "${systemdir}" || exit - - # Map Files - fn_print_dots "Copying map files..." - fn_script_log "Copying map files" - sleep 0.5 - find . -name '*.bsp' | cpio --quiet -updm "${fastdldir}" - find . -name '*.ain' | cpio --quiet -updm "${fastdldir}" - fn_print_ok "Map files copied" - sleep 0.5 - echo -en "\n" - - # Materials - fn_print_dots "Copying materials..." - fn_script_log "Copying materials" - sleep 0.5 - find . -name '*.vtf' | cpio --quiet -updm "${fastdldir}" - find . -name '*.vmt' | cpio --quiet -updm "${fastdldir}" - fn_print_ok "Materials copied" - sleep 0.5 - echo -en "\n" - - # Models - fn_print_dots "Copying models..." - fn_script_log "Copying models" - sleep 1 - find . -name '*.vtx' | cpio --quiet -updm "${fastdldir}" - find . -name '*.vvd' | cpio --quiet -updm "${fastdldir}" - find . -name '*.mdl' | cpio --quiet -updm "${fastdldir}" - find . -name '*.phy' | cpio --quiet -updm "${fastdldir}" - fn_print_ok "Models copied" - sleep 0.5 - echo -en "\n" - - # Particles - fn_print_dots "Copying particles..." - fn_script_log "Copying particles" - sleep 0.5 - find . -name '*.pcf' | cpio --quiet -updm "${fastdldir}" - fn_print_ok "Particles copied" - sleep 0.5 - echo -en "\n" - - # Sounds - fn_print_dots "Copying sounds..." - fn_script_log "Copying sounds" - sleep 0.5 - find . -name '*.wav' | cpio --quiet -updm "${fastdldir}" - find . -name '*.mp3' | cpio --quiet -updm "${fastdldir}" - find . -name '*.ogg' | cpio --quiet -updm "${fastdldir}" - fn_print_ok "Sounds copied" - sleep 0.5 - echo -en "\n" - - # Resources (mostly fonts) - fn_print_dots "Copying fonts and png..." - fn_script_log "Copying fonts and png" - sleep 1 - find . -name '*.otf' | cpio --quiet -updm "${fastdldir}" - find . -name '*.ttf' | cpio --quiet -updm "${fastdldir}" - find . -name '*.png' | cpio --quiet -updm "${fastdldir}" - fn_print_ok "Fonts and png copied" - sleep 0.5 - echo -en "\n" - - # Going back to rootdir in order to prevent mistakes - cd "${rootdir}" - # Correct addons directory structure for FastDL if [ -d "${fastdldir}/addons" ]; then - fn_print_info "Adjusting addons' file structure" - fn_script_log "Adjusting addons' file structure" - sleep 1 + echo -en "updating addons file structure..." cp -Rf "${fastdldir}"/addons/*/* "${fastdldir}" - fn_print_ok "Adjusted addons' file structure" - sleep 1 - echo -en "\n" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "updating addons file structure" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "updating addons file structure" + fi # Clear addons directory in fastdl if [ "${cleargmodaddons}" == "on" ]; then - fn_print_info "Clearing addons dir from fastdl dir" - fn_script_log "Clearing addons dir from fastdl dir" + echo -en "clearing addons dir from fastdl dir" + fn_script_log "clearing addons dir from fastdl dir..." sleep 1 rm -R "${fastdldir:?}/addons" - fn_print_ok "Cleared addons dir from fastdl dir" - sleep 1 - echo -en "\n" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "clearing addons dir from fastdl dir" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "clearing addons dir from fastdl dir" + fi fi fi # Correct content that may be into a lua directory by mistake like some darkrpmodification addons if [ -d "${fastdldir}/lua" ]; then - fn_print_dots "Typical DarkRP files detected, fixing" + echo -en "correcting DarkRP files..." sleep 2 cp -Rf "${fastdldir}/lua/"* "${fastdldir}" - fn_print_ok "Stupid DarkRP file structure fixed" - sleep 2 - echo -en "\n" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "correcting DarkRP files" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "correcting DarkRP files" + fi fi } @@ -310,14 +242,30 @@ fn_fastdl_source(){ for directory in "${directorys_array[@]}" do if [ -d "${systemdir}/${directory}" ]; then - if [ "${directory}" == "maps" ]; then - local allowed_extentions_array=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) - elif [ "${directory}" == "materials" ]; then - local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) - elif [ "${directory}" == "particles" ]; then - local allowed_extentions_array=( "*.pcf" ) - elif [ "${directory}" == "sounds" ]; then - local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.mdl" "*.phy" "*.jpg" "*.png" ) + if [ "${gamename}" == "Garry's Mod" ]; then + if [ "${directory}" == "maps" ]; then + local allowed_extentions_array=( "*.bsp" "*.ain" ) + elif [ "${directory}" == "materials" ]; then + local allowed_extentions_array=( "*.vtf" "*.vmt" ) + elif [ "${directory}" == "models" ]; then + local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.phy" ) + elif [ "${directory}" == "particles" ]; then + local allowed_extentions_array=( "*.pcf" ) + elif [ "${directory}" == "sounds" ]; then + local allowed_extentions_array=( "*.wav" "*.mp3" "*.ogg" ) + elif [ "${directory}" == "resources" ]; then + local allowed_extentions_array=( "*.otf" "*.ttf" "*.png" ) + fi + else + if [ "${directory}" == "maps" ]; then + local allowed_extentions_array=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) + elif [ "${directory}" == "materials" ]; then + local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) + elif [ "${directory}" == "particles" ]; then + local allowed_extentions_array=( "*.pcf" ) + elif [ "${directory}" == "sounds" ]; then + local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.mdl" "*.phy" "*.jpg" "*.png" ) + fi fi for allowed_extention in "${allowed_extentions_array[@]}" do @@ -381,41 +329,36 @@ fn_fastdl_source(){ # Generate lua file that will force download any file into the FastDL directory fn_fastdl_gmod_lua_enforcer(){ # Remove lua file if luaressource is turned off and file exists - echo "" - if [ "${luaressource}" == "off" ]; then - if [ -f "${luafastdlfullpath}" ]; then - fn_print_dots "Removing download enforcer" - sleep 1 - rm -R "${luafastdlfullpath:?}" - fn_print_ok "Removed download enforcer" - fn_script_log "Removed old download inforcer" - echo -en "\n" - sleep 2 + if [ -f "${luafastdlfullpath}" ]; then + echo -en "removing existing download enforcer..." + rm -R "${luafastdlfullpath:?}" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "removing existing download enforcer" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "removing existing download enforcer" fi fi # Remove old lua file and generate a new one if user said yes if [ "${luaressource}" == "on" ]; then - if [ -f "${luafastdlfullpath}" ]; then - fn_print_dots "Removing old download enforcer" - sleep 1 - rm "${luafastdlfullpath}" - fn_print_ok "Removed old download enforcer" - fn_script_log "Removed old download enforcer" - echo -en "\n" - sleep 1 - fi - fn_print_dots "Generating new download enforcer" - fn_script_log "Generating new download enforcer" - sleep 1 + echo -en "creating new download enforcer..." + fn_script_log "creating new download enforcer" # Read all filenames and put them into a lua file at the right path find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -printf '%P\n' | while read line; do echo "resource.AddFile( "\""${line}"\"" )" >> "${luafastdlfullpath}" done - fn_print_ok "Download enforcer generated" - fn_script_log "Download enforcer generated" - echo -en "\n" - echo "" - sleep 2 + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "creating new download enforcer" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "creating new download enforcer" + fi fi } @@ -448,12 +391,10 @@ fn_print_header echo "More info: https://git.io/vyk9a" echo "" fn_fastdl_config - +fn_fastdl_source if [ "${gamename}" == "Garry's Mod" ]; then fn_fastdl_gmod fn_fastdl_gmod_lua_enforcer -else - fn_fastdl_source fi fn_fastdl_completed core_exit.sh From a4f634dc034d368caefaafe529aeed46038f914f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 3 Mar 2017 22:39:10 +0000 Subject: [PATCH 0573/1895] Further improvements downlaod enforcer currently broken --- lgsm/functions/command_fastdl.sh | 69 ++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index dc39a3792..7179484cd 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -40,28 +40,30 @@ fn_fastdl_config(){ echo "${fastdldir}" echo "" if fn_prompt_yn "Overwrite existing directory?" Y; then - clearoldfastdl="on" + fn_script_log_info "Overwrite existing directory: YES" else - clearoldfastdl="off" + core_exit.sh fi fi # Garry's Mod Specific if [ "${gamename}" == "Garry's Mod" ]; then # Prompt to clear addons dir from fastdl, can use unnecessary space or not be required depending on addon's file structures - fn_print_dots if fn_prompt_yn "Clear addons directory from FastDL?" Y; then cleargmodaddons="on"; + fn_script_log_info "Clear addons directory from FastDL: YES" else cleargmodaddons="off"; + fn_script_log_info "Clear addons directory from FastDL: NO" fi # Prompt for download enforcer, which is using a .lua addfile resource generator - fn_print_dots if fn_prompt_yn "Use client download enforcer?" Y; then luaressource="on" + fn_script_log_info "Use client download enforcer: YES" else luaressource="off" + fn_script_log_info "Use client download enforcer: NO" fi fi } @@ -74,11 +76,11 @@ fn_fastdl_dirs(){ exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "creating web directory ${webdir}..." + fn_script_log_fatal "Creating web directory ${webdir}" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "creating web directory ${webdir}..." + fn_script_log_pass "Creating web directory ${webdir}" fi sleep 0.5 fi @@ -88,11 +90,11 @@ fn_fastdl_dirs(){ exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "creating fastdl directory ${fastdldir}..." + fn_script_log_fatal "Creating fastdl directory ${fastdldir}" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "creating fastdl directory ${fastdldir}..." + fn_script_log_pass "Creating fastdl directory ${fastdldir}" fi sleep 0.5 fi @@ -106,11 +108,11 @@ fn_clear_old_fastdl(){ exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "clearing existing FastDL directory ${fastdldir}..." + fn_script_log_fatal "Clearing existing FastDL directory ${fastdldir}" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "clearing existing FastDL directory ${fastdldir}..." + fn_script_log_pass "Clearing existing FastDL directory ${fastdldir}" fi sleep 0.5 fi @@ -133,7 +135,6 @@ fn_fastdl_gmod(){ # Clear addons directory in fastdl if [ "${cleargmodaddons}" == "on" ]; then echo -en "clearing addons dir from fastdl dir" - fn_script_log "clearing addons dir from fastdl dir..." sleep 1 rm -R "${fastdldir:?}/addons" exitcode=$? @@ -147,7 +148,6 @@ fn_fastdl_gmod(){ fi fi fi - # Correct content that may be into a lua directory by mistake like some darkrpmodification addons if [ -d "${fastdldir}/lua" ]; then echo -en "correcting DarkRP files..." @@ -229,13 +229,13 @@ fn_fastdl_source(){ fn_fastdl_dirs echo -e "copying files to ${fastdldir}" - fn_script_log "copying files to ${fastdldir}" + fn_script_log_info "Copying files to ${fastdldir}" else if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then rm -f "${tmpdir}/fastdl_files_to_compress.txt" fi - echo -e "analyzing required files" - fn_script_log "analyzing required files" + echo -e "analysing required files" + fn_script_log_info "Analysing required files" fi local directorys_array=( "maps" "materials" "particles" "sounds" ) @@ -273,17 +273,26 @@ fn_fastdl_source(){ tput sc if [ -z "${copyflag}" ]; then tput rc; tput el - printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." + printf "copying ${directory} ${allowed_extention} : ${fileswc}..." fi while read -r mapfile; do ((fileswc++)) if [ -n "${copyflag}" ]; then tput rc; tput el printf "copying ${directory} ${allowed_extention} : ${fileswc}..." + sleep 0.01 if [ ! -d "${fastdldir}/${directory}" ]; then mkdir "${fastdldir}/${directory}" fi cp "${mapfile}" "${fastdldir}/${directory}" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Copying ${mapfile} > ${fastdldir}/${directory}" + core_exit.sh + else + fn_script_log_pass "Copying ${mapfile} > ${fastdldir}/${directory}" + fi else tput rc; tput el printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." @@ -313,7 +322,8 @@ fn_fastdl_source(){ fi if [ -z "${copyflag}" ]; then - echo "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0) " + echo "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)" + fn_script_log_info "${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)" rm "${tmpdir}/fastdl_files_to_compress.txt" if fn_prompt_yn "Continue?" Y; then copyflag=1 @@ -322,6 +332,9 @@ fn_fastdl_source(){ core_exit.sh fi else + if [ "${gamename}" == "Garry's Mod" ]; then + fn_fastdl_gmod_lua_enforcer + fi fn_fastdl_bzip2 fi } @@ -330,34 +343,33 @@ fn_fastdl_source(){ fn_fastdl_gmod_lua_enforcer(){ # Remove lua file if luaressource is turned off and file exists if [ -f "${luafastdlfullpath}" ]; then - echo -en "removing existing download enforcer..." + echo -en "removing existing download enforcer: ${luafastdlfile}..." rm -R "${luafastdlfullpath:?}" exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "removing existing download enforcer" + fn_script_log_fatal "removing existing download enforcer ${luafastdlfullpath}" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "removing existing download enforcer" + fn_script_log_pass "removing existing download enforcer ${luafastdlfullpath}" fi fi # Remove old lua file and generate a new one if user said yes if [ "${luaressource}" == "on" ]; then - echo -en "creating new download enforcer..." - fn_script_log "creating new download enforcer" + echo -en "creating new download enforcer: ${luafastdlfile}..." # Read all filenames and put them into a lua file at the right path - find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -printf '%P\n' | while read line; do + find "${fastdldir:?}" \( -type f -name "*.bz2" \) -printf '%P\n' | while read line; do echo "resource.AddFile( "\""${line}"\"" )" >> "${luafastdlfullpath}" done exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "creating new download enforcer" + fn_script_log_fatal "creating new download enforcer ${luafastdlfullpath}" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "creating new download enforcer" + fn_script_log_pass "creating new download enforcer ${luafastdlfullpath}" fi fi } @@ -369,11 +381,11 @@ fn_fastdl_bzip2(){ exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "creating web directory ${webdir}..." + fn_script_log_fatal "compressing ${filetocompress}" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "creating web directory ${webdir}..." + fn_script_log_pass "compressing ${filetocompress}" fi done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \)) } @@ -383,7 +395,7 @@ fn_fastdl_completed(){ echo "FastDL files are located in:" echo "${webdir}" echo "FastDL completed" - fn_script_log "FastDL completed" + fn_script_log_info "FastDL completed" } # Run functions @@ -394,7 +406,6 @@ fn_fastdl_config fn_fastdl_source if [ "${gamename}" == "Garry's Mod" ]; then fn_fastdl_gmod - fn_fastdl_gmod_lua_enforcer fi fn_fastdl_completed core_exit.sh From 6a474dc6ad139441caeda2c6d92baf820d0fa606 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 4 Mar 2017 05:17:09 +0100 Subject: [PATCH 0574/1895] core_exit.sh --- lgsm/functions/command_dev_detect_deps.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index f709a4603..42ea13880 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -148,4 +148,6 @@ rm -f "${tmpdir}/.depdetect_ubuntu_list_uniq" rm -f "${tmpdir}/.depdetect_readelf" rm -f "${tmpdir}/.depdetect_unknown" -rm -f "${tmpdir}/.depdetect_unknown_uniq" \ No newline at end of file +rm -f "${tmpdir}/.depdetect_unknown_uniq" + +core_exit.sh From 7660f3a874e5c543e35bb510b4edf7af668efde3 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 4 Mar 2017 05:17:09 +0100 Subject: [PATCH 0575/1895] core_exit.sh --- lgsm/functions/command_dev_detect_glibc.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index 7703fba34..536a12c2a 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -37,4 +37,6 @@ while IFS= read -r -d $'\0' line; do done echo "" cat "${tmpdir}/detect_glibc.tmp"|sort|uniq|sort -r --version-sort -rm "${tmpdir}/detect_glibc.tmp" \ No newline at end of file +rm "${tmpdir}/detect_glibc.tmp" + +core_exit.sh From 7fe986a6876d2a9980e3be5690064f50b3600493 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 4 Mar 2017 05:17:10 +0100 Subject: [PATCH 0576/1895] core_exit.sh --- lgsm/functions/command_dev_detect_ldd.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_dev_detect_ldd.sh b/lgsm/functions/command_dev_detect_ldd.sh index 16f1f9473..4e1c7b2b3 100644 --- a/lgsm/functions/command_dev_detect_ldd.sh +++ b/lgsm/functions/command_dev_detect_ldd.sh @@ -50,4 +50,6 @@ echo "=================================" cat "${tmpdir}/detect_ldd_not_found.tmp" rm "${tmpdir}/detect_ldd.tmp" -rm "${tmpdir}/detect_ldd_not_found.tmp" \ No newline at end of file +rm "${tmpdir}/detect_ldd_not_found.tmp" + +core_exit.sh From e51746e5b117fbb9da938c8ad84f0ffef41994c8 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 4 Mar 2017 05:33:47 +0100 Subject: [PATCH 0577/1895] proper exit (fix opt running after uf) --- lgsm/functions/core_getopt.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 39efa37e4..d658397e2 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -174,12 +174,11 @@ for i in "${optcommands[@]}"; do if [ "$(echo "${currentopt[index]}"| awk -F ';' -v x=${currcmdindex} '{ print $x }')" == "${getopt}" ]; then # Run command ${currentopt[index+1]} + core_exit.sh break fi done done - break - core_exit.sh fi done @@ -187,4 +186,4 @@ done echo -e "${red}Unknown command${default}: $0 ${getopt}" exitcode=2 fn_opt_usage -core_exit.sh \ No newline at end of file +core_exit.sh From 1c06996cff4036a838b507ee5a581e9180646be4 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 4 Mar 2017 05:42:19 +0100 Subject: [PATCH 0578/1895] attempt to fix lua enforcer --- lgsm/functions/command_fastdl.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 7179484cd..60c78fa18 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -341,10 +341,10 @@ fn_fastdl_source(){ # Generate lua file that will force download any file into the FastDL directory fn_fastdl_gmod_lua_enforcer(){ - # Remove lua file if luaressource is turned off and file exists + # Clear old lua file if [ -f "${luafastdlfullpath}" ]; then echo -en "removing existing download enforcer: ${luafastdlfile}..." - rm -R "${luafastdlfullpath:?}" + rm "${luafastdlfullpath:?}" exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl @@ -355,9 +355,10 @@ fn_fastdl_gmod_lua_enforcer(){ fn_script_log_pass "removing existing download enforcer ${luafastdlfullpath}" fi fi - # Remove old lua file and generate a new one if user said yes + # Generate new one if user said yes if [ "${luaressource}" == "on" ]; then echo -en "creating new download enforcer: ${luafastdlfile}..." + touch "${luafastdlfullpath}" # Read all filenames and put them into a lua file at the right path find "${fastdldir:?}" \( -type f -name "*.bz2" \) -printf '%P\n' | while read line; do echo "resource.AddFile( "\""${line}"\"" )" >> "${luafastdlfullpath}" From 02b661adbb61fcd3896353804d9d586e0ee480d0 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sat, 4 Mar 2017 05:49:54 +0100 Subject: [PATCH 0579/1895] lua ressource not bz2 ! --- lgsm/functions/command_fastdl.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 60c78fa18..3b695cf0e 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -360,7 +360,7 @@ fn_fastdl_gmod_lua_enforcer(){ echo -en "creating new download enforcer: ${luafastdlfile}..." touch "${luafastdlfullpath}" # Read all filenames and put them into a lua file at the right path - find "${fastdldir:?}" \( -type f -name "*.bz2" \) -printf '%P\n' | while read line; do + find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -printf '%P\n' | while read line; do echo "resource.AddFile( "\""${line}"\"" )" >> "${luafastdlfullpath}" done exitcode=$? From 394bfd59056a6a9db5f0d5a42abca09da7be8135 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 14:34:53 +0000 Subject: [PATCH 0580/1895] Added if statement for webdir allowing the user to change it Also added forgotten dirs for gmod --- lgsm/functions/command_fastdl.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 3b695cf0e..0c4766704 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -12,7 +12,9 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh # Directories -webdir="${rootdir}/public_html" +if [ -z "${webdir}" ]; then + webdir="${lgsmdir}/public_html" +fi fastdldir="${webdir}/fastdl" addonsdir="${systemdir}/addons" # Server lua autorun dir, used to autorun lua on client connect to the server @@ -238,7 +240,7 @@ fn_fastdl_source(){ fn_script_log_info "Analysing required files" fi - local directorys_array=( "maps" "materials" "particles" "sounds" ) + local directorys_array=( "maps" "materials" "models" "particles" "sounds" "resources" ) for directory in "${directorys_array[@]}" do if [ -d "${systemdir}/${directory}" ]; then From 1e81f72b66b2040dd9cb60ccb64f48305a625df2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 14:38:01 +0000 Subject: [PATCH 0581/1895] Reverted to master version of fastdl to allow merging to develop fast dl is being worked on in ultimatebyte-0220 --- lgsm/functions/command_fastdl.sh | 230 +++++++------------------------ 1 file changed, 53 insertions(+), 177 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 3d39f49ea..9fe7ca68b 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -6,18 +6,11 @@ # Description: Creates a FastDL directory. local commandname="FASTDL" -local commandaction="FastDL Generator" +local commandaction="FastDL" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh -# Only Source supports FastDL -if [ "${engine}" != "source" ]; then - fn_print_error "${gamename} does not support FastDL" - fn_script_log_error "${gamename} does not support FastDL" - core_exit.sh -fi - # Directories webdir="${rootdir}/public_html" fastdldir="${webdir}/fastdl" @@ -31,27 +24,25 @@ fn_check_bzip2(){ # Returns true if not installed if [ -z "$(command -v bzip2)" ]; then bzip2installed="0" - fn_print_info "bzip2 is not installed! Install it to enable file compression" - fn_script_log_info "bzip2 is not installed. Install it to enable file compression." - fn_script_log_info "https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL#bzip2-compression" + fn_print_info "bzip2 is not installed !" + fn_script_log_info "bzip2 is not installed" echo -en "\n" sleep 1 - echo " * https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL#bzip2-compression" + echo "We advise using it" + echo "For more information, see https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL#bzip2-compression" sleep 2 - echo "" else bzip2installed="1" fi } -# Initiates FastDL fn_fastdl_init(){ - fn_print_header - fn_script_log "Started FastDL Generator" - sleep 1 - fn_check_bzip2 # User confirmation - if ! fn_prompt_yn "Build FastDL directory?" Y; then + fn_print_ok "Welcome to LGSM's FastDL generator" + sleep 1 + echo -en "\n" + fn_script_log "Started FastDL creation" + if ! fn_prompt_yn "Continue?" Y; then exit fi fn_script_log "Initiating FastDL creation" @@ -72,30 +63,28 @@ fn_fastdl_init(){ fi if [ ! -d "${fastdldir}" ]; then # No directory, won't ask for removing old ones - newfastdl="true" + newfastdl=1 fn_print_dots "Creating fastdl directory" sleep 0.5 mkdir "${fastdldir}" fn_print_ok "Created fastdl directory" - fn_script_log "Created fastdl directory" + fn_script_log "FastDL created fastdl directory" sleep 1 echo -en "\n" clearoldfastdl="off" # Nothing to clear elif [ "$(ls -A "${fastdldir}")" ]; then - newfastdl="false" - else - newfastdl="true" + newfastdl=0 fi } -# Prompts user for FastDL creation settings fn_fastdl_config(){ + # Global settings for FastDL creation fn_print_info "Entering configuration" fn_script_log "Configuration" sleep 2 echo -en "\n" # Prompt for clearing old files if directory was already here - if [ "${newfastdl}" == "false" ]; then + if [ -n "${newfastdl}" ] && [ "${newfastdl}" == "0" ]; then fn_print_dots if fn_prompt_yn "Clear old FastDL files?" Y; then clearoldfastdl="on"; fn_script_log "clearoldfastdl enabled"; fn_print_ok "Clearing Enabled" @@ -104,50 +93,27 @@ fn_fastdl_config(){ fi echo -en "\n" fi - # Settings for bzip2 users + # Prompt for using bzip2 if it's installed if [ ${bzip2installed} == 1 ]; then - # Prompt for using bzip2 if it's installed fn_print_dots - if fn_prompt_yn "Enable bzip2 file compression?" Y; then + if fn_prompt_yn "Enable file compression using bzip2?" Y; then bzip2enable="on"; fn_script_log "bzip2 enabled"; fn_print_ok "bzip2 Enabled" else bzip2enable="off"; fn_script_log "bzip2 disabled"; fn_print_ok "bzip2 Disabled" fi echo -en "\n" - if [ "${gamename}" == "Garry's Mod" ]&&[ "${bzip2enable}" == "on" ]; then - # Prompt for clearing uncompressed files, can save some space but might cause issues for gmod - fn_print_dots - if fn_prompt_yn "Clear non-bzip2 FastDL files?" Y; then - clearnonbzip2="on"; fn_script_log "Clearing non-bzip2 files Enabled."; fn_print_ok "Clearing non-bzip2 files Enabled" - else - clearnonbzip2="off"; fn_script_log "Clearing non-bzip2 files Disabled."; fn_print_ok "Clearing non-bzip2 files Disabled" - fi - echo -en "\n" - else - # Other games default remove non bzip2 files - clearnonbzip2="on" - fn_script_log "Original uncompressed fastDL files won't be kept." - fi fi - # Garry's Mod Specific - if [ "${gamename}" == "Garry's Mod" ]; then - # Prompt to clear addons dir from fastdl, can use unnecessary space or be required depending on addon's file structures - fn_print_dots - if fn_prompt_yn "Clear addons dir from fastdl dir?" Y; then - cleargmodaddons="on"; fn_script_log "Addons clearing Enabled."; fn_print_ok "Addons clearing Enabled" - else - cleargmodaddons="off"; fn_script_log "Addons clearing Disabled."; fn_print_ok "Addons clearing Disabled" - fi - echo -en "\n" - # Prompt for download enforcer, which is using a .lua addfile resource generator - fn_print_dots - if fn_prompt_yn "Use client download enforcer?" Y; then - luaressource="on"; fn_script_log "DL enforcer Enabled."; fn_print_ok "Enforcer Enabled" - else - luaressource="off"; fn_script_log "DL enforcer Disabled."; fn_print_ok "Enforcer Disabled" - fi - echo -en "\n" +} + +fn_fastdl_gmod_config(){ + # Prompt for download enforcer, that is using a .lua addfile resource generator + fn_print_dots + if fn_prompt_yn "Use client download enforcer?" Y; then + luaressource="on"; fn_script_log "DL enforcer Enabled"; fn_print_ok "Enforcer Enabled" + else + luaressource="off"; fn_script_log "DL enforcer Disabled"; fn_print_ok "Enforcer Disabled" fi + echo -en "\n" } fn_clear_old_fastdl(){ @@ -164,7 +130,7 @@ fn_clear_old_fastdl(){ fi } -fn_fastdl_gmod(){ +fn_gmod_fastdl(){ # Copy all needed files for FastDL echo "" fn_print_dots "Starting gathering all needed files" @@ -173,7 +139,7 @@ fn_fastdl_gmod(){ echo -en "\n" # No choice to cd to the directory, as find can't then display relative directory - cd "${systemdir}" || exit + cd "${systemdir}" # Map Files fn_print_dots "Copying map files..." @@ -244,27 +210,18 @@ fn_fastdl_gmod(){ # Correct addons directory structure for FastDL if [ -d "${fastdldir}/addons" ]; then fn_print_info "Adjusting addons' file structure" - fn_script_log "Adjusting addons' file structure" + fn_script_log "Adjusting addon's file structure" sleep 1 cp -Rf "${fastdldir}"/addons/*/* "${fastdldir}" - fn_print_ok "Adjusted addons' file structure" + #Don't remove yet rm -R "${fastdldir:?}/addons" + fn_print_ok "Adjusted addon's file structure" sleep 1 echo -en "\n" - # Clear addons directory in fastdl - if [ "${cleargmodaddons}" == "on" ]; then - fn_print_info "Clearing addons dir from fastdl dir" - fn_script_log "Clearing addons dir from fastdl dir" - sleep 1 - rm -R "${fastdldir:?}/addons" - fn_print_ok "Cleared addons dir from fastdl dir" - sleep 1 - echo -en "\n" - fi fi # Correct content that may be into a lua directory by mistake like some darkrpmodification addons if [ -d "${fastdldir}/lua" ]; then - fn_print_dots "Typical DarkRP files detected, fixing" + fn_print_dots "Typical DarkRP shit detected, fixing" sleep 2 cp -Rf "${fastdldir}/lua/"* "${fastdldir}" fn_print_ok "Stupid DarkRP file structure fixed" @@ -273,80 +230,8 @@ fn_fastdl_gmod(){ fi } -fn_fastdl_source(){ - # Copy all needed files for FastDL - echo "" - fn_print_dots "Starting gathering all needed files" - fn_script_log "Starting gathering all needed files" - sleep 1 - echo -en "\n" - - # Map Files - fn_print_dots "Copying map files..." - fn_script_log "Copying map files" - sleep 0.5 - mkdir "${fastdldir}/maps" - find "${systemdir}/maps" -name '*.bsp' -exec cp {} "${fastdldir}/maps" \; - find "${systemdir}/maps" -name '*.ain' -exec cp {} "${fastdldir}/maps" \; - find "${systemdir}/maps" -name '*.nav' -exec cp {} "${fastdldir}/maps" \; - find "${systemdir}/maps" -name '*.jpg' -exec cp {} "${fastdldir}/maps" \; - find "${systemdir}/maps" -name '*.txt' -exec cp {} "${fastdldir}/maps" \; - fn_print_ok "Map files copied" - sleep 0.5 - echo -en "\n" - - # Materials - fn_print_dots "Copying materials..." - fn_script_log "Copying materials" - sleep 0.5 - mkdir "${fastdldir}/materials" - find "${systemdir}/materials" -name '*.vtf' -exec cp {} "${fastdldir}/materials" \; - find "${systemdir}/materials" -name '*.vmt' -exec cp {} "${fastdldir}/materials" \; - find "${systemdir}/materials" -name '*.vbf' -exec cp {} "${fastdldir}/materials" \; - fn_print_ok "Materials copied" - sleep 0.5 - echo -en "\n" - - # Models - fn_print_dots "Copying models..." - fn_script_log "Copying models" - sleep 1 - mkdir "${fastdldir}/models" - find "${systemdir}/models" -name '*.vtx' -exec cp {} "${fastdldir}/models" \; - find "${systemdir}/models" -name '*.vvd' -exec cp {} "${fastdldir}/models" \; - find "${systemdir}/models" -name '*.mdl' -exec cp {} "${fastdldir}/models" \; - find "${systemdir}/models" -name '*.phy' -exec cp {} "${fastdldir}/models" \; - find "${systemdir}/models" -name '*.jpg' -exec cp {} "${fastdldir}/models" \; - find "${systemdir}/models" -name '*.png' -exec cp {} "${fastdldir}/models" \; - fn_print_ok "Models copied" - sleep 0.5 - echo -en "\n" - - # Particles - fn_print_dots "Copying particles..." - fn_script_log "Copying particles" - sleep 0.5 - mkdir "${fastdldir}/particles" - find "${systemdir}" -name '*.pcf' -exec cp {} "${fastdldir}/particles" \; - fn_print_ok "Particles copied" - sleep 0.5 - echo -en "\n" - - # Sounds - fn_print_dots "Copying sounds..." - fn_script_log "Copying sounds" - sleep 0.5 - mkdir "${fastdldir}/sound" - find "${systemdir}" -name '*.wav' -exec cp {} "${fastdldir}/sound" \; - find "${systemdir}" -name '*.mp3' -exec cp {} "${fastdldir}/sound" \; - find "${systemdir}" -name '*.ogg' -exec cp {} "${fastdldir}/sound" \; - fn_print_ok "Sounds copied" - sleep 0.5 - echo -en "\n" -} - # Generate lua file that will force download any file into the FastDL directory -fn_fastdl_gmod_lua_enforcer(){ +fn_lua_fastdl(){ # Remove lua file if luaressource is turned off and file exists echo "" if [ "${luaressource}" == "off" ]; then @@ -375,8 +260,8 @@ fn_fastdl_gmod_lua_enforcer(){ fn_script_log "Generating new download enforcer" sleep 1 # Read all filenames and put them into a lua file at the right path - find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -printf '%P\n' | while read line; do - echo "resource.AddFile( "\""${line}"\"" )" >> "${luafastdlfullpath}" + find "${fastdldir}" \( -type f ! -name "*.bz2" \) -printf '%P\n' | while read line; do + echo "resource.AddFile( "\""${line}"\"" )" >> ${luafastdlfullpath} done fn_print_ok "Download enforcer generated" fn_script_log "Download enforcer generated" @@ -396,50 +281,41 @@ fn_fastdl_bzip2(){ fn_print_dots "Compressing files using bzip2..." fn_script_log "Compressing files using bzip2..." # bzip2 all files that are not already compressed (keeping original files) - find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -exec bzip2 -qk \{\} \; + find "${fastdldir}" \( -type f ! -name "*.bz2" \) -exec bzip2 -qk \{\} \; fn_print_ok "bzip2 compression done" fn_script_log "bzip2 compression done" sleep 1 echo -en "\n" - # Clear non compressed FastDL files - if [ "${clearnonbzip2}" == "on" ]; then - fn_print_dots "Clearing original uncompressed FastDL files..." - sleep 1 - find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -exec rm {} \; - fn_print_ok "Cleared uncompressed FastDL files" - fn_script_log "Cleared uncompressed FastDL files." - fi fi } fn_fastdl_completed(){ # Finished message echo "" - fn_print_ok "FastDL created!" + fn_print_ok "Congratulations, it's done!" fn_script_log "FastDL job done" sleep 2 echo -en "\n" echo "" - fn_print_info_nl "Need more documentation?" - echo " * https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL" + fn_print_info "Need more documentation? See https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL" echo -en "\n" if [ "$bzip2installed" == "0" ]; then - echo "By the way, you'd better install bzip2 and re-run this command!" + echo "By the way, you'd better install bzip2 and re-run this command!" fi - echo "Credits: UltimateByte" + echo "Credits : UltimateByte" } -# Run functions -fn_check_bzip2 -fn_fastdl_init -fn_fastdl_config -fn_clear_old_fastdl +# Game checking and functions running +# Garry's Mod if [ "${gamename}" == "Garry's Mod" ]; then - fn_fastdl_gmod - fn_fastdl_gmod_lua_enforcer -else - fn_fastdl_source + fn_check_bzip2 + fn_fastdl_init + fn_fastdl_config + fn_fastdl_gmod_config + fn_clear_old_fastdl + fn_gmod_fastdl + fn_lua_fastdl + fn_fastdl_bzip2 + fn_fastdl_completed + exit fi -fn_fastdl_bzip2 -fn_fastdl_completed -core_exit.sh From f013f96c4ebe97f0a07f807906dab5b188e1e77d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 14:39:57 +0000 Subject: [PATCH 0582/1895] Also reverted getopt as well being worked on in ultimatebyte-0220 branch --- lgsm/functions/core_getopt.sh | 1100 ++++++++++++++++++++++++++++----- 1 file changed, 954 insertions(+), 146 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 78b097398..bcecc6c2d 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -6,169 +6,977 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -### Define all commands here ### -## User commands | Trigger commands | Description -# Standard commands -cmd_install=( "i;install" "command_install.sh" "Install the server." ) -cmd_auto_install=( "ai;auto-install" "command_autoinstall.sh" "Install the server without prompts." ) -cmd_start=( "st;start" "command_start.sh" "Start the server." ) -cmd_stop=( "sp;stop" "command_stop.sh" "Stop the server." ) -cmd_restart=( "r;restart" "command_restart.sh" "Restart the server." ) -cmd_details=( "dt;details" "command_details.sh" "Display relevant server information." ) -cmd_postdetails=( "pd;postdetails" "command_postdetails.sh" "Post stripped details to pastebin for support." ) -cmd_backup=( "b;backup" "command_backup.sh" "Create archives of the server." ) -cmd_update_functions=( "uf;update-functions" "command_update_functions.sh" "Update LinuxGSM functions." ) -cmd_test_alert=( "ta;test-alert" "command_test_alert.sh" "Send a test alert." ) -cmd_monitor=( "m;monitor" "command_monitor.sh" "Check server status and restart it if crashed." ) -# Console servers only -cmd_console=( "c;console" "command_console.sh" "Access server console." ) -cmd_debug=( "d;debug" "command_debug.sh" "Start server directly in your terminal." ) -# Update servers only -cmd_update=( "u;update" "command_update.sh" "Check for updates and apply if available." ) -cmd_force_update=( "fu;force-update;update-restart;ur" "forceupdate=1; command_update.sh" "Unconditionally update the server." ) -# SteamCMD servers only -cmd_validate=( "v;validate" "command_validate.sh" "Validate server files with SteamCMD." ) -# Server with mods-install -cmd_mods_install=( "mi;mods-install" "command_mods_install.sh" "View and install available mods/addons." ) -cmd_mods_remove=( "mr;mods-remove" "command_mods_remove.sh" "View and remove an installed mod/addon." ) -cmd_mods_update=( "mu;mods-update" "command_mods_update.sh" "Update installed mods/addons." ) -# Server specific -cmd_change_password=( "pw;change-password" "command_ts3_server_pass.sh" "Change TS3 serveradmin password." ) -cmd_install_default_ressources=( "ir;install-default-ressources" "command_install_resources_mta.sh" "Install the MTA default resources." ) -cmd_wipe=( "wi;wipe" "command_wipe.sh" "Wipe your server data." ) -cmd_map_compressor_u99=( "mc;map-compressor" "compress_ut99_maps.sh" "Compresses all ${gamename} server maps." ) -cmd_map_compressor_u2=( "mc;map-compressor" "compress_unreal2_maps.sh" "Compresses all ${gamename} server maps." ) -cmd_install_cdkey=( "cd;server-cd-key" "install_ut2k4_key.sh" "Add your server cd key." ) -cmd_install_dst_token=( "ct;cluster-token" "install_dst_token.sh" "Configure cluster token." ) -cmd_fastdl=( "fd;fastdl" "command_fastdl.sh" "Build a FastDL directory." ) -# Dev commands -cmd_dev_debug=( "dev;dev-debug" "command_dev_debug.sh" "DEVCOMMAND" ) -cmd_dev_detect_deps=( "dd;detect-deps" "command_dev_detect_deps.sh" "DEVCOMMAND" ) -cmd_dev_detect_glibc=( "dg;detect-glibc" "command_dev_detect_glibc.sh" "DEVCOMMAND" ) -cmd_dev_detect_ldd=( "dl;detect-ldd" "command_dev_detect_ldd.sh" "DEVCOMMAND" ) - -### Set specific opt here ### - -## Common opt to all servers - -currentopt=( "${cmd_install[@]}" "${cmd_auto_install[@]}" "${cmd_start[@]}" "${cmd_stop[@]}" "${cmd_restart[@]}" "${cmd_details[@]}" ) -currentopt+=( "${cmd_backup[@]}" "${cmd_update_functions[@]}" "${cmd_test_alert[@]}" "${cmd_monitor[@]}" ) - -## Servers that do not have a feature - -# Exclude games without a console -if [ "${gamename}" != "TeamSpeak 3" ]; then - currentopt+=( "${cmd_console[@]}" "${cmd_debug[@]}" ) -fi -# Exclude noupdated games here -if [ "${gamename}" != "Battlefield: 1942" ]&&[ "${gamename}" != "Call of Duty" ]&&[ "${gamename}" != "Call of Duty: United Offensive" ]&&[ "${gamename}" != "Call of Duty 2" ]&&[ "${gamename}" != "Call of Duty 4" ]&&[ "${gamename}" != "Call of Duty: World at War" ]&&[ "${gamename}" != "QuakeWorld" ]&&[ "${gamename}" != "Quake 2" ]&&[ "${gamename}" != "Quake 3: Arena" ]&&[ "${gamename}" != "Wolfenstein: Enemy Territory" ]; then - currentopt+=( "${cmd_update[@]}" "${cmd_force_update[@]}") -fi +fn_getopt_generic(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + u|update) + command_update.sh;; + fu|force-update|update-restart) + forceupdate=1; + command_update.sh;; + uf|update-functions) + command_update_functions.sh;; + v|validate) + command_validate.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.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;; + mi|mods-install) + command_mods_install.sh;; + mu|mods-update) + command_mods_update.sh;; + mr|mods-remove) + command_mods_remove.sh;; + dd|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update\t${default}u |Checks and applies updates from SteamCMD." + echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}validate\t${default}v |Validate server files with SteamCMD." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful information about the server." + echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + echo -e "${blue}mods-install\t${default}mi |View and install available mods/addons." + echo -e "${blue}mods-update\t${default}mu |Update installed mods/addons." + echo -e "${blue}mods-remove\t${default}mr |Remove installed mods/addons." + } | column -s $'\t' -t + esac +} -## Include games that have access to specific commands -# Validate command -if [ -n "${appid}" ]; then - currentopt+=( "${cmd_validate[@]}" ) -fi -# FastDL command -if [ "${engine}" == "source" ]; then - currentopt+=( "${cmd_fastdl[@]}" ) -fi -# Wipe command -if [ "${gamename}" == "Rust" ]; then - currentopt+=( "${cmd_wipe[@]}" ) -fi -# Mods commands -if [ "${engine}" == "source" ]||[ "${gamename}" == "Rust" ]|[ "${gamename}" == "Hurtworld" ]|[ "${gamename}" == "7 Days To Die" ]; then - currentopt+=( "${cmd_mods_install[@]}" "${cmd_mods_remove[@]}" "${cmd_mods_update[@]}" ) -fi +fn_getopt_generic_update_no_steam(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + u|update) + command_update.sh;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.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|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update\t${default}u |Checks and applies updates." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful information about the server." + echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + } | column -s $'\t' -t + esac +} -## Game server exclusive commands -# TeamSpeak exclusive -if [ "${gamename}" == "TeamSpeak 3" ]; then - currentopt+=( "${cmd_change_password[@]}" ) -fi -# Unreal exclusive -if [ "${engine}" == "unreal2" ]; then - if [ "${gamename}" == "Unreal Tournament 2004" ]; then - currentopt+=( "${cmd_install_cdkey[@]}" "${cmd_map_compressor_u2[@]}" ) - else - currentopt+=( "${cmd_map_compressor_u2[@]}" ) +fn_getopt_generic_no_update(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.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|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 fi -fi -if [ "${engine}" == "unreal" ]; then - currentopt+=( "${cmd_map_compressor_u99[@]}" ) -fi -# DST exclusive -if [ "${gamename}" == "Don't Starve Together" ]; then - currentopt+=( "${cmd_install_dst_token[@]}" ) -fi -# MTA exclusive -if [ "${gamename}" == "Multi Theft Auto" ]; then - currentopt+=( "${cmd_install_default_ressources[@]}" ) -fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful infomation about the server." + echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + } | column -s $'\t' -t + esac +} -## Developer commands -currentopt+=( "${cmd_dev_debug[@]}" "${cmd_dev_detect_deps[@]}" "${cmd_dev_detect_glibc[@]}" "${cmd_dev_detect_ldd[@]}" ) +fn_getopt_teamspeak3(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + u|update) + command_update.sh;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.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|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update\t${default}u |Checks and applies updates from teamspeak.com." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful information about the server." + echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" + echo -e "${blue}change-password\t${default}pw |Changes TS3 serveradmin password." + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + } | column -s $'\t' -t + esac +} +fn_getopt_minecraft(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + u|update) + command_update.sh;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.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|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update\t${default}u |Checks and applies updates from mojang.com." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful infomation about the server." + echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + } | column -s $'\t' -t + esac +} -### Build list of available commands -optcommands=() -index="0" -for ((index="0"; index < ${#currentopt[@]}; index+=3)); do - cmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" - for ((cmdindex=1; cmdindex <= ${cmdamount}; cmdindex++)); do - optcommands+=( "$(echo "${currentopt[index]}"| awk -F ';' -v x=${cmdindex} '{ print $x }')" ) - done -done +fn_getopt_mta(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + u|update) + command_update.sh;; + fu|force-update|update-restart) + forceupdate=1; + command_update.sh;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.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;; + ir|install-default-resources) + command_install_resources_mta.sh;; + ai|auto-install) + fn_autoinstall;; + dd|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update\t${default}u |Checks and applies updates from linux.mtasa.com." + echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from linux.mtasa.com." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful infomation about the server." + echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + echo -e "${blue}install-default-resources\t${default}ir |Install the MTA default resources." + } | column -s $'\t' -t + esac +} -# Shows LinuxGSM usage -fn_opt_usage(){ +fn_getopt_mumble(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + u|update) + command_update.sh;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.sh;; + b|backup) + command_backup.sh;; + dev|dev-debug) + command_dev_debug.sh;; + c|console) + command_console.sh;; + i|install) + command_install.sh;; + dd|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update\t${default}u |Checks and applies updates from GitHub." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful information about the server." + echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + } | column -s $'\t' -t + esac +} + +fn_getopt_dstserver(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + u|update) + command_update.sh;; + fu|force-update|update-restart) + forceupdate=1; + command_update.sh;; + uf|update-functions) + command_update_functions.sh;; + v|validate) + command_validate.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.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;; + ct|cluster-token) + install_dst_token.sh;; + dd|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" echo "${gamename} - Linux Game Server Manager - Version ${version}" echo "https://gameservermanagers.com/${selfname}" echo -e "" echo -e "${lightyellow}Commands${default}" - # Display available commands - index="0" { - for ((index="0"; index < ${#currentopt[@]}; index+=3)); do - # Hide developer commands - if [ "${currentopt[index+2]}" != "DEVCOMMAND" ]; then - echo -e "${cyan}$(echo "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo "${currentopt[index]}" | awk -F ';' '{ print $1 }')\t| ${currentopt[index+2]}" - fi - done + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update\t${default}u |Checks and applies updates from SteamCMD." + echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}validate\t${default}v |Validate server files with SteamCMD." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful information about the server." + echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + echo -e "${blue}cluster-token\t${default}ct |Configure cluster token." } | column -s $'\t' -t - core_exit.sh + esac } -### Check if user commands exist and run corresponding scripts, or display script usage -if [ -z "${getopt}" ]; then - fn_opt_usage -fi -# Command exists -for i in "${optcommands[@]}"; do - if [ "${i}" == "${getopt}" ] ; then - # Seek and run command - index="0" - for ((index="0"; index < ${#currentopt[@]}; index+=3)); do - currcmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')" - for ((currcmdindex=1; currcmdindex <= ${currcmdamount}; currcmdindex++)); do - if [ "$(echo "${currentopt[index]}"| awk -F ';' -v x=${currcmdindex} '{ print $x }')" == "${getopt}" ]; then - # Run command - ${currentopt[index+1]} - break - fi - done - done - break - core_exit.sh +fn_getopt_gmodserver(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + u|update) + command_update.sh;; + fu|force-update|update-restart) + forceupdate=1; + command_update.sh;; + uf|update-functions) + command_update_functions.sh;; + v|validate) + command_validate.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.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;; + fd|fastdl) + command_fastdl.sh;; + mi|mods-install) + command_mods_install.sh;; + mu|mods-update) + command_mods_update.sh;; + mr|mods-remove) + command_mods_remove.sh;; + dd|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update\t${default}u |Checks and applies updates from SteamCMD." + echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}validate\t${default}v |Validate server files with SteamCMD." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful information about the server." + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + echo -e "${blue}fastdl\t${default}fd |Generates or update a FastDL directory for your server." + echo -e "${blue}mods-install\t${default}mi |View and install available mods/addons." + echo -e "${blue}mods-update\t${default}mu |Update installed mods/addons." + echo -e "${blue}mods-remove\t${default}mr |Remove installed mods/addons." + } | column -s $'\t' -t + esac +} + +fn_getopt_rustserver(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + u|update) + command_update.sh;; + fu|force-update|update-restart) + forceupdate=1; + command_update.sh;; + uf|update-functions) + command_update_functions.sh;; + v|validate) + command_validate.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|details) + command_details.sh;; + pd|postdetails) + command_postdetails.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;; + mi|mods-install) + command_mods_install.sh;; + mu|mods-update) + command_mods_update.sh;; + mr|mods-remove) + command_mods_remove.sh;; + wi|wipe) + command_wipe.sh;; + dd|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update\t${default}u |Checks and applies updates from SteamCMD." + echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}validate\t${default}v |Validate server files with SteamCMD." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful information about the server." + echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)" + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + echo -e "${blue}mods-install\t${default}mi |View and install available mods/addons." + echo -e "${blue}mods-update\t${default}mu |Update installed mods/addons." + echo -e "${blue}mods-remove\t${default}mr |Remove installed mods/addons." + echo -e "${blue}wipe\t${default}wi |Wipe your Rust server." + } | column -s $'\t' -t + esac +} + +fn_getopt_unreal(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|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|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful information about the server." + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + echo -e "${blue}map-compressor\t${default}mc |Compresses all ${gamename} server maps." + } | column -s $'\t' -t + esac +} + + +fn_getopt_unreal2(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + u|update) + command_update.sh;; + fu|force-update|update-restart) + forceupdate=1; + command_update.sh;; + uf|update-functions) + command_update_functions.sh;; + v|validate) + command_validate.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|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|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + mc|map-compressor) + compress_unreal2_maps.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 fi -done + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update\t${default}Checks and applies updates from SteamCMD." + echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}validate\t${default}v |Validate server files with SteamCMD." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful information about the server." + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + echo -e "${blue}map-compressor\t${default}mc |Compresses all ${gamename} server maps." + } | column -s $'\t' -t + esac +} -# If we're executing this, it means command was not found -echo -e "${red}Unknown command${default}: $0 ${getopt}" -exitcode=2 -fn_opt_usage + +fn_getopt_ut2k4(){ +case "${getopt}" in + st|start) + command_start.sh;; + sp|stop) + command_stop.sh;; + r|restart) + command_restart.sh;; + uf|update-functions) + command_update_functions.sh;; + m|monitor) + command_monitor.sh;; + ta|test-alert) + command_test_alert.sh;; + dt|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;; + cd|server-cd-key) + install_ut2k4_key.sh;; + mc|map-compressor) + compress_unreal2_maps.sh;; + dd|detect-deps) + command_dev_detect_deps.sh;; + dg|detect-glibc) + command_dev_detect_glibc.sh;; + dl|detect-ldd) + command_dev_detect_ldd.sh;; + *) + if [ -n "${getopt}" ]; then + echo -e "${red}Unknown command${default}: $0 ${getopt}" + exitcode=2 + fi + echo "Usage: $0 [option]" + echo "${gamename} - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com/${selfname}" + echo -e "" + echo -e "${lightyellow}Commands${default}" + { + echo -e "${blue}start\t${default}st |Start the server." + echo -e "${blue}stop\t${default}sp |Stop the server." + echo -e "${blue}restart\t${default}r |Restart the server." + echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded." + echo -e "${blue}monitor\t${default}m |Checks that the server is running." + echo -e "${blue}test-alert\t${default}ta |Sends test alert." + echo -e "${blue}details\t${default}dt |Displays useful information about the server." + echo -e "${blue}backup\t${default}b |Create archive of the server." + echo -e "${blue}console\t${default}c |Console allows you to access the live view of a server." + echo -e "${blue}debug\t${default}d |See the output of the server directly to your terminal." + echo -e "${blue}install\t${default}i |Install the server." + echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts." + echo -e "${blue}server-cd-key\t${default}cd |Add your server cd key" + echo -e "${blue}map-compressor\t${default}mc |Compresses all ${gamename} server maps." + } | column -s $'\t' -t + esac +} + +# Don't Starve Together +if [ "${gamename}" == "Don't Starve Together" ]; then + fn_getopt_dstserver +# Garry's Mod +elif [ "${gamename}" == "Garry's Mod" ]; then + fn_getopt_gmodserver +# Minecraft +elif [ "${engine}" == "lwjgl2" ]; then + fn_getopt_minecraft +# Multi Theft Auto +elif [ "${gamename}" == "Multi Theft Auto" ]; then + fn_getopt_mta +# Mumble +elif [ "${gamename}" == "Mumble" ]; then + fn_getopt_mumble +# Teamspeak 3 +elif [ "${gamename}" == "TeamSpeak 3" ]; then + fn_getopt_teamspeak3 +elif [ "${gamename}" == "Rust" ]; then + fn_getopt_rustserver +# Unreal 2 Engine +elif [ "${engine}" == "unreal2" ]; then + if [ "${gamename}" == "Unreal Tournament 2004" ]; then + fn_getopt_ut2k4 + else + fn_getopt_unreal2 + fi +# Unreal Engine +elif [ "${engine}" == "unreal" ]; then + fn_getopt_unreal +# Generic +elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then + fn_getopt_generic_no_update +elif [ "${gamename}" == "Factorio" ]; then + fn_getopt_generic_update_no_steam +else + fn_getopt_generic +fi core_exit.sh From e6cab16ee9274dac71b3e7f9fbf2ce1058169828 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 16:40:39 +0000 Subject: [PATCH 0583/1895] Update pcserver --- ProjectCars/pcserver | 117 ++++++++++++++++++++++++++++--------------- 1 file changed, 78 insertions(+), 39 deletions(-) diff --git a/ProjectCars/pcserver b/ProjectCars/pcserver index e2564fd6f..b05dec06f 100755 --- a/ProjectCars/pcserver +++ b/ProjectCars/pcserver @@ -1,63 +1,88 @@ #!/bin/bash -# Project Cars -# Server Management Script +# Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# Purpose: Project Cars | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki # Website: https://gameservermanagers.com + +# Debugging if [ -f ".dev-debug" ]; then exec 5>dev-debug.log BASH_XTRACEFD="5" set -x fi -version="211016" +version="170219" + +########################## +######## Settings ######## +########################## -#### Variables #### +#### Server Settings #### # Notification Alerts -# (on|off) +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="--config ${servercfg}" +} -# Email +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email emailalert="off" email="email@example.com" -#emailfrom="email@example.com" +emailfrom="" -# Pushbullet -# https://www.pushbullet.com/#settings +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet pushbulletalert="off" pushbullettoken="accesstoken" +channeltag="" -# Steam login -steamuser="anonymous" -steampass="" +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" -# Start Variables +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" -fn_parms(){ -parms=" --config ${servercfg}" -} +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" -#### Advanced Variables #### +#### LinuxGSM Advanced Settings #### -# Github Branch Select +## SteamCMD Settings +# Server appid +appid="332670" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## Github Branch Select # Allows for the use of different function files # from a different repo and/or branch. githubuser="GameServerManagers" githubrepo="LinuxGSM" -githubbranch="projectcars" +githubbranch="master" -# Steam -appid="332670" +## LinuxGSM Server Details +# Do not edit +gamename="Project Cars" +engine="madness" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta beta" -branch="" +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="pc-server" -# Server Details -servicename="projectcars-server" -gamename="Project Cars" +#### Directories #### +# Edit with care -# Directories +## Work Directories rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" @@ -66,6 +91,8 @@ functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" filesdir="${rootdir}/serverfiles" + +## Server Specific Directories systemdir="${filesdir}" executabledir="${filesdir}" executable="./DedicatedServerCmd" @@ -73,24 +100,26 @@ servercfg="${servicename}.cfg" servercfgdefault="server.cfg" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory backupdir="${rootdir}/backups" -# Logging -logdays="7" +## Logging Directories gamelogdir="${systemdir}/logs" scriptlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" -consolelogging="on" - scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${scriptlogdir}/${servicename}-email.log" -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" -##### Script ##### -# Do not edit +######################## +######## Script ######## +###### Do not edit ##### +######################## # Fetches core_dl for file downloads fn_fetch_core_dl(){ @@ -147,8 +176,18 @@ functionfile="${FUNCNAME}" fn_fetch_core_dl } +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + core_dl.sh core_functions.sh - getopt=$1 -core_getopt.sh +core_getopt.sh \ No newline at end of file From f9692e1201b36f292ebe180cce9e0ba18d88e0c7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 16:45:56 +0000 Subject: [PATCH 0584/1895] increased glibc requirement to 2.4 --- lgsm/functions/info_glibc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index f884db048..97a395962 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -66,7 +66,7 @@ elif [ "${gamename}" == "No More Room in Hell" ]; then glibcrequired="2.15" glibcfix="yes" elif [ "${gamename}" == "Project Cars" ]; then - glibcrequired="2.1" + glibcrequired="2.4" glibcfix="no" elif [ "${gamename}" == "Quake 2" ]; then glibcrequired="NOT REQUIRED" From 2c8e4a3aaa7a93264b63585c1db23c15d904692d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 17:26:47 +0000 Subject: [PATCH 0585/1895] Added pc info also shuffled a couple of functions --- lgsm/functions/info_config.sh | 121 ++++++++++++++++++++-------------- 1 file changed, 71 insertions(+), 50 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index cb17e09d5..3bf218df0 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -49,6 +49,29 @@ fn_info_config_ark(){ fi } +fn_info_config_ballistic_overkill(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + port="${zero}" + queryport="${zero}" + maxplayers="${unavailable}" + else + servername=$(grep "ServerName=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "Password=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + port=$(grep "ServerPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') + queryport=$((port + 1)) + maxplayers=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]') + + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + port=${port:-"0"} + queryport=${queryport:-"0"} + maxplayers=${maxplayers:-"NOT SET"} + fi +} + fn_info_config_bf1942(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -226,6 +249,27 @@ fn_info_config_minecraft(){ fi } +fn_info_config_projectcars(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" + port="${zero}" + queryport="${zero}" + else + servername=$(grep "name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + port=$(grep "hostPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + queryport=$(grep "queryPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + + # Not Set + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"NOT SET"} + port=${port:-"NOT SET"} + queryport=${queryport:-"NOT SET"} +} fn_info_config_projectzomboid(){ if [ ! -f "${servercfgfullpath}" ]; then @@ -315,33 +359,6 @@ fn_info_config_quakelive(){ fi } -fn_info_config_wolfensteinenemyterritory(){ - if [ ! -f "${servercfgfullpath}" ]; then - rconpassword="${unavailable}" - servername="${unavailable}" - serverpassword="${unavailable}" - maxplayers="${zero}" - port="${zero}" - else - port=$(grep "set net_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - rconpassword=$(grep "set zmq_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set zmq_rcon_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//g' -e '/^\//d' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - servername=$(grep "set sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "set sv_maxclients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') - - ip=$(grep "set net_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set net_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - ipsetinconfig=1 - ipinconfigvar="set net_ip" - - # Not Set - rconpassword=${rconpassword:-"NOT SET"} - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - maxplayers=${maxplayers:-"0"} - port=${port:-"27960"} - fi -} - fn_info_config_realvirtuality(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -568,29 +585,6 @@ fn_info_config_unreal(){ fi } -fn_info_config_ballistic_overkill(){ - if [ ! -f "${servercfgfullpath}" ]; then - servername="${unavailable}" - serverpassword="${unavailable}" - port="${zero}" - queryport="${zero}" - maxplayers="${unavailable}" - else - servername=$(grep "ServerName=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "Password=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - port=$(grep "ServerPort=" "${servercfgfullpath}" | tr -cd '[:digit:]') - queryport=$((port + 1)) - maxplayers=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]') - - # Not Set - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - port=${port:-"0"} - queryport=${queryport:-"0"} - maxplayers=${maxplayers:-"NOT SET"} - fi -} - fn_info_config_sdtd(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -677,6 +671,33 @@ fn_info_config_mta(){ fi } +fn_info_config_wolfensteinenemyterritory(){ + if [ ! -f "${servercfgfullpath}" ]; then + rconpassword="${unavailable}" + servername="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" + port="${zero}" + else + port=$(grep "set net_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + rconpassword=$(grep "set zmq_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set zmq_rcon_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//g' -e '/^\//d' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + servername=$(grep "set sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "set sv_maxclients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + + ip=$(grep "set net_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set net_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + ipsetinconfig=1 + ipinconfigvar="set net_ip" + + # Not Set + rconpassword=${rconpassword:-"NOT SET"} + servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"27960"} + fi +} + # Just Cause 2 if [ "${engine}" == "avalanche" ]; then fn_info_config_avalanche From 895591adfd6b9f54b581bf054295d83a81647886 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 17:30:50 +0000 Subject: [PATCH 0586/1895] missing fi --- lgsm/functions/info_config.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 3bf218df0..c34fd4243 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -249,6 +249,7 @@ fn_info_config_minecraft(){ fi } + fn_info_config_projectcars(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -269,6 +270,7 @@ fn_info_config_projectcars(){ maxplayers=${maxplayers:-"NOT SET"} port=${port:-"NOT SET"} queryport=${queryport:-"NOT SET"} + fi } fn_info_config_projectzomboid(){ From dd23d64dbf3ea1046f3f6f2772ee989045d3a381 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 17:33:22 +0000 Subject: [PATCH 0587/1895] Added pc if --- lgsm/functions/info_config.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index c34fd4243..2c2f1c7db 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -742,6 +742,9 @@ elif [ "${gamename}" == "Quake Live" ]; then # Minecraft elif [ "${engine}" == "lwjgl2" ]; then fn_info_config_minecraft +# Project Cars +elif [ "${gamename}" == "Project Cars" ]; then + fn_info_config_projectzomboid # Project Zomboid elif [ "${engine}" == "projectzomboid" ]; then fn_info_config_projectzomboid From b0d81bf857b6fd48fc58faf47128988162043f61 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 17:46:44 +0000 Subject: [PATCH 0588/1895] more details updates --- lgsm/functions/command_details.sh | 2 ++ lgsm/functions/info_config.sh | 3 +++ 2 files changed, 5 insertions(+) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index debf5442d..5a7cfb2fd 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -840,6 +840,8 @@ fn_display_details() { fn_details_factorio elif [ "${gamename}" == "Hurtworld" ]; then fn_details_hurtworld + elif [ "${gamename}" == "Project Cars" ]; then + fn_details_projectcars elif [ "${gamename}" == "QuakeWorld" ]; then fn_details_quake elif [ "${gamename}" == "Quake 2" ]; then diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 2c2f1c7db..8b4916367 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -257,12 +257,14 @@ fn_info_config_projectcars(){ maxplayers="${zero}" port="${zero}" queryport="${zero}" + steamport="${zero}" else servername=$(grep "name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') serverpassword=$(grep "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') port=$(grep "hostPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') queryport=$(grep "queryPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + steamport=$(grep "steamPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') # Not Set servername=${servername:-"NOT SET"} @@ -270,6 +272,7 @@ fn_info_config_projectcars(){ maxplayers=${maxplayers:-"NOT SET"} port=${port:-"NOT SET"} queryport=${queryport:-"NOT SET"} + steamport=${steamport:-"NOT SET"} fi } From 3cdb18596aebf87cd3c8324c14e07dc10578b2dd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 17:48:17 +0000 Subject: [PATCH 0589/1895] corrected function name --- lgsm/functions/info_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 8b4916367..5e500afc0 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -747,7 +747,7 @@ elif [ "${engine}" == "lwjgl2" ]; then fn_info_config_minecraft # Project Cars elif [ "${gamename}" == "Project Cars" ]; then - fn_info_config_projectzomboid + fn_info_config_projectcars # Project Zomboid elif [ "${engine}" == "projectzomboid" ]; then fn_info_config_projectzomboid From fab297b750cea9791a1ed56390f375ccd59a49af Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 19:52:57 +0000 Subject: [PATCH 0590/1895] Added project cars --- lgsm/functions/command_details.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 5a7cfb2fd..4c8d64ecc 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -487,6 +487,17 @@ fn_details_mumble(){ } | column -s $'\t' -t } +fn_details_projectcars(){ + echo -e "netstat -atunp | grep DedicatedS" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + echo -e "> Query\tINBOUND\t${queryport}\tudp" + echo -e "> Steam\tINBOUND\t${queryport}\tudp" + } | column -s $'\t' -t +} + fn_details_projectzomboid(){ echo -e "netstat -atunp | grep java" echo -e "" From d84fb4cd0c6267780422b9738397680c4d771767 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 19:59:58 +0000 Subject: [PATCH 0591/1895] added space to fix serverpassword bug --- lgsm/functions/info_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 5e500afc0..47fb5b33c 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -260,7 +260,7 @@ fn_info_config_projectcars(){ steamport="${zero}" else servername=$(grep "name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - serverpassword=$(grep "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + serverpassword=$(grep "password " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') port=$(grep "hostPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') queryport=$(grep "queryPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') From 9e5a71a528ac80a41157eab853c22f3f492ca207 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 20:02:07 +0000 Subject: [PATCH 0592/1895] corrected maxplayers --- lgsm/functions/info_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 47fb5b33c..a179efbb4 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -261,7 +261,7 @@ fn_info_config_projectcars(){ else servername=$(grep "name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') serverpassword=$(grep "password " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "maxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') port=$(grep "hostPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') queryport=$(grep "queryPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') steamport=$(grep "steamPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') From 888140c71129edc4682c1f5a7e4d3b28650ee8b7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 21:33:33 +0000 Subject: [PATCH 0593/1895] added pc --- 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 4c8d64ecc..106eb0041 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -315,7 +315,7 @@ fn_details_ports(){ parmslocation="${red}UNKNOWN${default}" # engines/games that require editing in the config file - local ports_edit_array=( "avalanche" "Ballistic Overkill" "dontstarve" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" ) + local ports_edit_array=( "avalanche" "Ballistic Overkill" "dontstarve" "idtech2" "idtech3" "idtech3_ql" "lwjgl2" "Project Cars" "projectzomboid" "quake" "refractor" "realvirtuality" "renderware" "seriousengine35" "teeworlds" "terraria" "unreal" "unreal2" "unreal3" "TeamSpeak 3" "Mumble" "7 Days To Die" ) for port_edit in "${ports_edit_array[@]}" do if [ "${engine}" == "${port_edit}" ]||[ "${gamename}" == "${port_edit}" ]; then From 20f63bcc10ca809dd2ef99742a8d5a3f4c5ca451 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 4 Mar 2017 23:18:31 +0000 Subject: [PATCH 0594/1895] Lots of garrys mod stuff --- lgsm/functions/command_fastdl.sh | 149 +++++++++++++++++++++++++------ 1 file changed, 121 insertions(+), 28 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 0c4766704..3fdd705c5 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -13,7 +13,7 @@ check.sh # Directories if [ -z "${webdir}" ]; then - webdir="${lgsmdir}/public_html" + webdir="${rootdir}/public_html" fi fastdldir="${webdir}/fastdl" addonsdir="${systemdir}/addons" @@ -121,6 +121,88 @@ fn_clear_old_fastdl(){ } fn_fastdl_gmod(){ + # Copy all needed files for FastDL + if [ -n "${copyflag}" ]; then + # Removes all existing FastDL files. + if [ -d "${fastdldir}" ]; then + echo -e "removing existing FastDL files" + sleep 0.1 + fileswc=1 + totalfileswc=$(find "${fastdldir}" | wc -l) + tput sc + while read -r filetoremove; do + tput rc; tput el + printf "removing ${fileswc} / ${totalfileswc} : ${filetoremove}..." + ((fileswc++)) + rm -rf "${filetoremove}" + ((exitcode=$?)) + if [ ${exitcode} -ne 0 ]; then + fn_script_log_fatal "Removing ${filetoremove}" + break + else + fn_script_log_pass "Removing ${filetoremove}" + fi + sleep 0.01 + done < <(find "${fastdldir}") + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi + fi + fn_fastdl_dirs + + echo -e "copying files to ${fastdldir}" + fn_script_log_info "Copying files to ${fastdldir}" + else + if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then + rm -f "${tmpdir}/fastdl_files_to_compress.txt" + fi + echo -e "analysing required files" + fn_script_log_info "Analysing required files" + fi + cd "${systemdir}" + local allowed_extentions_array=( "*.ain" "*.bsp" "*.mdl" "*.mp3" "*.ogg" "*.otf" "*.pcf" "*.phy" "*.png" "*.vtf" "*.vmt" "*.vtx" "*.vvd" "*.ttf" "*.wav" ) + for allowed_extention in "${allowed_extentions_array[@]}" + do + fileswc=0 + tput sc + if [ -z "${copyflag}" ]; then + tput rc; tput el + printf "copying ${directory} ${allowed_extention} : ${fileswc}..." + fi + while read -r ext; do + ((fileswc++)) + if [ -n "${copyflag}" ]; then + tput rc; tput el + printf "copying ${directory} ${allowed_extention} : ${fileswc}..." + sleep 0.01 + cp --parents "${ext}" "${fastdldir}" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Copying ${ext} > ${fastdldir}" + core_exit.sh + else + fn_script_log_pass "Copying ${ext} > ${fastdldir}" + fi + else + tput rc; tput el + printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." + sleep 0.01 + echo "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt" + fi + done < <(find . -type f -iname ${allowed_extention}) + + if [ -z "${copyflag}" ]; then + tput rc; tput el + printf "gathering ${allowed_extention} : ${fileswc}..." + fi + if [ ${fileswc} != 0 ]&&[ -n "${copyflag}" ]||[ -z "${copyflag}" ]; then + fn_print_ok_eol_nl + fi + done # Correct addons directory structure for FastDL if [ -d "${fastdldir}/addons" ]; then echo -en "updating addons file structure..." @@ -136,7 +218,7 @@ fn_fastdl_gmod(){ fi # Clear addons directory in fastdl if [ "${cleargmodaddons}" == "on" ]; then - echo -en "clearing addons dir from fastdl dir" + echo -en "clearing addons dir from fastdl dir..." sleep 1 rm -R "${fastdldir:?}/addons" exitcode=$? @@ -165,6 +247,31 @@ fn_fastdl_gmod(){ fn_script_log_pass "correcting DarkRP files" fi fi + if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then + totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt") + # Calculates total file size + while read dufile; do + filesize=$(du -b "${dufile}"| awk '{ print $1 }') + filesizetotal=$(( ${filesizetotal} + ${filesize} )) + done <"${tmpdir}/fastdl_files_to_compress.txt" + fi + + if [ -z "${copyflag}" ]; then + echo "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)" + fn_script_log_info "${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)" + rm "${tmpdir}/fastdl_files_to_compress.txt" + if fn_prompt_yn "Continue?" Y; then + copyflag=1 + fn_fastdl_gmod + else + core_exit.sh + fi + else + if [ "${gamename}" == "Garry's Mod" ]; then + fn_fastdl_gmod_lua_enforcer + fi + fn_fastdl_bzip2 + fi } # Using this gist https://gist.github.com/agunnerson-ibm/efca449565a3e7356906 @@ -244,30 +351,14 @@ fn_fastdl_source(){ for directory in "${directorys_array[@]}" do if [ -d "${systemdir}/${directory}" ]; then - if [ "${gamename}" == "Garry's Mod" ]; then - if [ "${directory}" == "maps" ]; then - local allowed_extentions_array=( "*.bsp" "*.ain" ) - elif [ "${directory}" == "materials" ]; then - local allowed_extentions_array=( "*.vtf" "*.vmt" ) - elif [ "${directory}" == "models" ]; then - local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.phy" ) - elif [ "${directory}" == "particles" ]; then - local allowed_extentions_array=( "*.pcf" ) - elif [ "${directory}" == "sounds" ]; then - local allowed_extentions_array=( "*.wav" "*.mp3" "*.ogg" ) - elif [ "${directory}" == "resources" ]; then - local allowed_extentions_array=( "*.otf" "*.ttf" "*.png" ) - fi - else - if [ "${directory}" == "maps" ]; then - local allowed_extentions_array=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) - elif [ "${directory}" == "materials" ]; then - local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) - elif [ "${directory}" == "particles" ]; then - local allowed_extentions_array=( "*.pcf" ) - elif [ "${directory}" == "sounds" ]; then - local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.mdl" "*.phy" "*.jpg" "*.png" ) - fi + if [ "${directory}" == "maps" ]; then + local allowed_extentions_array=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) + elif [ "${directory}" == "materials" ]; then + local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) + elif [ "${directory}" == "particles" ]; then + local allowed_extentions_array=( "*.pcf" ) + elif [ "${directory}" == "sounds" ]; then + local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.mdl" "*.phy" "*.jpg" "*.png" ) fi for allowed_extention in "${allowed_extentions_array[@]}" do @@ -380,7 +471,7 @@ fn_fastdl_gmod_lua_enforcer(){ fn_fastdl_bzip2(){ while read -r filetocompress; do echo -en "compressing ${filetocompress}..." - bzip2 "${filetocompress}" + bzip2 -f "${filetocompress}" exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl @@ -406,9 +497,11 @@ fn_print_header echo "More info: https://git.io/vyk9a" echo "" fn_fastdl_config -fn_fastdl_source + if [ "${gamename}" == "Garry's Mod" ]; then fn_fastdl_gmod +else + fn_fastdl_source fi fn_fastdl_completed core_exit.sh From aeaa454814dbcb4d59f69857bde4b5e67b4872c9 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 5 Mar 2017 04:19:35 +0100 Subject: [PATCH 0595/1895] Missing github info for BladeSymphony --- BladeSymphony/bsserver | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index b0eb68e9b..470221666 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -75,6 +75,13 @@ appid="228780" # Example: "-beta latest_experimental" branch="" +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + ## LinuxGSM Server Details # Do not edit gamename="Blade Symphony" From bf8ebfe3637d232cdd67b735343df9ab5a28f122 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 5 Mar 2017 08:04:31 +0100 Subject: [PATCH 0596/1895] Cleaning & fixes & functions rearranging --- lgsm/functions/command_fastdl.sh | 244 +++++++++++++------------------ 1 file changed, 100 insertions(+), 144 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 3fdd705c5..96f810c06 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -22,57 +22,97 @@ luasvautorundir="${systemdir}/lua/autorun/server" luafastdlfile="lgsm_cl_force_fastdl.lua" luafastdlfullpath="${luasvautorundir}/${luafastdlfile}" -fn_check_bzip2(){ - # Returns true if not installed - if [ -z "$(command -v bzip2)" ]; then - fn_print_fail "bzip2 is not installed" - fn_script_log_fatal "bzip2 is not installed" - core_exit.sh - fi -} +# Check if bzip2 is installed +if [ -z "$(command -v bzip2)" ]; then + fn_print_fail "bzip2 is not installed" + fn_script_log_fatal "bzip2 is not installed" + core_exit.sh +fi + +# Header +fn_print_header +echo "More info: https://git.io/vyk9a" +echo "" # Prompts user for FastDL creation settings -fn_fastdl_config(){ - echo "FastDL setup" - echo "=================================" +echo "${commandaction} setup" +echo "=================================" - # Prompt for clearing old files if directory was already here - if [ -d "${fastdldir}" ]; then - fn_print_warning_nl "FastDL directory already exists." - echo "${fastdldir}" - echo "" - if fn_prompt_yn "Overwrite existing directory?" Y; then - fn_script_log_info "Overwrite existing directory: YES" - else - core_exit.sh - fi +# Prompt for clearing old files if directory was already here +if [ -d "${fastdldir}" ]; then + fn_print_warning_nl "FastDL directory already exists." + echo "${fastdldir}" + echo "" + if fn_prompt_yn "Overwrite existing directory?" Y; then + fn_script_log_info "Overwrite existing directory: YES" + else + core_exit.sh fi +fi - # Garry's Mod Specific - if [ "${gamename}" == "Garry's Mod" ]; then - # Prompt to clear addons dir from fastdl, can use unnecessary space or not be required depending on addon's file structures - if fn_prompt_yn "Clear addons directory from FastDL?" Y; then - cleargmodaddons="on"; - fn_script_log_info "Clear addons directory from FastDL: YES" - else - cleargmodaddons="off"; - fn_script_log_info "Clear addons directory from FastDL: NO" - fi +# Garry's Mod Specific +if [ "${gamename}" == "Garry's Mod" ]; then + # Prompt for download enforcer, which is using a .lua addfile resource generator + if fn_prompt_yn "Force clients to download files?" Y; then + luaresource="on" + fn_script_log_info "Force clients to download files: YES" + else + luaresource="off" + fn_script_log_info "Force clients to download filesr: NO" + fi +fi + +fn_clear_old_fastdl(){ + # Clearing old FastDL + if [ -d "${fastdldir}" ];then + echo -en "clearing existing FastDL directory ${fastdldir}..." + rm -R "${fastdldir:?}"/* + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Clearing existing FastDL directory ${fastdldir}" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "Clearing existing FastDL directory ${fastdldir}" + fi + sleep 0.5 + fi +} - # Prompt for download enforcer, which is using a .lua addfile resource generator - if fn_prompt_yn "Use client download enforcer?" Y; then - luaressource="on" - fn_script_log_info "Use client download enforcer: YES" +fn_clear_old_fastdl_alt(){ + if [ -d "${fastdldir}" ]; then + echo -e "removing existing FastDL files" + sleep 0.1 + fileswc=1 + totalfileswc=$(find "${fastdldir}" | wc -l) + tput sc + while read -r filetoremove; do + tput rc; tput el + printf "removing ${fileswc} / ${totalfileswc} : ${filetoremove}..." + ((fileswc++)) + rm -rf "${filetoremove}" + ((exitcode=$?)) + if [ ${exitcode} -ne 0 ]; then + fn_script_log_fatal "Removing ${filetoremove}" + break + else + fn_script_log_pass "Removing ${filetoremove}" + fi + sleep 0.01 + done < <(find "${fastdldir}") + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh else - luaressource="off" - fn_script_log_info "Use client download enforcer: NO" + fn_print_ok_eol_nl fi fi } fn_fastdl_dirs(){ # Check and create directories - if [ ! -d "${modsdir}" ];then + if [ ! -d "${webdir}" ];then echo -en "creating web directory ${webdir}..." mkdir -p "${webdir}" exitcode=$? @@ -102,57 +142,12 @@ fn_fastdl_dirs(){ fi } -fn_clear_old_fastdl(){ - # Clearing old FastDL if user answered yes - if [ ! -d "${modsdir}" ];then - echo -en "clearing existing FastDL directory ${fastdldir}..." - rm -R "${fastdldir:?}"/* - exitcode=$? - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - fn_script_log_fatal "Clearing existing FastDL directory ${fastdldir}" - core_exit.sh - else - fn_print_ok_eol_nl - fn_script_log_pass "Clearing existing FastDL directory ${fastdldir}" - fi - sleep 0.5 - fi -} - fn_fastdl_gmod(){ # Copy all needed files for FastDL if [ -n "${copyflag}" ]; then - # Removes all existing FastDL files. - if [ -d "${fastdldir}" ]; then - echo -e "removing existing FastDL files" - sleep 0.1 - fileswc=1 - totalfileswc=$(find "${fastdldir}" | wc -l) - tput sc - while read -r filetoremove; do - tput rc; tput el - printf "removing ${fileswc} / ${totalfileswc} : ${filetoremove}..." - ((fileswc++)) - rm -rf "${filetoremove}" - ((exitcode=$?)) - if [ ${exitcode} -ne 0 ]; then - fn_script_log_fatal "Removing ${filetoremove}" - break - else - fn_script_log_pass "Removing ${filetoremove}" - fi - sleep 0.01 - done < <(find "${fastdldir}") - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - core_exit.sh - else - fn_print_ok_eol_nl - fi - fi + # Clear previous FastDL dir + fn_clear_old_fastdl_alt fn_fastdl_dirs - echo -e "copying files to ${fastdldir}" fn_script_log_info "Copying files to ${fastdldir}" else @@ -217,19 +212,17 @@ fn_fastdl_gmod(){ fn_script_log_pass "updating addons file structure" fi # Clear addons directory in fastdl - if [ "${cleargmodaddons}" == "on" ]; then - echo -en "clearing addons dir from fastdl dir..." - sleep 1 - rm -R "${fastdldir:?}/addons" - exitcode=$? - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - fn_script_log_fatal "clearing addons dir from fastdl dir" - core_exit.sh - else - fn_print_ok_eol_nl - fn_script_log_pass "clearing addons dir from fastdl dir" - fi + echo -en "clearing addons dir from fastdl dir..." + sleep 1 + rm -R "${fastdldir:?}/addons" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "clearing addons dir from fastdl dir" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "clearing addons dir from fastdl dir" fi fi # Correct content that may be into a lua directory by mistake like some darkrpmodification addons @@ -307,36 +300,8 @@ fn_human_readable_file_size() { fn_fastdl_source(){ # Copy all needed files for FastDL if [ -n "${copyflag}" ]; then - # Removes all existing FastDL files. - if [ -d "${fastdldir}" ]; then - echo -e "removing existing FastDL files" - sleep 0.1 - fileswc=1 - totalfileswc=$(find "${fastdldir}" | wc -l) - tput sc - while read -r filetoremove; do - tput rc; tput el - printf "removing ${fileswc} / ${totalfileswc} : ${filetoremove}..." - ((fileswc++)) - rm -rf "${filetoremove}" - ((exitcode=$?)) - if [ ${exitcode} -ne 0 ]; then - fn_script_log_fatal "Removing ${filetoremove}" - break - else - fn_script_log_pass "Removing ${filetoremove}" - fi - sleep 0.01 - done < <(find "${fastdldir}") - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - core_exit.sh - else - fn_print_ok_eol_nl - fi - fi + fn_clear_old_fastdl_alt fn_fastdl_dirs - echo -e "copying files to ${fastdldir}" fn_script_log_info "Copying files to ${fastdldir}" else @@ -347,8 +312,8 @@ fn_fastdl_source(){ fn_script_log_info "Analysing required files" fi - local directorys_array=( "maps" "materials" "models" "particles" "sounds" "resources" ) - for directory in "${directorys_array[@]}" + local directories_array=( "maps" "materials" "models" "particles" "sounds" "resources" ) + for directory in "${directories_array[@]}" do if [ -d "${systemdir}/${directory}" ]; then if [ "${directory}" == "maps" ]; then @@ -449,7 +414,7 @@ fn_fastdl_gmod_lua_enforcer(){ fi fi # Generate new one if user said yes - if [ "${luaressource}" == "on" ]; then + if [ "${luaresource}" == "on" ]; then echo -en "creating new download enforcer: ${luafastdlfile}..." touch "${luafastdlfullpath}" # Read all filenames and put them into a lua file at the right path @@ -484,24 +449,15 @@ fn_fastdl_bzip2(){ done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \)) } -fn_fastdl_completed(){ - # Finished message - echo "FastDL files are located in:" - echo "${webdir}" - echo "FastDL completed" - fn_script_log_info "FastDL completed" -} - # Run functions -fn_print_header -echo "More info: https://git.io/vyk9a" -echo "" -fn_fastdl_config - if [ "${gamename}" == "Garry's Mod" ]; then fn_fastdl_gmod else fn_fastdl_source fi -fn_fastdl_completed +# Finished message +echo "FastDL files are located in:" +echo "${webdir}" +echo "FastDL completed" +fn_script_log_info "FastDL completed" core_exit.sh From 71dcf5937839f0bb1182d50fa076bdb0a16c0daf Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 5 Mar 2017 08:22:33 +0100 Subject: [PATCH 0597/1895] Second pass cleaning & compressing output rework --- lgsm/functions/command_fastdl.sh | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 96f810c06..d68d16c5e 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -259,11 +259,6 @@ fn_fastdl_gmod(){ else core_exit.sh fi - else - if [ "${gamename}" == "Garry's Mod" ]; then - fn_fastdl_gmod_lua_enforcer - fi - fn_fastdl_bzip2 fi } @@ -389,11 +384,6 @@ fn_fastdl_source(){ else core_exit.sh fi - else - if [ "${gamename}" == "Garry's Mod" ]; then - fn_fastdl_gmod_lua_enforcer - fi - fn_fastdl_bzip2 fi } @@ -434,8 +424,10 @@ fn_fastdl_gmod_lua_enforcer(){ } fn_fastdl_bzip2(){ + echo -en "compressing files..." + echo "" while read -r filetocompress; do - echo -en "compressing ${filetocompress}..." + echo -en "\r\033[Kcompressing ${filetocompress}..." bzip2 -f "${filetocompress}" exitcode=$? if [ ${exitcode} -ne 0 ]; then @@ -447,14 +439,17 @@ fn_fastdl_bzip2(){ fn_script_log_pass "compressing ${filetocompress}" fi done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \)) + echo "" } # Run functions if [ "${gamename}" == "Garry's Mod" ]; then fn_fastdl_gmod + fn_fastdl_gmod_lua_enforcer else fn_fastdl_source fi +fn_fastdl_bzip2 # Finished message echo "FastDL files are located in:" echo "${webdir}" From 1346393250489775739ef2eb3541f115918d137f Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 5 Mar 2017 08:36:41 +0100 Subject: [PATCH 0598/1895] less compression output & clear tabs --- lgsm/functions/command_fastdl.sh | 37 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index d68d16c5e..c4495e99a 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -62,22 +62,22 @@ if [ "${gamename}" == "Garry's Mod" ]; then fi fi -fn_clear_old_fastdl(){ - # Clearing old FastDL - if [ -d "${fastdldir}" ];then - echo -en "clearing existing FastDL directory ${fastdldir}..." - rm -R "${fastdldir:?}"/* - exitcode=$? - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - fn_script_log_fatal "Clearing existing FastDL directory ${fastdldir}" - core_exit.sh - else - fn_print_ok_eol_nl - fn_script_log_pass "Clearing existing FastDL directory ${fastdldir}" - fi - sleep 0.5 - fi +fn_clear_old_fastdl(){ + # Clearing old FastDL + if [ -d "${fastdldir}" ];then + echo -en "clearing existing FastDL directory ${fastdldir}..." + rm -R "${fastdldir:?}"/* + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Clearing existing FastDL directory ${fastdldir}" + core_exit.sh + else + fn_print_ok_eol_nl + fn_script_log_pass "Clearing existing FastDL directory ${fastdldir}" + fi + sleep 0.5 + fi } fn_clear_old_fastdl_alt(){ @@ -435,11 +435,10 @@ fn_fastdl_bzip2(){ fn_script_log_fatal "compressing ${filetocompress}" core_exit.sh else - fn_print_ok_eol_nl fn_script_log_pass "compressing ${filetocompress}" fi done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \)) - echo "" + fn_print_ok_eol_nl } # Run functions @@ -452,7 +451,7 @@ fi fn_fastdl_bzip2 # Finished message echo "FastDL files are located in:" -echo "${webdir}" +echo "${fastdldir}" echo "FastDL completed" fn_script_log_info "FastDL completed" core_exit.sh From bbb95362346cf2a3ff7bb0e18d7848619871900c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 5 Mar 2017 15:09:08 +0000 Subject: [PATCH 0599/1895] directory not used here --- lgsm/functions/command_fastdl.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index c4495e99a..4aa50fbe7 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -165,13 +165,13 @@ fn_fastdl_gmod(){ tput sc if [ -z "${copyflag}" ]; then tput rc; tput el - printf "copying ${directory} ${allowed_extention} : ${fileswc}..." + printf "copying ${allowed_extention} : ${fileswc}..." fi while read -r ext; do ((fileswc++)) if [ -n "${copyflag}" ]; then tput rc; tput el - printf "copying ${directory} ${allowed_extention} : ${fileswc}..." + printf "copying ${allowed_extention} : ${fileswc}..." sleep 0.01 cp --parents "${ext}" "${fastdldir}" exitcode=$? @@ -184,7 +184,7 @@ fn_fastdl_gmod(){ fi else tput rc; tput el - printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." + printf "gathering ${allowed_extention} : ${fileswc}..." sleep 0.01 echo "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt" fi From a8ae8a43afdc0dd470050ce5146ad8abce510df8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 5 Mar 2017 15:13:06 +0000 Subject: [PATCH 0600/1895] minor tidy --- lgsm/functions/command_fastdl.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 4aa50fbe7..fab1f38a8 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -63,8 +63,8 @@ if [ "${gamename}" == "Garry's Mod" ]; then fi fn_clear_old_fastdl(){ - # Clearing old FastDL - if [ -d "${fastdldir}" ];then + # Clearing old FastDL + if [ -d "${fastdldir}" ]; then echo -en "clearing existing FastDL directory ${fastdldir}..." rm -R "${fastdldir:?}"/* exitcode=$? @@ -112,7 +112,7 @@ fn_clear_old_fastdl_alt(){ fn_fastdl_dirs(){ # Check and create directories - if [ ! -d "${webdir}" ];then + if [ ! -d "${webdir}" ]; then echo -en "creating web directory ${webdir}..." mkdir -p "${webdir}" exitcode=$? @@ -126,7 +126,7 @@ fn_fastdl_dirs(){ fi sleep 0.5 fi - if [ ! -d "${fastdldir}" ];then + if [ ! -d "${fastdldir}" ]; then echo -en "creating fastdl directory ${fastdldir}..." mkdir -p "${fastdldir}" exitcode=$? From ae9d308084111fbdb0a5d25e674a8a5988ac0fd6 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Sun, 5 Mar 2017 22:22:51 +0100 Subject: [PATCH 0601/1895] major fastdl re-think --- lgsm/functions/command_fastdl.sh | 368 +++++++++++++++---------------- 1 file changed, 173 insertions(+), 195 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index fab1f38a8..be97474c6 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -62,13 +62,14 @@ if [ "${gamename}" == "Garry's Mod" ]; then fi fi +# Clears any fastdl directory content fn_clear_old_fastdl(){ # Clearing old FastDL if [ -d "${fastdldir}" ]; then echo -en "clearing existing FastDL directory ${fastdldir}..." - rm -R "${fastdldir:?}"/* + rm -R "${fastdldir:?}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" -ne 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Clearing existing FastDL directory ${fastdldir}" core_exit.sh @@ -80,36 +81,6 @@ fn_clear_old_fastdl(){ fi } -fn_clear_old_fastdl_alt(){ - if [ -d "${fastdldir}" ]; then - echo -e "removing existing FastDL files" - sleep 0.1 - fileswc=1 - totalfileswc=$(find "${fastdldir}" | wc -l) - tput sc - while read -r filetoremove; do - tput rc; tput el - printf "removing ${fileswc} / ${totalfileswc} : ${filetoremove}..." - ((fileswc++)) - rm -rf "${filetoremove}" - ((exitcode=$?)) - if [ ${exitcode} -ne 0 ]; then - fn_script_log_fatal "Removing ${filetoremove}" - break - else - fn_script_log_pass "Removing ${filetoremove}" - fi - sleep 0.01 - done < <(find "${fastdldir}") - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - core_exit.sh - else - fn_print_ok_eol_nl - fi - fi -} - fn_fastdl_dirs(){ # Check and create directories if [ ! -d "${webdir}" ]; then @@ -142,59 +113,146 @@ fn_fastdl_dirs(){ fi } -fn_fastdl_gmod(){ - # Copy all needed files for FastDL - if [ -n "${copyflag}" ]; then - # Clear previous FastDL dir - fn_clear_old_fastdl_alt - fn_fastdl_dirs - echo -e "copying files to ${fastdldir}" - fn_script_log_info "Copying files to ${fastdldir}" +# Using this gist https://gist.github.com/agunnerson-ibm/efca449565a3e7356906 +fn_human_readable_file_size(){ + local abbrevs=( + $((1 << 60)):ZB + $((1 << 50)):EB + $((1 << 40)):TB + $((1 << 30)):GB + $((1 << 20)):MB + $((1 << 10)):KB + $((1)):bytes + ) + + local bytes="${1}" + local precision="${2}" + + if [[ "${bytes}" == "1" ]]; then + echo "1 byte" + else + for item in "${abbrevs[@]}"; do + local factor="${item%:*}" + local abbrev="${item#*:}" + if [[ "${bytes}" -ge "${factor}" ]]; then + local size="$(bc -l <<< "${bytes} / ${factor}")" + printf "%.*f %s\n" "${precision}" "${size}" "${abbrev}" + break + fi + done + fi +} + +# Provides info about the fastdl directory content and prompts for confirmation +fn_fastdl_preview(){ + # Remove any file list + if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then + rm -f "${tmpdir}/fastdl_files_to_compress.txt" + fi + echo -e "analysing required files" + fn_script_log_info "Analysing required files" + # Garry's Mod + if [ "${gamename}" == "Garry's Mod" ]; then + cd "${systemdir}" || exit + allowed_extentions_array=( "*.ain" "*.bsp" "*.mdl" "*.mp3" "*.ogg" "*.otf" "*.pcf" "*.phy" "*.png" "*.vtf" "*.vmt" "*.vtx" "*.vvd" "*.ttf" "*.wav" ) + for allowed_extention in "${allowed_extentions_array[@]}"; do + fileswc=0 + tput sc + while read -r ext; do + ((fileswc++)) + tput rc; tput el + printf "gathering ${allowed_extention} : ${fileswc}..." + echo "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt" + done < <(find . -type f -iname ${allowed_extention}) + if [ ${fileswc} != 0 ]; then + fn_print_ok_eol_nl + fi + done + # Source engine else - if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then - rm -f "${tmpdir}/fastdl_files_to_compress.txt" - fi - echo -e "analysing required files" - fn_script_log_info "Analysing required files" + fastdl_directories_array=( "maps" "materials" "models" "particles" "sounds" "resources" ) + for directory in "${fastdl_directories_array[@]}"; do + if [ -d "${systemdir}/${directory}" ]; then + if [ "${directory}" == "maps" ]; then + local allowed_extentions_array=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) + elif [ "${directory}" == "materials" ]; then + local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) + elif [ "${directory}" == "models" ]; then + local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.phy" "*.jpg" "*.png" ) + elif [ "${directory}" == "particles" ]; then + local allowed_extentions_array=( "*.pcf" ) + elif [ "${directory}" == "sounds" ]; then + local allowed_extentions_array=( "*.wav" "*.mp3" "*.ogg" ) + fi + for allowed_extention in "${allowed_extentions_array[@]}"; do + fileswc=0 + tput sc + while read -r ext; do + ((fileswc++)) + tput rc; tput el + printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." + echo "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt" + done < <(find "${systemdir}/${directory}" -type f -iname ${allowed_extention}) + tput rc; tput el + printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." + if [ ${fileswc} != 0 ]; then + fn_print_ok_eol_nl + fi + done + fi + done + fi + if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then + echo "calculating total file size..." + sleep 0.5 + totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt") + # Calculates total file size + while read dufile; do + filesize=$(stat -c %s "${dufile}") + filesizetotal=$(( ${filesizetotal} + ${filesize} )) + exitcode=$? + if [ "${exitcode}" != 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Calculating total file size." + core_exit.sh + fi + done <"${tmpdir}/fastdl_files_to_compress.txt" + else + fn_print_fail_eol_nl "generating file list" + fn_script_log_fatal "Generating file list." + core_exit.sh fi - cd "${systemdir}" - local allowed_extentions_array=( "*.ain" "*.bsp" "*.mdl" "*.mp3" "*.ogg" "*.otf" "*.pcf" "*.phy" "*.png" "*.vtf" "*.vmt" "*.vtx" "*.vvd" "*.ttf" "*.wav" ) + echo "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)" + fn_script_log_info "${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)" + rm "${tmpdir}/fastdl_files_to_compress.txt" + if ! fn_prompt_yn "Continue?" Y; then + fn_script_log "User exited" + core_exit.sh + fi +} + +# Builds Garry's Mod fastdl directory content +fn_fastdl_gmod(){ + cd "${systemdir}" || exit for allowed_extention in "${allowed_extentions_array[@]}" do fileswc=0 tput sc - if [ -z "${copyflag}" ]; then + while read -r fastdlfile; do + ((fileswc++)) tput rc; tput el printf "copying ${allowed_extention} : ${fileswc}..." - fi - while read -r ext; do - ((fileswc++)) - if [ -n "${copyflag}" ]; then - tput rc; tput el - printf "copying ${allowed_extention} : ${fileswc}..." - sleep 0.01 - cp --parents "${ext}" "${fastdldir}" - exitcode=$? - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - fn_script_log_fatal "Copying ${ext} > ${fastdldir}" - core_exit.sh - else - fn_script_log_pass "Copying ${ext} > ${fastdldir}" - fi + cp --parents "${fastdlfile}" "${fastdldir}" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}" + core_exit.sh else - tput rc; tput el - printf "gathering ${allowed_extention} : ${fileswc}..." - sleep 0.01 - echo "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt" + fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}" fi done < <(find . -type f -iname ${allowed_extention}) - - if [ -z "${copyflag}" ]; then - tput rc; tput el - printf "gathering ${allowed_extention} : ${fileswc}..." - fi - if [ ${fileswc} != 0 ]&&[ -n "${copyflag}" ]||[ -z "${copyflag}" ]; then + if [ ${fileswc} != 0 ]; then fn_print_ok_eol_nl fi done @@ -248,153 +306,74 @@ fn_fastdl_gmod(){ filesizetotal=$(( ${filesizetotal} + ${filesize} )) done <"${tmpdir}/fastdl_files_to_compress.txt" fi - - if [ -z "${copyflag}" ]; then - echo "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)" - fn_script_log_info "${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)" - rm "${tmpdir}/fastdl_files_to_compress.txt" - if fn_prompt_yn "Continue?" Y; then - copyflag=1 - fn_fastdl_gmod - else - core_exit.sh - fi - fi -} - -# Using this gist https://gist.github.com/agunnerson-ibm/efca449565a3e7356906 -fn_human_readable_file_size() { - local abbrevs=( - $((1 << 60)):ZB - $((1 << 50)):EB - $((1 << 40)):TB - $((1 << 30)):GB - $((1 << 20)):MB - $((1 << 10)):KB - $((1)):bytes - ) - - local bytes="${1}" - local precision="${2}" - - if [[ "${bytes}" == "1" ]]; then - echo "1 byte" - else - for item in "${abbrevs[@]}"; do - local factor="${item%:*}" - local abbrev="${item#*:}" - if [[ "${bytes}" -ge "${factor}" ]]; then - local size="$(bc -l <<< "${bytes} / ${factor}")" - printf "%.*f %s\n" "${precision}" "${size}" "${abbrev}" - break - fi - done - fi } fn_fastdl_source(){ - # Copy all needed files for FastDL - if [ -n "${copyflag}" ]; then - fn_clear_old_fastdl_alt - fn_fastdl_dirs - echo -e "copying files to ${fastdldir}" - fn_script_log_info "Copying files to ${fastdldir}" - else - if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then - rm -f "${tmpdir}/fastdl_files_to_compress.txt" - fi - echo -e "analysing required files" - fn_script_log_info "Analysing required files" - fi - - local directories_array=( "maps" "materials" "models" "particles" "sounds" "resources" ) - for directory in "${directories_array[@]}" + for directory in "${fastdl_directories_array[@]}" do if [ -d "${systemdir}/${directory}" ]; then if [ "${directory}" == "maps" ]; then local allowed_extentions_array=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" ) elif [ "${directory}" == "materials" ]; then local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" ) + elif [ "${directory}" == "models" ]; then + local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.phy" "*.jpg" "*.png" ) elif [ "${directory}" == "particles" ]; then local allowed_extentions_array=( "*.pcf" ) elif [ "${directory}" == "sounds" ]; then - local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.mdl" "*.phy" "*.jpg" "*.png" ) + local allowed_extentions_array=( "*.wav" "*.mp3" "*.ogg" ) fi for allowed_extention in "${allowed_extentions_array[@]}" do fileswc=0 tput sc - if [ -z "${copyflag}" ]; then + while read -r fastdlfile; do + ((fileswc++)) tput rc; tput el printf "copying ${directory} ${allowed_extention} : ${fileswc}..." - fi - while read -r mapfile; do - ((fileswc++)) - if [ -n "${copyflag}" ]; then - tput rc; tput el - printf "copying ${directory} ${allowed_extention} : ${fileswc}..." - sleep 0.01 - if [ ! -d "${fastdldir}/${directory}" ]; then - mkdir "${fastdldir}/${directory}" - fi - cp "${mapfile}" "${fastdldir}/${directory}" - exitcode=$? - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - fn_script_log_fatal "Copying ${mapfile} > ${fastdldir}/${directory}" - core_exit.sh - else - fn_script_log_pass "Copying ${mapfile} > ${fastdldir}/${directory}" - fi + sleep 0.01 + if [ ! -d "${fastdldir}/${directory}" ]; then + mkdir "${fastdldir}/${directory}" + fi + cp "${fastdlfile}" "${fastdldir}/${directory}" + exitcode=$? + if [ "${exitcode}" -ne 0 ]; then + fn_print_fail_eol_nl + fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}/${directory}" + core_exit.sh else - tput rc; tput el - printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." - sleep 0.01 - echo "${mapfile}" >> "${tmpdir}/fastdl_files_to_compress.txt" + fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}/${directory}" fi done < <(find "${systemdir}/${directory}" -type f -iname ${allowed_extention}) - - if [ -z "${copyflag}" ]; then - tput rc; tput el - printf "gathering ${directory} ${allowed_extention} : ${fileswc}..." - fi - if [ ${fileswc} != 0 ]&&[ -n "${copyflag}" ]||[ -z "${copyflag}" ]; then + if [ ${fileswc} != 0 ]; then fn_print_ok_eol_nl fi done fi done +} - if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then - totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt") - # Calculates total file size - while read dufile; do - filesize=$(du -b "${dufile}"| awk '{ print $1 }') - filesizetotal=$(( ${filesizetotal} + ${filesize} )) - done <"${tmpdir}/fastdl_files_to_compress.txt" - fi - - if [ -z "${copyflag}" ]; then - echo "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)" - fn_script_log_info "${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)" - rm "${tmpdir}/fastdl_files_to_compress.txt" - if fn_prompt_yn "Continue?" Y; then - copyflag=1 - fn_fastdl_source - else - core_exit.sh - fi +# Builds the fastdl directory content +fn_fastdl_build(){ + # Copy all needed files for FastDL + echo -e "copying files to ${fastdldir}" + fn_script_log_info "Copying files to ${fastdldir}" + if [ "${gamename}" == "Garry's Mod" ]; then + fn_fastdl_gmod + fn_fastdl_gmod_dl_enforcer + else + fn_fastdl_source fi } # Generate lua file that will force download any file into the FastDL directory -fn_fastdl_gmod_lua_enforcer(){ +fn_fastdl_gmod_dl_enforcer(){ # Clear old lua file if [ -f "${luafastdlfullpath}" ]; then echo -en "removing existing download enforcer: ${luafastdlfile}..." rm "${luafastdlfullpath:?}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" -ne 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "removing existing download enforcer ${luafastdlfullpath}" core_exit.sh @@ -408,11 +387,11 @@ fn_fastdl_gmod_lua_enforcer(){ echo -en "creating new download enforcer: ${luafastdlfile}..." touch "${luafastdlfullpath}" # Read all filenames and put them into a lua file at the right path - find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -printf '%P\n' | while read line; do - echo "resource.AddFile( "\""${line}"\"" )" >> "${luafastdlfullpath}" - done + while read line; do + echo "resource.AddFile( \"${line}\" )" >> "${luafastdlfullpath}" + done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -printf '%P\n') exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" -ne 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "creating new download enforcer ${luafastdlfullpath}" core_exit.sh @@ -423,6 +402,7 @@ fn_fastdl_gmod_lua_enforcer(){ fi } +# Compresses FastDL files using bzip2 fn_fastdl_bzip2(){ echo -en "compressing files..." echo "" @@ -430,7 +410,7 @@ fn_fastdl_bzip2(){ echo -en "\r\033[Kcompressing ${filetocompress}..." bzip2 -f "${filetocompress}" exitcode=$? - if [ ${exitcode} -ne 0 ]; then + if [ "${exitcode}" -ne 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "compressing ${filetocompress}" core_exit.sh @@ -442,12 +422,10 @@ fn_fastdl_bzip2(){ } # Run functions -if [ "${gamename}" == "Garry's Mod" ]; then - fn_fastdl_gmod - fn_fastdl_gmod_lua_enforcer -else - fn_fastdl_source -fi +fn_fastdl_preview +fn_clear_old_fastdl +fn_fastdl_dirs +fn_fastdl_build fn_fastdl_bzip2 # Finished message echo "FastDL files are located in:" From 62aa1c0cda50d9a15ec0b72fe9d34f1c2f58fdda Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 5 Mar 2017 21:40:45 +0000 Subject: [PATCH 0602/1895] message not required --- lgsm/functions/command_fastdl.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index be97474c6..0cd0012d6 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -228,7 +228,7 @@ fn_fastdl_preview(){ if ! fn_prompt_yn "Continue?" Y; then fn_script_log "User exited" core_exit.sh - fi + fi } # Builds Garry's Mod fastdl directory content @@ -404,8 +404,6 @@ fn_fastdl_gmod_dl_enforcer(){ # Compresses FastDL files using bzip2 fn_fastdl_bzip2(){ - echo -en "compressing files..." - echo "" while read -r filetocompress; do echo -en "\r\033[Kcompressing ${filetocompress}..." bzip2 -f "${filetocompress}" From c32be4e661c3495277a622a5c262534c9d66fac0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 5 Mar 2017 21:43:23 +0000 Subject: [PATCH 0603/1895] capitals for some log messages --- lgsm/functions/command_fastdl.sh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 0cd0012d6..8d558a670 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -263,11 +263,11 @@ fn_fastdl_gmod(){ exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "updating addons file structure" + fn_script_log_fatal "Updating addons file structure" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "updating addons file structure" + fn_script_log_pass "Updating addons file structure" fi # Clear addons directory in fastdl echo -en "clearing addons dir from fastdl dir..." @@ -276,11 +276,11 @@ fn_fastdl_gmod(){ exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "clearing addons dir from fastdl dir" + fn_script_log_fatal "Clearing addons dir from fastdl dir" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "clearing addons dir from fastdl dir" + fn_script_log_pass "Clearing addons dir from fastdl dir" fi fi # Correct content that may be into a lua directory by mistake like some darkrpmodification addons @@ -291,11 +291,11 @@ fn_fastdl_gmod(){ exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "correcting DarkRP files" + fn_script_log_fatal "Correcting DarkRP files" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "correcting DarkRP files" + fn_script_log_pass "Correcting DarkRP files" fi fi if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then @@ -375,11 +375,11 @@ fn_fastdl_gmod_dl_enforcer(){ exitcode=$? if [ "${exitcode}" -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "removing existing download enforcer ${luafastdlfullpath}" + fn_script_log_fatal "Removing existing download enforcer ${luafastdlfullpath}" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "removing existing download enforcer ${luafastdlfullpath}" + fn_script_log_pass "Removing existing download enforcer ${luafastdlfullpath}" fi fi # Generate new one if user said yes @@ -393,11 +393,11 @@ fn_fastdl_gmod_dl_enforcer(){ exitcode=$? if [ "${exitcode}" -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "creating new download enforcer ${luafastdlfullpath}" + fn_script_log_fatal "Creating new download enforcer ${luafastdlfullpath}" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "creating new download enforcer ${luafastdlfullpath}" + fn_script_log_pass "Creating new download enforcer ${luafastdlfullpath}" fi fi } @@ -410,10 +410,10 @@ fn_fastdl_bzip2(){ exitcode=$? if [ "${exitcode}" -ne 0 ]; then fn_print_fail_eol_nl - fn_script_log_fatal "compressing ${filetocompress}" + fn_script_log_fatal "Compressing ${filetocompress}" core_exit.sh else - fn_script_log_pass "compressing ${filetocompress}" + fn_script_log_pass "Compressing ${filetocompress}" fi done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \)) fn_print_ok_eol_nl From feea45d6914e76cb4fc5dea9a77e3918e9fa1748 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 6 Mar 2017 17:44:14 +0000 Subject: [PATCH 0604/1895] Version 170305 --- 7DaysToDie/sdtdserver | 2 +- ARKSurvivalEvolved/arkserver | 2 +- Arma3/arma3server | 2 +- BallisticOverkill/boserver | 2 +- Battlefield1942/bf1942server | 2 +- BlackMesa/bmdmserver | 2 +- BladeSymphony/bsserver | 2 +- BrainBread2/bb2server | 2 +- CallOfDuty/codserver | 2 +- CallOfDuty2/cod2server | 2 +- CallOfDuty4/cod4server | 2 +- CallOfDutyUnitedOffensive/coduoserver | 2 +- CallOfDutyWorldAtWar/codwawserver | 2 +- CodenameCURE/ccserver | 2 +- CounterStrike/csserver | 2 +- CounterStrikeConditionZero/csczserver | 2 +- CounterStrikeGlobalOffensive/csgoserver | 2 +- CounterStrikeSource/cssserver | 2 +- DayOfDefeat/dodserver | 2 +- DayOfDefeatSource/dodsserver | 2 +- DayOfInfamy/doiserver | 2 +- DeathmatchClassic/dmcserver | 2 +- DontStarveTogether/dstserver | 2 +- DoubleActionBoogaloo/dabserver | 2 +- EmpiresMod/emserver | 2 +- Factorio/fctrserver | 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 +- Minecraft/mcserver | 2 +- MultiTheftAuto/mtaserver | 2 +- Mumble/mumbleserver | 2 +- NS2Combat/ns2cserver | 2 +- NaturalSelection2/ns2server | 2 +- NoMoreRoomInHell/nmrihserver | 2 +- OpposingForce/opforserver | 2 +- PiratesVikingandKnightsII/pvkiiserver | 2 +- ProjectCars/pcserver | 2 +- ProjectZomboid/pzserver | 2 +- Quake2/q2server | 2 +- Quake3/q3server | 2 +- QuakeLive/qlserver | 2 +- QuakeWorld/qwserver | 2 +- RedOrchestra/roserver | 2 +- Ricochet/ricochetserver | 2 +- Rust/rustserver | 2 +- SeriousSam3BFE/ss3sserver | 2 +- Starbound/sbserver | 2 +- SvenCoop/svenserver | 2 +- TeamFortress2/tf2server | 2 +- TeamFortressClassic/tfcserver | 2 +- TeamSpeak3/ts3server | 2 +- Teeworlds/twserver | 2 +- Terraria/terrariaserver | 2 +- TowerUnite/tuserver | 2 +- UnrealTournament/utserver | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament3/ut3server | 2 +- UnrealTournament99/ut99server | 2 +- WolfensteinEnemyTerritory/wetserver | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_ts3server.sh | 2 +- 71 files changed, 71 insertions(+), 71 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index ce73f795c..59bbbe252 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index a633d728c..566b9e36a 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Arma3/arma3server b/Arma3/arma3server index 928b2a144..0da13b5a6 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/BallisticOverkill/boserver b/BallisticOverkill/boserver index 781fc4af7..fb15b0be5 100644 --- a/BallisticOverkill/boserver +++ b/BallisticOverkill/boserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Battlefield1942/bf1942server b/Battlefield1942/bf1942server index 3111d79d6..10910c229 100644 --- a/Battlefield1942/bf1942server +++ b/Battlefield1942/bf1942server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index a3e1e9454..01d338c52 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index 470221666..ceb2b6cc3 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index e01b9dbb8..d9f9ad56a 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/CallOfDuty/codserver b/CallOfDuty/codserver index 788db3838..ff392d35a 100755 --- a/CallOfDuty/codserver +++ b/CallOfDuty/codserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/CallOfDuty2/cod2server b/CallOfDuty2/cod2server index 21481bef6..951157bd2 100755 --- a/CallOfDuty2/cod2server +++ b/CallOfDuty2/cod2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server index 4c0c79a65..153bee61d 100644 --- a/CallOfDuty4/cod4server +++ b/CallOfDuty4/cod4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/CallOfDutyUnitedOffensive/coduoserver b/CallOfDutyUnitedOffensive/coduoserver index bc6b8eaf7..3812bc518 100755 --- a/CallOfDutyUnitedOffensive/coduoserver +++ b/CallOfDutyUnitedOffensive/coduoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/CallOfDutyWorldAtWar/codwawserver b/CallOfDutyWorldAtWar/codwawserver index a8a9204cb..4a026bd22 100755 --- a/CallOfDutyWorldAtWar/codwawserver +++ b/CallOfDutyWorldAtWar/codwawserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 63ca1091c..2bcbe44e2 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/CounterStrike/csserver b/CounterStrike/csserver index 21a61c540..d19f29285 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index 4047c9128..55d29b4ec 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index f3954640c..6fc6ed076 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index af7191cc9..282e7a613 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index e58597264..df059fe0f 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 9a0009754..d741b5bd6 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/DayOfInfamy/doiserver b/DayOfInfamy/doiserver index 27de57e53..48d51dbc1 100644 --- a/DayOfInfamy/doiserver +++ b/DayOfInfamy/doiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index bd7540d3c..15e7e06f6 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index 84db9996f..99d8bd167 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 4bbb6795c..5266942b5 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/EmpiresMod/emserver b/EmpiresMod/emserver index 929405368..bf9cd399e 100644 --- a/EmpiresMod/emserver +++ b/EmpiresMod/emserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 890562fa9..e957c8151 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index 064b1504a..1243f068a 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index 70c535bfd..7da80c97a 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index 0e3f44e64..9a212cafe 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index a1830b9e7..fd2e79335 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index be1fa33ee..a54c26bc7 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index efec28f28..813ca531e 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index d43cf4114..8b5d31ae7 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Insurgency/insserver b/Insurgency/insserver index 568da1b1f..778e3b99b 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/JustCause2/jc2server b/JustCause2/jc2server index db5974e42..ca23c1640 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index da9de5d3c..d490be6a1 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index 325ee5af9..fb21485b2 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index 9097ee97b..ccf44fd8e 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Minecraft/mcserver b/Minecraft/mcserver index 49bed4183..073a47c74 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver index 74111e97c..ad1ed8474 100644 --- a/MultiTheftAuto/mtaserver +++ b/MultiTheftAuto/mtaserver @@ -12,7 +12,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index d66ec7d85..d6b340fcf 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index 04c73b2ed..e56b588af 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index b718a8180..3ae2df8d2 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index 5a3318e3e..ccb665c29 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index 0b113a03d..a0b4f9e95 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index 51c0fc434..f9362f998 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/ProjectCars/pcserver b/ProjectCars/pcserver index b05dec06f..c42f2f9ff 100755 --- a/ProjectCars/pcserver +++ b/ProjectCars/pcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index 92c02a44c..36aafdae9 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Quake2/q2server b/Quake2/q2server index ff20eaa74..d0441aded 100644 --- a/Quake2/q2server +++ b/Quake2/q2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Quake3/q3server b/Quake3/q3server index b39697eef..8ac52796b 100644 --- a/Quake3/q3server +++ b/Quake3/q3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index b2ae067f4..0a16e6ff4 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/QuakeWorld/qwserver b/QuakeWorld/qwserver index 147d65127..c3793ed30 100644 --- a/QuakeWorld/qwserver +++ b/QuakeWorld/qwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index 1c7fac367..84dfc8acd 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index 2a714cc5d..4d4d2cb57 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Rust/rustserver b/Rust/rustserver index 05355eb8c..79e96d80b 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index c3db06006..d982bd953 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Starbound/sbserver b/Starbound/sbserver index 6672a4f85..64093c6d1 100644 --- a/Starbound/sbserver +++ b/Starbound/sbserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/SvenCoop/svenserver b/SvenCoop/svenserver index 17348c8a9..0aa31d4c2 100644 --- a/SvenCoop/svenserver +++ b/SvenCoop/svenserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index 6a5461090..5a6d16702 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index caabf8bf8..3c51077a2 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index 0cae571ca..25337132e 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Teeworlds/twserver b/Teeworlds/twserver index 377c70088..d1185e84d 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index 43abf5a97..6aca08117 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/TowerUnite/tuserver b/TowerUnite/tuserver index 500ec01ff..9f15c39a6 100644 --- a/TowerUnite/tuserver +++ b/TowerUnite/tuserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/UnrealTournament/utserver b/UnrealTournament/utserver index 2982a1d7d..f8039d725 100644 --- a/UnrealTournament/utserver +++ b/UnrealTournament/utserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index b5aae27ff..2b89df457 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/UnrealTournament3/ut3server b/UnrealTournament3/ut3server index 4ad601283..c8d769038 100644 --- a/UnrealTournament3/ut3server +++ b/UnrealTournament3/ut3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index 002b0efe9..e1b11d313 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/WolfensteinEnemyTerritory/wetserver b/WolfensteinEnemyTerritory/wetserver index 9720fcd98..c3c91a3cb 100644 --- a/WolfensteinEnemyTerritory/wetserver +++ b/WolfensteinEnemyTerritory/wetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index aa6362168..78ff0804e 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -17,7 +17,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 0b62e3668..0eeab7cb5 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170219" +version="1700305" ########################## ######## Settings ######## From 7f2440796391279674f2e527836716920eaedbff Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Tue, 7 Mar 2017 21:20:29 +0000 Subject: [PATCH 0605/1895] Release 170305 --- 7DaysToDie/sdtdserver | 2 +- ARKSurvivalEvolved/arkserver | 2 +- Arma3/arma3server | 2 +- BallisticOverkill/boserver | 2 +- Battlefield1942/bf1942server | 2 +- BlackMesa/bmdmserver | 2 +- BladeSymphony/bsserver | 2 +- BrainBread2/bb2server | 2 +- CallOfDuty/codserver | 2 +- CallOfDuty2/cod2server | 2 +- CallOfDuty4/cod4server | 2 +- CallOfDutyUnitedOffensive/coduoserver | 2 +- CallOfDutyWorldAtWar/codwawserver | 2 +- CodenameCURE/ccserver | 2 +- CounterStrike/csserver | 2 +- CounterStrikeConditionZero/csczserver | 2 +- CounterStrikeGlobalOffensive/csgoserver | 2 +- CounterStrikeSource/cssserver | 2 +- DayOfDefeat/dodserver | 2 +- DayOfDefeatSource/dodsserver | 2 +- DayOfInfamy/doiserver | 2 +- DeathmatchClassic/dmcserver | 2 +- DontStarveTogether/dstserver | 2 +- DoubleActionBoogaloo/dabserver | 2 +- EmpiresMod/emserver | 2 +- Factorio/fctrserver | 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 +- Minecraft/mcserver | 2 +- MultiTheftAuto/mtaserver | 2 +- Mumble/mumbleserver | 2 +- NS2Combat/ns2cserver | 2 +- NaturalSelection2/ns2server | 2 +- NoMoreRoomInHell/nmrihserver | 2 +- OpposingForce/opforserver | 2 +- PiratesVikingandKnightsII/pvkiiserver | 2 +- ProjectCars/pcserver | 2 +- ProjectZomboid/pzserver | 2 +- Quake2/q2server | 2 +- Quake3/q3server | 2 +- QuakeLive/qlserver | 2 +- QuakeWorld/qwserver | 2 +- RedOrchestra/roserver | 2 +- Ricochet/ricochetserver | 2 +- Rust/rustserver | 2 +- SeriousSam3BFE/ss3sserver | 2 +- Starbound/sbserver | 2 +- SvenCoop/svenserver | 2 +- TeamFortress2/tf2server | 2 +- TeamFortressClassic/tfcserver | 2 +- TeamSpeak3/ts3server | 2 +- Teeworlds/twserver | 2 +- Terraria/terrariaserver | 2 +- TowerUnite/tuserver | 2 +- UnrealTournament/utserver | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament3/ut3server | 2 +- UnrealTournament99/ut99server | 2 +- WolfensteinEnemyTerritory/wetserver | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_ts3server.sh | 2 +- 71 files changed, 71 insertions(+), 71 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index 59bbbe252..fe579d3df 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 566b9e36a..6770d4128 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Arma3/arma3server b/Arma3/arma3server index 0da13b5a6..4b7d9e90e 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/BallisticOverkill/boserver b/BallisticOverkill/boserver index fb15b0be5..1f29990be 100644 --- a/BallisticOverkill/boserver +++ b/BallisticOverkill/boserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Battlefield1942/bf1942server b/Battlefield1942/bf1942server index 10910c229..efd27a892 100644 --- a/Battlefield1942/bf1942server +++ b/Battlefield1942/bf1942server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index 01d338c52..29d4cb903 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index ceb2b6cc3..96c27899e 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index d9f9ad56a..3647d5a32 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/CallOfDuty/codserver b/CallOfDuty/codserver index ff392d35a..f4d092300 100755 --- a/CallOfDuty/codserver +++ b/CallOfDuty/codserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/CallOfDuty2/cod2server b/CallOfDuty2/cod2server index 951157bd2..9b918fc1b 100755 --- a/CallOfDuty2/cod2server +++ b/CallOfDuty2/cod2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server index 153bee61d..50432244f 100644 --- a/CallOfDuty4/cod4server +++ b/CallOfDuty4/cod4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/CallOfDutyUnitedOffensive/coduoserver b/CallOfDutyUnitedOffensive/coduoserver index 3812bc518..9011ead88 100755 --- a/CallOfDutyUnitedOffensive/coduoserver +++ b/CallOfDutyUnitedOffensive/coduoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/CallOfDutyWorldAtWar/codwawserver b/CallOfDutyWorldAtWar/codwawserver index 4a026bd22..81bac8ca1 100755 --- a/CallOfDutyWorldAtWar/codwawserver +++ b/CallOfDutyWorldAtWar/codwawserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 2bcbe44e2..15a57e0af 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/CounterStrike/csserver b/CounterStrike/csserver index d19f29285..ac18e4e20 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index 55d29b4ec..d02caa924 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 6fc6ed076..75ffa7265 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index 282e7a613..7ccc2a688 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index df059fe0f..17e6bf90a 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index d741b5bd6..6710ec756 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/DayOfInfamy/doiserver b/DayOfInfamy/doiserver index 48d51dbc1..e26f95010 100644 --- a/DayOfInfamy/doiserver +++ b/DayOfInfamy/doiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index 15e7e06f6..9308ced64 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index 99d8bd167..d84b8084a 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 5266942b5..ab0f3c770 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/EmpiresMod/emserver b/EmpiresMod/emserver index bf9cd399e..a9b9def1c 100644 --- a/EmpiresMod/emserver +++ b/EmpiresMod/emserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Factorio/fctrserver b/Factorio/fctrserver index e957c8151..54e76a5f2 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index 1243f068a..aaf73016c 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index 7da80c97a..d9b06c24a 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index 9a212cafe..9182365d6 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index fd2e79335..a32f50903 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index a54c26bc7..701678eb9 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index 813ca531e..aa5a19990 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index 8b5d31ae7..445551956 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Insurgency/insserver b/Insurgency/insserver index 778e3b99b..6bf8c6787 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/JustCause2/jc2server b/JustCause2/jc2server index ca23c1640..f6491db66 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index d490be6a1..cd3d4c8d8 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index fb21485b2..fae715724 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index ccf44fd8e..8b9761476 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Minecraft/mcserver b/Minecraft/mcserver index 073a47c74..5e703eec3 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver index ad1ed8474..328e5886b 100644 --- a/MultiTheftAuto/mtaserver +++ b/MultiTheftAuto/mtaserver @@ -12,7 +12,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index d6b340fcf..369a26206 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index e56b588af..c5abeb46f 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index 3ae2df8d2..af5e65d24 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index ccb665c29..7aac993bc 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index a0b4f9e95..915a6944a 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index f9362f998..5ab0e2396 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/ProjectCars/pcserver b/ProjectCars/pcserver index c42f2f9ff..64b6bd5e8 100755 --- a/ProjectCars/pcserver +++ b/ProjectCars/pcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index 36aafdae9..191505d57 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Quake2/q2server b/Quake2/q2server index d0441aded..601fff1cc 100644 --- a/Quake2/q2server +++ b/Quake2/q2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Quake3/q3server b/Quake3/q3server index 8ac52796b..9a0dced71 100644 --- a/Quake3/q3server +++ b/Quake3/q3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index 0a16e6ff4..1fdaec287 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/QuakeWorld/qwserver b/QuakeWorld/qwserver index c3793ed30..5d0cb3b8a 100644 --- a/QuakeWorld/qwserver +++ b/QuakeWorld/qwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index 84dfc8acd..ea82680d5 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index 4d4d2cb57..641fc84e1 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Rust/rustserver b/Rust/rustserver index 79e96d80b..6ac1ac5f9 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index d982bd953..a6b4d53f0 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Starbound/sbserver b/Starbound/sbserver index 64093c6d1..cd7f8c40a 100644 --- a/Starbound/sbserver +++ b/Starbound/sbserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/SvenCoop/svenserver b/SvenCoop/svenserver index 0aa31d4c2..0f6fb9829 100644 --- a/SvenCoop/svenserver +++ b/SvenCoop/svenserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index 5a6d16702..25d262dd3 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index 3c51077a2..834472249 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index 25337132e..f5a39f220 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Teeworlds/twserver b/Teeworlds/twserver index d1185e84d..0325f3889 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index 6aca08117..f0a893134 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/TowerUnite/tuserver b/TowerUnite/tuserver index 9f15c39a6..eb356d6fd 100644 --- a/TowerUnite/tuserver +++ b/TowerUnite/tuserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/UnrealTournament/utserver b/UnrealTournament/utserver index f8039d725..055f689bc 100644 --- a/UnrealTournament/utserver +++ b/UnrealTournament/utserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index 2b89df457..760efbf53 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/UnrealTournament3/ut3server b/UnrealTournament3/ut3server index c8d769038..369b7e643 100644 --- a/UnrealTournament3/ut3server +++ b/UnrealTournament3/ut3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index e1b11d313..e1fa68fb3 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/WolfensteinEnemyTerritory/wetserver b/WolfensteinEnemyTerritory/wetserver index c3c91a3cb..22ef30bd0 100644 --- a/WolfensteinEnemyTerritory/wetserver +++ b/WolfensteinEnemyTerritory/wetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 78ff0804e..360345341 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -17,7 +17,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 0eeab7cb5..e2bf7b12d 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="1700305" +version="170305" ########################## ######## Settings ######## From e5b77379e0e7338f6a1eb93361b01c83c975c103 Mon Sep 17 00:00:00 2001 From: UltimateByte Date: Wed, 8 Mar 2017 21:54:12 +0100 Subject: [PATCH 0606/1895] Fixes commands setting vars not working Some commands that require setting a variable, like "force-update" wouldn't work without this "eval" argument. Example: ```` $ ./insserver fu /home/insserver/lgsm/functions/core_getopt.sh: line 176: forceupdate=1;: command not found ```` This fixes the issue. Tested on Debian & Ubuntu. --- lgsm/functions/core_getopt.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 92ef90002..a17487eb5 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -173,7 +173,7 @@ for i in "${optcommands[@]}"; do for ((currcmdindex=1; currcmdindex <= ${currcmdamount}; currcmdindex++)); do if [ "$(echo "${currentopt[index]}"| awk -F ';' -v x=${currcmdindex} '{ print $x }')" == "${getopt}" ]; then # Run command - ${currentopt[index+1]} + eval ${currentopt[index+1]} core_exit.sh break fi @@ -186,4 +186,4 @@ done echo -e "${red}Unknown command${default}: $0 ${getopt}" exitcode=2 fn_opt_usage -core_exit.sh \ No newline at end of file +core_exit.sh From 586a624e375bd53a94520f8369e0a08a0a095321 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 8 Mar 2017 23:29:41 +0000 Subject: [PATCH 0607/1895] added JSON.sh json.sh is a json parser. --- lgsm/functions/JSON.sh | 208 +++++++++++++++++++++++++++++++ lgsm/functions/core_functions.sh | 8 ++ 2 files changed, 216 insertions(+) create mode 100644 lgsm/functions/JSON.sh diff --git a/lgsm/functions/JSON.sh b/lgsm/functions/JSON.sh new file mode 100644 index 000000000..077863385 --- /dev/null +++ b/lgsm/functions/JSON.sh @@ -0,0 +1,208 @@ +#!/bin/sh + +throw() { + echo "$*" >&2 + exit 1 +} + +BRIEF=0 +LEAFONLY=0 +PRUNE=0 +NO_HEAD=0 +NORMALIZE_SOLIDUS=0 + +usage() { + echo + echo "Usage: JSON.sh [-b] [-l] [-p] [-s] [-h]" + echo + echo "-p - Prune empty. Exclude fields with empty values." + echo "-l - Leaf only. Only show leaf nodes, which stops data duplication." + echo "-b - Brief. Combines 'Leaf only' and 'Prune empty' options." + echo "-n - No-head. Do not show nodes that have no path (lines that start with [])." + echo "-s - Remove escaping of the solidus symbol (straight slash)." + echo "-h - This help text." + echo +} + +parse_options() { + set -- "$@" + local ARGN=$# + while [ "$ARGN" -ne 0 ] + do + case $1 in + -h) usage + exit 0 + ;; + -b) BRIEF=1 + LEAFONLY=1 + PRUNE=1 + ;; + -l) LEAFONLY=1 + ;; + -p) PRUNE=1 + ;; + -n) NO_HEAD=1 + ;; + -s) NORMALIZE_SOLIDUS=1 + ;; + ?*) echo "ERROR: Unknown option." + usage + exit 0 + ;; + esac + shift 1 + ARGN=$((ARGN-1)) + done +} + +awk_egrep () { + local pattern_string=$1 + + gawk '{ + while ($0) { + start=match($0, pattern); + token=substr($0, start, RLENGTH); + print token; + $0=substr($0, start+RLENGTH); + } + }' pattern="$pattern_string" +} + +tokenize () { + local GREP + local ESCAPE + local CHAR + + if echo "test string" | egrep -ao --color=never "test" >/dev/null 2>&1 + then + GREP='egrep -ao --color=never' + else + GREP='egrep -ao' + fi + + if echo "test string" | egrep -o "test" >/dev/null 2>&1 + then + ESCAPE='(\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})' + CHAR='[^[:cntrl:]"\\]' + else + GREP=awk_egrep + ESCAPE='(\\\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})' + CHAR='[^[:cntrl:]"\\\\]' + fi + + local STRING="\"$CHAR*($ESCAPE$CHAR*)*\"" + local NUMBER='-?(0|[1-9][0-9]*)([.][0-9]*)?([eE][+-]?[0-9]*)?' + local KEYWORD='null|false|true' + local SPACE='[[:space:]]+' + + # Force zsh to expand $A into multiple words + local is_wordsplit_disabled=$(unsetopt 2>/dev/null | grep -c '^shwordsplit$') + if [ $is_wordsplit_disabled != 0 ]; then setopt shwordsplit; fi + $GREP "$STRING|$NUMBER|$KEYWORD|$SPACE|." | egrep -v "^$SPACE$" + if [ $is_wordsplit_disabled != 0 ]; then unsetopt shwordsplit; fi +} + +parse_array () { + local index=0 + local ary='' + read -r token + case "$token" in + ']') ;; + *) + while : + do + parse_value "$1" "$index" + index=$((index+1)) + ary="$ary""$value" + read -r token + case "$token" in + ']') break ;; + ',') ary="$ary," ;; + *) throw "EXPECTED , or ] GOT ${token:-EOF}" ;; + esac + read -r token + done + ;; + esac + [ "$BRIEF" -eq 0 ] && value=$(printf '[%s]' "$ary") || value= + : +} + +parse_object () { + local key + local obj='' + read -r token + case "$token" in + '}') ;; + *) + while : + do + case "$token" in + '"'*'"') key=$token ;; + *) throw "EXPECTED string GOT ${token:-EOF}" ;; + esac + read -r token + case "$token" in + ':') ;; + *) throw "EXPECTED : GOT ${token:-EOF}" ;; + esac + read -r token + parse_value "$1" "$key" + obj="$obj$key:$value" + read -r token + case "$token" in + '}') break ;; + ',') obj="$obj," ;; + *) throw "EXPECTED , or } GOT ${token:-EOF}" ;; + esac + read -r token + done + ;; + esac + [ "$BRIEF" -eq 0 ] && value=$(printf '{%s}' "$obj") || value= + : +} + +parse_value () { + local jpath="${1:+$1,}$2" isleaf=0 isempty=0 print=0 + case "$token" in + '{') parse_object "$jpath" ;; + '[') parse_array "$jpath" ;; + # At this point, the only valid single-character tokens are digits. + ''|[!0-9]) throw "EXPECTED value GOT ${token:-EOF}" ;; + *) value=$token + # if asked, replace solidus ("\/") in json strings with normalized value: "/" + [ "$NORMALIZE_SOLIDUS" -eq 1 ] && value=$(echo "$value" | sed 's#\\/#/#g') + isleaf=1 + [ "$value" = '""' ] && isempty=1 + ;; + esac + [ "$value" = '' ] && return + [ "$NO_HEAD" -eq 1 ] && [ -z "$jpath" ] && return + + [ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 0 ] && print=1 + [ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && [ $PRUNE -eq 0 ] && print=1 + [ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 1 ] && [ "$isempty" -eq 0 ] && print=1 + [ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && \ + [ $PRUNE -eq 1 ] && [ $isempty -eq 0 ] && print=1 + [ "$print" -eq 1 ] && printf "[%s]\t%s\n" "$jpath" "$value" + : +} + +parse () { + read -r token + parse_value + read -r token + case "$token" in + '') ;; + *) throw "EXPECTED EOF GOT $token" ;; + esac +} + +if ([ "$0" = "$BASH_SOURCE" ] || ! [ -n "$BASH_SOURCE" ]); +then + parse_options "$@" + tokenize | parse +fi + +# vi: expandtab sw=2 ts=2 diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 1738928ca..6c66a09b9 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -89,6 +89,14 @@ if [ ! -d "${tmpdir}" ]; then mkdir -p "${tmpdir}" fi +# External dependencies + +JSON.sh(){ +# Functions are defined in core_functions.sh. +functionfile="${FUNCNAME}" +fn_fetch_core_dl +} + # Core core_dl.sh(){ From 5360fdd6662122cecd9956c38727a9bf7d650b2c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 11 Mar 2017 19:43:33 +0000 Subject: [PATCH 0608/1895] corrected github username --- MultiTheftAuto/mtaserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver index 328e5886b..d82e00754 100644 --- a/MultiTheftAuto/mtaserver +++ b/MultiTheftAuto/mtaserver @@ -57,7 +57,7 @@ logdays="7" # Github Branch Select # Allows for the use of different function files # from a different repo and/or branch. -githubuser="dgibbs64" +githubuser="GameServerManagers" githubrepo="linuxgsm" githubbranch="master" From fd289541b1dcce7bbe447d626e9cffca80931557 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 11 Mar 2017 19:43:52 +0000 Subject: [PATCH 0609/1895] changed from issues to support --- lgsm/functions/command_start.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index c544dd9cf..1f411af48 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -126,7 +126,7 @@ fn_start_tmux(){ echo "=================================" cat "${scriptlogdir}/.${servicename}-tmux-error.tmp" | tee -a "${scriptlog}" - # Detected error https://gameservermanagers.com/issues + # Detected error https://gameservermanagers.com/support if [ $(grep -c "Operation not permitted" "${scriptlogdir}/.${servicename}-tmux-error.tmp") ]; then echo "" echo "Fix" @@ -148,8 +148,8 @@ fn_start_tmux(){ else echo "No known fix currently. Please log an issue." fn_script_log_info "No known fix currently. Please log an issue." - echo "https://gameservermanagers.com/issues" - fn_script_log_info "https://gameservermanagers.com/issues" + echo "https://gameservermanagers.com/support" + fn_script_log_info "https://gameservermanagers.com/support" fi fi fi From bdc29f04f6866dcbcfc12b48e195c3f5f92cd95d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 18 Mar 2017 20:28:03 +0000 Subject: [PATCH 0610/1895] Team Fortress 2 now required Glibc 2.15 --- lgsm/functions/info_glibc.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 97a395962..6870ca51a 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -80,6 +80,9 @@ elif [ "${gamename}" == "Quake Live" ]; then elif [ "${gamename}" == "Sven Co-op" ]; then glibcrequired="2.18" glibcfix="no" +elif [ "${gamename}" == "Team Fortress 2" ]; then + glibcrequired="2.15" + glibcfix="yes" elif [ "${gamename}" == "TeamSpeak 3" ]; then glibcrequired="NOT REQUIRED" glibcfix="no" From 4b79e89507ce4b032d2ac7213149dded60b75d2a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 19 Mar 2017 02:04:27 +0000 Subject: [PATCH 0611/1895] now uses arrays --- lgsm/functions/gsquery.py | 40 ++++++++++++--------------------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/lgsm/functions/gsquery.py b/lgsm/functions/gsquery.py index 6172d53b4..05d18f9fc 100644 --- a/lgsm/functions/gsquery.py +++ b/lgsm/functions/gsquery.py @@ -1,16 +1,15 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -# Game Server Query +# PythonGSQ # Author: Anonymous & Daniel Gibbs # Website: https://gameservermanagers.com -# Description: Handles querying of . +# Description: Allows querying of various game servers. import optparse import socket import sys - -class GameServer: +class PythonGSQ: def __init__(self, options, arguments): self.option = options self.argument = arguments @@ -18,32 +17,17 @@ class GameServer: self.server_response_timeout = 5 self.default_buffer_length = 1024 # - if self.option.engine == 'avalanche': - self.query_prompt_string = b'\xFE\xFD\x09\x10\x20\x30\x40' - elif self.option.engine == 'goldsource': + sourcequery=['quakelive','realvirtuality','refractor','source','goldsource','spark','unity3d'] + idtech2query=['idtech3','quake','iw3.0'] + idtech3query=['idtech2','iw2.0'] + if self.option.engine in sourcequery: self.query_prompt_string = b'\xFF\xFF\xFF\xFFTSource Engine Query\0' - elif self.option.engine == 'idtech2': + elif self.option.engine in idtech2query: self.query_prompt_string = b'\xff\xff\xff\xffstatus\x00' - elif self.option.engine == 'idtech3': - self.query_prompt_string = b'\xff\xff\xff\xffgetstatus' - elif self.option.engine == 'iw2.0': + elif self.option.engine in idtech3query: self.query_prompt_string = b'\xff\xff\xff\xffgetstatus' - elif self.option.engine == 'iw3.0': - self.query_prompt_string = b'\xff\xff\xff\xffgetstatus' - elif self.option.engine == 'quake': - self.query_prompt_string = b'\xff\xff\xff\xffstatus\x00' - elif self.option.engine == 'quakelive': - self.query_prompt_string = b'\xFF\xFF\xFF\xFFTSource Engine Query\0' - elif self.option.engine == 'realvirtuality': - self.query_prompt_string = b'\xFF\xFF\xFF\xFFTSource Engine Query\0' - elif self.option.engine == 'refractor': - self.query_prompt_string = b'\xFF\xFF\xFF\xFFTSource Engine Query\0' - elif self.option.engine == 'source': - self.query_prompt_string = b'\xFF\xFF\xFF\xFFTSource Engine Query\0' - elif self.option.engine == 'spark': - self.query_prompt_string = b'\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 == 'avalanche': + self.query_prompt_string = b'\xFE\xFD\x09\x10\x20\x30\x40' elif self.option.engine == 'unreal': self.query_prompt_string = b'\x5C\x69\x6E\x66\x6F\x5C' elif self.option.engine == 'unreal2': @@ -135,5 +119,5 @@ if __name__ == '__main__': ) options, arguments = parser.parse_args() # - server = GameServer(options, arguments) + server = PythonGSQ(options, arguments) server.responding() From afe1853ab2571a4deaa47857783087ca4f0d07d2 Mon Sep 17 00:00:00 2001 From: Chaos Date: Mon, 20 Mar 2017 17:39:43 -0600 Subject: [PATCH 0612/1895] Resolves #1377 --- lgsm/functions/info_distro.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index d8d733d64..abc3fff59 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -37,12 +37,14 @@ glibcversion="$(ldd --version | sed -n '1s/.* //p')" ## tmux version # e.g: tmux 1.6 -if [ -z "$(command -v tmux)" ]; then +if [ -z "$(command -V tmux)" ]; then tmuxv="${red}NOT INSTALLED!${default}" -elif [ "$(tmux -V|sed "s/tmux //" | sed -n '1 p' | tr -cd '[:digit:]')" -lt "16" ]; then - tmuxv="$(tmux -V) (>= 1.6 required for console log)" else - tmuxv=$(tmux -V) + if [ "$(tmux -V|sed "s/tmux //" | sed -n '1 p' | tr -cd '[:digit:]')" -lt "16" ] 2>/dev/null; then + tmuxv="$(tmux -V) (>= 1.6 required for console log)" + else + tmuxv=$(tmux -V) + fi fi ## Uptime From 4b547ef89973114c0a9cd502f804ef8f3f66171b Mon Sep 17 00:00:00 2001 From: Chaos Date: Mon, 20 Mar 2017 17:56:00 -0600 Subject: [PATCH 0613/1895] Fixes the same issue in command_start --- lgsm/functions/command_start.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 1f411af48..4bad75d7b 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -84,13 +84,13 @@ fn_start_tmux(){ 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 + if [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -lt "16" ] 2>/dev/null; then echo "Console logging disabled: Tmux => 1.6 required https://gameservermanagers.com/tmux-upgrade 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 + elif [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -eq "18" ] 2>/dev/null; then echo "Console logging disabled: Bug in tmux 1.8 breaks logging https://gameservermanagers.com/tmux-upgrade Currently installed: $(tmux -V)" > "${consolelog}" From d0c6cbf1cce34e28cc9d7c0df31322166c5950d3 Mon Sep 17 00:00:00 2001 From: Chaos Date: Mon, 20 Mar 2017 17:56:59 -0600 Subject: [PATCH 0614/1895] Helpful comment as to why I'm doing this --- 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 4bad75d7b..b4928905d 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -84,7 +84,7 @@ fn_start_tmux(){ 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" ] 2>/dev/null; then + if [ "$(tmux -V|sed "s/tmux //"|sed -n '1 p'|tr -cd '[:digit:]')" -lt "16" ] 2>/dev/null; then # Tmux compiled from source will not return a number, therefore bypass this check and trash the error echo "Console logging disabled: Tmux => 1.6 required https://gameservermanagers.com/tmux-upgrade Currently installed: $(tmux -V)" > "${consolelog}" From 053ed98988d866571148172083660d4aa3198495 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 23 Mar 2017 00:58:34 +0000 Subject: [PATCH 0615/1895] Updated Codename CURE glibc version to 2.15 --- lgsm/functions/info_glibc.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 6870ca51a..339c3d0ae 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -35,6 +35,9 @@ elif [ "${gamename}" == "Call of Duty 4" ]; then elif [ "${gamename}" == "Call of Duty: World at War" ]; then glibcrequired="2.3.2" glibcfix="no" +elif [ "${gamename}" == "Codename CURE" ]; then + glibcrequired="2.15" + glibcfix="yes" elif [ "${gamename}" == "Day of Infamy" ]; then glibcrequired="2.15" glibcfix="yes" From f264c24eec5468397b35ae52cfc7980fd33947eb Mon Sep 17 00:00:00 2001 From: Bara20 Date: Mon, 27 Mar 2017 23:39:03 +0200 Subject: [PATCH 0616/1895] Add coserver file --- ClassicOffensive/coserver | 224 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 ClassicOffensive/coserver diff --git a/ClassicOffensive/coserver b/ClassicOffensive/coserver new file mode 100644 index 000000000..b2f695bd7 --- /dev/null +++ b/ClassicOffensive/coserver @@ -0,0 +1,224 @@ +#!/bin/bash +# Project: Game Server Managers - LinuxGSM +# Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# Purpose: Classic Offensive | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki +# Website: https://gameservermanagers.com + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="170305" + +########################## +######## Settings ######## +########################## + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +# https://developer.valvesoftware.com/wiki/Counter-Strike:_Global_Offensive_Dedicated_Servers#Starting_the_Server +# [Game Modes] gametype gamemode +# Arms Race 1 0 +# Classic Casual 0 0 +# Classic Competitive 0 1 +# Demolition 1 1 +# Deathmatch 1 2 +gametype="0" +gamemode="0" +defaultmap="de_mirage" +mapgroup="mg_active" +maxplayers="16" +tickrate="64" +port="27015" +sourcetvport="27020" +clientport="27005" +ip="0.0.0.0" + +## Required: Game Server Login Token +# GSLT is required for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Optional: Workshop Parameters +# https://developer.valvesoftware.com/wiki/CSGO_Workshop_For_Server_Operators +# To get an authkey visit - http://steamcommunity.com/dev/apikey +# authkey="" +# ws_collection_id="" +# ws_start_map="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game csco -usercon -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers_override ${maxplayers} +mapgroup ${mapgroup} +game_mode ${gamemode} +game_type ${gametype} +host_workshop_collection ${ws_collection_id} +workshop_start_map ${ws_start_map} -authkey ${authkey}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="740" +appid_co="600380" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="csco" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Classic Offensive" +engine="source" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="co-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}/csco" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${systemdir}/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" + +######################## +######## Script ######## +###### Do not edit ##### +######################## + +# 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 -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_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_fetch_core_dl +} + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + +core_dl.sh +core_functions.sh +getopt=$1 +core_getopt.sh From f65449a0e066ff9165e5902b2f6ccc738ec6a2f2 Mon Sep 17 00:00:00 2001 From: Bara20 Date: Tue, 28 Mar 2017 10:17:33 +0200 Subject: [PATCH 0617/1895] Add support for classic offensive --- ClassicOffensive/coserver | 4 ++++ lgsm/functions/install_config.sh | 7 +++++++ lgsm/functions/install_server_files.sh | 10 ++++++++++ lgsm/functions/update_steamcmd.sh | 4 ++++ 4 files changed, 25 insertions(+) diff --git a/ClassicOffensive/coserver b/ClassicOffensive/coserver index b2f695bd7..5dfb9f286 100644 --- a/ClassicOffensive/coserver +++ b/ClassicOffensive/coserver @@ -95,6 +95,10 @@ appid_co="600380" # Example: "-beta latest_experimental" branch="" +## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login +steamuser="accountname" +steampass='accountpassword' + ## Github Branch Select # Allows for the use of different function files # from a different repo and/or branch. diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 249e5291e..71a9bad3e 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -228,6 +228,13 @@ elif [ "${gamename}" == "Counter-Strike: Global Offensive" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars + fn_set_config_vars +elif [ "${gamename}" == "Classic Offensive" ]; then + gamedirname="ClassicOffensive" + array_configs+=( server.cfg ) + fn_fetch_default_config + fn_default_config_remote + fn_set_config_vars elif [ "${gamename}" == "Counter-Strike: Source" ]; then gamedirname="CounterStrikeSource" array_configs+=( server.cfg ) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index edee16e9f..f330f086e 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -83,6 +83,11 @@ fn_install_server_files_steamcmd(){ else ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} +quit local exitcode=$? + + if [ "${gamename}" == "Classic Offensive" ]; then + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid_co}" ${branch} +quit + local exitcode=$? + fi fi elif [ "${counter}" -ge "5" ]; then if [ "${engine}" == "goldsource" ]; then @@ -91,6 +96,11 @@ fn_install_server_files_steamcmd(){ else ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} -validate +quit local exitcode=$? + + if [ "${gamename}" == "Classic Offensive" ]; then + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid_co}" ${branch} -validate +quit + local exitcode=$? + fi fi fi elif [ "${counter}" -ge "11" ]; then diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index e500a0fbf..8720af82c 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -29,6 +29,10 @@ fn_update_steamcmd_dl(){ ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" else ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" + + if [ "${gamename}" == "Classic Offensive" ]; then + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid_co}" ${branch} +quit | tee -a "${scriptlog}" + fi fi fix.sh From 6128817437aa5493271fed9693052c9c1af92369 Mon Sep 17 00:00:00 2001 From: Bara20 Date: Tue, 28 Mar 2017 10:19:12 +0200 Subject: [PATCH 0618/1895] Update githubuser --- ClassicOffensive/coserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ClassicOffensive/coserver b/ClassicOffensive/coserver index 5dfb9f286..8800f55db 100644 --- a/ClassicOffensive/coserver +++ b/ClassicOffensive/coserver @@ -102,7 +102,7 @@ steampass='accountpassword' ## Github Branch Select # Allows for the use of different function files # from a different repo and/or branch. -githubuser="csco" +githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="master" From b21a3f93aa396511ca01a3af2cca1ab8dc539233 Mon Sep 17 00:00:00 2001 From: Bara20 Date: Tue, 28 Mar 2017 16:12:29 +0200 Subject: [PATCH 0619/1895] Update install_config.sh --- lgsm/functions/install_config.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 71a9bad3e..415a498de 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -228,7 +228,6 @@ elif [ "${gamename}" == "Counter-Strike: Global Offensive" ]; then fn_fetch_default_config fn_default_config_remote fn_set_config_vars - fn_set_config_vars elif [ "${gamename}" == "Classic Offensive" ]; then gamedirname="ClassicOffensive" array_configs+=( server.cfg ) From 283e54b9dcc7399f1007b7bdaaa644a9a912227e Mon Sep 17 00:00:00 2001 From: Chaos Date: Mon, 3 Apr 2017 00:11:44 -0600 Subject: [PATCH 0620/1895] Added a discord icon to the readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 72e57fa62..978fdbbff 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Build Status](https://travis-ci.org/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.org/GameServerManagers/LinuxGSM) [![Under Development](https://badge.waffle.io/GameServerManagers/LinuxGSM.svg?label=Under%20Development&title=Under%20Development)](http://waffle.io/GameServerManagers/LinuxGSM) +[![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://gameservermanagers.com/discord) The Linux Game Server Managers are command line tools for quick, simple deployment and management of various dedicated game servers and voice alert servers. From c7d848e3e3e9a268a68b759f2ff5cbdbb7112d14 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 8 Apr 2017 22:21:19 +0100 Subject: [PATCH 0621/1895] Cleared files for new dir structure --- 7DaysToDie/sdtdserver | 200 --------------------- ARKSurvivalEvolved/arkserver | 199 --------------------- Arma3/arma3server | 218 ----------------------- BallisticOverkill/boserver | 198 --------------------- Battlefield1942/bf1942server | 185 -------------------- BlackMesa/bmdmserver | 206 ---------------------- BladeSymphony/bsserver | 203 --------------------- BrainBread2/bb2server | 203 --------------------- CallOfDuty/codserver | 187 -------------------- CallOfDuty2/cod2server | 187 -------------------- CallOfDuty4/cod4server | 187 -------------------- CallOfDutyUnitedOffensive/coduoserver | 187 -------------------- CallOfDutyWorldAtWar/codwawserver | 187 -------------------- CodenameCURE/ccserver | 200 --------------------- CounterStrike/csserver | 200 --------------------- CounterStrikeConditionZero/csczserver | 200 --------------------- CounterStrikeGlobalOffensive/csgoserver | 223 ------------------------ CounterStrikeSource/cssserver | 206 ---------------------- DayOfDefeat/dodserver | 201 --------------------- DayOfDefeatSource/dodsserver | 200 --------------------- DayOfInfamy/doiserver | 203 --------------------- DeathmatchClassic/dmcserver | 200 --------------------- DontStarveTogether/dstserver | 207 ---------------------- DoubleActionBoogaloo/dabserver | 200 --------------------- EmpiresMod/emserver | 205 ---------------------- Factorio/fctrserver | 190 -------------------- FistfulOfFrags/fofserver | 200 --------------------- GarrysMod/gmodserver | 216 ----------------------- GoldenEyeSource/gesserver | 200 --------------------- HalfLife2Deathmatch/hl2dmserver | 200 --------------------- HalfLifeDeathmatch/hldmserver | 199 --------------------- HalfLifeDeathmatchSource/hldmsserver | 203 --------------------- Hurtworld/hwserver | 214 ----------------------- Insurgency/insserver | 205 ---------------------- JustCause2/jc2server | 190 -------------------- KillingFloor/kfserver | 207 ---------------------- Left4Dead/l4dserver | 199 --------------------- Left4Dead2/l4d2server | 199 --------------------- Minecraft/mcserver | 184 ------------------- MultiTheftAuto/mtaserver | 183 ------------------- Mumble/mumbleserver | 184 ------------------- NS2Combat/ns2cserver | 210 ---------------------- NaturalSelection2/ns2server | 210 ---------------------- NoMoreRoomInHell/nmrihserver | 205 ---------------------- OpposingForce/opforserver | 200 --------------------- PiratesVikingandKnightsII/pvkiiserver | 200 --------------------- ProjectCars/pcserver | 193 -------------------- ProjectZomboid/pzserver | 195 --------------------- Quake2/q2server | 185 -------------------- Quake3/q3server | 186 -------------------- QuakeLive/qlserver | 198 --------------------- QuakeWorld/qwserver | 185 -------------------- RedOrchestra/roserver | 207 ---------------------- Ricochet/ricochetserver | 219 ----------------------- Rust/rustserver | 218 ----------------------- SeriousSam3BFE/ss3sserver | 198 --------------------- Starbound/sbserver | 199 --------------------- SvenCoop/svenserver | 199 --------------------- TeamFortress2/tf2server | 203 --------------------- TeamFortressClassic/tfcserver | 200 --------------------- Teeworlds/twserver | 200 --------------------- Terraria/terrariaserver | 199 --------------------- TowerUnite/tuserver | 197 --------------------- UnrealTournament/utserver | 188 -------------------- UnrealTournament2004/ut2k4server | 188 -------------------- UnrealTournament3/ut3server | 199 --------------------- UnrealTournament99/ut99server | 186 -------------------- WolfensteinEnemyTerritory/wetserver | 184 ------------------- TeamSpeak3/ts3server => lgsminstall | 127 ++++++-------- 69 files changed, 51 insertions(+), 13592 deletions(-) delete mode 100644 7DaysToDie/sdtdserver delete mode 100644 ARKSurvivalEvolved/arkserver delete mode 100644 Arma3/arma3server delete mode 100644 BallisticOverkill/boserver delete mode 100644 Battlefield1942/bf1942server delete mode 100644 BlackMesa/bmdmserver delete mode 100644 BladeSymphony/bsserver delete mode 100644 BrainBread2/bb2server delete mode 100755 CallOfDuty/codserver delete mode 100755 CallOfDuty2/cod2server delete mode 100644 CallOfDuty4/cod4server delete mode 100755 CallOfDutyUnitedOffensive/coduoserver delete mode 100755 CallOfDutyWorldAtWar/codwawserver delete mode 100644 CodenameCURE/ccserver delete mode 100644 CounterStrike/csserver delete mode 100644 CounterStrikeConditionZero/csczserver delete mode 100755 CounterStrikeGlobalOffensive/csgoserver delete mode 100644 CounterStrikeSource/cssserver delete mode 100644 DayOfDefeat/dodserver delete mode 100644 DayOfDefeatSource/dodsserver delete mode 100644 DayOfInfamy/doiserver delete mode 100644 DeathmatchClassic/dmcserver delete mode 100644 DontStarveTogether/dstserver delete mode 100644 DoubleActionBoogaloo/dabserver delete mode 100644 EmpiresMod/emserver delete mode 100644 Factorio/fctrserver delete mode 100644 FistfulOfFrags/fofserver delete mode 100644 GarrysMod/gmodserver delete mode 100644 GoldenEyeSource/gesserver delete mode 100644 HalfLife2Deathmatch/hl2dmserver delete mode 100644 HalfLifeDeathmatch/hldmserver delete mode 100644 HalfLifeDeathmatchSource/hldmsserver delete mode 100644 Hurtworld/hwserver delete mode 100644 Insurgency/insserver delete mode 100644 JustCause2/jc2server delete mode 100644 KillingFloor/kfserver delete mode 100644 Left4Dead/l4dserver delete mode 100644 Left4Dead2/l4d2server delete mode 100644 Minecraft/mcserver delete mode 100644 MultiTheftAuto/mtaserver delete mode 100644 Mumble/mumbleserver delete mode 100644 NS2Combat/ns2cserver delete mode 100644 NaturalSelection2/ns2server delete mode 100644 NoMoreRoomInHell/nmrihserver delete mode 100644 OpposingForce/opforserver delete mode 100644 PiratesVikingandKnightsII/pvkiiserver delete mode 100755 ProjectCars/pcserver delete mode 100644 ProjectZomboid/pzserver delete mode 100644 Quake2/q2server delete mode 100644 Quake3/q3server delete mode 100755 QuakeLive/qlserver delete mode 100644 QuakeWorld/qwserver delete mode 100644 RedOrchestra/roserver delete mode 100644 Ricochet/ricochetserver delete mode 100644 Rust/rustserver delete mode 100644 SeriousSam3BFE/ss3sserver delete mode 100644 Starbound/sbserver delete mode 100644 SvenCoop/svenserver delete mode 100644 TeamFortress2/tf2server delete mode 100644 TeamFortressClassic/tfcserver delete mode 100644 Teeworlds/twserver delete mode 100644 Terraria/terrariaserver delete mode 100644 TowerUnite/tuserver delete mode 100644 UnrealTournament/utserver delete mode 100644 UnrealTournament2004/ut2k4server delete mode 100644 UnrealTournament3/ut3server delete mode 100644 UnrealTournament99/ut99server delete mode 100644 WolfensteinEnemyTerritory/wetserver rename TeamSpeak3/ts3server => lgsminstall (56%) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver deleted file mode 100644 index fe579d3df..000000000 --- a/7DaysToDie/sdtdserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: 7 Days To Die | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -steamuser="username" -steampass='password' - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-logfile ${gamelogdir}/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated -configfile=${servercfgfullpath}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="294420" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="7 Days To Die" -engine="unity3d" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="sdtd-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./7DaysToDieServer.x86" -servercfg="${servicename}.xml" -servercfgdefault="serverconfig.xml" -servercfgdir="${filesdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver deleted file mode 100644 index 6770d4128..000000000 --- a/ARKSurvivalEvolved/arkserver +++ /dev/null @@ -1,199 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: ARK: Survival Evolved | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -port="7777" -queryport="27015" -rconport="27020" -maxplayers="70" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="\"TheIsland?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port}?\"" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="376030" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="ARK: Survival Evolved" -engine="unreal4" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ark-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/ShooterGame" -executabledir="${systemdir}/Binaries/Linux" -executable="./ShooterGameServer" -servercfgdir="${systemdir}/Saved/Config/LinuxServer" -servercfg="GameUserSettings.ini" -servercfgdefault="GameUserSettings.ini" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/Saved/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/Arma3/arma3server b/Arma3/arma3server deleted file mode 100644 index 4b7d9e90e..000000000 --- a/Arma3/arma3server +++ /dev/null @@ -1,218 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: ARMA 3 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -steamuser="username" -steampass='password' - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -ip="0.0.0.0" -port="2302" - -## ARMA 3 Modules -# Add mods with relative paths: -# mods/@cba_a3 -# To load the "Community Base Addons v3" module found in the -# directory serverfiles/mods/@cba_a3. Load several mods as: -# mods="mods/@ace\;mods/@acex\;mods/@cba_a3" -mods="" - -## Server-side Mods -servermods="" - -## Path to BattlEye -# Leave empty for default -bepath="" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-netlog -ip=${ip} -port=${port} -cfg=${networkcfgfullpath} -config=${servercfgfullpath} -mod=${mods} -servermod=${servermods} -bepath=${bepath} -autoinit -loadmissiontomemory" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="233780" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="ARMA 3" -engine="realvirtuality" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="arma3-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./arma3server" -servercfg="${servicename}.server.cfg" -networkcfg="${servicename}.network.cfg" -servercfgdefault="server.cfg" -networkcfgdefault="network.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" -networkcfgfullpath="${servercfgdir}/${networkcfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -#gamelogdir="" # No server logs available -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/BallisticOverkill/boserver b/BallisticOverkill/boserver deleted file mode 100644 index 1f29990be..000000000 --- a/BallisticOverkill/boserver +++ /dev/null @@ -1,198 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Ballistic Overkill | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Optional: Game Server Login Token -# GSLT can be used for running a public server. -# More info: https://gameservermanagers.com/gslt -gslt="" -ip="" -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms=" -batchmode -nographics -dedicated -configfile=${servercfgfullpath}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## SteamCMD Settings -# Server appid -appid="416880" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## LinuxGSM Server Details -# Do not edit -gamename="Ballistic Overkill" -engine="unity3d" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="bo-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./BODS.x86" -servercfg="${servicename}.txt" -servercfgdefault="config.txt" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directorie -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/Battlefield1942/bf1942server b/Battlefield1942/bf1942server deleted file mode 100644 index efd27a892..000000000 --- a/Battlefield1942/bf1942server +++ /dev/null @@ -1,185 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Battlefield: 1942 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="+hostServer 1 +dedicated 1" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - - -#### Advanced Variables #### - -# Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Battlefield: 1942" -engine="refractor" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="bf1942-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${systemdir}" -executable="./start.sh" -servercfg="serversettings.con" -servercfgdefault="serversettings.con" -servercfgdir="${systemdir}/mods/bf1942/settings" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver deleted file mode 100644 index 29d4cb903..000000000 --- a/BlackMesa/bmdmserver +++ /dev/null @@ -1,206 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Black Mesa: Deathmatch | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="dm_bounce" -maxplayers="16" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Optional: Game Server Login Token -# GSLT can be used for running a public server. -# More info: https://gameservermanagers.com/gslt -gslt="" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game bms -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## SteamCMD Settings -# Server appid -appid="346680" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## LinuxGSM Server Details -# Do not edit -gamename="Black Mesa: Deathmatch" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="bmdm-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/bms" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directorie -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver deleted file mode 100644 index 96c27899e..000000000 --- a/BladeSymphony/bsserver +++ /dev/null @@ -1,203 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Blade Symphony | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -steamuser="username" -steampass='password' - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="duel_winter" -maxplayers="16" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-autoupdate -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="228780" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Blade Symphony" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="bs-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/berimbau" -executabledir="${filesdir}" -executable="./srcds_run.sh" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server deleted file mode 100644 index 3647d5a32..000000000 --- a/BrainBread2/bb2server +++ /dev/null @@ -1,203 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: BrainBread 2 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="bba_barracks" -maxplayers="20" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Optional: Game Server Login Token -# GSLT can be used for running a public server. -# More info: https://gameservermanagers.com/gslt -gslt="" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game brainbread2 -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="475370" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="BrainBread 2" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="bb2-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/brainbread2" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/CallOfDuty/codserver b/CallOfDuty/codserver deleted file mode 100755 index f4d092300..000000000 --- a/CallOfDuty/codserver +++ /dev/null @@ -1,187 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Call of Duty | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="mp_neuville" -maxclients="20" -port="28960" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### Advanced Variables #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Call of Duty" -engine="idtech3" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="cod-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./cod_lnxded" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/main" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/CallOfDuty2/cod2server b/CallOfDuty2/cod2server deleted file mode 100755 index 9b918fc1b..000000000 --- a/CallOfDuty2/cod2server +++ /dev/null @@ -1,187 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Call of Duty 2 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="mp_leningrad" -maxclients="20" -port="28960" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### Advanced Variables #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Call of Duty 2" -engine="iw2.0" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="cod2-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./cod2_lnxded" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/main" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server deleted file mode 100644 index 50432244f..000000000 --- a/CallOfDuty4/cod4server +++ /dev/null @@ -1,187 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Call of Duty 4 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="mp_crossfire" -maxclients="32" -port="28960" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### Advanced Variables #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Call of Duty 4" -engine="iw3.0" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="cod4-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./cod4x18_dedrun" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/main" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/CallOfDutyUnitedOffensive/coduoserver b/CallOfDutyUnitedOffensive/coduoserver deleted file mode 100755 index 9011ead88..000000000 --- a/CallOfDutyUnitedOffensive/coduoserver +++ /dev/null @@ -1,187 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Call of Duty: United Offensive | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="mp_cassino" -maxclients="20" -port="28960" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### Advanced Variables #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Call of Duty: United Offensive" -engine="idtech3" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="coduo-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./coduo_lnxded" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/uo" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/CallOfDutyWorldAtWar/codwawserver b/CallOfDutyWorldAtWar/codwawserver deleted file mode 100755 index 81bac8ca1..000000000 --- a/CallOfDutyWorldAtWar/codwawserver +++ /dev/null @@ -1,187 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Call of Duty: World at War | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="mp_castle" -maxclients="20" -port="28960" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### Advanced Variables #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Call of Duty: World at War" -engine="iw3.0" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="codwaw-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./codwaw_lnxded" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/main" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver deleted file mode 100644 index 15a57e0af..000000000 --- a/CodenameCURE/ccserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Codename CURE | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="cbe_bunker" -maxplayers="6" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game cure -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="383410" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Codename CURE" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="cc-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/cure" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/CounterStrike/csserver b/CounterStrike/csserver deleted file mode 100644 index ac18e4e20..000000000 --- a/CounterStrike/csserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Counter-Strike | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="de_dust2" -maxplayers="16" -port="27015" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game cstrike -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### Advanced Variables #### - -## SteamCMD Settings -# Server appid -appid="90" -appidmod="cstrike" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Counter-Strike 1.6" -engine="goldsource" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="cs-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/cstrike" -executabledir="${filesdir}" -executable="./hlds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver deleted file mode 100644 index d02caa924..000000000 --- a/CounterStrikeConditionZero/csczserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Counter-Strike: Condition Zero | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="de_dust2" -maxplayers="16" -port="27015" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game czero -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="90" -appidmod="czero" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Counter-Strike: Condition Zero" -engine="goldsource" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="cscz-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/czero" -executabledir="${filesdir}" -executable="./hlds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver deleted file mode 100755 index 75ffa7265..000000000 --- a/CounterStrikeGlobalOffensive/csgoserver +++ /dev/null @@ -1,223 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Counter-Strike: Global Offensive | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -# https://developer.valvesoftware.com/wiki/Counter-Strike:_Global_Offensive_Dedicated_Servers#Starting_the_Server -# [Game Modes] gametype gamemode -# Arms Race 1 0 -# Classic Casual 0 0 -# Classic Competitive 0 1 -# Demolition 1 1 -# Deathmatch 1 2 -gametype="0" -gamemode="0" -defaultmap="de_mirage" -mapgroup="mg_active" -maxplayers="16" -tickrate="64" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Required: Game Server Login Token -# GSLT is required for running a public server. -# More info: https://gameservermanagers.com/gslt -gslt="" - -## Optional: Workshop Parameters -# https://developer.valvesoftware.com/wiki/CSGO_Workshop_For_Server_Operators -# To get an authkey visit - http://steamcommunity.com/dev/apikey -# authkey="" -# ws_collection_id="" -# ws_start_map="" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game csgo -usercon -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers_override ${maxplayers} +mapgroup ${mapgroup} +game_mode ${gamemode} +game_type ${gametype} +host_workshop_collection ${ws_collection_id} +workshop_start_map ${ws_start_map} -authkey ${authkey}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="740" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Counter-Strike: Global Offensive" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="csgo-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/csgo" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver deleted file mode 100644 index 7ccc2a688..000000000 --- a/CounterStrikeSource/cssserver +++ /dev/null @@ -1,206 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Counter-Strike: Source | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="de_dust2" -maxplayers="16" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" -updateonstart="off" - -## Required: Game Server Login Token -# GSLT is required for running a public server. -# More info: https://gameservermanagers.com/gslt -gslt="" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game cstrike -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="232330" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Counter-Strike: Source" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="css-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/cstrike" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver deleted file mode 100644 index 17e6bf90a..000000000 --- a/DayOfDefeat/dodserver +++ /dev/null @@ -1,201 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Day of Defeat | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="dod_Anzio" -maxplayers="16" -port="27015" -clientport="27005" -ip="0.0.0.0" -updateonstart="off" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game dod -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="90" -appidmod="dod" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Day of Defeat" -engine="goldsource" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="dod-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/dod" -executabledir="${filesdir}" -executable="./hlds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver deleted file mode 100644 index 6710ec756..000000000 --- a/DayOfDefeatSource/dodsserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Day of Defeat: Source | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="dod_Anzio" -maxplayers="16" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game dod -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="232290" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Day of Defeat: Source" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="dods-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/dod" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/DayOfInfamy/doiserver b/DayOfInfamy/doiserver deleted file mode 100644 index e26f95010..000000000 --- a/DayOfInfamy/doiserver +++ /dev/null @@ -1,203 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Day of Infamy | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="bastogne" -maxplayers="16" -tickrate="64" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" -workshop="0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game doi -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} +sv_workshop_enabled ${workshop}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="462310" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Day of Infamy" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="doi-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/doi" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" - -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver deleted file mode 100644 index 9308ced64..000000000 --- a/DeathmatchClassic/dmcserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Deathmatch Classic | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="dcdm5" -maxplayers="16" -port="27015" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game dmc -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="90" -appidmod="dmc" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Deathmatch Classic" -engine="goldsource" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="dmc-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/dmc" -executabledir="${filesdir}" -executable="./hlds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver deleted file mode 100644 index d84b8084a..000000000 --- a/DontStarveTogether/dstserver +++ /dev/null @@ -1,207 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Dont Starve Together | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Installation Variables | https://github.com/GameServerManagers/LinuxGSM/wiki/Don't-Starve-Together -sharding="false" -master="true" -shard="Master" -cluster="Cluster_1" -cave="false" - -# Edit with care -persistentstorageroot="${HOME}/.klei" -confdir="DoNotStarveTogether" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-persistent_storage_root ${persistentstorageroot} -conf_dir ${confdir} -cluster ${cluster} -shard ${shard}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="343050" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Don't Starve Together" -engine="dontstarve" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="dst-server-${shard}" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}/bin" -executable="./dontstarve_dedicated_server_nullrenderer" -clustercfg="cluster.ini" -clustercfgdir="${persistentstorageroot}/${confdir}/${cluster}" -clustercfgfullpath="${clustercfgdir}/${clustercfg}" -clustercfgdefault="cluster.ini" -servercfg="server.ini" -servercfgdir="${clustercfgdir}/${shard}" -servercfgfullpath="${servercfgdir}/${servercfg}" -servercfgdefault="server.ini" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver deleted file mode 100644 index ab0f3c770..000000000 --- a/DoubleActionBoogaloo/dabserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Double Action: Boogaloo | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="da_rooftops" -maxplayers="10" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="317800" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Double Action: Boogaloo" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="dab-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/dab" -executabledir="${filesdir}" -executable="./dabds.sh" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/EmpiresMod/emserver b/EmpiresMod/emserver deleted file mode 100644 index a9b9def1c..000000000 --- a/EmpiresMod/emserver +++ /dev/null @@ -1,205 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Empires Mod | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="emp_district" -maxplayers="62" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Optional: Game Server Login Token -# GSLT can be used for running a public server. -# More info: https://gameservermanagers.com/gslt -gslt="" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game empires -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="460040" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Empires Mod" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="em-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/empires" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/Factorio/fctrserver b/Factorio/fctrserver deleted file mode 100644 index 54e76a5f2..000000000 --- a/Factorio/fctrserver +++ /dev/null @@ -1,190 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Factorio | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -port="34197" -rconport="34198" -rconpassword="CHANGE_ME" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="--start-server ${filesdir}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Factorio" -engine="factorio" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="fctr-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}/bin/x64" -executable="./factorio" -servercfg="${servicename}.json" -servercfgdefault="server-settings.json" -servercfgdir="${filesdir}/data" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver deleted file mode 100644 index aaf73016c..000000000 --- a/FistfulOfFrags/fofserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Fistful Of Frags | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="fof_depot" -maxplayers="16" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game fof -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="295230" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Fistful of Frags" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="fof-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/fof" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver deleted file mode 100644 index d9b06c24a..000000000 --- a/GarrysMod/gmodserver +++ /dev/null @@ -1,216 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Garry's Mod | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="gm_construct" -gamemode="sandbox" -maxplayers="16" -port="27015" -sourcetvport="27020" -clientport="27005" -tickrate="66" -ip="0.0.0.0" - -## Workshop Parameters | http://wiki.garrysmod.com/page/Workshop_for_Dedicated_Servers -workshopauth="" -workshopcollectionid="" - -## 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. -# More info: https://gameservermanagers.com/gslt -gslt="" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -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}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="4020" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Garry's Mod" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="gmod-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/garrysmod" -addonsdir="${systemdir}/addons" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver deleted file mode 100644 index 9182365d6..000000000 --- a/GoldenEyeSource/gesserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: GoldenEye: Source | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="ge_archives" -maxplayers="16" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game gesource -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="310" # Source 2007 SDK -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="GoldenEye: Source" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ges-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/gesource" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver deleted file mode 100644 index a32f50903..000000000 --- a/HalfLife2Deathmatch/hl2dmserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Half Life 2: Deathmatch | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="dm_lockdown" -maxplayers="16" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game hl2mp -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="232370" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Half Life 2: Deathmatch" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="hl2dm-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/hl2mp" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver deleted file mode 100644 index 701678eb9..000000000 --- a/HalfLifeDeathmatch/hldmserver +++ /dev/null @@ -1,199 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Half Life: Deathmatch | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="crossfire" -maxplayers="16" -port="27015" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game valve -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="90" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Half Life: Deathmatch" -engine="goldsource" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="hldm-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/valve" -executabledir="${filesdir}" -executable="./hlds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver deleted file mode 100644 index aa5a19990..000000000 --- a/HalfLifeDeathmatchSource/hldmsserver +++ /dev/null @@ -1,203 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Half-Life Deathmatch: Source | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="crossfire" -maxplayers="16" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game hl1mp -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="255470" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Half-Life Deathmatch: Source" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="hldms-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/hl1mp" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver deleted file mode 100644 index 445551956..000000000 --- a/Hurtworld/hwserver +++ /dev/null @@ -1,214 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Hurtworld | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -servername="Hurtworld LinuxGSM Server" -ip="0.0.0.0" -port="12871" -queryport="12881" -maxplayers="20" -map="" #Optional -creativemode="0" #Free Build: creativemode="1" -logfile="gamelog.txt" - -## Adding admins using STEAMID64 -# Example : addadmin 012345678901234567; addadmin 987654321098765432 -admins="" - -## Advanced Server Start Settings -# Rollback server state (remove after start command) -loadsave="" -# Use unstable 64 bit server executable (O/1) -x64mode="0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | 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}\" " -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="405100" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Hurtworld" -engine="unity3d" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="hurtworld-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname=$(basename $(readlink -f "${BASH_SOURCE[0]}")) -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -if [ "${x64mode}" == "1" ]; then - executable="./Hurtworld.x86_64" -else - executable="./Hurtworld.x86" -fi - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/Insurgency/insserver b/Insurgency/insserver deleted file mode 100644 index 6bf8c6787..000000000 --- a/Insurgency/insserver +++ /dev/null @@ -1,205 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Insurgency | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="ministry" -maxplayers="16" -tickrate="64" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" -workshop="0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game insurgency -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} +sv_workshop_enabled ${workshop} -norestart" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="237410" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Insurgency" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ins-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/insurgency" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/JustCause2/jc2server b/JustCause2/jc2server deleted file mode 100644 index f6491db66..000000000 --- a/JustCause2/jc2server +++ /dev/null @@ -1,190 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Just Cause 2 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="261140" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Just Cause 2" -engine="avalanche" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="jc2-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./Jcmp-Server" -servercfg="config.lua" -servercfgdefault="config.lua" -servercfgdir="${filesdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -#gamelogdir="" # No server logs available -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver deleted file mode 100644 index cd3d4c8d8..000000000 --- a/KillingFloor/kfserver +++ /dev/null @@ -1,207 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Killing Floor | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -steamuser="username" -steampass='password' - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="KF-BioticsLab.rom" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="server ${defaultmap}?game=KFmod.KFGameType?VACSecured=true -nohomedir ini=${servercfg} log=${gamelog}" - -# Server Start Command for Objective mode -#defaultmap="KFO-Steamland" -#parms="server ${defaultmap}?Game=KFStoryGame.KFStoryGame?VACSecured=true -nohomedir ini=${servercfg} log=${gamelog}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="215360" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Killing Floor" -engine="unreal2" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="kf-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/System" -executabledir="${systemdir}" -executable="./ucc-bin" -servercfg="${servicename}.ini" -servercfgdefault="Default.ini" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" -compressedmapsdir="${rootdir}/Maps-Compressed" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" -gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver deleted file mode 100644 index fae715724..000000000 --- a/Left4Dead/l4dserver +++ /dev/null @@ -1,199 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Left 4 Dead | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="l4d_hospital01_apartment" -maxplayers="8" -port="27015" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game left4dead -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="222840" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Left 4 Dead" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="l4d-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/left4dead" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server deleted file mode 100644 index 8b9761476..000000000 --- a/Left4Dead2/l4d2server +++ /dev/null @@ -1,199 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Left 4 Dead 2 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="c5m1_waterfront" -maxplayers="8" -port="27015" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game left4dead2 -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="222860" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Left 4 Dead 2" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="l4d2-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/left4dead2" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/Minecraft/mcserver b/Minecraft/mcserver deleted file mode 100644 index 5e703eec3..000000000 --- a/Minecraft/mcserver +++ /dev/null @@ -1,184 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Minecraft | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -javaram="1024" # -Xmx$1024M - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="nogui" -} -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Minecraft" -engine="lwjgl2" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="mc-server" - -#### Directories #### -# Edit with care - -## Work Directories -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" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="java -Xmx${javaram}M -jar ${filesdir}/minecraft_server.jar" -servercfg="server.properties" -servercfgdefault="server.properties" -servercfgdir="${filesdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver deleted file mode 100644 index d82e00754..000000000 --- a/MultiTheftAuto/mtaserver +++ /dev/null @@ -1,183 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Multi Theft Auto | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -# None Available - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care -fn_parms(){ -parms=" " -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -# Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="linuxgsm" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Multi Theft Auto" -engine="renderware" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="mta-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -resourcesdir="${systemdir}/mods/deathmatch/resources" -executabledir="${systemdir}" -executable="./mta-server64" -servercfg="mtaserver.conf" -servercfgdir="${systemdir}/mods/deathmatch" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/mods/deathmatch/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver deleted file mode 100644 index 369a26206..000000000 --- a/Mumble/mumbleserver +++ /dev/null @@ -1,184 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Mumble | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### -# Use .ini config file for Mumble (Murmur) server. - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-fg -ini ${servercfgfullpath}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Mumble" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="mumble-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./murmur.x86" -servercfg="${servicename}.ini" -servercfgdefault="murmur.ini" -servercfgdir="${filesdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${rootdir}/log" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver deleted file mode 100644 index c5abeb46f..000000000 --- a/NS2Combat/ns2cserver +++ /dev/null @@ -1,210 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: NS2: Combat | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -steamuser="username" -steampass='password' - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="co_core" -port="27015" -maxplayers="24" -ip="0.0.0.0" -servername="NS2C Server" -webadminuser="admin" -webadminpass="admin" -webadminport="8080" -mods="" -password="" -# Add the following line to the parms if you want a private server. Ensuring -# that the password variable above is not left empty. -# -password \"${password}\" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -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}\"" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="313900" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="NS2: Combat" -engine="spark" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ns2c-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}/ia32" -executable="./ns2combatserver_linux32" -servercfgdir="${rootdir}/server1" -servercfgfullpath="${servercfgdir}" -modstoragedir="${servercfgdir}/Workshop" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server deleted file mode 100644 index af5e65d24..000000000 --- a/NaturalSelection2/ns2server +++ /dev/null @@ -1,210 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Natural Selection 2 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -steamuser="username" -steampass='password' - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="ns2_summit" -port="27015" -maxplayers="24" -ip="0.0.0.0" -servername="NS2 Server" -webadminuser="admin" -webadminpass="admin" -webadminport="8080" -mods="" -password="" -# Add the following line to the parms if you want a private server. Ensuring -# that the password variable above is not left empty. -# -password \"${password}\" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-name \"${servername}\" -port ${port} -webadmin -webdomain ${ip} -webuser ${webadminuser} -webpassword \"${webadminpass}\" -webport ${webadminport} -map ${defaultmap} -limit ${maxplayers} -config_path \"${servercfgdir}\" -logdir \"${gamelogdir}\" -modstorage \"${modstoragedir}\" -mods \"${mods}\"" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="4940" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Natural Selection 2" -engine="spark" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ns2-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./server_linux32" -servercfgdir="${rootdir}/server1" -servercfgfullpath="${servercfgdir}" -modstoragedir="${servercfgdir}/Workshop" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver deleted file mode 100644 index 7aac993bc..000000000 --- a/NoMoreRoomInHell/nmrihserver +++ /dev/null @@ -1,205 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: No More Room in Hell | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="nmo_broadway" -maxplayers="8" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Optional: Game Server Login Token -# GSLT can be used for running a public server. -# More info: https://gameservermanagers.com/gslt -gslt="" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game nmrih -insecure -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="317670" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="No More Room in Hell" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="nmrih-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/nmrih" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver deleted file mode 100644 index 915a6944a..000000000 --- a/OpposingForce/opforserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Half-Life: Opposing Force | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="op4_bootcamp" -maxplayers="16" -port="27015" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game gearbox -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" -} - -### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="90" -appidmod="gearbox" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Half-Life: Opposing Force" -engine="goldsource" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="opfor-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/gearbox" -executabledir="${filesdir}" -executable="./hlds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver deleted file mode 100644 index 5ab0e2396..000000000 --- a/PiratesVikingandKnightsII/pvkiiserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: No More Room in Hell | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="bt_island" -maxplayers="24" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game pvkii -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="17575" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Pirates, Vikings, and Knights II" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="pvkii-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/pvkii" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/ProjectCars/pcserver b/ProjectCars/pcserver deleted file mode 100755 index 64b6bd5e8..000000000 --- a/ProjectCars/pcserver +++ /dev/null @@ -1,193 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Project Cars | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -# Notification Alerts -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="--config ${servercfg}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="332670" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Project Cars" -engine="madness" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="pc-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./DedicatedServerCmd" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver deleted file mode 100644 index 191505d57..000000000 --- a/ProjectZomboid/pzserver +++ /dev/null @@ -1,195 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Project Zomboid | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -adminpassword="CHANGE_ME" -ip="0.0.0.0" - -fn_parms(){ -parms="-ip ${ip} -adminpassword \"${adminpassword}\" -servername ${servicename}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="380870" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Project Zomboid" -engine="projectzomboid" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="pz-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./start-server.sh" -servercfg="${servicename}.ini" -servercfgdefault="server.ini" -servercfgdir="${HOME}/Zomboid/Server" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${HOME}/Zomboid/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/Quake2/q2server b/Quake2/q2server deleted file mode 100644 index 601fff1cc..000000000 --- a/Quake2/q2server +++ /dev/null @@ -1,185 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Quake 2 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="q2dm1" -ip="0.0.0.0" -port="27910" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="+set dedicated 1 +set ip ${ip} +set port ${port} +exec ${servercfg} +set deathmatch 1 +map ${defaultmap}" -} -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Quake 2" -engine="idtech2" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="quake2server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/baseq2" -executabledir="${filesdir}" -executable="./quake2" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/Quake3/q3server b/Quake3/q3server deleted file mode 100644 index 9a0dced71..000000000 --- a/Quake3/q3server +++ /dev/null @@ -1,186 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Quake 3: Arena | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="q3dm17" -ip="0.0.0.0" -port="27960" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set com_hunkMegs 32 +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Quake 3: Arena" -engine="idtech3" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="quake3-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/baseq3" -executabledir="${filesdir}" -executable="./q3ded" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver deleted file mode 100755 index 1fdaec287..000000000 --- a/QuakeLive/qlserver +++ /dev/null @@ -1,198 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Quake Live | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -arch="x64" # x64 or x86 - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | Install/Config Guide : https://steamcommunity.com/sharedfiles/filedetails/?id=542966946 -# Console Commands : http://www.regurge.at/ql/ -fn_parms(){ -parms="+exec ${servercfg}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="349090" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Quake Live" -engine="idtech3_ql" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ql-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable=$([ "${arch}" == 'x64' ] && echo "./run_server_x64.sh" || echo "./run_server_x86.sh") -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${filesdir}/baseq3" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/QuakeWorld/qwserver b/QuakeWorld/qwserver deleted file mode 100644 index 5d0cb3b8a..000000000 --- a/QuakeWorld/qwserver +++ /dev/null @@ -1,185 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Quake World (nQuake) | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -port="27500" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-port ${port} -game ktx +exec ${servercfg}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="QuakeWorld" -engine="quake" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="quakeworld_server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/ktx" -executabledir="${filesdir}" -executable="./mvdsv" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver deleted file mode 100644 index ea82680d5..000000000 --- a/RedOrchestra/roserver +++ /dev/null @@ -1,207 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Red Orchestra: Ostfront 41-45 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -steamuser="username" -steampass='password' - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="RO-Arad.rom" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="server ${defaultmap}?game=ROGame.ROTeamGame?VACSecured=true -nohomedir ini=${servercfg} log=${gamelog}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="223250" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Red Orchestra: Ostfront 41-45" -engine="unreal2" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ro-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" - -## Server Specific Directories -filesdir="${rootdir}/serverfiles" -systemdir="${filesdir}/system" -executabledir="${systemdir}" -executable="./ucc-bin" -servercfg="${servicename}.ini" -servercfgdefault="default.ini" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" -compressedmapsdir="${rootdir}/Maps-Compressed" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - - -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" -gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver deleted file mode 100644 index 641fc84e1..000000000 --- a/Ricochet/ricochetserver +++ /dev/null @@ -1,219 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Ricochet | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="rc_arena" -maxplayers="16" -port="27015" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game ricochet -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" -} - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -ip="0.0.0.0" - -## Optional: Game Server Login Token -# GSLT can be used for running a public server. -# More info: https://gameservermanagers.com/gslt -gslt="" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="90" -appidmod="ricochet" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Ricochet" -engine="goldsource" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ricochet-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/ricochet" -executabledir="${filesdir}" -executable="./hlds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/Rust/rustserver b/Rust/rustserver deleted file mode 100644 index 6ac1ac5f9..000000000 --- a/Rust/rustserver +++ /dev/null @@ -1,218 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Rust | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -# More settings available after install in serverfiles/server/rust-server/server.cfg -servername="Rust" -ip="0.0.0.0" -port="28015" -rconport="28016" -rconpassword="CHANGE_ME" -rconweb="1" # Value is: 1 for Facepunch's web panel; 0 for RCON tools like Rusty or Rustadmin -maxplayers="50" -# Advanced Start Settings -seed="" # default random; range : 1 to 2147483647 ; used to change or reproduce a procedural map -worldsize="3000" # default 3000; range : 1000 to 6000 ; map size in meters -saveinterval="300" # Auto-save in seconds -tickrate="30" # default 30; range : 15 to 100 - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-batchmode +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${servicename}\" ${conditionalseed} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile \"${gamelogdate}\"" -} - -# Specific to Rust -if [ -n "${seed}" ]; then - # If set, then add to start parms - conditionalseed="+server.seed ${seed}" -else - # Keep randomness of the number if not set - conditionalseed="" -fi - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="258550" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Rust" -engine="unity3d" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="rust-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname=$(basename $(readlink -f "${BASH_SOURCE[0]}")) -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./RustDedicated" -serveridentitydir="${systemdir}/server/${servicename}" -servercfg="server.cfg" -servercfgdefault="server.cfg" -servercfgdir="${serveridentitydir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" -gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver deleted file mode 100644 index a6b4d53f0..000000000 --- a/SeriousSam3BFE/ss3sserver +++ /dev/null @@ -1,198 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Sam 3: BFE | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master/SeriousSam3BFE/help/DedicatedServer_Readme.txt -fn_parms(){ -parms="+ip ${ip} +logfile ${gamelog} +exec ${servercfgfullpath}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="41080" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Serious Sam 3: BFE" -engine="seriousengine35" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ss3-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/Bin" -executable="./runSam3_DedicatedServer.sh" -executabledir="${systemdir}" -servercfg="${servicename}.ini" -servercfgdefault="server.ini" -servercfgdir="${filesdir}/Content/SeriousSam3/Config" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" -gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/Starbound/sbserver b/Starbound/sbserver deleted file mode 100644 index cd7f8c40a..000000000 --- a/Starbound/sbserver +++ /dev/null @@ -1,199 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Starbound | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -steamuser="username" -steampass='password' - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="211820" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Starbound" -engine="starbound" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="sb-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}/linux" -executable="./starbound_server" -servercfg="starbound_server.config" -servercfgdefault="starbound_server.config" -servercfgdir="${filesdir}/storage" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/storage" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/SvenCoop/svenserver b/SvenCoop/svenserver deleted file mode 100644 index 0f6fb9829..000000000 --- a/SvenCoop/svenserver +++ /dev/null @@ -1,199 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Sven Co-op | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="svencoop1" -maxplayers="16" -port="27015" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game svencoop -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="276060" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Sven Co-op" -engine="goldsource" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="svencoop-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/svencoop" -executabledir="${filesdir}" -executable="./svends_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server deleted file mode 100644 index 25d262dd3..000000000 --- a/TeamFortress2/tf2server +++ /dev/null @@ -1,203 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Team Fortress 2 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="cp_badlands" -maxplayers="16" -port="27015" -sourcetvport="27020" -clientport="27005" -ip="0.0.0.0" - -## Optional: Game Server Login Token -# GSLT can be used for running a public server. -# More info: https://gameservermanagers.com/gslt -gslt="" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game tf -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" -} - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="232250" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Team Fortress 2" -engine="source" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="tf2-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/tf" -executabledir="${filesdir}" -executable="./srcds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/cfg" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver deleted file mode 100644 index 834472249..000000000 --- a/TeamFortressClassic/tfcserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Team Fortress Classic | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="dustbowl" -maxplayers="16" -port="27015" -clientport="27005" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-game tfc -strictportbind _ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="90" -appidmod="tfc" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Team Fortress Classic" -engine="goldsource" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="tfc-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/tfc" -executabledir="${filesdir}" -executable="./hlds_run" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/Teeworlds/twserver b/Teeworlds/twserver deleted file mode 100644 index 0325f3889..000000000 --- a/Teeworlds/twserver +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Teeworlds | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -steamuser="username" -steampass='password' - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-f ${servercfgfullpath}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="380840" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Teeworlds" -engine="teeworlds" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="tw-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/tw" -executabledir="${systemdir}" -executable="./teeworlds_srv" -servercfg="${servicename}.cfg" # Teeworlds can also auto load any config if an autoexec.cfg file is present in the server dir -servercfgdefault="server.cfg" -servercfgdir="${filesdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver deleted file mode 100644 index f0a893134..000000000 --- a/Terraria/terrariaserver +++ /dev/null @@ -1,199 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Terraria | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -steamuser="username" -steampass='password' - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-config ${servercfgfullpath}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="105600" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Terraria" -engine="terraria" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="terraria-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./TerrariaServer" -servercfg="${servicename}.txt" -servercfgdefault="serverconfig.txt" -servercfgdir="${filesdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -#gamelogdir="" # Terraria Doesn't Have a Server Log -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh diff --git a/TowerUnite/tuserver b/TowerUnite/tuserver deleted file mode 100644 index eb356d6fd..000000000 --- a/TowerUnite/tuserver +++ /dev/null @@ -1,197 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Tower Unite | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -port="7777" -queryport="27015" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="-log -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -TowerServerINI=${servicename}.ini" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## SteamCMD Settings -# Server appid -appid="439660" -# Steam App Branch Select -# Allows to opt into the various Steam app branches. Default branch is "". -# Example: "-beta latest_experimental" -branch="" - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Tower Unite" -engine="unreal4" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="tu-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/Tower" -executabledir="${systemdir}/Binaries/Linux" -executable="./TowerServer-Linux-Shipping" -servercfgdir="${systemdir}/Binaries/Linux" -servercfg="${servicename}.ini" -servercfgfullpath="${servercfgdir}/${servercfg}" -servercfgdefault="TowerServer.ini" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${systemdir}/Saved/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/UnrealTournament/utserver b/UnrealTournament/utserver deleted file mode 100644 index 055f689bc..000000000 --- a/UnrealTournament/utserver +++ /dev/null @@ -1,188 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Unreal Tournament | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -# For CTF: defaultmap="CTF-Face" gametype="CTF" -defaultmap="DM-Underland" -gametype="DM" -timelimit="10" -ip="0.0.0.0" -port="7777" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="UnrealTournament ${defaultmap}?Game=${gametype}?TimeLimit=${timelimit} -port=${port}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Unreal Tournament" -engine="unreal4" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ut-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/LinuxServer" -executabledir="${systemdir}/Engine/Binaries/Linux" -executable="./UE4Server-Linux-Shipping" -servercfg="Game.ini" -servercfgdir="${systemdir}/UnrealTournament/Saved/Config/LinuxServer" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server deleted file mode 100644 index 760efbf53..000000000 --- a/UnrealTournament2004/ut2k4server +++ /dev/null @@ -1,188 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Unreal Tournament 2004 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="DM-Rankin" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="server ${defaultmap}?game=XGame.xDeathMatch -nohomedir ini=${servercfg} log=${gamelog}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Unreal Tournament 2004" -engine="unreal2" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ut2k4-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/System" -executabledir="${systemdir}" -executable="./ucc-bin" -servercfg="${servicename}.ini" -servercfgdefault="UT2004.ini" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" -compressedmapsdir="${rootdir}/Maps-Compressed" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" -gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/UnrealTournament3/ut3server b/UnrealTournament3/ut3server deleted file mode 100644 index 369b7e643..000000000 --- a/UnrealTournament3/ut3server +++ /dev/null @@ -1,199 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Unreal Tournament 3 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -ip="0.0.0.0" -port="7777" -queryport="25300" -defaultmap="VCTF-Suspense" -game="UTGameContent.UTVehicleCTFGame_Content" -mutators="" #"UTGame.UTMutator_Instagib,UTGame.UTMutator_LowGrav" -isdedicated="true" -islanmatch="false" -usesstats="false" -shouldadvertise="true" -pureserver="1" -allowjoininprogress="true" -maxplayers="32" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -# Edit with care | List of game types and mutators : http://wiki.unrealadmin.org/FAQ:UT3 -fn_parms(){ -parms="server ${defaultmap}?Game=${game}?bIsDedicated=${isdedicated}?bIsLanMatch=${islanmatch}?bUsesStats=${usesstats}?bShouldAdvertise=${shouldadvertise}?PureServer=${pureserver}?bAllowJoinInProgress=${allowjoininprogress}?MaxPlayers=${maxplayers}?Mutator=${mutators} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Unreal Tournament 3" -engine="unreal3" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ut3-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${systemdir}/Binaries" -executable="./ut3" -servercfg="${servicename}.ini" -servercfgdefault="UTGame.ini" -servercfgdir="${systemdir}/UTGame/Config" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" -gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server deleted file mode 100644 index e1fa68fb3..000000000 --- a/UnrealTournament99/ut99server +++ /dev/null @@ -1,186 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Unreal Tournament 99 | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="DM-Deck16][" -ip="0.0.0.0" - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ -parms="server ${defaultmap}.unr ini=${servercfgfullpath}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Unreal Tournament 99" -engine="unreal" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ut99-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}/System" -executabledir="${systemdir}" -executable="./ucc-bin" -servercfg="${servicename}.ini" -servercfgdefault="Default.ini" -servercfgdir="${systemdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" -compressedmapsdir="${rootdir}/Maps-Compressed" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/WolfensteinEnemyTerritory/wetserver b/WolfensteinEnemyTerritory/wetserver deleted file mode 100644 index 22ef30bd0..000000000 --- a/WolfensteinEnemyTerritory/wetserver +++ /dev/null @@ -1,184 +0,0 @@ -#!/bin/bash -# Project: Game Server Managers - LinuxGSM -# Author: Daniel Gibbs -# License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Enemy Territory | Server Management Script -# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors -# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki -# Website: https://gameservermanagers.com - -# Debugging -if [ -f ".dev-debug" ]; then - exec 5>dev-debug.log - BASH_XTRACEFD="5" - set -x -fi - -version="170305" - -########################## -######## Settings ######## -########################## - -#### Server Settings #### - -## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters -fn_parms(){ - parms="+set net_strict 1 +set fs_homepath ${filesdir} +exec ${servercfg}" -} - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - -## LinuxGSM Server Details -# Do not edit -gamename="Wolfenstein: Enemy Territory" -engine="idtech3" - -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="et-server" - -#### Directories #### -# Edit with care - -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${systemdir}" -executable="./etded" -servercfg="${servicename}.cfg" -servercfgdefault="server.cfg" -servercfgdir="${systemdir}/etmain" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" -consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh \ No newline at end of file diff --git a/TeamSpeak3/ts3server b/lgsminstall similarity index 56% rename from TeamSpeak3/ts3server rename to lgsminstall index f5a39f220..773aa60af 100644 --- a/TeamSpeak3/ts3server +++ b/lgsminstall @@ -2,7 +2,7 @@ # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs # License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: TeamSpeak 3 | Server Management Script +# Purpose: Counter-Strike: Global Offensive | Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki # Website: https://gameservermanagers.com @@ -15,90 +15,62 @@ if [ -f ".dev-debug" ]; then fi version="170305" - -########################## -######## Settings ######## -########################## - -## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -# Edit serverfiles/ts3-server.ini after installation - -#### LinuxGSM Settings #### - -## Notification Alerts -# (on|off) -# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email -emailalert="off" -email="email@example.com" -emailfrom="" - -# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet -pushbulletalert="off" -pushbullettoken="accesstoken" -channeltag="" - -## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update -updateonstart="off" - -## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup -maxbackups="4" -maxbackupdays="30" -stoponbackup="on" - -## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging -consolelogging="on" -logdays="7" - -#### LinuxGSM Advanced Settings #### +sname="core" +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +servicename="${selfname}" ## Github Branch Select # Allows for the use of different function files # from a different repo and/or branch. githubuser="GameServerManagers" githubrepo="LinuxGSM" -githubbranch="master" +githubbranch="config" -## LinuxGSM Server Details -# Do not edit -gamename="TeamSpeak 3" -servername="TeamSpeak 3 Server" +source lgsm/config/_default.cfg +source lgsm/config/common.cfg +source lgsm/config/${servicename.cfg + +# LinuxGSM installer +if [ "${sname}" == "core" ]; then + userinput=$1 + if [ -z "${userinput}" ]; then + userinput="empty" + fi + serverslist=$(grep "${userinput}" lgsm/data/serverlist.csv|awk -F "," '{print $2}') + echo "USERINPUT: $userinput" + echo "SERVERLIST: $serverslist" + if [ "${userinput}" == "${serverslist}" ]; then + echo "installing" + sname=$(grep $userinput lgsm/data/serverlist.csv|awk -F "," '{print $1}') + servername=$(grep $userinput lgsm/data/serverlist.csv|awk -F "," '{print $2}') + if [ -e "${servername}" ]; then + i=2 + while [ -e "$servername-$i" ] ; do + let i++ + done + servername="${servername}-$i" + fi + cp "${selfname}" "${servername}" + sed -i -e "s/sname=\"core\"/sname=\"${sname}\"/g" "${servername}" + exit + elif [ "$userinput" == "list" ]; then + { + awk -F "," '{print $2 "\t" $3}' "lgsm/data/serverlist.csv" + } | column -s $'\t' -t + exit + else + echo "Usage: ./${selfname} list" + echo "For a complete list of available servers" + echo "" + echo "Usage: ./${selfname} [servername]" + echo "To install a server" + exit + fi +fi -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="ts3-server" -#### Directories #### -# Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - -## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="./ts3server_startscript.sh" -servercfg="${servicename}.ini" -servercfgdefault="ts3server.ini" -servercfgdir="${filesdir}" -servercfgfullpath="${servercfgdir}/${servercfg}" - -## Backup Directory -backupdir="${rootdir}/backups" - -## Logging Directories -gamelogdir="${filesdir}/logs" -scriptlogdir="${rootdir}/log/script" -scriptlog="${scriptlogdir}/${servicename}-script.log" -emaillog="${scriptlogdir}/${servicename}-email.log" - -## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" ######################## ######## Script ######## @@ -173,5 +145,8 @@ fi core_dl.sh core_functions.sh + + + getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From fb21909b0563bd0f33b2bd99bfd204415f78a7f3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 8 Apr 2017 23:14:10 +0100 Subject: [PATCH 0622/1895] Adding the new files for testing --- lgsm/config/common-template.cfg | 5 ++ lgsm/config/csgoserver/_default.cfg | 119 ++++++++++++++++++++++++++++ lgsm/config/instance-template.cfg | 5 ++ lgsm/data/serverlist.csv | 68 ++++++++++++++++ lgsm/functions/fn_functions | 20 ----- lgsm/functions/fn_getopt | 15 ---- lgsm/functions/fn_update_functions | 21 ----- lgsminstall => lgsminstall.sh | 0 8 files changed, 197 insertions(+), 56 deletions(-) create mode 100644 lgsm/config/common-template.cfg create mode 100644 lgsm/config/csgoserver/_default.cfg create mode 100644 lgsm/config/instance-template.cfg create mode 100644 lgsm/data/serverlist.csv delete mode 100644 lgsm/functions/fn_functions delete mode 100644 lgsm/functions/fn_getopt delete mode 100644 lgsm/functions/fn_update_functions rename lgsminstall => lgsminstall.sh (100%) diff --git a/lgsm/config/common-template.cfg b/lgsm/config/common-template.cfg new file mode 100644 index 000000000..ddb1ef233 --- /dev/null +++ b/lgsm/config/common-template.cfg @@ -0,0 +1,5 @@ +################################## +######## Common Settings ######### +################################## +# PLACE GLOBAL SETTINGS HERE +## These settings will apply to all instances diff --git a/lgsm/config/csgoserver/_default.cfg b/lgsm/config/csgoserver/_default.cfg new file mode 100644 index 000000000..74c1f69e8 --- /dev/null +++ b/lgsm/config/csgoserver/_default.cfg @@ -0,0 +1,119 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +# https://developer.valvesoftware.com/wiki/Counter-Strike:_Global_Offensive_Dedicated_Servers#Starting_the_Server +# [Game Modes] gametype gamemode +# Arms Race 1 0 +# Classic Casual 0 0 +# Classic Competitive 0 1 +# Demolition 1 1 +# Deathmatch 1 2 +gametype="0" +gamemode="0" +defaultmap="de_mirage" +mapgroup="mg_active" +maxplayers="16" +tickrate="64" +port="27015" +sourcetvport="27016" +clientport="27017" +ip="0.0.0.0" + +## Required: Game Server Login Token +# GSLT is required for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Optional: Workshop Parameters +# https://developer.valvesoftware.com/wiki/CSGO_Workshop_For_Server_Operators +# To get an authkey visit - http://steamcommunity.com/dev/apikey +authkey="" +ws_collection_id="" +ws_start_map="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game csgo -usercon -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers_override ${maxplayers} +mapgroup ${mapgroup} +game_mode ${gamemode} +game_type ${gametype} +host_workshop_collection ${ws_collection_id} +workshop_start_map ${ws_start_map} -authkey ${authkey}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="740" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Counter-Strike: Global Offensive" +engine="source" + +#### Directories #### +# Edit with care + +## Work Directories + +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}/csgo" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${systemdir}/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config/instance-template.cfg b/lgsm/config/instance-template.cfg new file mode 100644 index 000000000..69646e3a7 --- /dev/null +++ b/lgsm/config/instance-template.cfg @@ -0,0 +1,5 @@ +################################## +######## Instance Settings ######## +################################## +# PLACE INSTANCE SETTINGS HERE +## These settings will apply to a specific instance \ No newline at end of file diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv new file mode 100644 index 000000000..d9a27de49 --- /dev/null +++ b/lgsm/data/serverlist.csv @@ -0,0 +1,68 @@ +arma3,arma3server,ARMA 3 +sdtd,sdtdserver,7 Days to Die +ark,arkserver,ARK: Survival Evolved +bo,boserver,Ballistic Overkill +bf1942,bf1942server,Battlefield 1942 +bmdm,bmdmserver,Black Mesa: Deathmatch +bs,bsserver,Blade Symphony +bb2,bb2server,BrainBread 2 +cod,codserver,Call of Duty +cod2,cod2server,Call of Duty 2 +cod4,cod4server,Call of Duty 4 +coduo,coduoserver,Call of Duty: United Offensive +codwaw,codwawserver,Call of Duty: World at War +cc,ccserver,Codename CURE +cs,csserver,Counter-Strike 1.6 +cscz,csczserver,Counter-Strike: Condition Zero +csgo,csgoserver,Counter-Strike: Global Offensive +css,cssserver,Counter-Strike: Source +dod,dodserver,Day of Defeat +dods,dodsserver,Day of Defeat: Source +doi,doiserver,Day of Infamy +dmc,dmcserver,Deathmatch Classic +dst,dstserver,Don't Starve Together +dab,dabserver,Double Action: Boogaloo +em,emserver,Empires Mod +fctr,fctrserver,Factorio +fof,fofserver,Fistful of Frags +gmod,gmodserver,Garrys Mod +ges,gesserver,GoldenEye: Source +hl2dm,hl2dmserver,Half-Life 2: Deathmatch +hldms,hldmsserver,Half-Life Deathmatch: Source +hldm,hldmserver,Half-Life: Deathmatch +hw,hwserver,Hurtworld +ins,insserver,Insurgency +jc2,jc2server,Just Cause 2 +kf,kfserver,Killing Floor +l4d,l4dserver,Left 4 Dead +l4d2,l4d2server,Left 4 Dead 2 +mc,mcserver,Minecraft +mta,mtaserver,Multi Theft Auto +mumble,mumbleserver,Mumble +ns2,ns2server,Natural Selection 2 +nmrih,nmrihserver,No More Room in Hell +ns2c,ns2cserver,NS2: Combat +opfor,opforserver,Opposing Force +pvkii,pvkiiserver,"Pirates, Vikings, & Knights II" +pc,pcserver,Project Cars +pz,pzserver,Project Zomboid +q2,q2server,Quake 2 +q3,q3server,Quake 3: Arena +ql,qlserver,Quake Live +qw,qwserver,Quake World +ro,roserver,Red Orchestra: Ostfront 41-45 +ricochet,ricochetserver,Ricochet +rust,rustserver,Rust +ss3,ss3server,Serious Sam 3: BFE +sb,sbserver,Starbound +sven,svenserver,Sven Co-op +tf2,tf2server,Team Fortress 2 +tfc,tfcserver,Team Fortress Classic +ts3,ts3server,Teamspeak 3 +tw,twserver,Teeworlds +terraria,terrariaserver,Terraria +tu,tuserver,Tower Unite +ut2k4,ut2k4server,Unreal Tournament 2004 +ut3,ut3server,Unreal Tournament 3 +ut99,ut99server,Unreal Tournament 99 +wet,wetserver,Wolfenstein: Enemy Territory diff --git a/lgsm/functions/fn_functions b/lgsm/functions/fn_functions deleted file mode 100644 index ca45dd740..000000000 --- a/lgsm/functions/fn_functions +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# LinuxGSM fn_functions function -# Author: Daniel Gibbs -# Website: https://gameservermanagers.com -lgsm_version="211016" - -# Description: Redirects 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/lgsm/functions/fn_getopt b/lgsm/functions/fn_getopt deleted file mode 100644 index e15a29201..000000000 --- a/lgsm/functions/fn_getopt +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# LinuxGSM fn_getopt function -# Author: Daniel Gibbs -# Website: https://gameservermanagers.com -lgsm_version="211016" - -# 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/lgsm/functions/fn_update_functions b/lgsm/functions/fn_update_functions deleted file mode 100644 index 7dbde6694..000000000 --- a/lgsm/functions/fn_update_functions +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# LinuxGSM fn_update_functions function -# Author: Daniel Gibbs -# Website: https://gameservermanagers.com -lgsm_version="211016" - -# Description: LEGACY FUNCTION Deletes the functions dir to allow re-downloading of functions from GitHub. - -fn_print_dots "Updating functions" -sleep 1 -echo -ne "\n" -rm -rfv "${rootdir}/functions/"* -exitcode=$? -if [ "${exitcode}" == "0" ]; then - fn_print_ok "Updating functions" - fn_script_log "Success! Updating functions" -else - fn_print_fail "Updating functions" - fn_script_log "Failure! Updating functions" -fi -echo -ne "\n" \ No newline at end of file diff --git a/lgsminstall b/lgsminstall.sh similarity index 100% rename from lgsminstall rename to lgsminstall.sh From 6c912930767029e56ca218ab0a1683cdbc3df6d4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 8 Apr 2017 23:16:16 +0100 Subject: [PATCH 0623/1895] added moved cfg files --- lgsminstall.sh | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lgsminstall.sh b/lgsminstall.sh index 773aa60af..5b953a53a 100644 --- a/lgsminstall.sh +++ b/lgsminstall.sh @@ -27,10 +27,6 @@ githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="config" -source lgsm/config/_default.cfg -source lgsm/config/common.cfg -source lgsm/config/${servicename.cfg - # LinuxGSM installer if [ "${sname}" == "core" ]; then userinput=$1 @@ -69,7 +65,9 @@ if [ "${sname}" == "core" ]; then fi fi - +source lgsm/config/_default.cfg +source lgsm/config/common.cfg +source lgsm/config/${servicename}.cfg ######################## From 9437b6c2b460d22e02c103c542cba9233a7f453e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 9 Apr 2017 15:06:44 +0100 Subject: [PATCH 0624/1895] Config downloading now works --- lgsminstall.sh | 197 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 140 insertions(+), 57 deletions(-) diff --git a/lgsminstall.sh b/lgsminstall.sh index 5b953a53a..b3d882db3 100644 --- a/lgsminstall.sh +++ b/lgsminstall.sh @@ -15,31 +15,45 @@ if [ -f ".dev-debug" ]; then fi version="170305" -sname="core" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lgsmdir="${rootdir}/lgsm" +tmpdir="${lgsmdir}/tmp" servicename="${selfname}" +shortname="core" +shortname="core" +shortname="core" +configdir="${lgsmdir}/config" +gameconfigdir="${configdir}/${servername}" ## Github Branch Select # Allows for the use of different function files # from a different repo and/or branch. githubuser="GameServerManagers" githubrepo="LinuxGSM" -githubbranch="config" +githubbranch="feature/config" + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="feature/config" # LinuxGSM installer -if [ "${sname}" == "core" ]; then +if [ "${shortname}" == "core" ]; then userinput=$1 if [ -z "${userinput}" ]; then userinput="empty" fi - serverslist=$(grep "${userinput}" lgsm/data/serverlist.csv|awk -F "," '{print $2}') + serverslist=$(grep "${userinput}" <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/serverlist.csv")|awk -F "," '{print $2}') echo "USERINPUT: $userinput" echo "SERVERLIST: $serverslist" if [ "${userinput}" == "${serverslist}" ]; then echo "installing" - sname=$(grep $userinput lgsm/data/serverlist.csv|awk -F "," '{print $1}') - servername=$(grep $userinput lgsm/data/serverlist.csv|awk -F "," '{print $2}') + shortname=$(grep ${userinput} <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/serverlist.csv")|awk -F "," '{print $1}') + servername=$(grep ${userinput} <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/serverlist.csv")|awk -F "," '{print $2}') + gamename=$(grep ${userinput} <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/serverlist.csv")|awk -F "," '{print $3}') if [ -e "${servername}" ]; then i=2 while [ -e "$servername-$i" ] ; do @@ -48,11 +62,13 @@ if [ "${sname}" == "core" ]; then servername="${servername}-$i" fi cp "${selfname}" "${servername}" - sed -i -e "s/sname=\"core\"/sname=\"${sname}\"/g" "${servername}" + sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${servername}" + sed -i -e "s/servername=\"core\"/servername=\"${servername}\"/g" "${servername}" + sed -i -e "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${gamename}" exit - elif [ "$userinput" == "list" ]; then + elif [ "${userinput}" == "list" ]; then { - awk -F "," '{print $2 "\t" $3}' "lgsm/data/serverlist.csv" + awk -F "," '{print $2 "\t" $3}' <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/serverlist.csv") } | column -s $'\t' -t exit else @@ -65,74 +81,141 @@ if [ "${sname}" == "core" ]; then fi fi -source lgsm/config/_default.cfg -source lgsm/config/common.cfg -source lgsm/config/${servicename}.cfg - - -######################## -######## Script ######## -###### Do not edit ##### -######################## +# Bootstrap -# 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 -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 +# Fetches bootstrap files (configs and core functions) +fn_boostrap_fetch_file(){ + fileurl="${1}" + filedir="${2}" + filename="${3}" + executecmd="${4:-0}" + run="${5:-0}" + force="${6:-0}" + # If the file is missing, then download + if [ ! -f "${filedir}/${filename}" ]; then + if [ ! -d "${filedir}" ]; then + mkdir -p "${filedir}" 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 + # 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 + echo -ne " fetching ${filename}...\c" + curlcmd=$(${curlcmd} -s --fail -L -o "${filedir}/${filename}" "${fileurl}" 2>&1) + local exitcode=$? + if [ ${exitcode} -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + echo -e "${fileurl}" | tee -a "${scriptlog}" + echo "${curlcmd}" | tee -a "${scriptlog}" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi + else echo -e "\e[0;31mFAIL\e[0m\n" - echo "${curlfetch}" - echo -e "${githuburl}\n" + echo "Curl is not installed!" + echo -e "" 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 + # make file executecmd if executecmd is set + if [ "${executecmd}" == "executecmd" ]; then + chmod +x "${filedir}/${filename}" + fi fi - chmod +x "${filedir}/${filename}" -fi -source "${filedir}/${filename}" + + if [ -f "${filedir}/${filename}" ]; then + # run file if run is set + if [ "${run}" == "run" ]; then + source "${filedir}/${filename}" + fi + fi +} + +fn_boostrap_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_boostrap_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" } +fn_boostrap_fetch_config(){ + github_file_url_dir="${1}" # github dir containing the file + github_file_url_name="${2}" # name of the github file + githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + fileurl="${githuburl}" + filedir="${3}" + filename="${4}" + executecmd="noexecutecmd" + run="norun" + force="noforce" + md5="nomd5" + fn_boostrap_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" +} + +# Load the default config. If missing download it. If changed reload it. +if [ ! -f "${tmpdir}/config/${servername}/_default.cfg" ];then + fn_boostrap_fetch_config "lgsm/config/${servername}" "_default.cfg" "${tmpdir}/config/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" +fi +if [ ! -f "${gameconfigdir}/_default.cfg" ];then + echo "hello" + cp "${tmpdir}/config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" +else + function_file_diff=$(diff -q ${tmpdir}/config/${servername}/_default.cfg ${gameconfigdir}/_default.cfg) + if [ "${function_file_diff}" != "" ]; then + echo "config different onverwriting" + cp "${tmpdir}/config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" + fi + source lgsm/config/${servername}/_default.cfg +fi + +if [ ! -f "${gameconfigdir}/common.cfg" ];then + fn_boostrap_fetch_config "lgsm/config" "common-template.cfg" "${lgsmdir}/config/${servername}" "common.cfg" "${executecmd}" "noexecutecmd" "norun" "noforce" "nomd5" + source lgsm/config/${servername}/common.cfg +else + source lgsm/config/${servername}/common.cfg +fi + +if [ ! -f "${gameconfigdir}/${servicename}.cfg" ];then + fn_boostrap_fetch_config "lgsm/config" "instance-template.cfg" "${lgsmdir}/config/${servername}" "${servicename}.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + source lgsm/config/${servername}/${servicename}.cfg +else + source lgsm/config/${servername}/${servicename}.cfg +fi + +######################## +######## Script ######## +###### Do not edit ##### +######################## + core_dl.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_boostrap_fetch_function } core_functions.sh(){ # Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_boostrap_fetch_function } # Prevent from running this script as root. if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/exit 1" ]; then echo "[ FAIL ] Do NOT run this script as root!" exit 1 else From 9dd8a547d79e9986aa916ee1d7993ee30cbf9656 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 9 Apr 2017 16:26:19 +0100 Subject: [PATCH 0625/1895] further improvements --- lgsm/config/csgoserver/_default.cfg | 9 --------- lgsminstall.sh | 24 ++++++++++++------------ 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/lgsm/config/csgoserver/_default.cfg b/lgsm/config/csgoserver/_default.cfg index 74c1f69e8..bb4b5bbba 100644 --- a/lgsm/config/csgoserver/_default.cfg +++ b/lgsm/config/csgoserver/_default.cfg @@ -85,15 +85,6 @@ engine="source" #### Directories #### # Edit with care -## Work Directories - -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${filesdir}/csgo" executabledir="${filesdir}" diff --git a/lgsminstall.sh b/lgsminstall.sh index b3d882db3..e9391ecb6 100644 --- a/lgsminstall.sh +++ b/lgsminstall.sh @@ -40,6 +40,18 @@ githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="feature/config" + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/exit 1" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + # LinuxGSM installer if [ "${shortname}" == "core" ]; then userinput=$1 @@ -213,21 +225,9 @@ functionfile="${FUNCNAME}" fn_boostrap_fetch_function } -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/exit 1" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi core_dl.sh core_functions.sh - - getopt=$1 core_getopt.sh From 6fa873ba58ff22f275b81e2893e7f8ff5a6df2d8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 10 Apr 2017 20:47:34 +0100 Subject: [PATCH 0626/1895] corrected PVKII --- lgsm/data/serverlist.csv | 2 +- lgsminstall.sh | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv index d9a27de49..d21279969 100644 --- a/lgsm/data/serverlist.csv +++ b/lgsm/data/serverlist.csv @@ -43,7 +43,7 @@ ns2,ns2server,Natural Selection 2 nmrih,nmrihserver,No More Room in Hell ns2c,ns2cserver,NS2: Combat opfor,opforserver,Opposing Force -pvkii,pvkiiserver,"Pirates, Vikings, & Knights II" +pvkii,pvkiiserver,Pirates, Vikings, & Knights II pc,pcserver,Project Cars pz,pzserver,Project Zomboid q2,q2server,Quake 2 diff --git a/lgsminstall.sh b/lgsminstall.sh index e9391ecb6..1eebf2c3a 100644 --- a/lgsminstall.sh +++ b/lgsminstall.sh @@ -33,14 +33,6 @@ githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="feature/config" -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="feature/config" - - # Prevent from running this script as root. if [ "$(whoami)" = "root" ]; then if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/exit 1" ]; then From 61bc06acf2443daef166d513527bcbbd82737fa2 Mon Sep 17 00:00:00 2001 From: TechNZ Date: Tue, 11 Apr 2017 07:50:25 +1200 Subject: [PATCH 0627/1895] Add tmux dimensions added the ability to set the default width and height of the detatched session using variables tmux_width and tmux_height. these variables may be set at a local level or system wide. the script checks if the input from the variables is a valid positive integer and if input is not a valid positive integer, sets the values for the tmux to the default values of 80x23 --- lgsm/functions/command_start.sh | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index c544dd9cf..f102b3a10 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -56,6 +56,20 @@ fn_start_teamspeak3(){ fn_start_tmux(){ fn_parms + + # check for tmux size variables + if [[ ${tmux_width} =~ ^[0-9]+$ ]] + then + tmux-x=${tmux_width} + else + tmux-x=80 + fi + if [[ ${tmux_height} =~ ^[0-9]+$ ]] + then + tmux-y=${tmux_height} + else + tmux-y=23 + fi # Log rotation check_status.sh @@ -81,7 +95,7 @@ fn_start_tmux(){ # Create lockfile date > "${rootdir}/${lockselfname}" cd "${executabledir}" - tmux new-session -d -s "${servicename}" "${executable} ${parms}" 2> "${scriptlogdir}/.${servicename}-tmux-error.tmp" + tmux new-session -d -x ${tmux-x} -y ${tmux-y} --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 From d7f1acee6cd489c4d5d381a338b55dba8e46c423 Mon Sep 17 00:00:00 2001 From: TechNZ Date: Tue, 11 Apr 2017 07:58:54 +1200 Subject: [PATCH 0628/1895] fixed error with '-s' flag '-s' flag had an extra '-' --- 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 f102b3a10..3cf200739 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -95,7 +95,7 @@ fn_start_tmux(){ # Create lockfile date > "${rootdir}/${lockselfname}" cd "${executabledir}" - tmux new-session -d -x ${tmux-x} -y ${tmux-y} --s "${servicename}" "${executable} ${parms}" 2> "${scriptlogdir}/.${servicename}-tmux-error.tmp" + tmux new-session -d -x ${tmux-x} -y ${tmux-y} -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 From 8d78b19fbcd959c475a53057dcfbd648851433c2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 10 Apr 2017 22:09:21 +0100 Subject: [PATCH 0629/1895] Further work completed. Working on menus currently --- lgsminstall.sh | 184 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 142 insertions(+), 42 deletions(-) diff --git a/lgsminstall.sh b/lgsminstall.sh index 1eebf2c3a..1c0b6d08f 100644 --- a/lgsminstall.sh +++ b/lgsminstall.sh @@ -17,12 +17,16 @@ fi version="170305" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lgsmdir="${rootdir}/lgsm" -tmpdir="${lgsmdir}/tmp" servicename="${selfname}" shortname="core" -shortname="core" -shortname="core" +servername="core" +gamename="core" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" configdir="${lgsmdir}/config" gameconfigdir="${configdir}/${servername}" @@ -33,55 +37,141 @@ githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="feature/config" -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/exit 1" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 + +fn_print_center() { + columns="$(tput cols)" + line="$@" + printf "%*s\n" $(( (${#line} + columns) / 2)) "$line" +} +# Print horizontal line +fn_print_horizontal(){ + char="${1:-=}" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" +} + +# Display simple Bash menu +fn_menu_bash() { + local resultvar=$1 + title=$2 + caption=$3 + options=$4 + fn_print_horizontal + fn_print_center $title + fn_print_center $caption + fn_print_horizontal + menu_options=() + while read -r line || [[ -n "$line" ]]; do + var=$(echo $line | awk -F "," '{print $2 " - " $3}') + menu_options+=( "${var}" ) + done < $options + menu_options+=( "Cancel" ) + select option in "${menu_options[@]}"; do + if [ -n "${option}" ] && [ "${option}" != "Cancel" ]; then + eval "$resultvar=\"${option/%\ */}\"" + fi + break + done +} + +fn_menu() { + local resultvar=$1 + local selection="" + title=$2 + caption=$3 + options=$4 + # If this is a list of options as a string, dump it to a file so we can process it + if [ ! -e "${options}" ]; then + echo -ne "${options}\n" > "${cachedir}/menu.options" + options="${cachedir}/menu.options" + fi + + # Get menu command +# for menucmd in whiptail dialog bash; do +# if [ -x $(which $menucmd) ]; then +# menucmd=$(which $menucmd) +# break +# fi +# done + case "$(basename $menucmd)" in + whiptail|dialog) + fn_menu_whiptail "${menucmd}" selection "${title}" "${caption}" "${options}" 40 80 30 + ;; + *) + fn_menu_bash selection "${title}" "${caption}" "${options}" + ;; + esac + eval "$resultvar=\"${selection}\"" + echo "$resultvar" +} + +fn_serverlist(){ + IFS="," + if [ -f "lgsm/data/serverlist.csv" ]; then + serverlist="lgsm/data/serverlist.csv" + server_info_array=($(awk '{ print $2 }' "${serverlist}" | grep "${userinput}" )) else - core_functions.sh - check_root.sh + serverlist="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/serverlist.csv" + server_info_array=($(awk '{ print $2 }' <(curl -s "${serverlist}") | grep "${userinput}")) fi -fi + shortname="${server_info_array[0]}" + servername="${server_info_array[1]}" + gamename="${server_info_array[2]}" + echo "$server_info_array" + echo "shortname: $shortname" + echo "servername: $servername" + echo "gamename: $gamename" +} + +fn_install_getopt(){ + userinput="empty" + echo "Usage: $0 [option]" + echo -e "" + echo "Installer - Linux Game Server Manager - Version ${version}" + echo "https://gameservermanagers.com" + echo -e "" + echo -e "Commands" + echo -e "install |Select server to install." + echo -e "servername |e.g $0 csgoserver. Enter the required servername will install it." + echo -e "list |List all servers available for install." + exit +} # LinuxGSM installer if [ "${shortname}" == "core" ]; then userinput=$1 if [ -z "${userinput}" ]; then - userinput="empty" - fi - serverslist=$(grep "${userinput}" <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/serverlist.csv")|awk -F "," '{print $2}') - echo "USERINPUT: $userinput" - echo "SERVERLIST: $serverslist" - if [ "${userinput}" == "${serverslist}" ]; then - echo "installing" - shortname=$(grep ${userinput} <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/serverlist.csv")|awk -F "," '{print $1}') - servername=$(grep ${userinput} <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/serverlist.csv")|awk -F "," '{print $2}') - gamename=$(grep ${userinput} <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/serverlist.csv")|awk -F "," '{print $3}') - if [ -e "${servername}" ]; then - i=2 - while [ -e "$servername-$i" ] ; do - let i++ - done - servername="${servername}-$i" - fi - cp "${selfname}" "${servername}" - sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${servername}" - sed -i -e "s/servername=\"core\"/servername=\"${servername}\"/g" "${servername}" - sed -i -e "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${gamename}" - exit + fn_install_getopt elif [ "${userinput}" == "list" ]; then + fn_serverlist { - awk -F "," '{print $2 "\t" $3}' <(curl -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/serverlist.csv") - } | column -s $'\t' -t + if [ -f "lgsm/data/serverlist.csv" ]; then + awk -F "," '{print $2 "\t" $3}' "${serverlist}" + else + awk -F "," '{print $2 "\t" $3}' <(curl -s "${serverlist}") + fi + } | column -s $'\t' -t | more exit + elif [ "${userinput}" == "install" ]; then + fn_menu result "Linux Game Server Manager" "Select game to install" "lgsm/data/serverlist.csv" else - echo "Usage: ./${selfname} list" - echo "For a complete list of available servers" - echo "" - echo "Usage: ./${selfname} [servername]" - echo "To install a server" - exit + fn_serverlist + if [ "${userinput}" == "${server_info_array[1]}" ]; then + + if [ -e "${servername}" ]; then + i=2 + while [ -e "$servername-$i" ] ; do + let i++ + done + servername="${servername}-$i" + fi + cp "${selfname}" "${servername}" + sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${servername}" + sed -i -e "s/servername=\"core\"/servername=\"${servername}\"/g" "${servername}" + sed -i -e "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${servername}" + exit + else + fn_install_getopt + fi fi fi @@ -217,6 +307,16 @@ functionfile="${FUNCNAME}" fn_boostrap_fetch_function } +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/exit 1" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi core_dl.sh core_functions.sh From 8f89b64394191a76078cbdbfcdc2f3725eb45042 Mon Sep 17 00:00:00 2001 From: TechNZ Date: Wed, 12 Apr 2017 20:05:27 +1200 Subject: [PATCH 0630/1895] correct syntax error changed "-" to "_" --- lgsm/functions/command_start.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 3cf200739..f8689ca45 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -60,15 +60,15 @@ fn_start_tmux(){ # check for tmux size variables if [[ ${tmux_width} =~ ^[0-9]+$ ]] then - tmux-x=${tmux_width} + tmux_x=${tmux_width} else - tmux-x=80 + tmux_x=80 fi if [[ ${tmux_height} =~ ^[0-9]+$ ]] then - tmux-y=${tmux_height} + tmux_y=${tmux_height} else - tmux-y=23 + tmux_y=23 fi # Log rotation @@ -95,7 +95,7 @@ fn_start_tmux(){ # Create lockfile date > "${rootdir}/${lockselfname}" cd "${executabledir}" - tmux new-session -d -x ${tmux-x} -y ${tmux-y} -s "${servicename}" "${executable} ${parms}" 2> "${scriptlogdir}/.${servicename}-tmux-error.tmp" + tmux new-session -d -x ${tmux_x} -y ${tmux_y} -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 From 219395469c2c7872c7830d3b31fedb0c213d6108 Mon Sep 17 00:00:00 2001 From: TechNZ Date: Wed, 12 Apr 2017 23:09:18 +1200 Subject: [PATCH 0631/1895] updated if syntax and naming scheme updated if statements and variables to meet LGSM syntax and naming conventions --- lgsm/functions/command_start.sh | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index f8689ca45..cb640aa20 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -58,17 +58,15 @@ fn_start_tmux(){ fn_parms # check for tmux size variables - if [[ ${tmux_width} =~ ^[0-9]+$ ]] - then - tmux_x=${tmux_width} + if [[ "${servercfgtmuxwidth}" =~ ^[0-9]+$ ]]; then + sessionwidth="${servercfgwidth}" else - tmux_x=80 + sessionwidth="80" fi - if [[ ${tmux_height} =~ ^[0-9]+$ ]] - then - tmux_y=${tmux_height} + if [[ "${servercfgtmuxheight}" =~ ^[0-9]+$ ]]; then + sessionheight="${servercfgtmuxheight}" else - tmux_y=23 + sessionheight="23" fi # Log rotation @@ -95,7 +93,7 @@ fn_start_tmux(){ # Create lockfile date > "${rootdir}/${lockselfname}" cd "${executabledir}" - tmux new-session -d -x ${tmux_x} -y ${tmux_y} -s "${servicename}" "${executable} ${parms}" 2> "${scriptlogdir}/.${servicename}-tmux-error.tmp" + tmux new-session -d -x "${sessionheight}" -y "${sessionwidth}" -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 From d46a0af89421edf8ac3f8894664011a0aeee0eeb Mon Sep 17 00:00:00 2001 From: TechNZ Date: Wed, 12 Apr 2017 23:13:40 +1200 Subject: [PATCH 0632/1895] corrected variable name error corrected a variable name error cause by quickly making changes when tired --- 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 cb640aa20..b9b07fff4 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -59,7 +59,7 @@ fn_start_tmux(){ # check for tmux size variables if [[ "${servercfgtmuxwidth}" =~ ^[0-9]+$ ]]; then - sessionwidth="${servercfgwidth}" + sessionwidth="${servercfgtmuxwidth}" else sessionwidth="80" fi From 6da1a1a4c84ec8bbe2915822b297ae7576d042d6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 12 Apr 2017 23:44:09 +0100 Subject: [PATCH 0633/1895] dev Dev update --- lgsminstall.sh | 388 +++++++++++++++++++++++++++---------------------- 1 file changed, 216 insertions(+), 172 deletions(-) diff --git a/lgsminstall.sh b/lgsminstall.sh index 1c0b6d08f..0999334fe 100644 --- a/lgsminstall.sh +++ b/lgsminstall.sh @@ -37,144 +37,6 @@ githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="feature/config" - -fn_print_center() { - columns="$(tput cols)" - line="$@" - printf "%*s\n" $(( (${#line} + columns) / 2)) "$line" -} -# Print horizontal line -fn_print_horizontal(){ - char="${1:-=}" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" -} - -# Display simple Bash menu -fn_menu_bash() { - local resultvar=$1 - title=$2 - caption=$3 - options=$4 - fn_print_horizontal - fn_print_center $title - fn_print_center $caption - fn_print_horizontal - menu_options=() - while read -r line || [[ -n "$line" ]]; do - var=$(echo $line | awk -F "," '{print $2 " - " $3}') - menu_options+=( "${var}" ) - done < $options - menu_options+=( "Cancel" ) - select option in "${menu_options[@]}"; do - if [ -n "${option}" ] && [ "${option}" != "Cancel" ]; then - eval "$resultvar=\"${option/%\ */}\"" - fi - break - done -} - -fn_menu() { - local resultvar=$1 - local selection="" - title=$2 - caption=$3 - options=$4 - # If this is a list of options as a string, dump it to a file so we can process it - if [ ! -e "${options}" ]; then - echo -ne "${options}\n" > "${cachedir}/menu.options" - options="${cachedir}/menu.options" - fi - - # Get menu command -# for menucmd in whiptail dialog bash; do -# if [ -x $(which $menucmd) ]; then -# menucmd=$(which $menucmd) -# break -# fi -# done - case "$(basename $menucmd)" in - whiptail|dialog) - fn_menu_whiptail "${menucmd}" selection "${title}" "${caption}" "${options}" 40 80 30 - ;; - *) - fn_menu_bash selection "${title}" "${caption}" "${options}" - ;; - esac - eval "$resultvar=\"${selection}\"" - echo "$resultvar" -} - -fn_serverlist(){ - IFS="," - if [ -f "lgsm/data/serverlist.csv" ]; then - serverlist="lgsm/data/serverlist.csv" - server_info_array=($(awk '{ print $2 }' "${serverlist}" | grep "${userinput}" )) - else - serverlist="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/serverlist.csv" - server_info_array=($(awk '{ print $2 }' <(curl -s "${serverlist}") | grep "${userinput}")) - fi - shortname="${server_info_array[0]}" - servername="${server_info_array[1]}" - gamename="${server_info_array[2]}" - echo "$server_info_array" - echo "shortname: $shortname" - echo "servername: $servername" - echo "gamename: $gamename" -} - -fn_install_getopt(){ - userinput="empty" - echo "Usage: $0 [option]" - echo -e "" - echo "Installer - Linux Game Server Manager - Version ${version}" - echo "https://gameservermanagers.com" - echo -e "" - echo -e "Commands" - echo -e "install |Select server to install." - echo -e "servername |e.g $0 csgoserver. Enter the required servername will install it." - echo -e "list |List all servers available for install." - exit -} - -# LinuxGSM installer -if [ "${shortname}" == "core" ]; then - userinput=$1 - if [ -z "${userinput}" ]; then - fn_install_getopt - elif [ "${userinput}" == "list" ]; then - fn_serverlist - { - if [ -f "lgsm/data/serverlist.csv" ]; then - awk -F "," '{print $2 "\t" $3}' "${serverlist}" - else - awk -F "," '{print $2 "\t" $3}' <(curl -s "${serverlist}") - fi - } | column -s $'\t' -t | more - exit - elif [ "${userinput}" == "install" ]; then - fn_menu result "Linux Game Server Manager" "Select game to install" "lgsm/data/serverlist.csv" - else - fn_serverlist - if [ "${userinput}" == "${server_info_array[1]}" ]; then - - if [ -e "${servername}" ]; then - i=2 - while [ -e "$servername-$i" ] ; do - let i++ - done - servername="${servername}-$i" - fi - cp "${selfname}" "${servername}" - sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${servername}" - sed -i -e "s/servername=\"core\"/servername=\"${servername}\"/g" "${servername}" - sed -i -e "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${servername}" - exit - else - fn_install_getopt - fi - fi -fi - # Bootstrap # Fetches bootstrap files (configs and core functions) @@ -260,36 +122,227 @@ fn_boostrap_fetch_config(){ fn_boostrap_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" } -# Load the default config. If missing download it. If changed reload it. -if [ ! -f "${tmpdir}/config/${servername}/_default.cfg" ];then - fn_boostrap_fetch_config "lgsm/config/${servername}" "_default.cfg" "${tmpdir}/config/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" -fi -if [ ! -f "${gameconfigdir}/_default.cfg" ];then - echo "hello" - cp "${tmpdir}/config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" -else - function_file_diff=$(diff -q ${tmpdir}/config/${servername}/_default.cfg ${gameconfigdir}/_default.cfg) - if [ "${function_file_diff}" != "" ]; then - echo "config different onverwriting" - cp "${tmpdir}/config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" +fn_print_center() { + columns="$(tput cols)" + line="$@" + printf "%*s\n" $(( (${#line} + columns) / 2)) "${line}" +} +# Print horizontal line +fn_print_horizontal(){ + char="${1:-=}" + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" +} + +# Bash Menu +fn_install_menu_bash() { + local resultvar=$1 + title=$2 + caption=$3 + options=$4 + fn_print_horizontal + fn_print_center $title + fn_print_center $caption + fn_print_horizontal + menu_options=() + while read -r line || [[ -n "${line}" ]]; do + var=$(echo "${line}" | awk -F "," '{print $2 " - " $3}') + menu_options+=( "${var}" ) + done < $options + menu_options+=( "Cancel" ) + select option in "${menu_options[@]}"; do + if [ -n "${option}" ] && [ "${option}" != "Cancel" ]; then + eval "$resultvar=\"${option/%\ */}\"" + fi + break + done +} + +# Whiptail/Dialog Menu +fn_install_menu_whiptail() { + local menucmd=$1 + local resultvar=$2 + title=$3 + caption=$4 + options=$5 + height=${6:-40} + width=${7:-80} + menuheight=${8:-30} + IFS="," + menu_options=() + while read -r line; do + key=$(echo "${line}" | awk -F "," '{print $3}') + val=$(echo "${line}" | awk -F "," '{print $2}') + menu_options+=( ${val//\"} "${key//\"}" ) + done < $options + OPTION=$(${menucmd} --title "${title}" --menu "${caption}" ${height} ${width} ${menuheight} "${menu_options[@]}" 3>&1 1>&2 2>&3) + if [ $? = 0 ]; then + eval "$resultvar=\"${OPTION}\"" + else + eval "$resultvar=" fi - source lgsm/config/${servername}/_default.cfg -fi +} -if [ ! -f "${gameconfigdir}/common.cfg" ];then - fn_boostrap_fetch_config "lgsm/config" "common-template.cfg" "${lgsmdir}/config/${servername}" "common.cfg" "${executecmd}" "noexecutecmd" "norun" "noforce" "nomd5" - source lgsm/config/${servername}/common.cfg -else - source lgsm/config/${servername}/common.cfg +# Menu selector +fn_install_menu() { + local resultvar=$1 + local selection="" + title=$2 + caption=$3 + options=$4 + # Get menu command + for menucmd in whiptail dialog bash; do + if [ -x $(which ${menucmd}) ]; then + menucmd=$(which ${menucmd}) + break + fi + done + case "$(basename ${menucmd})" in + whiptail|dialog) + fn_install_menu_whiptail "${menucmd}" selection "${title}" "${caption}" "${options}" 40 80 30;; + *) + fn_install_menu_bash selection "${title}" "${caption}" "${options}";; + esac + eval "$resultvar=\"${selection}\"" +} + +# Gets server info from serverlist.csv and puts in to array +fn_server_info(){ + IFS="," + server_info_array=($(grep -a "${userinput}" "${serverlist}")) + shortname="${server_info_array[0]}" # csgo + servername="${server_info_array[1]}" # csgoserver + gamename="${server_info_array[2]}" # Counter Strike: Global Offensive + echo "shortname: $shortname" + echo "servername: $servername" + echo "gamename: $gamename" +} + +fn_install_getopt(){ + userinput="empty" + echo "Usage: $0 [option]" + echo -e "" + echo "Installer - Linux Game Server Managers - Version ${version}" + echo "https://gameservermanagers.com" + echo -e "" + echo -e "Commands" + echo -e "install |Select server to install." + echo -e "servername |e.g $0 csgoserver. Enter the required servername will install it." + echo -e "list |List all servers available for install." + exit +} + +fn_install_file(){ + filename="${servername}" + if [ -e "${filename}" ]; then + i=2 + while [ -e "${filename}-${i}" ] ; do + let i++ + done + filename="${filename}-${i}" + fi + cp -R "${selfname}" "${filename}" + sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${filename}" + sed -i -e "s/servername=\"core\"/servername=\"${servername}\"/g" "${filename}" + sed -i -e "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${filename}" + exit +} + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi fi -if [ ! -f "${gameconfigdir}/${servicename}.cfg" ];then - fn_boostrap_fetch_config "lgsm/config" "instance-template.cfg" "${lgsmdir}/config/${servername}" "${servicename}.cfg" "noexecutecmd" "norun" "noforce" "nomd5" - source lgsm/config/${servername}/${servicename}.cfg +# LinuxGSM installer mode +if [ "${shortname}" == "core" ]; then + userinput=$1 + datadir="${lgsmdir}/data" + serverlist="${datadir}/serverlist.csv" + serverlist_tmp="${tmpdir}/data/serverlist.csv" + + # Download the serverlist. This is the complete list of all supported servers. + # Download to tmp dir + fn_boostrap_fetch_config "lgsm/data" "serverlist.csv" "${tmpdir}/data" "serverlist.csv" "noexecutecmd" "norun" "noforce" "nomd5" + # if missing in lgsm dir copy it accross + if [ ! -f "${serverlist}" ]; then + mkdir -p "${datadir}" + cp -R "${serverlist_tmp}" "${serverlist}" + # check if the files are different. + else + file_diff=$(diff -q "${serverlist_tmp}" "${serverlist}") + if [ "${file_diff}" != "" ]; then + cp -Rf "${serverlist_tmp}" "${serverlist}" + fi + fi + + if [ ! -f "${serverlist}" ];then + echo "[ FAIL ] serverlist.csv could not be loaded." + exit 1 + fi + + if [ "${userinput}" == "list" ]; then + { + awk -F "," '{print $2 "\t" $3}' "${serverlist}" + } | column -s $'\t' -t | more + exit + elif [ "${userinput}" == "install" ]; then + fn_install_menu result "LinuxGSM" "Select game to install" "lgsm/data/serverlist.csv" + userinput="${result}" + fn_server_info + echo "result is ${result}" + echo "RESULT: ${result}" + echo "VALIDATE: ${servername}" + if [ "${result}" == "${servername}" ]; then + fn_install_file + else + echo "[ FAIL ] menu result does not match servername" + fi + elif [ -n "${userinput}" ]; then + fn_server_info + if [ "${userinput}" == "${servername}" ]; then + fn_install_file + fi + else + fn_install_getopt + fi +# LinuxGSM Server Mode else - source lgsm/config/${servername}/${servicename}.cfg + # Load LinuxGSM configs + # These are required to get all the default variables for the specific server. + # Load the default config. If missing download it. If changed reload it. + if [ ! -f "${tmpdir}/config/${servername}/_default.cfg" ];then + fn_boostrap_fetch_config "lgsm/config/${servername}" "_default.cfg" "${tmpdir}/config/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + fi + if [ ! -f "${gameconfigdir}/_default.cfg" ];then + cp -R "${tmpdir}/config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" + else + function_file_diff=$(diff -q ${tmpdir}/config/${servername}/_default.cfg ${gameconfigdir}/_default.cfg) + if [ "${function_file_diff}" != "" ]; then + echo "config different onverwriting" + cp -R "${tmpdir}/config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" + fi + source lgsm/config/${servername}/_default.cfg + fi + # Load the common.cfg config. If missing download it + if [ ! -f "${gameconfigdir}/common.cfg" ];then + fn_boostrap_fetch_config "lgsm/config" "common-template.cfg" "${lgsmdir}/config/${servername}" "common.cfg" "${executecmd}" "noexecutecmd" "norun" "noforce" "nomd5" + source lgsm/config/${servername}/common.cfg + else + source lgsm/config/${servername}/common.cfg + fi + # Load the instance.cfg config. If missing download it + if [ ! -f "${gameconfigdir}/${servicename}.cfg" ];then + fn_boostrap_fetch_config "lgsm/config" "instance-template.cfg" "${lgsmdir}/config/${servername}" "${servicename}.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + source lgsm/config/${servername}/${servicename}.cfg + else + source lgsm/config/${servername}/${servicename}.cfg + fi fi - ######################## ######## Script ######## ###### Do not edit ##### @@ -307,16 +360,7 @@ functionfile="${FUNCNAME}" fn_boostrap_fetch_function } -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/exit 1" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi + core_dl.sh core_functions.sh From b0713945d38e85585a4a789c4d6943d2d2541063 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 13 Apr 2017 20:45:31 +0100 Subject: [PATCH 0634/1895] dev appears to be a working version of the new config style. Only working with csgoserver currently --- lgsminstall.sh | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/lgsminstall.sh b/lgsminstall.sh index 0999334fe..6260e6946 100644 --- a/lgsminstall.sh +++ b/lgsminstall.sh @@ -212,9 +212,6 @@ fn_server_info(){ shortname="${server_info_array[0]}" # csgo servername="${server_info_array[1]}" # csgoserver gamename="${server_info_array[2]}" # Counter Strike: Global Offensive - echo "shortname: $shortname" - echo "servername: $servername" - echo "gamename: $gamename" } fn_install_getopt(){ @@ -244,6 +241,8 @@ fn_install_file(){ sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${filename}" sed -i -e "s/servername=\"core\"/servername=\"${servername}\"/g" "${filename}" sed -i -e "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${filename}" + echo "Installed ${gamename} server as ${filename}" + echo "./${filename} install" exit } @@ -294,9 +293,6 @@ if [ "${shortname}" == "core" ]; then fn_install_menu result "LinuxGSM" "Select game to install" "lgsm/data/serverlist.csv" userinput="${result}" fn_server_info - echo "result is ${result}" - echo "RESULT: ${result}" - echo "VALIDATE: ${servername}" if [ "${result}" == "${servername}" ]; then fn_install_file else @@ -315,16 +311,17 @@ else # Load LinuxGSM configs # These are required to get all the default variables for the specific server. # Load the default config. If missing download it. If changed reload it. - if [ ! -f "${tmpdir}/config/${servername}/_default.cfg" ];then - fn_boostrap_fetch_config "lgsm/config/${servername}" "_default.cfg" "${tmpdir}/config/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + if [ ! -f "${lgsmdir}/default-configs/lgsm-config/${servername}/_default.cfg" ];then + mkdir -p "${lgsmdir}/default-configs/lgsm-config/${servername}" + fn_boostrap_fetch_config "lgsm/config/${servername}" "_default.cfg" "${lgsmdir}/default-configs/lgsm-config/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" fi if [ ! -f "${gameconfigdir}/_default.cfg" ];then - cp -R "${tmpdir}/config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" + cp -R "${lgsmdir}/default-configs/lgsm-config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" else - function_file_diff=$(diff -q ${tmpdir}/config/${servername}/_default.cfg ${gameconfigdir}/_default.cfg) + function_file_diff=$(diff -q ${lgsmdir}/default-configs/lgsm-config/${servername}/_default.cfg ${gameconfigdir}/_default.cfg) if [ "${function_file_diff}" != "" ]; then echo "config different onverwriting" - cp -R "${tmpdir}/config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" + cp -R "${lgsmdir}/default-configs/lgsm-config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" fi source lgsm/config/${servername}/_default.cfg fi From 1d158880855c5a93784c18c2952fa2c61f3733ac Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 13 Apr 2017 20:46:14 +0100 Subject: [PATCH 0635/1895] renamed linuxgsm.sh --- lgsminstall.sh => linuxgsm.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lgsminstall.sh => linuxgsm.sh (100%) diff --git a/lgsminstall.sh b/linuxgsm.sh similarity index 100% rename from lgsminstall.sh rename to linuxgsm.sh From ef56b2eb57a0eea124e6f6052da0585f6a3368da Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 13 Apr 2017 21:14:03 +0100 Subject: [PATCH 0636/1895] updated description --- lgsm/config/csgoserver/_default.cfg | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/config/csgoserver/_default.cfg b/lgsm/config/csgoserver/_default.cfg index bb4b5bbba..3c7a1aea8 100644 --- a/lgsm/config/csgoserver/_default.cfg +++ b/lgsm/config/csgoserver/_default.cfg @@ -2,6 +2,9 @@ ######## Default Settings ######## ################################## # DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applys settings to every instance +# [instance].cfg - applys settings to specific instance #### Server Settings #### From 63c6acdb7095885dc724238498db436fa18cb10a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 13 Apr 2017 21:36:11 +0100 Subject: [PATCH 0637/1895] Added 3 more _default.cfg files --- lgsm/config/arkserver/_default.cfg | 89 ++++++++++++++++++++++++ lgsm/config/arma3server/_default.cfg | 100 +++++++++++++++++++++++++++ lgsm/config/sdtdserver/_default.cfg | 90 ++++++++++++++++++++++++ 3 files changed, 279 insertions(+) create mode 100644 lgsm/config/arkserver/_default.cfg create mode 100644 lgsm/config/arma3server/_default.cfg create mode 100644 lgsm/config/sdtdserver/_default.cfg diff --git a/lgsm/config/arkserver/_default.cfg b/lgsm/config/arkserver/_default.cfg new file mode 100644 index 000000000..6c4d453bf --- /dev/null +++ b/lgsm/config/arkserver/_default.cfg @@ -0,0 +1,89 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applys settings to every instance +# [instance].cfg - applys settings to specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +port="7777" +queryport="27015" +rconport="27020" +maxplayers="70" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="\"TheIsland?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port}?\"" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="376030" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="ARK: Survival Evolved" +engine="unreal4" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/ShooterGame" +executabledir="${systemdir}/Binaries/Linux" +executable="./ShooterGameServer" +servercfgdir="${systemdir}/Saved/Config/LinuxServer" +servercfg="GameUserSettings.ini" +servercfgdefault="GameUserSettings.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${systemdir}/Saved/Logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config/arma3server/_default.cfg b/lgsm/config/arma3server/_default.cfg new file mode 100644 index 000000000..f551c8d66 --- /dev/null +++ b/lgsm/config/arma3server/_default.cfg @@ -0,0 +1,100 @@ +#### Server Settings #### + +## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="2302" + +## ARMA 3 Modules +# Add mods with relative paths: +# mods/@cba_a3 +# To load the "Community Base Addons v3" module found in the +# directory serverfiles/mods/@cba_a3. Load several mods as: +# mods="mods/@ace\;mods/@acex\;mods/@cba_a3" +mods="" + +## Server-side Mods +servermods="" + +## Path to BattlEye +# Leave empty for default +bepath="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-netlog -ip=${ip} -port=${port} -cfg=${networkcfgfullpath} -config=${servercfgfullpath} -mod=${mods} -servermod=${servermods} -bepath=${bepath} -autoinit -loadmissiontomemory" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="233780" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="ARMA 3" +engine="realvirtuality" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./arma3server" +servercfg="${servicename}.server.cfg" +networkcfg="${servicename}.network.cfg" +servercfgdefault="server.cfg" +networkcfgdefault="network.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" +networkcfgfullpath="${servercfgdir}/${networkcfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +#gamelogdir="" # No server logs available +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config/sdtdserver/_default.cfg b/lgsm/config/sdtdserver/_default.cfg new file mode 100644 index 000000000..ad8476ddb --- /dev/null +++ b/lgsm/config/sdtdserver/_default.cfg @@ -0,0 +1,90 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applys settings to every instance +# [instance].cfg - applys settings to specific instance + +#### Server Settings #### + +## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-logfile ${gamelogdir}/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated -configfile=${servercfgfullpath}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="294420" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="7 Days To Die" +engine="unity3d" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./7DaysToDieServer.x86" +servercfg="${servicename}.xml" +servercfgdefault="serverconfig.xml" +servercfgdir="${filesdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${rootdir}/log/server" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +gamelog="${gamelogdir}/${servicename}-game.log" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file From 7ae73eea6eaf7735e33047305924ae344a16d0a6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 14 Apr 2017 09:37:02 +0100 Subject: [PATCH 0638/1895] =?UTF-8?q?fixed=20cp:=20cannot=20create=20regul?= =?UTF-8?q?ar=20file=20=E2=80=98.../=5Fdefault.cfg=E2=80=99:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- linuxgsm.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 6260e6946..9f6d6b2ac 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -316,6 +316,7 @@ else fn_boostrap_fetch_config "lgsm/config/${servername}" "_default.cfg" "${lgsmdir}/default-configs/lgsm-config/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" fi if [ ! -f "${gameconfigdir}/_default.cfg" ];then + mkdir -p "${gameconfigdir}" cp -R "${lgsmdir}/default-configs/lgsm-config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" else function_file_diff=$(diff -q ${lgsmdir}/default-configs/lgsm-config/${servername}/_default.cfg ${gameconfigdir}/_default.cfg) @@ -323,21 +324,21 @@ else echo "config different onverwriting" cp -R "${lgsmdir}/default-configs/lgsm-config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" fi - source lgsm/config/${servername}/_default.cfg + source "lgsm/config/${servername}/_default.cfg" fi # Load the common.cfg config. If missing download it if [ ! -f "${gameconfigdir}/common.cfg" ];then fn_boostrap_fetch_config "lgsm/config" "common-template.cfg" "${lgsmdir}/config/${servername}" "common.cfg" "${executecmd}" "noexecutecmd" "norun" "noforce" "nomd5" - source lgsm/config/${servername}/common.cfg + source "lgsm/config/${servername}/common.cfg" else - source lgsm/config/${servername}/common.cfg + source "lgsm/config/${servername}/common.cfg" fi # Load the instance.cfg config. If missing download it if [ ! -f "${gameconfigdir}/${servicename}.cfg" ];then fn_boostrap_fetch_config "lgsm/config" "instance-template.cfg" "${lgsmdir}/config/${servername}" "${servicename}.cfg" "noexecutecmd" "norun" "noforce" "nomd5" - source lgsm/config/${servername}/${servicename}.cfg + source "lgsm/config/${servername}/${servicename}.cfg" else - source lgsm/config/${servername}/${servicename}.cfg + source "lgsm/config/${servername}/${servicename}.cfg" fi fi ######################## From d35fe34622d4116b28d87cf5d72f62bc37a4fd83 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 14 Apr 2017 13:43:45 +0100 Subject: [PATCH 0639/1895] Updated directory structure --- .../arkserver/_default.cfg | 0 .../arma3server/_default.cfg | 0 .../common-template.cfg | 0 .../csgoserver/_default.cfg | 0 .../instance-template.cfg | 0 .../sdtdserver/_default.cfg | 0 linuxgsm.sh | 45 ++++++++++--------- 7 files changed, 23 insertions(+), 22 deletions(-) rename lgsm/{config => config-default}/arkserver/_default.cfg (100%) rename lgsm/{config => config-default}/arma3server/_default.cfg (100%) rename lgsm/{config => config-default}/common-template.cfg (100%) rename lgsm/{config => config-default}/csgoserver/_default.cfg (100%) rename lgsm/{config => config-default}/instance-template.cfg (100%) rename lgsm/{config => config-default}/sdtdserver/_default.cfg (100%) diff --git a/lgsm/config/arkserver/_default.cfg b/lgsm/config-default/arkserver/_default.cfg similarity index 100% rename from lgsm/config/arkserver/_default.cfg rename to lgsm/config-default/arkserver/_default.cfg diff --git a/lgsm/config/arma3server/_default.cfg b/lgsm/config-default/arma3server/_default.cfg similarity index 100% rename from lgsm/config/arma3server/_default.cfg rename to lgsm/config-default/arma3server/_default.cfg diff --git a/lgsm/config/common-template.cfg b/lgsm/config-default/common-template.cfg similarity index 100% rename from lgsm/config/common-template.cfg rename to lgsm/config-default/common-template.cfg diff --git a/lgsm/config/csgoserver/_default.cfg b/lgsm/config-default/csgoserver/_default.cfg similarity index 100% rename from lgsm/config/csgoserver/_default.cfg rename to lgsm/config-default/csgoserver/_default.cfg diff --git a/lgsm/config/instance-template.cfg b/lgsm/config-default/instance-template.cfg similarity index 100% rename from lgsm/config/instance-template.cfg rename to lgsm/config-default/instance-template.cfg diff --git a/lgsm/config/sdtdserver/_default.cfg b/lgsm/config-default/sdtdserver/_default.cfg similarity index 100% rename from lgsm/config/sdtdserver/_default.cfg rename to lgsm/config-default/sdtdserver/_default.cfg diff --git a/linuxgsm.sh b/linuxgsm.sh index 9f6d6b2ac..92f0dc6df 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -27,8 +27,10 @@ functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" filesdir="${rootdir}/serverfiles" -configdir="${lgsmdir}/config" -gameconfigdir="${configdir}/${servername}" +configdir="${lgsmdir}/config-lgsm" +configdirserver="${configdir}/${servername}" +configdirdefault="${lgsmdir}/config-default" + ## Github Branch Select # Allows for the use of different function files @@ -311,36 +313,37 @@ else # Load LinuxGSM configs # These are required to get all the default variables for the specific server. # Load the default config. If missing download it. If changed reload it. - if [ ! -f "${lgsmdir}/default-configs/lgsm-config/${servername}/_default.cfg" ];then - mkdir -p "${lgsmdir}/default-configs/lgsm-config/${servername}" - fn_boostrap_fetch_config "lgsm/config/${servername}" "_default.cfg" "${lgsmdir}/default-configs/lgsm-config/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + if [ ! -f "${configdirdefault}/config-lgsm/${servername}/_default.cfg" ];then + mkdir -p "${configdirdefault}/config-lgsm/${servername}" + fn_boostrap_fetch_config "lgsm/config-default/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" fi - if [ ! -f "${gameconfigdir}/_default.cfg" ];then - mkdir -p "${gameconfigdir}" - cp -R "${lgsmdir}/default-configs/lgsm-config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" + if [ ! -f "${configdirserver}/_default.cfg" ];then + mkdir -p "${configdirserver}" + cp -R "${configdirdefault}/config-lgsm/${servername}/_default.cfg" "${configdirserver}/_default.cfg" else - function_file_diff=$(diff -q ${lgsmdir}/default-configs/lgsm-config/${servername}/_default.cfg ${gameconfigdir}/_default.cfg) + function_file_diff=$(diff -q ${configdirdefault}/config-lgsm/${servername}/_default.cfg ${configdirserver}/_default.cfg) if [ "${function_file_diff}" != "" ]; then - echo "config different onverwriting" - cp -R "${lgsmdir}/default-configs/lgsm-config/${servername}/_default.cfg" "${gameconfigdir}/_default.cfg" + echo "_default.cfg has been altered. Reloading config." + cp -R "${configdirdefault}/config-lgsm/${servername}/_default.cfg" "${configdirserver}/_default.cfg" fi - source "lgsm/config/${servername}/_default.cfg" fi + source "${configdirserver}/_default.cfg" # Load the common.cfg config. If missing download it - if [ ! -f "${gameconfigdir}/common.cfg" ];then - fn_boostrap_fetch_config "lgsm/config" "common-template.cfg" "${lgsmdir}/config/${servername}" "common.cfg" "${executecmd}" "noexecutecmd" "norun" "noforce" "nomd5" - source "lgsm/config/${servername}/common.cfg" + if [ ! -f "${configdirserver}/common.cfg" ];then + fn_boostrap_fetch_config "lgsm/config-default" "common-template.cfg" "${configdirserver}" "common.cfg" "${executecmd}" "noexecutecmd" "norun" "noforce" "nomd5" + source "${configdirserver}/common.cfg" else - source "lgsm/config/${servername}/common.cfg" + source "${configdirserver}/common.cfg" fi # Load the instance.cfg config. If missing download it - if [ ! -f "${gameconfigdir}/${servicename}.cfg" ];then - fn_boostrap_fetch_config "lgsm/config" "instance-template.cfg" "${lgsmdir}/config/${servername}" "${servicename}.cfg" "noexecutecmd" "norun" "noforce" "nomd5" - source "lgsm/config/${servername}/${servicename}.cfg" + if [ ! -f "${configdirserver}/${servicename}.cfg" ];then + fn_boostrap_fetch_config "lgsm/config-default" "instance-template.cfg" "${configdirserver}" "${servicename}.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + source "${configdirserver}/${servicename}.cfg" else - source "lgsm/config/${servername}/${servicename}.cfg" + source "${configdirserver}/${servicename}.cfg" fi fi + ######################## ######## Script ######## ###### Do not edit ##### @@ -358,8 +361,6 @@ functionfile="${FUNCNAME}" fn_boostrap_fetch_function } - - core_dl.sh core_functions.sh From 6bd5ac5fc62ccc68bba5462c5e0c5332e64f8123 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 14 Apr 2017 13:44:54 +0100 Subject: [PATCH 0640/1895] further dir changes --- .../config-default/{ => config-lgsm}/arkserver/_default.cfg | 0 .../{ => config-lgsm}/arma3server/_default.cfg | 0 lgsm/config-default/{ => config-lgsm}/common-template.cfg | 0 .../{ => config-lgsm}/csgoserver/_default.cfg | 0 lgsm/config-default/{ => config-lgsm}/instance-template.cfg | 0 .../{ => config-lgsm}/sdtdserver/_default.cfg | 0 linuxgsm.sh | 6 +++--- 7 files changed, 3 insertions(+), 3 deletions(-) rename lgsm/config-default/{ => config-lgsm}/arkserver/_default.cfg (100%) rename lgsm/config-default/{ => config-lgsm}/arma3server/_default.cfg (100%) rename lgsm/config-default/{ => config-lgsm}/common-template.cfg (100%) rename lgsm/config-default/{ => config-lgsm}/csgoserver/_default.cfg (100%) rename lgsm/config-default/{ => config-lgsm}/instance-template.cfg (100%) rename lgsm/config-default/{ => config-lgsm}/sdtdserver/_default.cfg (100%) diff --git a/lgsm/config-default/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg similarity index 100% rename from lgsm/config-default/arkserver/_default.cfg rename to lgsm/config-default/config-lgsm/arkserver/_default.cfg diff --git a/lgsm/config-default/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg similarity index 100% rename from lgsm/config-default/arma3server/_default.cfg rename to lgsm/config-default/config-lgsm/arma3server/_default.cfg diff --git a/lgsm/config-default/common-template.cfg b/lgsm/config-default/config-lgsm/common-template.cfg similarity index 100% rename from lgsm/config-default/common-template.cfg rename to lgsm/config-default/config-lgsm/common-template.cfg diff --git a/lgsm/config-default/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg similarity index 100% rename from lgsm/config-default/csgoserver/_default.cfg rename to lgsm/config-default/config-lgsm/csgoserver/_default.cfg diff --git a/lgsm/config-default/instance-template.cfg b/lgsm/config-default/config-lgsm/instance-template.cfg similarity index 100% rename from lgsm/config-default/instance-template.cfg rename to lgsm/config-default/config-lgsm/instance-template.cfg diff --git a/lgsm/config-default/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg similarity index 100% rename from lgsm/config-default/sdtdserver/_default.cfg rename to lgsm/config-default/config-lgsm/sdtdserver/_default.cfg diff --git a/linuxgsm.sh b/linuxgsm.sh index 92f0dc6df..558a4c5a0 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -315,7 +315,7 @@ else # Load the default config. If missing download it. If changed reload it. if [ ! -f "${configdirdefault}/config-lgsm/${servername}/_default.cfg" ];then mkdir -p "${configdirdefault}/config-lgsm/${servername}" - fn_boostrap_fetch_config "lgsm/config-default/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + fn_boostrap_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" fi if [ ! -f "${configdirserver}/_default.cfg" ];then mkdir -p "${configdirserver}" @@ -330,14 +330,14 @@ else source "${configdirserver}/_default.cfg" # Load the common.cfg config. If missing download it if [ ! -f "${configdirserver}/common.cfg" ];then - fn_boostrap_fetch_config "lgsm/config-default" "common-template.cfg" "${configdirserver}" "common.cfg" "${executecmd}" "noexecutecmd" "norun" "noforce" "nomd5" + fn_boostrap_fetch_config "lgsm/config-default/config-lgsm" "common-template.cfg" "${configdirserver}" "common.cfg" "${executecmd}" "noexecutecmd" "norun" "noforce" "nomd5" source "${configdirserver}/common.cfg" else source "${configdirserver}/common.cfg" fi # Load the instance.cfg config. If missing download it if [ ! -f "${configdirserver}/${servicename}.cfg" ];then - fn_boostrap_fetch_config "lgsm/config-default" "instance-template.cfg" "${configdirserver}" "${servicename}.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + fn_boostrap_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${servicename}.cfg" "noexecutecmd" "norun" "noforce" "nomd5" source "${configdirserver}/${servicename}.cfg" else source "${configdirserver}/${servicename}.cfg" From e40c541eebc5a16dddbcf0447f4a02d367f90fc7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 14 Apr 2017 13:50:09 +0100 Subject: [PATCH 0641/1895] renamed the default config location --- lgsm/functions/install_config.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 249e5291e..c67c1f7bd 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -17,12 +17,12 @@ fn_check_cfgdir(){ fi } -# Downloads default configs from Game-Server-Configs repo to lgsm/default-configs +# Downloads default configs from Game-Server-Configs repo to lgsm/config-default fn_fetch_default_config(){ - mkdir -pv "${lgsmdir}/default-configs" + mkdir -pv "${lgsmdir}/config-default" githuburl="https://github.com/GameServerManagers/Game-Server-Configs/master" for config in "${array_configs[@]}"; do - fileurl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master/${gamedirname}/${config}"; filedir="${lgsmdir}/default-configs"; filename="${config}"; executecmd="noexecute" run="norun"; force="noforce" + fileurl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master/${gamedirname}/${config}"; filedir="${lgsmdir}/config-default"; filename="${config}"; executecmd="noexecute" run="norun"; force="noforce" fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" done } @@ -34,13 +34,13 @@ fn_default_config_remote(){ echo "copying ${config} config file." fn_script_log_info "copying ${servercfg} config file." if [ "${config}" == "${servercfgdefault}" ]; then - cp -nv "${lgsmdir}/default-configs/${config}" "${servercfgfullpath}" + cp -nv "${lgsmdir}/config-default/${config}" "${servercfgfullpath}" elif [ "${gamename}" == "ARMA 3" ]&&[ "${config}" == "${networkcfgdefault}" ]; then - cp -nv "${lgsmdir}/default-configs/${config}" "${networkcfgfullpath}" + cp -nv "${lgsmdir}/config-default/${config}" "${networkcfgfullpath}" elif [ "${gamename}" == "Don't Starve Together" ]&&[ "${config}" == "${clustercfgdefault}" ]; then - cp -nv "${lgsmdir}/default-configs/${clustercfgdefault}" "${clustercfgfullpath}" + cp -nv "${lgsmdir}/config-default/${clustercfgdefault}" "${clustercfgfullpath}" else - cp -nv "${lgsmdir}/default-configs/${config}" "${servercfgdir}/${config}" + cp -nv "${lgsmdir}/config-default/${config}" "${servercfgdir}/${config}" fi done sleep 1 From 790f58e64d4ab7de9819ff8e7cb3f3182a65697d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 14 Apr 2017 13:52:10 +0100 Subject: [PATCH 0642/1895] further dir changes --- lgsm/functions/install_config.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index c67c1f7bd..0b6f7e744 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -22,7 +22,7 @@ fn_fetch_default_config(){ mkdir -pv "${lgsmdir}/config-default" githuburl="https://github.com/GameServerManagers/Game-Server-Configs/master" for config in "${array_configs[@]}"; do - fileurl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master/${gamedirname}/${config}"; filedir="${lgsmdir}/config-default"; filename="${config}"; executecmd="noexecute" run="norun"; force="noforce" + fileurl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master/${gamedirname}/${config}"; filedir="${lgsmdir}/config-default/config-game"; filename="${config}"; executecmd="noexecute" run="norun"; force="noforce" fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" done } @@ -34,13 +34,13 @@ fn_default_config_remote(){ echo "copying ${config} config file." fn_script_log_info "copying ${servercfg} config file." if [ "${config}" == "${servercfgdefault}" ]; then - cp -nv "${lgsmdir}/config-default/${config}" "${servercfgfullpath}" + cp -nv "${lgsmdir}/config-default/config-game/${config}" "${servercfgfullpath}" elif [ "${gamename}" == "ARMA 3" ]&&[ "${config}" == "${networkcfgdefault}" ]; then - cp -nv "${lgsmdir}/config-default/${config}" "${networkcfgfullpath}" + cp -nv "${lgsmdir}/config-default/config-game/${config}" "${networkcfgfullpath}" elif [ "${gamename}" == "Don't Starve Together" ]&&[ "${config}" == "${clustercfgdefault}" ]; then - cp -nv "${lgsmdir}/config-default/${clustercfgdefault}" "${clustercfgfullpath}" + cp -nv "${lgsmdir}/config-default/config-game/${clustercfgdefault}" "${clustercfgfullpath}" else - cp -nv "${lgsmdir}/config-default/${config}" "${servercfgdir}/${config}" + cp -nv "${lgsmdir}/config-default/config-game/${config}" "${servercfgdir}/${config}" fi done sleep 1 From be948aff4f8f37274d493a32823a9b49908dde00 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 15 Apr 2017 15:50:16 +0100 Subject: [PATCH 0643/1895] Testing updater --- lgsm/functions/command_update_functions.sh | 30 ++++--- lgsm/functions/core_dl.sh | 13 +++ linuxgsm.sh | 94 ++++++++-------------- 3 files changed, 66 insertions(+), 71 deletions(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 34dbb8115..2cfe3ac49 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -21,22 +21,32 @@ if [ -n "${rootdir}" ]; then exitcode=$? fi fi +# Check if 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 + curlcmd=${curlcmd} + break + fi +done +echo -ne " checking _default.cfg...\c" +function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlcmd} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${servername}/_default.cfg")) +if [ "${function_file_diff}" != "" ]; then + fn_print_update_eol_nl + fn_script_log_info "checking ${functionfile}: UPDATE" + rm -rf "${configdirdefault}/config-lgsm/${servername}/_default.cfg" + fn_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + +else + fn_print_ok_eol_nl +fi if [ -n "${functionsdir}" ]; then if [ -d "${functionsdir}" ]; then cd "${functionsdir}" for functionfile in * do - # Check if 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 - curlcmd=${curlcmd} - break - fi - done - echo -ne " checking ${functionfile}...\c" function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlcmd} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}")) if [ "${function_file_diff}" != "" ]; then diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index d6c9b58ca..6193cfaf8 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -177,6 +177,19 @@ fn_fetch_file(){ # force: force download of file even if exists # md5: Checks fail against an md5 sum +fn_fetch_config(){ + github_file_url_dir="${1}" # github dir containing the file + github_file_url_name="${2}" # name of the github file + githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" + fileurl="${githuburl}" + filedir="${3}" + filename="${4}" + executecmd="noexecutecmd" + run="norun" + force="noforce" + md5="nomd5" + fn_boostrap_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" +} # Fetches files from the github repo fn_fetch_file_github(){ diff --git a/linuxgsm.sh b/linuxgsm.sh index 558a4c5a0..9edad11d7 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -39,16 +39,32 @@ githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="feature/config" +# Core Functions that are required first +core_dl.sh(){ + functionfile="${FUNCNAME}" + fn_bootstrap_fetch_file +} + +core_functions.sh(){ + functionfile="${FUNCNAME}" + fn_bootstrap_fetch_file +} + # Bootstrap +# Fetches the core functions required before passed off to core_dl.sh -# Fetches bootstrap files (configs and core functions) -fn_boostrap_fetch_file(){ - fileurl="${1}" - filedir="${2}" - filename="${3}" - executecmd="${4:-0}" - run="${5:-0}" - force="${6:-0}" +# Fetches core functions +fn_bootstrap_fetch_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}" + filedir="${functionsdir}" + filename="${github_file_url_name}" + executecmd="executecmd" + run="run" + force="noforce" + md5="nomd5" # If the file is missing, then download if [ ! -f "${filedir}/${filename}" ]; then if [ ! -d "${filedir}" ]; then @@ -77,9 +93,7 @@ fn_boostrap_fetch_file(){ echo -e "\e[0;32mOK\e[0m" fi else - echo -e "\e[0;31mFAIL\e[0m\n" - echo "Curl is not installed!" - echo -e "" + echo "[ FAIL ] Curl is not installed" exit 1 fi # make file executecmd if executecmd is set @@ -96,40 +110,15 @@ fn_boostrap_fetch_file(){ fi } -fn_boostrap_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_boostrap_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" -} -fn_boostrap_fetch_config(){ - github_file_url_dir="${1}" # github dir containing the file - github_file_url_name="${2}" # name of the github file - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" - fileurl="${githuburl}" - filedir="${3}" - filename="${4}" - executecmd="noexecutecmd" - run="norun" - force="noforce" - md5="nomd5" - fn_boostrap_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" -} +# Installer menu fn_print_center() { columns="$(tput cols)" line="$@" printf "%*s\n" $(( (${#line} + columns) / 2)) "${line}" } -# Print horizontal line + fn_print_horizontal(){ char="${1:-=}" printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "${char}" @@ -310,12 +299,15 @@ if [ "${shortname}" == "core" ]; then fi # LinuxGSM Server Mode else + core_dl.sh + core_functions.sh + # Load LinuxGSM configs # These are required to get all the default variables for the specific server. # Load the default config. If missing download it. If changed reload it. if [ ! -f "${configdirdefault}/config-lgsm/${servername}/_default.cfg" ];then mkdir -p "${configdirdefault}/config-lgsm/${servername}" - fn_boostrap_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + fn_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" fi if [ ! -f "${configdirserver}/_default.cfg" ];then mkdir -p "${configdirserver}" @@ -330,39 +322,19 @@ else source "${configdirserver}/_default.cfg" # Load the common.cfg config. If missing download it if [ ! -f "${configdirserver}/common.cfg" ];then - fn_boostrap_fetch_config "lgsm/config-default/config-lgsm" "common-template.cfg" "${configdirserver}" "common.cfg" "${executecmd}" "noexecutecmd" "norun" "noforce" "nomd5" + fn_fetch_config "lgsm/config-default/config-lgsm" "common-template.cfg" "${configdirserver}" "common.cfg" "${executecmd}" "noexecutecmd" "norun" "noforce" "nomd5" source "${configdirserver}/common.cfg" else source "${configdirserver}/common.cfg" fi # Load the instance.cfg config. If missing download it if [ ! -f "${configdirserver}/${servicename}.cfg" ];then - fn_boostrap_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${servicename}.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${servicename}.cfg" "noexecutecmd" "norun" "noforce" "nomd5" source "${configdirserver}/${servicename}.cfg" else source "${configdirserver}/${servicename}.cfg" fi fi -######################## -######## Script ######## -###### Do not edit ##### -######################## - -core_dl.sh(){ -# Functions are defined in core_functions.sh. -functionfile="${FUNCNAME}" -fn_boostrap_fetch_function -} - -core_functions.sh(){ -# Functions are defined in core_functions.sh. -functionfile="${FUNCNAME}" -fn_boostrap_fetch_function -} - -core_dl.sh -core_functions.sh - getopt=$1 core_getopt.sh From 16c94f854a312e100fa7615e6b9c111379ef3dec Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 15 Apr 2017 16:04:35 +0100 Subject: [PATCH 0644/1895] fixing issues with curl --- lgsm/functions/command_update_functions.sh | 13 +++++++------ lgsm/functions/core_dl.sh | 10 +++++----- lgsm/functions/core_functions.sh | 10 +++++----- linuxgsm.sh | 8 ++++---- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 2cfe3ac49..bf101135d 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -21,17 +21,18 @@ if [ -n "${rootdir}" ]; then exitcode=$? fi fi -# Check if curl exists and use available path +# 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} +for curlpath in ${curlpaths} do - if [ -x "${curlcmd}" ]; then - curlcmd=${curlcmd} + if [ -x "${curlpath}" ]; then break fi done + + echo -ne " checking _default.cfg...\c" -function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlcmd} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${servername}/_default.cfg")) +function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${servername}/_default.cfg")) if [ "${function_file_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking ${functionfile}: UPDATE" @@ -48,7 +49,7 @@ if [ -n "${functionsdir}" ]; then for functionfile in * do echo -ne " checking ${functionfile}...\c" - function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlcmd} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}")) + function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}")) if [ "${function_file_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking ${functionfile}: UPDATE" diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 6193cfaf8..82b0f8ac9 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -106,25 +106,25 @@ fn_fetch_file(){ # 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} + for curlpath in ${curlpaths} do - if [ -x "${curlcmd}" ]; then + if [ -x "${curlpath}" ]; then break fi done # If curl exists download file - if [ "$(basename ${curlcmd})" == "curl" ]; then + if [ "$(basename ${curlpath})" == "curl" ]; then # trap to remove part downloaded files trap fn_fetch_trap INT # if larger file shows progress bar if [ "${filename##*.}" == "bz2" ]||[ "${filename##*.}" == "gz" ]||[ "${filename##*.}" == "zip" ]||[ "${filename##*.}" == "jar" ]; then echo -ne "downloading ${filename}..." sleep 1 - curlcmd=$(${curlcmd} --progress-bar --fail -L -o "${filedir}/${filename}" "${fileurl}") + curlcmd=$(${curlpath} --progress-bar --fail -L -o "${filedir}/${filename}" "${fileurl}") echo -ne "downloading ${filename}..." else echo -ne " fetching ${filename}...\c" - curlcmd=$(${curlcmd} -s --fail -L -o "${filedir}/${filename}" "${fileurl}" 2>&1) + curlcmd=$(${curlpath} -s --fail -L -o "${filedir}/${filename}" "${fileurl}" 2>&1) fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 1738928ca..28a6dd7f7 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -56,18 +56,18 @@ if [ ! -f "${filedir}/${filename}" ]; then 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} + for curlpath in ${curlpaths} do - if [ -x "${curlcmd}" ]; then + if [ -x "${curlpath}" ]; 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 [ "$(basename ${curlpath})" == "curl" ]; then + curlcmd=$(${curlpath} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) if [ $? -ne 0 ]; then echo -e "${red}FAIL${default}\n" - echo "${curlfetch}" + echo "${curlcmd}" echo -e "${githuburl}\n" exit 1 else diff --git a/linuxgsm.sh b/linuxgsm.sh index 9edad11d7..d4a68c534 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -72,17 +72,17 @@ fn_bootstrap_fetch_file(){ 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} + for curlpath in ${curlpaths} do - if [ -x "${curlcmd}" ]; then + if [ -x "${curlpath}" ]; then break fi done # If curl exists download file - if [ "$(basename ${curlcmd})" == "curl" ]; then + if [ "$(basename ${curlpath})" == "curl" ]; then # trap to remove part downloaded files echo -ne " fetching ${filename}...\c" - curlcmd=$(${curlcmd} -s --fail -L -o "${filedir}/${filename}" "${fileurl}" 2>&1) + curlcmd=$(${curlpath} -s --fail -L -o "${filedir}/${filename}" "${fileurl}" 2>&1) local exitcode=$? if [ ${exitcode} -ne 0 ]; then echo -e "\e[0;31mFAIL\e[0m\n" From a98b72cb6f65cbac7dd1a4fea9e8315665c7a645 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 15 Apr 2017 16:16:21 +0100 Subject: [PATCH 0645/1895] Corrected curl paths many curl references were not using curlpath --- lgsm/functions/alert_pushbullet.sh | 2 +- lgsm/functions/command_postdetails.sh | 6 +- lgsm/functions/command_update_functions.sh | 19 +----- lgsm/functions/core_dl.sh | 10 +++ lgsm/functions/core_functions.sh | 79 ---------------------- lgsm/functions/update_factorio.sh | 2 +- lgsm/functions/update_minecraft.sh | 2 +- lgsm/functions/update_mumble.sh | 2 +- 8 files changed, 18 insertions(+), 104 deletions(-) diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh index 05276b010..8e46b95a6 100644 --- a/lgsm/functions/alert_pushbullet.sh +++ b/lgsm/functions/alert_pushbullet.sh @@ -11,7 +11,7 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_print_dots "Sending Pushbullet alert" sleep 1 -pushbulletsend=$(curl --silent -u """${pushbullettoken}"":" -d channel_tag="${channeltag}" -d type="note" -d body="${alertbody}" -d title="${alertsubject}" 'https://api.pushbullet.com/v2/pushes'|grep -o invalid_access_token|uniq) +pushbulletsend=$(${curlpath} --silent -u """${pushbullettoken}"":" -d channel_tag="${channeltag}" -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" diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index b4169023a..e535e554c 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -112,12 +112,12 @@ if [ "${posttarget}" == "http://pastebin.com" ] ; then fn_print_dots "Posting details to pastbin.com for ${postexpire}" sleep 1 # grab the return from 'value' from an initial visit to pastebin. - csrftoken=$(curl -s "${posttarget}" | + csrftoken=$(${curlpath} -s "${posttarget}" | sed -n 's/^.*input type="hidden" name="csrf_token_post" value="\(.*\)".*$/\1/p') # # Use the csrftoken to then post the content. # - link=$(curl -s "${posttarget}/post.php" -D - -F "submit_hidden=submit_hidden" \ + link=$(${curlpath} -s "${posttarget}/post.php" -D - -F "submit_hidden=submit_hidden" \ -F "post_key=${csrftoken}" -F "paste_expire_date=${postexpire}" \ -F "paste_name=${gamename} Debug Info" \ -F "paste_format=8" -F "paste_private=0" \ @@ -133,7 +133,7 @@ elif [ "${posttarget}" == "https://hastebin.com" ] ; then # hastebin is a bit simpler. If successful, the returned result # should look like: {"something":"key"}, putting the reference that # we need in "key". TODO - error handling. -CedarLUG - link=$(curl -H "HTTP_X_REQUESTED_WITH:XMLHttpRequest" -s -d "$(<${tmpfile})" "${posttarget}/documents" | cut -d\" -f4) + link=$(${curlpath} -H "HTTP_X_REQUESTED_WITH:XMLHttpRequest" -s -d "$(<${tmpfile})" "${posttarget}/documents" | cut -d\" -f4) fn_print_ok_nl "Posting details to hastebin.com for ${postexpire}" echo " Please share the following url for support: ${posttarget}/${link}" else diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index bf101135d..a1013b96b 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -1,4 +1,4 @@ -#!/bin/bash +aa#!/bin/bash # LinuxGSM command_update_functions.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com @@ -14,23 +14,6 @@ check.sh fn_script_log_info "Updating functions" echo -ne "\n" -# Removed legacy functions dir -if [ -n "${rootdir}" ]; then - if [ -d "${rootdir}/functions/" ]; then - rm -rfv "${rootdir}/functions/" - exitcode=$? - fi -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 curlpath in ${curlpaths} -do - if [ -x "${curlpath}" ]; then - break - fi -done - - echo -ne " checking _default.cfg...\c" function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${servername}/_default.cfg")) if [ "${function_file_diff}" != "" ]; then diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 82b0f8ac9..7d51d91da 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -236,3 +236,13 @@ fn_update_function(){ md5="nomd5" fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" } + + +# Defines curl 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 curlpath in "${curlpaths}" +do + if [ -x "${curlpath}" ]; then + break + fi +done \ No newline at end of file diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 28a6dd7f7..736829e9f 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -5,85 +5,6 @@ # 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 will not load. -# Fixes for legacy code -if [ "${gamename}" == "ARK: Survivial Evolved" ]; then - gamename="ARK: Survival Evolved" -elif [ "${gamename}" == "Teamspeak 3" ]; then - gamename="TeamSpeak 3" -elif [ "${gamename}" == "Counter Strike: Global Offensive" ]; then - gamename="Counter-Strike: Global Offensive" -elif [ "${gamename}" == "Counter Strike: Source" ]; then - gamename="Counter-Strike: Source" -elif [ "${gamename}" == "Quake Live" ]; then - engine="idtech3_ql" -fi - -if [ "${emailnotification}" == "on" ]; then - emailalert="on" -fi - -## Code/functions for legacy servers -fn_functions(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -fn_getopt(){ -functionfile="${FUNCNAME}" -fn_fetch_function -} - -## In case older versions are missing these vars -if [ -z "${lgsmdir}" ]||[ -z "${functionsdir}" ]||[ -z "${libdir}" ]||[ -z "${tmpdir}" ]; then - lgsmdir="${rootdir}/lgsm" - functionsdir="${lgsmdir}/functions" - libdir="${lgsmdir}/lib" - tmpdir="${lgsmdir}/tmp" -fi - -## fn_fetch_core_dl placed here to allow legacy servers to still download core functions -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 curlpath in ${curlpaths} - do - if [ -x "${curlpath}" ]; then - break - fi - done - # If curl exists download file - if [ "$(basename ${curlpath})" == "curl" ]; then - curlcmd=$(${curlpath} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1) - if [ $? -ne 0 ]; then - echo -e "${red}FAIL${default}\n" - echo "${curlcmd}" - echo -e "${githuburl}\n" - exit 1 - else - echo -e "${green}OK${default}" - fi - else - echo -e "${red}FAIL${default}\n" - echo "Curl is not installed!" - echo -e "" - exit 1 - fi - chmod +x "${filedir}/${filename}" -fi -source "${filedir}/${filename}" -} - # Creates tmp dir if missing if [ ! -d "${tmpdir}" ]; then mkdir -p "${tmpdir}" diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index cbb39ef18..e14ff5932 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -76,7 +76,7 @@ fn_update_factorio_arch(){ fn_update_factorio_availablebuild(){ # Gets latest build info. - availablebuild=$(curl -s https://www.factorio.com/download-headless/stable | grep 'headless/linux64' | head -n 1 | grep -oP '(?<=get-download/).*?(?=/)') + availablebuild=$(${curlpath} -s https://www.factorio.com/download-headless/stable | grep 'headless/linux64' | head -n 1 | grep -oP '(?<=get-download/).*?(?=/)') sleep 1 # Checks if availablebuild variable has been set diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index cf45946b0..c54300b78 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -69,7 +69,7 @@ fn_update_currentbuild(){ fn_update_availablebuild(){ # Gets latest build info. - availablebuild=$(curl -s "https://launchermeta.mojang.com/mc/game/version_manifest.json" | sed -e 's/^.*"release":"\([^"]*\)".*$/\1/') + availablebuild=$(${curlpath} -s "https://launchermeta.mojang.com/mc/game/version_manifest.json" | sed -e 's/^.*"release":"\([^"]*\)".*$/\1/') sleep 1 # Checks if availablebuild variable has been set diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index b77cb3ac4..e90b8276b 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -76,7 +76,7 @@ fn_update_mumble_arch(){ fn_update_mumble_availablebuild(){ # Gets latest build info. - availablebuild=$(curl -s https://api.github.com/repos/mumble-voip/mumble/releases/latest | grep 'murmur-static_x86.*\.bz2"' | tail -1 | awk -F"/" '{ print $8 }') + availablebuild=$(${curlpath} -s https://api.github.com/repos/mumble-voip/mumble/releases/latest | grep 'murmur-static_x86.*\.bz2"' | tail -1 | awk -F"/" '{ print $8 }') sleep 1 # Checks if availablebuild variable has been set From fbc24c6dfcb7e49d0b3b85b6b3e82038875076ce Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 15 Apr 2017 16:42:04 +0100 Subject: [PATCH 0646/1895] removed fn_fetch_core_dl --- lgsm/functions/core_functions.sh | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 736829e9f..461fc602e 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -13,29 +13,28 @@ fi # Core core_dl.sh(){ -# Functions are defined in core_functions.sh. functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_fetch_function } core_exit.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_fetch_function } core_getopt.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_fetch_function } core_trap.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_fetch_function } core_messages.sh(){ functionfile="${FUNCNAME}" -fn_fetch_core_dl +fn_fetch_function } From b20a33dd35575f15b086f63abb48ef186bd0a9ac Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 15 Apr 2017 16:49:23 +0100 Subject: [PATCH 0647/1895] bug --- lgsm/functions/command_update_functions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index a1013b96b..fcf06992a 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -1,4 +1,4 @@ -aa#!/bin/bash +#!/bin/bash # LinuxGSM command_update_functions.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com From 6e5a93a82723213acaad93445e23cf4ba8184188 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 15 Apr 2017 16:55:01 +0100 Subject: [PATCH 0648/1895] corrected path --- lgsm/functions/command_update_functions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index fcf06992a..363fcb2a4 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -15,7 +15,7 @@ fn_script_log_info "Updating functions" echo -ne "\n" echo -ne " checking _default.cfg...\c" -function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${servername}/_default.cfg")) +function_file_diff=$(diff "${configdirdefault}/config-lgsm/${servername}/_default.cfg" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${servername}/_default.cfg")) if [ "${function_file_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking ${functionfile}: UPDATE" From aac5af596d20e5145ef621e21cdea71577121940 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 15 Apr 2017 17:14:15 +0100 Subject: [PATCH 0649/1895] Updated ui --- lgsm/functions/command_update_functions.sh | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 363fcb2a4..cf711023f 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -8,34 +8,35 @@ local commandname="UPDATE LinuxGSM" local commandaction="Update LinuxGSM" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -fn_print_dots "Updating functions" +fn_print_dots "Updating LinuxGSM" sleep 1 check.sh -fn_script_log_info "Updating functions" +fn_script_log_info "Updating LinuxGSM" echo -ne "\n" -echo -ne " checking _default.cfg...\c" -function_file_diff=$(diff "${configdirdefault}/config-lgsm/${servername}/_default.cfg" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${servername}/_default.cfg")) -if [ "${function_file_diff}" != "" ]; then +# Check and update _default.cfg +echo -ne " checking config _default.cfg...\c" +config_file_diff=$(diff "${configdirdefault}/config-lgsm/${servername}/_default.cfg" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${servername}/_default.cfg")) +if [ "${config_file_diff}" != "" ]; then fn_print_update_eol_nl - fn_script_log_info "checking ${functionfile}: UPDATE" - rm -rf "${configdirdefault}/config-lgsm/${servername}/_default.cfg" + fn_script_log_info "checking config _default.cfg: UPDATE" + rm -f "${configdirdefault}/config-lgsm/${servername}/_default.cfg" fn_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" - else fn_print_ok_eol_nl fi +# Check and update functions if [ -n "${functionsdir}" ]; then if [ -d "${functionsdir}" ]; then cd "${functionsdir}" for functionfile in * do - echo -ne " checking ${functionfile}...\c" + echo -ne " checking function ${functionfile}...\c" function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}")) if [ "${function_file_diff}" != "" ]; then fn_print_update_eol_nl - fn_script_log_info "checking ${functionfile}: UPDATE" + fn_script_log_info "checking function ${functionfile}: UPDATE" rm -rf "${functionsdir}/${functionfile}" fn_update_function else From 0442559cc92cbd973bc3103e1cb3382459f8dea9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Apr 2017 13:52:36 +0100 Subject: [PATCH 0650/1895] Steamlining bootstrap process --- lgsm/functions/core_functions.sh | 14 ++++++++------ linuxgsm.sh | 9 ++------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 461fc602e..a821bf95b 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -14,7 +14,7 @@ fi core_dl.sh(){ functionfile="${FUNCNAME}" -fn_fetch_function +fn_bootstrap_fetch_file } core_exit.sh(){ @@ -34,7 +34,7 @@ fn_fetch_function core_messages.sh(){ functionfile="${FUNCNAME}" -fn_fetch_function +fn_bootstrap_fetch_file } @@ -541,11 +541,13 @@ functionfile="${FUNCNAME}" fn_fetch_function } +# Calls on-screen messages (bootstrap) +core_messages.sh + +#Calls file downloader (bootstrap) +core_dl.sh + # Calls the global Ctrl-C trap core_trap.sh -# Calls on-screen messages -core_messages.sh -#Calls file downloader -core_dl.sh diff --git a/linuxgsm.sh b/linuxgsm.sh index d4a68c534..a76833bbe 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -39,12 +39,7 @@ githubuser="GameServerManagers" githubrepo="LinuxGSM" githubbranch="feature/config" -# Core Functions that are required first -core_dl.sh(){ - functionfile="${FUNCNAME}" - fn_bootstrap_fetch_file -} - +# Core Function that is required first core_functions.sh(){ functionfile="${FUNCNAME}" fn_bootstrap_fetch_file @@ -297,9 +292,9 @@ if [ "${shortname}" == "core" ]; then else fn_install_getopt fi + # LinuxGSM Server Mode else - core_dl.sh core_functions.sh # Load LinuxGSM configs From 6fbd530633ca43f0f46278d01b630a30f7f9d1d9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Apr 2017 19:24:27 +0100 Subject: [PATCH 0651/1895] renamed filesdir to serverfiles makign it easier to understand by changing the var to serverfiles (the actual name of the directory --- README.md | 2 +- .../config-lgsm/arkserver/_default.cfg | 2 +- .../config-lgsm/arma3server/_default.cfg | 4 +- .../config-lgsm/csgoserver/_default.cfg | 4 +- .../config-lgsm/sdtdserver/_default.cfg | 6 +- lgsm/functions/check_permissions.sh | 6 +- lgsm/functions/command_dev_detect_glibc.sh | 14 +- lgsm/functions/command_dev_detect_ldd.sh | 14 +- lgsm/functions/command_stop.sh | 4 +- lgsm/functions/command_validate.sh | 4 +- lgsm/functions/compress_unreal2_maps.sh | 6 +- lgsm/functions/compress_ut99_maps.sh | 6 +- lgsm/functions/core_dl.sh | 261 +++++++++--------- lgsm/functions/fix_csgo.sh | 4 +- lgsm/functions/fix_dst.sh | 4 +- lgsm/functions/fix_ins.sh | 2 +- lgsm/functions/fix_kf.sh | 4 +- lgsm/functions/fix_ro.sh | 4 +- lgsm/functions/fix_steamcmd.sh | 12 +- lgsm/functions/fix_ut2k4.sh | 4 +- lgsm/functions/info_distro.sh | 4 +- lgsm/functions/install_factorio_save.sh | 2 +- lgsm/functions/install_minecraft_eula.sh | 4 +- lgsm/functions/install_server_dir.sh | 6 +- lgsm/functions/install_server_files.sh | 22 +- lgsm/functions/install_ts3db.sh | 2 +- .../install_unreal_tournament_eula.sh | 4 +- lgsm/functions/update_factorio.sh | 6 +- lgsm/functions/update_minecraft.sh | 10 +- lgsm/functions/update_mta.sh | 6 +- lgsm/functions/update_mumble.sh | 6 +- lgsm/functions/update_steamcmd.sh | 8 +- lgsm/functions/update_ts3.sh | 6 +- linuxgsm.sh | 25 +- tests/tests_jc2server.sh | 12 +- tests/tests_ts3server.sh | 8 +- 36 files changed, 246 insertions(+), 252 deletions(-) diff --git a/README.md b/README.md index 72e57fa62..3a6cf9d5a 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ If you want to donate to the project you can via PayPal. I have had a may kind p

  • Wiki
  • GitHub Code
  • GitHub Issues
  • -
  • Waffle (Github Dashboard)
  • +
  • Waffle (GitHub Dashboard)
  • alternativeTo.net
  • Social

    diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 6c4d453bf..8378e9cec 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -65,7 +65,7 @@ engine="unreal4" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/ShooterGame" +systemdir="${serverfiles}/ShooterGame" executabledir="${systemdir}/Binaries/Linux" executable="./ShooterGameServer" servercfgdir="${systemdir}/Saved/Config/LinuxServer" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index f551c8d66..4dc8a264c 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -73,8 +73,8 @@ engine="realvirtuality" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./arma3server" servercfg="${servicename}.server.cfg" networkcfg="${servicename}.network.cfg" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 3c7a1aea8..fdbb7a272 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -89,8 +89,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/csgo" -executabledir="${filesdir}" +systemdir="${serverfiles}/csgo" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index ad8476ddb..d537643cc 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -65,12 +65,12 @@ engine="unity3d" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./7DaysToDieServer.x86" servercfg="${servicename}.xml" servercfgdefault="serverconfig.xml" -servercfgdir="${filesdir}" +servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 24648f2ec..61cd9d472 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -18,8 +18,8 @@ fn_check_ownership(){ funcownissue=1 fi fi - if [ -d "${filesdir}" ]; then - if [ $(find "${filesdir}" -not -user $(whoami)|wc -l) -ne "0" ]; then + if [ -d "${serverfiles}" ]; then + if [ $(find "${serverfiles}" -not -user $(whoami)|wc -l) -ne "0" ]; then filesownissue=1 fi fi @@ -37,7 +37,7 @@ fn_check_ownership(){ find "${functionsdir}" -not -user $(whoami) -printf "%u\t\t%g\t%p\n" fi if [ "${filesownissue}" == "1" ]; then - find "${filesdir}" -not -user $(whoami) -printf "%u\t\t%g\t%p\n" + find "${serverfiles}" -not -user $(whoami) -printf "%u\t\t%g\t%p\n" fi } | column -s $'\t' -t | tee -a "${scriptlog}" diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index 536a12c2a..12f3e3069 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -15,21 +15,21 @@ if [ -z "$(command -v objdump)" ]; then core_exit.sh fi -if [ -z "${filesdir}" ]; then +if [ -z "${serverfiles}" ]; then dir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" fi -if [ -d "${filesdir}" ]; then +if [ -d "${serverfiles}" ]; then echo "Checking directory: " - echo "${filesdir}" -elif [ -f "${filesdir}" ]; then + echo "${serverfiles}" +elif [ -f "${serverfiles}" ]; then echo "Checking file: " - echo "${filesdir}" + echo "${serverfiles}" fi echo "" -files=$(find ${filesdir} | wc -l) -find ${filesdir} -type f -print0 | +files=$(find ${serverfiles} | wc -l) +find ${serverfiles} -type f -print0 | while IFS= read -r -d $'\0' line; do objdump -T $line 2>/dev/null|grep -oP "GLIBC[^ ]+" >>"${tmpdir}/detect_glibc.tmp" echo -n "$i / $files" $'\r' diff --git a/lgsm/functions/command_dev_detect_ldd.sh b/lgsm/functions/command_dev_detect_ldd.sh index 4e1c7b2b3..312b037a4 100644 --- a/lgsm/functions/command_dev_detect_ldd.sh +++ b/lgsm/functions/command_dev_detect_ldd.sh @@ -9,21 +9,21 @@ echo "=================================" echo "Shared Object dependencies Checker" echo "=================================" -if [ -z "${filesdir}" ]; then +if [ -z "${serverfiles}" ]; then dir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" fi -if [ -d "${filesdir}" ]; then +if [ -d "${serverfiles}" ]; then echo "Checking directory: " - echo "${filesdir}" -elif [ -f "${filesdir}" ]; then + echo "${serverfiles}" +elif [ -f "${serverfiles}" ]; then echo "Checking file: " - echo "${filesdir}" + echo "${serverfiles}" fi echo "" -files=$(find "${filesdir}" | wc -l) -find "${filesdir}" -type f -print0 | +files=$(find "${serverfiles}" | wc -l) +find "${serverfiles}" -type f -print0 | while IFS= read -r -d $'\0' line; do #ldd -v $line 2>/dev/null|grep "=>" >>"${tmpdir}/detect_ldd.tmp" if [ -n "$(ldd $line 2>/dev/null |grep -v "not a dynamic executable")" ]; then diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index fe88c43ce..3996f523e 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -252,7 +252,7 @@ fn_stop_ark(){ if [ -z "${queryport}" ]; then fn_print_warn "No queryport found using info_config.sh" fn_script_log_warn "No queryport found using info_config.sh" - userconfigfile="${filesdir}" + userconfigfile="${serverfiles}" userconfigfile+="/ShooterGame/Saved/Config/LinuxServer/GameUserSettings.ini" queryport=$(grep ^QueryPort= ${userconfigfile} | cut -d= -f2 | sed "s/[^[:digit:].*].*//g") fi @@ -291,7 +291,7 @@ fn_stop_ark(){ fn_stop_teamspeak3(){ fn_print_dots "${servername}" sleep 0.5 - "${filesdir}"/ts3server_startscript.sh stop > /dev/null 2>&1 + "${serverfiles}"/ts3server_startscript.sh stop > /dev/null 2>&1 check_status.sh if [ "${status}" == "0" ]; then # Remove lockfile diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index eb6d13c15..f2fa5638b 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -27,9 +27,9 @@ fn_validation(){ fi if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" fi if [ $? != 0 ]; then fn_print_fail_nl "Validating files: SteamCMD" diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh index 7ef8bfeea..abd84f414 100644 --- a/lgsm/functions/compress_unreal2_maps.sh +++ b/lgsm/functions/compress_unreal2_maps.sh @@ -21,10 +21,10 @@ if ! fn_prompt_yn "Start compression?" Y; then echo Exiting; return fi mkdir -pv "${compressedmapsdir}" > /dev/null 2>&1 -rm -rfv "${filesdir}/Maps/"*.ut2.uz2 +rm -rfv "${serverfiles}/Maps/"*.ut2.uz2 cd "${systemdir}" -for map in "${filesdir}/Maps/"*; do +for map in "${serverfiles}/Maps/"*; do ./ucc-bin compress "${map}" --nohomedir done -mv -fv "${filesdir}/Maps/"*.ut2.uz2 "${compressedmapsdir}" +mv -fv "${serverfiles}/Maps/"*.ut2.uz2 "${compressedmapsdir}" core_exit.sh diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh index e74ec727c..e81117e7b 100644 --- a/lgsm/functions/compress_ut99_maps.sh +++ b/lgsm/functions/compress_ut99_maps.sh @@ -21,10 +21,10 @@ if ! fn_prompt_yn "Start compression?" Y; then echo Exiting; return fi mkdir -pv "${compressedmapsdir}" > /dev/null 2>&1 -rm -rfv "${filesdir}/Maps/"*.unr.uz +rm -rfv "${serverfiles}/Maps/"*.unr.uz cd "${systemdir}" -for map in "${filesdir}/Maps/"*; do +for map in "${serverfiles}/Maps/"*; do ./ucc-bin compress "${map}" --nohomedir done -mv -fv "${filesdir}/Maps/"*.unr.uz "${compressedmapsdir}" +mv -fv "${serverfiles}/Maps/"*.unr.uz "${compressedmapsdir}" core_exit.sh diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 7d51d91da..7d24f9436 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -5,17 +5,17 @@ # Website: https://gameservermanagers.com # Description: Deals with all downloads for LinuxGSM. -# 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 +# remote_fileurl: The URL of the file: http://example.com/dl/File.tar.bz2 +# local_filedir: location the file is to be saved: /home/server/lgsm/tmp +# local_filename: name of file (this can be different from the url name): file.tar.bz2 +# chmodx: Optional, set to "chmodx" to make file executable using chmod +x +# run: Optional, set run to execute the file after download +# forcedl: Optional, force re-download of file even if exists +# md5: Optional, set an md5 sum and will compare it against the file. # # 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_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" +# fn_fetch_file "http://example.com/file.tar.bz2" "/some/dir" "file.tar.bz2" "chmodx" "run" "forcedl" "10cd7353aa9d758a075c600a6dd193fd" local commandname="DOWNLOAD" local commandaction="Download" @@ -24,50 +24,50 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_dl_md5(){ # Runs MD5 Check if available if [ "${md5}" != "0" ]&&[ "${md5}" != "nomd5" ]; then - echo -ne "verifying ${filename} with MD5..." + echo -ne "verifying ${local_filename} with MD5..." sleep 1 - local md5sumcmd=$(md5sum "${filedir}/${filename}"|awk '{print $1;}') + local md5sumcmd=$(md5sum "${local_filedir}/${local_filename}"|awk '{print $1;}') if [ "${md5sumcmd}" != "${md5}" ]; then fn_print_fail_eol_nl - echo "${filename} returned MD5 checksum: ${md5sumcmd}" + echo "${local_filename} returned MD5 checksum: ${md5sumcmd}" echo "expected MD5 checksum: ${md5}" - fn_script_log_fatal "Verifying ${filename} with MD5: FAIL" - fn_script_log_info "${filename} returned MD5 checksum: ${md5sumcmd}" + fn_script_log_fatal "Verifying ${local_filename} with MD5: FAIL" + fn_script_log_info "${local_filename} returned MD5 checksum: ${md5sumcmd}" fn_script_log_info "Expected MD5 checksum: ${md5}" core_exit.sh else fn_print_ok_eol_nl - fn_script_log_pass "Verifying ${filename} with MD5: OK" - fn_script_log_info "${filename} returned MD5 checksum: ${md5sumcmd}" + fn_script_log_pass "Verifying ${local_filename} with MD5: OK" + fn_script_log_info "${local_filename} returned MD5 checksum: ${md5sumcmd}" fn_script_log_info "Expected MD5 checksum: ${md5}" fi fi } -# Extracts bzip2 or gzip or zip files +# Extracts bzip2, gzip or zip files # Extracts can be defined in code like so: -# fn_dl_extract "${filedir}" "${filename}" "${extractdir}" +# fn_dl_extract "${local_filedir}" "${local_filename}" "${extractdir}" # fn_dl_extract "/home/gameserver/lgsm/tmp" "file.tar.bz2" "/home/gamserver/serverfiles" fn_dl_extract(){ - filedir="${1}" - filename="${2}" + local_filedir="${1}" + local_filename="${2}" extractdir="${3}" # extracts archives - echo -ne "extracting ${filename}..." - mime=$(file -b --mime-type "${filedir}/${filename}") + echo -ne "extracting ${local_filename}..." + mime=$(file -b --mime-type "${local_filedir}/${local_filename}") if [ "${mime}" == "application/gzip" ]||[ "${mime}" == "application/x-gzip" ]; then - tarcmd=$(tar -zxf "${filedir}/${filename}" -C "${extractdir}") + extractcmd=$(tar -zxf "${local_filedir}/${local_filename}" -C "${extractdir}") elif [ "${mime}" == "application/x-bzip2" ]; then - tarcmd=$(tar -jxf "${filedir}/${filename}" -C "${extractdir}") + extractcmd=$(tar -jxf "${local_filedir}/${local_filename}" -C "${extractdir}") elif [ "${mime}" == "application/zip" ]; then - tarcmd=$(unzip -d "${extractdir}" "${filedir}/${filename}") + extractcmd=$(unzip -d "${extractdir}" "${local_filedir}/${local_filename}") fi local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Extracting download: FAIL" - echo "${tarcmd}" | tee -a "${scriptlog}" + echo "${extractcmd}" | tee -a "${scriptlog}" core_exit.sh else fn_print_ok_eol_nl @@ -78,163 +78,155 @@ fn_dl_extract(){ # Trap to remove file download if canceled before completed fn_fetch_trap(){ echo "" - echo -ne "downloading ${filename}..." + echo -ne "downloading ${local_filename}..." fn_print_canceled_eol_nl - fn_script_log_info "Downloading ${filename}...CANCELED" + fn_script_log_info "Downloading ${local_filename}...CANCELED" sleep 1 - rm -f "${filedir}/${filename}" | tee -a "${scriptlog}" - echo -ne "downloading ${filename}..." + rm -f "${local_filedir}/${local_filename}" | tee -a "${scriptlog}" + echo -ne "downloading ${local_filename}..." fn_print_removed_eol_nl - fn_script_log_info "Downloading ${filename}...REMOVED" + fn_script_log_info "Downloading ${local_filename}...REMOVED" core_exit.sh } fn_fetch_file(){ - fileurl="${1}" - filedir="${2}" - filename="${3}" - executecmd="${4:-0}" + remote_fileurl="${1}" + local_filedir="${2}" + local_filename="${3}" + chmodx="${4:-0}" run="${5:-0}" - force="${6:-0}" + forcedl="${6:-0}" md5="${7:-0}" # If the file is missing, then download - if [ ! -f "${filedir}/${filename}" ]; then - if [ ! -d "${filedir}" ]; then - mkdir -p "${filedir}" + if [ ! -f "${local_filedir}/${local_filename}" ]; then + if [ ! -d "${local_filedir}" ]; then + mkdir -p "${local_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 curlpath in ${curlpaths} - do - if [ -x "${curlpath}" ]; then - break - fi - done - # If curl exists download file - if [ "$(basename ${curlpath})" == "curl" ]; then - # trap to remove part downloaded files - trap fn_fetch_trap INT - # if larger file shows progress bar - if [ "${filename##*.}" == "bz2" ]||[ "${filename##*.}" == "gz" ]||[ "${filename##*.}" == "zip" ]||[ "${filename##*.}" == "jar" ]; then - echo -ne "downloading ${filename}..." - sleep 1 - curlcmd=$(${curlpath} --progress-bar --fail -L -o "${filedir}/${filename}" "${fileurl}") - echo -ne "downloading ${filename}..." - else - echo -ne " fetching ${filename}...\c" - curlcmd=$(${curlpath} -s --fail -L -o "${filedir}/${filename}" "${fileurl}" 2>&1) - fi - local exitcode=$? - if [ ${exitcode} -ne 0 ]; then - fn_print_fail_eol_nl - if [ -f "${scriptlog}" ]; then - fn_script_log_fatal "Downloading ${filename}: FAIL" - fi - echo -e "${fileurl}" | tee -a "${scriptlog}" - echo "${curlcmd}" | tee -a "${scriptlog}" - core_exit.sh - else - fn_print_ok_eol_nl - if [ -f "${scriptlog}" ]; then - fn_script_log_pass "Downloading ${filename}: OK" - fi - fi - # remove trap - trap - INT + # Trap will remove part downloaded files if canceled + trap fn_fetch_trap INT + # if larger file shows progress bar + if [ "${local_filename##*.}" == "bz2" ]||[ "${local_filename##*.}" == "gz" ]||[ "${local_filename##*.}" == "zip" ]||[ "${local_filename##*.}" == "jar" ]; then + echo -ne "downloading ${local_filename}..." + sleep 1 + curlcmd=$(${curlpath} --progress-bar --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}") + echo -ne "downloading ${local_filename}..." else + echo -ne " fetching ${local_filename}...\c" + curlcmd=$(${curlpath} -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) + fi + local exitcode=$? + if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - echo "Curl is not installed!" - echo -e "" if [ -f "${scriptlog}" ]; then - fn_script_log_fatal "Curl is not installed!" + fn_script_log_fatal "Downloading ${local_filename}: FAIL" fi + echo -e "${remote_fileurl}" | tee -a "${scriptlog}" + echo "${curlcmd}" | tee -a "${scriptlog}" core_exit.sh + else + fn_print_ok_eol_nl + if [ -f "${scriptlog}" ]; then + fn_script_log_pass "Downloading ${local_filename}: OK" + fi fi - # make file executecmd if executecmd is set - if [ "${executecmd}" == "executecmd" ]; then - chmod +x "${filedir}/${filename}" + # Remove trap + trap - INT + # Make file executable if chmodx is set + if [ "${chmodx}" == "chmodx" ]; then + chmod +x "${local_filedir}/${local_filename}" fi fi - if [ -f "${filedir}/${filename}" ]; then + if [ -f "${local_filedir}/${local_filename}" ]; then fn_dl_md5 - # run file if run is set + # Execute file if run is set if [ "${run}" == "run" ]; then - source "${filedir}/${filename}" + source "${local_filedir}/${local_filename}" fi fi } +# GitHub file download functions +# Used to simplify downloading specific files from GitHub -# 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 +# github_file_url_dir: the directory of the file in the GitHub: lgsm/functions +# github_file_url_name: the filename of the file to download from GitHub: core_messages.sh +# githuburl: the full GitHub url -fn_fetch_config(){ - github_file_url_dir="${1}" # github dir containing the file - github_file_url_name="${2}" # name of the github file - githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" - fileurl="${githuburl}" - filedir="${3}" - filename="${4}" - executecmd="noexecutecmd" - run="norun" - force="noforce" - md5="nomd5" - fn_boostrap_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" -} +# remote_fileurl: The URL of the file: http://example.com/dl/File.tar.bz2 +# local_filedir: location the file is to be saved: /home/server/lgsm/tmp +# local_filename: name of file (this can be different from the url name): file.tar.bz2 +# chmodx: Optional, set to "chmodx" to make file executable using chmod +x +# run: Optional, set run to execute the file after download +# forcedl: Optional, force re-download of file even if exists +# md5: Optional, set an md5 sum and will compare it against the file. -# Fetches files from the github repo +# Fetches any 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}" + + remote_fileurl="${githuburl}" + local_filedir="${3}" + local_filename="${github_file_url_name}" + chmodx="${4:-0}" run="${5:-0}" - force="${6:-0}" + forcedl="${6:-0}" md5="${7:-0}" - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + # Passes vars to the file download function + fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } +fn_fetch_config(){ + 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}" + + remote_fileurl="${githuburl}" + local_filedir="${3}" + local_filename="${4}" + chmodx="noexecutecmd" + run="norun" + forcedl="noforce" + md5="nomd5" + # Passes vars to the file download function + fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${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 + github_file_url_dir="lgsm/functions" + github_file_url_name="${functionfile}" 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" + + remote_fileurl="${githuburl}" + local_filedir="${functionsdir}" + local_filename="${github_file_url_name}" + chmodx="chmodx" run="run" - force="noforce" + forcedl="noforce" md5="nomd5" - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + # Passes vars to the file download function + fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } fn_update_function(){ exitbypass=1 - github_file_url_dir="lgsm/functions" # github dir containing the file - github_file_url_name="${functionfile}" # name of the github file + github_file_url_dir="lgsm/functions" + github_file_url_name="${functionfile}" 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" + + remote_fileurl="${githuburl}" + local_filedir="${functionsdir}" + local_filename="${github_file_url_name}" + chmodx="chmodx" run="norun" - force="noforce" + forcedl="noforce" md5="nomd5" - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } @@ -245,4 +237,9 @@ do if [ -x "${curlpath}" ]; then break fi -done \ No newline at end of file +done + +if [ "$(basename ${curlpath})" != "curl" ]; then + echo "[ FAIL ] Curl is not installed" + exit 1 +fi \ No newline at end of file diff --git a/lgsm/functions/fix_csgo.sh b/lgsm/functions/fix_csgo.sh index 305c0d06b..3dc840824 100644 --- a/lgsm/functions/fix_csgo.sh +++ b/lgsm/functions/fix_csgo.sh @@ -9,10 +9,10 @@ local commandaction="Fix" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" # Fixes: server not always creating steam_appid.txt file. -if [ ! -f "${filesdir}/steam_appid.txt" ]; then +if [ ! -f "${serverfiles}/steam_appid.txt" ]; then fixname="730 steam_appid.txt" fn_fix_msg_start - echo -n "730" >> "${filesdir}/steam_appid.txt" + echo -n "730" >> "${serverfiles}/steam_appid.txt" fn_fix_msg_end fi diff --git a/lgsm/functions/fix_dst.sh b/lgsm/functions/fix_dst.sh index 5a631a52e..0a6bbe8b9 100644 --- a/lgsm/functions/fix_dst.sh +++ b/lgsm/functions/fix_dst.sh @@ -10,9 +10,9 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" # 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 +if [ -f "/etc/redhat-release" ] && [ ! -f "${serverfiles}/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" + ln -s "/usr/lib/libcurl.so.4" "${serverfiles}/bin/lib32/libcurl-gnutls.so.4" fn_fix_msg_end fi \ No newline at end of file diff --git a/lgsm/functions/fix_ins.sh b/lgsm/functions/fix_ins.sh index c132173b0..86fff41e7 100644 --- a/lgsm/functions/fix_ins.sh +++ b/lgsm/functions/fix_ins.sh @@ -9,7 +9,7 @@ local commandaction="Fix" # Fixes: ./srcds_linux: error while loading shared libraries: libtier0.so: cannot open shared object file: No such file or directory. -export LD_LIBRARY_PATH=${filesdir}:${filesdir}/bin:${LD_LIBRARY_PATH} +export LD_LIBRARY_PATH=${serverfiles}:${serverfiles}/bin:${LD_LIBRARY_PATH} # Fixes: issue #529 - gamemode not passed to debug or start. diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh index a70f8ce86..515189d8c 100644 --- a/lgsm/functions/fix_kf.sh +++ b/lgsm/functions/fix_kf.sh @@ -10,8 +10,8 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" 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" +sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css" +sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css" sleep 1 echo "Applying WebAdmin CharSet fix." echo "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1" diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh index 3498ee9c8..033245216 100644 --- a/lgsm/functions/fix_ro.sh +++ b/lgsm/functions/fix_ro.sh @@ -10,8 +10,8 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" 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" +sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css" +sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css" sleep 1 echo "Applying WebAdmin CharSet fix." echo "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1" diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 79bf5acce..52762e10a 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -23,21 +23,21 @@ if [ "${gamename}" == "Serious Sam 3: BFE" ]; 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}" + cp -v "${serverfiles}/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 + if [ ! -f "${serverfiles}/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}" + cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${scriptlog}" fn_fix_msg_end fi - if [ ! -f "${filesdir}/Hurtworld_Data/Plugins/x86_64/steamclient.so" ]; then + if [ ! -f "${serverfiles}/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}" + cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${scriptlog}" fn_fix_msg_end fi elif [ "${gamename}" == "Tower Unite" ]; then @@ -45,7 +45,7 @@ elif [ "${gamename}" == "Tower Unite" ]; then if [ ! -f "${executabledir}/steamclient.so" ]; then fixname="steamclient.so" fn_fix_msg_start - cp -v "${filesdir}/linux64/steamclient.so" "${executabledir}/steamclient.so" >> "${scriptlog}" + cp -v "${serverfiles}/linux64/steamclient.so" "${executabledir}/steamclient.so" >> "${scriptlog}" fn_fix_msg_end fi fi diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index 913ef62e9..ae0088315 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -10,8 +10,8 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" 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" +sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ut2003.css" +sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ut2003.css" sleep 1 echo "applying WebAdmin CharSet fix." echo "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1" diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index d8d733d64..c83dff8a1 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -95,13 +95,13 @@ if [ -z "${rootdirdu}" ]; then fi ## LinuxGSM used space in serverfiles dir. -filesdirdu=$(du -sh "${filesdir}" 2> /dev/null | awk '{print $1}') +filesdirdu=$(du -sh "${serverfiles}" 2> /dev/null | awk '{print $1}') if [ -z "${filesdirdu}" ]; then filesdirdu="0M" fi ## LinuxGSM used space total minus backup dir. -rootdirduexbackup=$(du -sh --exclude="${backupdir}" "${filesdir}" 2> /dev/null | awk '{print $1}') +rootdirduexbackup=$(du -sh --exclude="${backupdir}" "${serverfiles}" 2> /dev/null | awk '{print $1}') if [ -z "${rootdirduexbackup}" ]; then rootdirduexbackup="0M" fi diff --git a/lgsm/functions/install_factorio_save.sh b/lgsm/functions/install_factorio_save.sh index e76e97e9f..240c2a62a 100644 --- a/lgsm/functions/install_factorio_save.sh +++ b/lgsm/functions/install_factorio_save.sh @@ -12,4 +12,4 @@ echo "Creating initial Factorio savefile" echo "=================================" sleep 1 check_glibc.sh -"${executabledir}"/factorio --create ${filesdir}/save1 +"${executabledir}"/factorio --create ${serverfiles}/save1 diff --git a/lgsm/functions/install_minecraft_eula.sh b/lgsm/functions/install_minecraft_eula.sh index 7c172df1b..5ca97ac8e 100644 --- a/lgsm/functions/install_minecraft_eula.sh +++ b/lgsm/functions/install_minecraft_eula.sh @@ -11,7 +11,7 @@ sleep 1 echo "You are required to accept the EULA:" echo "https://account.mojang.com/documents/minecraft_eula" -echo "eula=false" > "${filesdir}/eula.txt" +echo "eula=false" > "${serverfiles}/eula.txt" if [ -z "${autoinstall}" ]; then echo "By continuing you are indicating your agreement to the EULA." @@ -25,4 +25,4 @@ echo "" sleep 5 fi -sed -i "s/eula=false/eula=true/g" "${filesdir}/eula.txt" +sed -i "s/eula=false/eula=true/g" "${serverfiles}/eula.txt" diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh index 426e25a2b..523a38465 100644 --- a/lgsm/functions/install_server_dir.sh +++ b/lgsm/functions/install_server_dir.sh @@ -12,7 +12,7 @@ echo "" echo "Server Directory" echo "=================================" sleep 1 -if [ -d "${filesdir}" ]; then +if [ -d "${serverfiles}" ]; then fn_print_warning_nl "A server is already installed here." fi pwd @@ -22,7 +22,7 @@ if [ -z "${autoinstall}" ]; then exit fi fi -if [ ! -d "${filesdir}" ]; then - mkdir -v "${filesdir}" +if [ ! -d "${serverfiles}" ]; then + mkdir -v "${serverfiles}" fi sleep 1 diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index edee16e9f..ed8ad70ff 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -24,11 +24,11 @@ fn_install_server_files(){ elif [ "${gamename}" == "GoldenEye: Source" ]; then fileurl="http://files.gameservermanagers.com/GoldenEyeSource/GoldenEye_Source_v5.0.1_full_server_linux.tar.bz2"; filedir="${tmpdir}"; filename="GoldenEye_Source_v5.0.1_server_full_Linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="ea227a150300abe346e757380325f84c" elif [ "${gamename}" == "Quake 2" ]; then - fileurl="http://files.gameservermanagers.com/Quake2/quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="0b8c7e2d51f40b56b328c69e986e7c5f" + fileurl="http://files.gameservermanagers.com/Quake2/quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; filedir="${tmpdir}"; filename="quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="0b8c7e2d51f40b56b328c69e986e7c5f" elif [ "${gamename}" == "Quake 3: Arena" ]; then - fileurl="http://files.gameservermanagers.com/Quake3/quake3-1.32c-x86-full-linux.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="quake3-1.32c-x86-full-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="fd7258d827474f67663dda297bff4306" + fileurl="http://files.gameservermanagers.com/Quake3/quake3-1.32c-x86-full-linux.tar.bz2"; filedir="${tmpdir}"; filename="quake3-1.32c-x86-full-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="fd7258d827474f67663dda297bff4306" elif [ "${gamename}" == "QuakeWorld" ]; then - fileurl="http://files.gameservermanagers.com/QuakeWorld/nquake.server.linux.083116.full.tar.bz2"; filedir="${lgsmdir}/tmp"; filename="nquake.server.linux.083116.full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="75a409cf08d808f075e4dacdc7b21b78" + fileurl="http://files.gameservermanagers.com/QuakeWorld/nquake.server.linux.083116.full.tar.bz2"; filedir="${tmpdir}"; filename="nquake.server.linux.083116.full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="75a409cf08d808f075e4dacdc7b21b78" elif [ "${gamename}" == "Unreal Tournament 2004" ]; then fileurl="http://files.gameservermanagers.com/UnrealTournament2004/ut2004-server-3339-ultimate-linux.tar.bz2"; filedir="${tmpdir}"; filename="ut2004-server-3339-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" elif [ "${gamename}" == "Unreal Tournament 99" ]; then @@ -41,7 +41,7 @@ fn_install_server_files(){ fileurl="http://files.gameservermanagers.com/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; filedir="${tmpdir}"; filename="enemy-territory.260b.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" fi fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" - fn_dl_extract "${filedir}" "${filename}" "${filesdir}" + fn_dl_extract "${filedir}" "${filename}" "${serverfiles}" } fn_install_server_files_steamcmd(){ @@ -62,8 +62,8 @@ fn_install_server_files_steamcmd(){ 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 + echo "Removing $(find ${serverfiles} -type d -print0 | grep -Ez '[^/]{30}$')" + find ${serverfiles} -type d -print0 | grep -Ez '[^/]{30}$' | xargs -0 rm -rf fi if [ "${counter}" -ge "9" ]; then rm -rf "${rootdir}/steamcmd" @@ -78,18 +78,18 @@ fn_install_server_files_steamcmd(){ 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}" ${branch} +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} +quit local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} +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}" ${branch} -validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} -validate +quit local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} -validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} -validate +quit local exitcode=$? fi fi @@ -107,7 +107,7 @@ fn_install_server_files_steamcmd(){ 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}" ${branch} -validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} -validate +quit local exitcode=$? done fi diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh index ebceecfa7..0d363fcb3 100644 --- a/lgsm/functions/install_ts3db.sh +++ b/lgsm/functions/install_ts3db.sh @@ -14,7 +14,7 @@ fn_install_ts3db_mariadb(){ echo "checking if libmariadb2 is installed" echo "=================================" sleep 1 - ldd ${filesdir}/libts3db_mariadb.so | grep "libmariadb.so.2 => not found" + ldd ${serverfiles}/libts3db_mariadb.so | grep "libmariadb.so.2 => not found" if [ $? -eq 0 ]; then echo "libmariadb2 not installed. Please install it first." echo "exiting..." diff --git a/lgsm/functions/install_unreal_tournament_eula.sh b/lgsm/functions/install_unreal_tournament_eula.sh index b554ab2ad..a8e31b22a 100644 --- a/lgsm/functions/install_unreal_tournament_eula.sh +++ b/lgsm/functions/install_unreal_tournament_eula.sh @@ -11,7 +11,7 @@ sleep 1 echo "You are required to accept the EULA:" echo "https://www.epicgames.com/unrealtournament/unreal-tournament-pre-alpha-test-development-build-eula/" -echo "eula=false" > "${filesdir}/eula.txt" +echo "eula=false" > "${serverfiles}/eula.txt" if [ -z "${autoinstall}" ]; then echo "By continuing you are indicating your agreement to the EULA." @@ -25,4 +25,4 @@ echo "" sleep 5 fi -sed -i "s/eula=false/eula=true/g" "${filesdir}/eula.txt" +sed -i "s/eula=false/eula=true/g" "${serverfiles}/eula.txt" diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index e14ff5932..3d0a73357 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -12,9 +12,9 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_update_factorio_dl(){ fn_fetch_file "https://www.factorio.com/get-download/${availablebuild}/headless/${factorioarch}" "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" fn_dl_extract "${tmpdir}" "factorio_headless_${factorioarch}-${availablebuild}.tar.gz" "${tmpdir}" - echo -e "copying to ${filesdir}...\c" - fn_script_log "Copying to ${filesdir}" - cp -R "${tmpdir}/factorio/"* "${filesdir}" + echo -e "copying to ${serverfiles}...\c" + fn_script_log "Copying to ${serverfiles}" + cp -R "${tmpdir}/factorio/"* "${serverfiles}" local exitcode=$? if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index c54300b78..b28700fef 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -10,9 +10,9 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_update_dl(){ fn_fetch_file "https://s3.amazonaws.com/Minecraft.Download/versions/${availablebuild}/minecraft_server.${availablebuild}.jar" "${tmpdir}" "minecraft_server.${availablebuild}.jar" - echo -e "copying to ${filesdir}...\c" - fn_script_log "Copying to ${filesdir}" - cp "${tmpdir}/minecraft_server.${availablebuild}.jar" "${filesdir}/minecraft_server.jar" + echo -e "copying to ${serverfiles}...\c" + fn_script_log "Copying to ${serverfiles}" + cp "${tmpdir}/minecraft_server.${availablebuild}.jar" "${serverfiles}/minecraft_server.jar" local exitcode=$? if [ ${exitcode} -eq 0 ]; then fn_print_ok_eol_nl @@ -47,7 +47,7 @@ fn_update_currentbuild(){ fi # Get current build from logs - currentbuild=$(cat "${filesdir}/logs/latest.log" 2> /dev/null | grep version | egrep -o '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') + currentbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | egrep -o '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') if [ -z "${currentbuild}" ]; then fn_print_error_nl "Checking for update: mojang.com: Current build version not found" fn_script_log_error "Checking for update: mojang.com: Current build version not found" @@ -58,7 +58,7 @@ fn_update_currentbuild(){ command_stop.sh exitbypass=1 command_start.sh - currentbuild=$(cat "${filesdir}/logs/latest.log" 2> /dev/null | grep version | egrep -o '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') + currentbuild=$(cat "${serverfiles}/logs/latest.log" 2> /dev/null | grep version | egrep -o '((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}') if [ -z "${currentbuild}" ]; then fn_print_fail_nl "Checking for update: mojang.com: Current build version still not found" fn_script_log_fatal "Checking for update: mojang.com: Current build version still not found" diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 0fcd7936c..9383b73e3 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -12,9 +12,9 @@ fn_update_mta_dl(){ fn_fetch_file "http://linux.mtasa.com/dl/${numversion}/multitheftauto_linux_x64-${fullversion}.tar.gz" "${tmpdir}" "multitheftauto_linux_x64-${fullversion}.tar.gz" mkdir "${tmpdir}/multitheftauto_linux_x64-${fullversion}" fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${fullversion}.tar.gz" "${tmpdir}/multitheftauto_linux_x64-${fullversion}" - echo -e "copying to ${filesdir}...\c" - fn_script_log "Copying to ${filesdir}" - cp -R "${tmpdir}/multitheftauto_linux_x64-${fullversion}/multitheftauto_linux_x64-${fullversion}/"* "${filesdir}" + echo -e "copying to ${serverfiles}...\c" + fn_script_log "Copying to ${serverfiles}" + cp -R "${tmpdir}/multitheftauto_linux_x64-${fullversion}/multitheftauto_linux_x64-${fullversion}/"* "${serverfiles}" local exitcode=$? if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index e90b8276b..b16ea69c4 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -12,9 +12,9 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_update_mumble_dl(){ fn_fetch_file "https://github.com/mumble-voip/mumble/releases/download/${availablebuild}/murmur-static_${mumblearch}-${availablebuild}.tar.bz2" "${tmpdir}" "murmur-static_${mumblearch}-${availablebuild}.tar.bz2" fn_dl_extract "${tmpdir}" "murmur-static_${mumblearch}-${availablebuild}.tar.bz2" "${tmpdir}" - echo -e "copying to ${filesdir}...\c" - fn_script_log "Copying to ${filesdir}" - cp -R "${tmpdir}/murmur-static_${mumblearch}-${availablebuild}/"* "${filesdir}" + echo -e "copying to ${serverfiles}...\c" + fn_script_log "Copying to ${serverfiles}" + cp -R "${tmpdir}/murmur-static_${mumblearch}-${availablebuild}/"* "${serverfiles}" local exitcode=$? if [ ${exitcode} -eq 0 ]; then fn_print_ok_eol_nl diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index e500a0fbf..26096291f 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -26,17 +26,17 @@ fn_update_steamcmd_dl(){ fi if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" fi fix.sh } fn_appmanifest_info(){ - appmanifestfile=$(find "${filesdir}" -type f -name "appmanifest_${appid}.acf") - appmanifestfilewc=$(find "${filesdir}" -type f -name "appmanifest_${appid}.acf"|wc -l) + appmanifestfile=$(find "${serverfiles}" -type f -name "appmanifest_${appid}.acf") + appmanifestfilewc=$(find "${serverfiles}" -type f -name "appmanifest_${appid}.acf"|wc -l) } fn_appmanifest_check(){ diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index f810eb0f4..982d7aecb 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -11,9 +11,9 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_update_ts3_dl(){ fn_fetch_file "http://dl.4players.de/ts/releases/${ts3_version_number}/teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" "${tmpdir}" "teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" fn_dl_extract "${tmpdir}" "teamspeak3-server_linux_${ts3arch}-${ts3_version_number}.tar.bz2" "${tmpdir}" - echo -e "copying to ${filesdir}...\c" - fn_script_log "Copying to ${filesdir}" - cp -R "${tmpdir}/teamspeak3-server_linux_${ts3arch}/"* "${filesdir}" + echo -e "copying to ${serverfiles}...\c" + fn_script_log "Copying to ${serverfiles}" + cp -R "${tmpdir}/teamspeak3-server_linux_${ts3arch}/"* "${serverfiles}" local exitcode=$? if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl diff --git a/linuxgsm.sh b/linuxgsm.sh index a76833bbe..9c26ac3c7 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -26,13 +26,13 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" configdir="${lgsmdir}/config-lgsm" configdirserver="${configdir}/${servername}" configdirdefault="${lgsmdir}/config-default" -## Github Branch Select +## GitHub Branch Select # Allows for the use of different function files # from a different repo and/or branch. githubuser="GameServerManagers" @@ -42,7 +42,7 @@ githubbranch="feature/config" # Core Function that is required first core_functions.sh(){ functionfile="${FUNCNAME}" - fn_bootstrap_fetch_file + fn_bootstrap_fetch_file "lgsm/functions" "core_functions.sh" "${functionsdir}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" } # Bootstrap @@ -50,16 +50,13 @@ core_functions.sh(){ # Fetches core functions fn_bootstrap_fetch_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}" - filedir="${functionsdir}" - filename="${github_file_url_name}" - executecmd="executecmd" - run="run" - force="noforce" - md5="nomd5" + 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 @@ -252,7 +249,7 @@ if [ "${shortname}" == "core" ]; then # Download the serverlist. This is the complete list of all supported servers. # Download to tmp dir - fn_boostrap_fetch_config "lgsm/data" "serverlist.csv" "${tmpdir}/data" "serverlist.csv" "noexecutecmd" "norun" "noforce" "nomd5" + fn_boostrap_fetch_file "lgsm/data" "serverlist.csv" "${tmpdir}/data" "serverlist.csv" "noexecutecmd" "norun" "noforce" "nomd5" # if missing in lgsm dir copy it accross if [ ! -f "${serverlist}" ]; then mkdir -p "${datadir}" diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 360345341..ae554e85a 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -93,12 +93,12 @@ tmpdir="${lgsmdir}/tmp" filesdir="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./Jcmp-Server" servercfg="config.lua" servercfgdefault="config.lua" -servercfgdir="${filesdir}" +servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory @@ -443,7 +443,7 @@ echo "Command: ./jc2server update" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "changed buildid to 0." -sed -i 's/[0-9]\+/0/' "${filesdir}/steamapps/appmanifest_${appid}.acf" +sed -i 's/[0-9]\+/0/' "${serverfiles}/steamapps/appmanifest_${appid}.acf" (command_update.sh) fn_test_result_pass @@ -456,7 +456,7 @@ echo "Command: ./jc2server update" requiredstatus="ONLINE" fn_setstatus fn_print_info_nl "changed buildid to 0." -sed -i 's/[0-9]\+/0/' "${filesdir}/steamapps/appmanifest_${appid}.acf" +sed -i 's/[0-9]\+/0/' "${serverfiles}/steamapps/appmanifest_${appid}.acf" (command_update.sh) fn_test_result_pass @@ -469,7 +469,7 @@ echo "Command: ./jc2server update" requiredstatus="OFFLINE" fn_setstatus fn_print_info_nl "removed appmanifest_${appid}.acf." -rm --verbose "${filesdir}/steamapps/appmanifest_${appid}.acf" +rm --verbose "${serverfiles}/steamapps/appmanifest_${appid}.acf" (command_update.sh) fn_test_result_pass diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index e2bf7b12d..d19223269 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -80,19 +80,19 @@ tmpdir="${lgsmdir}/tmp" filesdir="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./ts3server_startscript.sh" servercfg="${servicename}.ini" servercfgdefault="ts3server.ini" -servercfgdir="${filesdir}" +servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${rootdir}/backups" ## Logging Directories -gamelogdir="${filesdir}/logs" +gamelogdir="${serverfiles}/logs" scriptlogdir="${rootdir}/log/script" scriptlog="${scriptlogdir}/${servicename}-script.log" emaillog="${scriptlogdir}/${servicename}-email.log" From 287475b4916c08668ccf3ea1e5d56b8f4cda2e75 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Apr 2017 20:07:15 +0100 Subject: [PATCH 0652/1895] A good tidy up --- .../config-lgsm/arkserver/_default.cfg | 5 +++-- .../config-lgsm/arma3server/_default.cfg | 4 ++-- .../config-lgsm/csgoserver/_default.cfg | 4 ++-- .../config-lgsm/sdtdserver/_default.cfg | 6 +++--- lgsm/functions/check_steamcmd.sh | 15 +-------------- lgsm/functions/command_install_resources_mta.sh | 5 ++--- lgsm/functions/command_start.sh | 2 +- lgsm/functions/command_validate.sh | 3 +-- lgsm/functions/core_dl.sh | 4 +++- lgsm/functions/fix_steamcmd.sh | 6 +++--- lgsm/functions/install_logs.sh | 10 +++++----- lgsm/functions/install_mta_resources.sh | 9 ++++----- lgsm/functions/install_server_files.sh | 4 ++-- lgsm/functions/logs.sh | 2 +- lgsm/functions/monitor_gsquery.sh | 5 ----- lgsm/functions/update_mta.sh | 5 ++--- lgsm/functions/update_steamcmd.sh | 6 ++++-- linuxgsm.sh | 1 + 18 files changed, 40 insertions(+), 56 deletions(-) diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 8378e9cec..35a8d1949 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -77,9 +77,10 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${rootdir}/backups" ## Logging Directories +logdir="${logdir}" gamelogdir="${systemdir}/Saved/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" +scriptlogdir="${logdir}/script" +consolelogdir="${logdir}/console" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${scriptlogdir}/${servicename}-email.log" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 4dc8a264c..ac83b822d 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -89,8 +89,8 @@ backupdir="${rootdir}/backups" ## Logging Directories #gamelogdir="" # No server logs available -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" +scriptlogdir="${logdir}/script" +consolelogdir="${logdir}/console" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${scriptlogdir}/${servicename}-email.log" diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index fdbb7a272..718d8d132 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -102,8 +102,8 @@ backupdir="${rootdir}/backups" ## Logging Directories gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" +scriptlogdir="${logdir}/script" +consolelogdir="${logdir}/console" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${scriptlogdir}/${servicename}-email.log" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index d537643cc..b8576295e 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -77,9 +77,9 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${rootdir}/backups" ## Logging Directories -gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" +gamelogdir="${logdir}/server" +scriptlogdir="${logdir}/script" +consolelogdir="${logdir}/console" gamelog="${gamelogdir}/${servicename}-game.log" scriptlog="${scriptlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index ddfcb82d4..2b8cb0f0b 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -39,7 +39,6 @@ fn_check_steamcmd_user(){ 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 @@ -55,17 +54,5 @@ fn_check_steamcmd_sh(){ 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 -# stdbuf has now replaced unbuffer. This should not longer be required. -#fn_check_steamcmd_guard +fn_check_steamcmd_sh \ No newline at end of file diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 07c2e0ac0..07b6e4440 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -12,9 +12,8 @@ fn_install_resources(){ echo "" echo "Installing Default Resources" echo "=================================" - fileurl="http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip"; filedir="${tmpdir}"; filename="multitheftauto_resources.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="nomd5" - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" - fn_dl_extract "${filedir}" "${filename}" "${resourcesdir}" + fn_fetch_file "http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip" "${tmpdir}" "mtasa-resources-latest.zip" "noexecute" "norun" "noforce" "nomd5" + fn_dl_extract "${tmpdir}" "mtasa-resources-latest.zip" "${resourcesdir}" echo "Default Resources Installed." } diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 1f411af48..87f9a05ed 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -46,7 +46,7 @@ fn_start_teamspeak3(){ if [ "${status}" == "0" ]; then fn_print_fail_nl "Unable to start ${servername}" fn_script_log_fatal "Unable to start ${servername}" - echo -e " Check log files: ${rootdir}/log" + echo -e " Check log files: ${logdir}" core_exit.sh else fn_print_ok_nl "${servername}" diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index f2fa5638b..72488d956 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -18,8 +18,7 @@ fn_validation(){ fn_script_log_info "Validating files: SteamCMD" sleep 1 - cd "${rootdir}/steamcmd" - + cd "${steamcmddir}" # Detects if unbuffer command is available for 32 bit distributions only. info_distro.sh if [ $(command -v stdbuf) ]&&[ "${arch}" != "x86_64" ]; then diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 7d24f9436..665162859 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -55,7 +55,9 @@ fn_dl_extract(){ # extracts archives echo -ne "extracting ${local_filename}..." mime=$(file -b --mime-type "${local_filedir}/${local_filename}") - + if [ ! -d "${extractdir}" ]; then + mkdir "${extractdir}" + fi if [ "${mime}" == "application/gzip" ]||[ "${mime}" == "application/x-gzip" ]; then extractcmd=$(tar -zxf "${local_filedir}/${local_filename}" -C "${extractdir}") elif [ "${mime}" == "application/x-bzip2" ]; then diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 52762e10a..693398739 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -13,7 +13,7 @@ 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}" + cp -v "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${scriptlog}" fn_fix_msg_end fi @@ -31,13 +31,13 @@ elif [ "${gamename}" == "Hurtworld" ]; then if [ ! -f "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then fixname="steamclient.so x86" fn_fix_msg_start - cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${scriptlog}" + cp -v "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${scriptlog}" fn_fix_msg_end fi if [ ! -f "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" ]; then fixname="steamclient.so x86_64" fn_fix_msg_start - cp -v "${rootdir}/steamcmd/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${scriptlog}" + cp -v "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${scriptlog}" fn_fix_msg_end fi elif [ "${gamename}" == "Tower Unite" ]; then diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 3feb0feea..65a09ed18 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -15,7 +15,7 @@ if [ "${checklogs}" != "1" ]; then fi sleep 1 # Create script and console log directories -mkdir -v "${rootdir}/log" +mkdir -v "${logdir}" mkdir -v "${scriptlogdir}" touch "${scriptlog}" if [ -n "${consolelogdir}" ]; then @@ -30,15 +30,15 @@ fi # Symlink gamelogdir to lgsm logs if variable exists if [ -n "${gamelogdir}" ]; then - if [ ! -h "${rootdir}/log/server" ]; then - ln -nfsv "${gamelogdir}" "${rootdir}/log/server" + if [ ! -h "${logdir}/server" ]; then + ln -nfsv "${gamelogdir}" "${logdir}/server" 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 - ln -nfsv "${rootdir}/Steam/logs" "${rootdir}/log/steamcmd" + if [ ! -h "${logdir}/steamcmd" ]; then + ln -nfsv "${rootdir}/Steam/logs" "${logdir}/steamcmd" fi fi sleep 1 diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index 8156da9da..6abfc598a 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -14,20 +14,19 @@ fn_install_libmysqlclient16(){ echo "Checking if libmysqlclient16 is installed" echo "=================================" sleep 1 - if [ ! -f /usr/lib/libmysqlclient.so.16 ]; then + if [ ! -f "/usr/lib/libmysqlclient.so.16" ]; then fn_print_warn_nl "libmysqlclient16 not installed. Installing.." sleep 1 sudo -v > /dev/null 2>&1 if [ $? -eq 0 ]; then - fileurl="https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16"; filedir="${tmpdir}"; filename="libmysqlclient.so.16"; executecmd="executecmd" run="norun"; force="noforce"; md5="6c188e0f8fb5d7a29f4bc413b9fed6c2" - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" - sudo mv ${tmpdir}/${filename} /usr/lib/${filename} + fn_fetch_file "https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16" "${filedir}" "libmysqlclient.so.16" "executecmd" "norun" "noforce" "6c188e0f8fb5d7a29f4bc413b9fed6c2" + sudo mv "${tmpdir}/libmysqlclient.so.16" "/usr/lib/libmysqlclient.so.16" else fn_print_fail_nl "Failed to install libmysqlclient16, $(whoami) does not have sudo access. Download it manually and place it in /usr/lib" sleep 1 fi else - echo "libmysqlclient16 already installed." + echo "libmysqlclient16 already installed." fi } diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index ed8ad70ff..39c2934bc 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -48,7 +48,7 @@ fn_install_server_files_steamcmd(){ counter="0" while [ "${counter}" == "0" ]||[ "${exitcode}" != "0" ]; do counter=$((counter+1)) - cd "${rootdir}/steamcmd" + cd "${steamcmddir}" if [ "${counter}" -le "10" ]; then # Attempt 1-4: Standard attempt # Attempt 5-6: Validate attempt @@ -66,7 +66,7 @@ fn_install_server_files_steamcmd(){ find ${serverfiles} -type d -print0 | grep -Ez '[^/]{30}$' | xargs -0 rm -rf fi if [ "${counter}" -ge "9" ]; then - rm -rf "${rootdir}/steamcmd" + rm -rf "${steamcmddir}" check_steamcmd.sh fi diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index 44467d82f..2fd0fc626 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -37,7 +37,7 @@ if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; th sourcemodlogdir="${systemdir}/addons/sourcemod/logs" ulxlogdir="${systemdir}/data/ulx_logs" darkrplogdir="${systemdir}/data/darkrp_logs" - legacyserverlogdir="${rootdir}/log/server" + legacyserverlogdir="${logdir}/server" # Setting up counting variables scriptcount="0" ; consolecount="0" ; gamecount="0" ; srcdscount="0" ; smcount="0" ; ulxcount="0" ; darkrpcount="0" ; legacycount="0" sleep 1 diff --git a/lgsm/functions/monitor_gsquery.sh b/lgsm/functions/monitor_gsquery.sh index dc24aaee3..c874dc452 100644 --- a/lgsm/functions/monitor_gsquery.sh +++ b/lgsm/functions/monitor_gsquery.sh @@ -9,11 +9,6 @@ local commandname="MONITOR" local commandaction="Monitor" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -# Forces legacy servers to use gsquery -if [ -z "${gsquery}" ]; then - gsquery="yes" -fi - if [ "${gsquery}" == "yes" ]; then # Downloads gsquery.py if missing diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 9383b73e3..72aaf65ec 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -10,11 +10,10 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_update_mta_dl(){ fn_fetch_file "http://linux.mtasa.com/dl/${numversion}/multitheftauto_linux_x64-${fullversion}.tar.gz" "${tmpdir}" "multitheftauto_linux_x64-${fullversion}.tar.gz" - mkdir "${tmpdir}/multitheftauto_linux_x64-${fullversion}" - fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${fullversion}.tar.gz" "${tmpdir}/multitheftauto_linux_x64-${fullversion}" + fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64-${fullversion}.tar.gz" "${tmpdir}" echo -e "copying to ${serverfiles}...\c" fn_script_log "Copying to ${serverfiles}" - cp -R "${tmpdir}/multitheftauto_linux_x64-${fullversion}/multitheftauto_linux_x64-${fullversion}/"* "${serverfiles}" + cp -R "${tmpdir}/multitheftauto_linux_x64-${fullversion}/"* "${serverfiles}" local exitcode=$? if [ "${exitcode}" == "0" ]; then fn_print_ok_eol_nl diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 26096291f..09f25b2d9 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -17,7 +17,7 @@ fn_update_steamcmd_dl(){ fn_print_ok_nl "SteamCMD" fn_script_log_info "Starting SteamCMD" - cd "${rootdir}/steamcmd" + cd "${steamcmddir}" # Detects if unbuffer command is available for 32 bit distributions only. info_distro.sh @@ -25,6 +25,7 @@ fn_update_steamcmd_dl(){ unbuffer="stdbuf -i0 -o0 -e0" fi + cd "${steamcmddir}" if [ "${engine}" == "goldsource" ]; then ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" else @@ -146,7 +147,7 @@ fn_update_steamcmd_check(){ 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 - cd "${rootdir}/steamcmd" + if [ -f "${HOME}/Steam/appcache/appinfo.vdf" ]; then rm -f "${HOME}/Steam/appcache/appinfo.vdf" fi @@ -160,6 +161,7 @@ fn_update_steamcmd_check(){ fi # Gets availablebuild info + cd "${steamcmddir}" availablebuild=$(./steamcmd.sh +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +app_info_print "${appid}" +quit | sed -n '/branch/,$p' | grep -m 1 buildid | tr -cd '[:digit:]') if [ -z "${availablebuild}" ]; then fn_print_fail "Checking for update: SteamCMD" diff --git a/linuxgsm.sh b/linuxgsm.sh index 9c26ac3c7..d2e71ca43 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -22,6 +22,7 @@ shortname="core" servername="core" gamename="core" lockselfname=".${servicename}.lock" +steamcmddir="${rootdir}/steamcmd" lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" From 4bf75bf17d7318311cac439072cdb1aeb14bab99 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Apr 2017 20:10:06 +0100 Subject: [PATCH 0653/1895] typo --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index d2e71ca43..1cc6300d2 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -250,7 +250,7 @@ if [ "${shortname}" == "core" ]; then # Download the serverlist. This is the complete list of all supported servers. # Download to tmp dir - fn_boostrap_fetch_file "lgsm/data" "serverlist.csv" "${tmpdir}/data" "serverlist.csv" "noexecutecmd" "norun" "noforce" "nomd5" + fn_bootstrap_fetch_file "lgsm/data" "serverlist.csv" "${tmpdir}/data" "serverlist.csv" "noexecutecmd" "norun" "noforce" "nomd5" # if missing in lgsm dir copy it accross if [ ! -f "${serverlist}" ]; then mkdir -p "${datadir}" From 8bce2f28f5ca12969cd5012665ffade5a2c0aa2f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Apr 2017 20:20:15 +0100 Subject: [PATCH 0654/1895] fixed broken installer --- linuxgsm.sh | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 1cc6300d2..7402cd354 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -43,7 +43,7 @@ githubbranch="feature/config" # Core Function that is required first core_functions.sh(){ functionfile="${FUNCNAME}" - fn_bootstrap_fetch_file "lgsm/functions" "core_functions.sh" "${functionsdir}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" } # Bootstrap @@ -103,6 +103,21 @@ fn_bootstrap_fetch_file(){ fi } +fn_bootstrap_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}" + + remote_fileurl="${githuburl}" + local_filedir="${3}" + local_filename="${github_file_url_name}" + chmodx="${4:-0}" + run="${5:-0}" + forcedl="${6:-0}" + md5="${7:-0}" + # Passes vars to the file download function + fn_bootstrap_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" +} # Installer menu @@ -250,7 +265,7 @@ if [ "${shortname}" == "core" ]; then # Download the serverlist. This is the complete list of all supported servers. # Download to tmp dir - fn_bootstrap_fetch_file "lgsm/data" "serverlist.csv" "${tmpdir}/data" "serverlist.csv" "noexecutecmd" "norun" "noforce" "nomd5" + fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${tmpdir}/data" "serverlist.csv" "noexecutecmd" "norun" "noforce" "nomd5" # if missing in lgsm dir copy it accross if [ ! -f "${serverlist}" ]; then mkdir -p "${datadir}" From 8bf21d6c44a7b12a249dc0a9e6628cd1e716c4ec Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Apr 2017 20:25:30 +0100 Subject: [PATCH 0655/1895] moved get opt to correct location --- linuxgsm.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 7402cd354..f1e21c33d 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -294,6 +294,8 @@ if [ "${shortname}" == "core" ]; then fn_server_info if [ "${result}" == "${servername}" ]; then fn_install_file + elif [ "${result}" == "" ]; then + echo "Install canceled" else echo "[ FAIL ] menu result does not match servername" fi @@ -342,7 +344,6 @@ else else source "${configdirserver}/${servicename}.cfg" fi -fi - -getopt=$1 -core_getopt.sh + getopt=$1 + core_getopt.sh +fi \ No newline at end of file From 930f41b4eb6f47ccafcf3d0a7e4b57a00a52d0c1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Apr 2017 21:03:48 +0100 Subject: [PATCH 0656/1895] fixing downloader --- lgsm/functions/core_functions.sh | 14 +++--- linuxgsm.sh | 76 ++++++++++++++++---------------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index a821bf95b..f7a4ac79c 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -5,16 +5,11 @@ # 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 will not load. -# Creates tmp dir if missing -if [ ! -d "${tmpdir}" ]; then - mkdir -p "${tmpdir}" -fi - # Core core_dl.sh(){ functionfile="${FUNCNAME}" -fn_bootstrap_fetch_file +fn_bootstrap_fetch_file_github "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" } core_exit.sh(){ @@ -34,7 +29,7 @@ fn_fetch_function core_messages.sh(){ functionfile="${FUNCNAME}" -fn_bootstrap_fetch_file +fn_bootstrap_fetch_file_github "lgsm/functions" "core_messages.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" } @@ -541,6 +536,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +# Creates tmp dir if missing +if [ ! -d "${tmpdir}" ]; then + mkdir -p "${tmpdir}" +fi + # Calls on-screen messages (bootstrap) core_messages.sh diff --git a/linuxgsm.sh b/linuxgsm.sh index f1e21c33d..7270b3b87 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -43,7 +43,7 @@ githubbranch="feature/config" # Core Function that is required first core_functions.sh(){ functionfile="${FUNCNAME}" - fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + fn_bootstrap_fetch_file_github "lgsm/functions" "core_functions.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" } # Bootstrap @@ -51,17 +51,17 @@ core_functions.sh(){ # Fetches core functions fn_bootstrap_fetch_file(){ - fileurl="${1}" - filedir="${2}" - filename="${3}" - executecmd="${4:-0}" + remote_fileurl="${1}" + local_filedir="${2}" + local_filename="${3}" + chmodx="${4:-0}" run="${5:-0}" - force="${6:-0}" + forcedl="${6:-0}" md5="${7:-0}" # If the file is missing, then download - if [ ! -f "${filedir}/${filename}" ]; then - if [ ! -d "${filedir}" ]; then - mkdir -p "${filedir}" + if [ ! -f "${local_filedir}/${local_filename}" ]; then + if [ ! -d "${local_filedir}" ]; then + mkdir -p "${local_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)" @@ -74,12 +74,12 @@ fn_bootstrap_fetch_file(){ # If curl exists download file if [ "$(basename ${curlpath})" == "curl" ]; then # trap to remove part downloaded files - echo -ne " fetching ${filename}...\c" - curlcmd=$(${curlpath} -s --fail -L -o "${filedir}/${filename}" "${fileurl}" 2>&1) + echo -ne " fetching ${local_filename}...\c" + curlcmd=$(${curlpath} -s --fail -L -o "${local_filedir}/${local_filename}" "${remote_fileurl}" 2>&1) local exitcode=$? if [ ${exitcode} -ne 0 ]; then echo -e "\e[0;31mFAIL\e[0m\n" - echo -e "${fileurl}" | tee -a "${scriptlog}" + echo -e "${remote_fileurl}" | tee -a "${scriptlog}" echo "${curlcmd}" | tee -a "${scriptlog}" exit 1 else @@ -89,16 +89,16 @@ fn_bootstrap_fetch_file(){ echo "[ FAIL ] Curl is not installed" exit 1 fi - # make file executecmd if executecmd is set - if [ "${executecmd}" == "executecmd" ]; then - chmod +x "${filedir}/${filename}" + # make file chmodx if chmodx is set + if [ "${chmodx}" == "chmodx" ]; then + chmod +x "${local_filedir}/${local_filename}" fi fi - if [ -f "${filedir}/${filename}" ]; then + if [ -f "${local_filedir}/${local_filename}" ]; then # run file if run is set if [ "${run}" == "run" ]; then - source "${filedir}/${filename}" + source "${local_filedir}/${local_filename}" fi fi } @@ -108,15 +108,15 @@ fn_bootstrap_fetch_file_github(){ github_file_url_name="${2}" githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}" - remote_fileurl="${githuburl}" - local_filedir="${3}" - local_filename="${github_file_url_name}" + remote_remote_fileurl="${githuburl}" + local_local_filedir="${3}" + local_local_filename="${github_file_url_name}" chmodx="${4:-0}" run="${5:-0}" - forcedl="${6:-0}" + forcedldl="${6:-0}" md5="${7:-0}" # Passes vars to the file download function - fn_bootstrap_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" + fn_bootstrap_fetch_file "${remote_remote_fileurl}" "${local_local_filedir}" "${local_local_filename}" "${chmodx}" "${run}" "${forcedldl}" "${md5}" } # Installer menu @@ -174,7 +174,7 @@ fn_install_menu_whiptail() { menu_options+=( ${val//\"} "${key//\"}" ) done < $options OPTION=$(${menucmd} --title "${title}" --menu "${caption}" ${height} ${width} ${menuheight} "${menu_options[@]}" 3>&1 1>&2 2>&3) - if [ $? = 0 ]; then + if [ $? == 0 ]; then eval "$resultvar=\"${OPTION}\"" else eval "$resultvar=" @@ -228,25 +228,25 @@ fn_install_getopt(){ } fn_install_file(){ - filename="${servername}" - if [ -e "${filename}" ]; then + local_filename="${servername}" + if [ -e "${local_filename}" ]; then i=2 - while [ -e "${filename}-${i}" ] ; do + while [ -e "${local_filename}-${i}" ] ; do let i++ done - filename="${filename}-${i}" + local_filename="${local_filename}-${i}" fi - cp -R "${selfname}" "${filename}" - sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${filename}" - sed -i -e "s/servername=\"core\"/servername=\"${servername}\"/g" "${filename}" - sed -i -e "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${filename}" - echo "Installed ${gamename} server as ${filename}" - echo "./${filename} install" + cp -R "${selfname}" "${local_filename}" + sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}" + sed -i -e "s/servername=\"core\"/servername=\"${servername}\"/g" "${local_filename}" + sed -i -e "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${local_filename}" + echo "Installed ${gamename} server as ${local_filename}" + echo "./${local_filename} install" exit } # Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then +if [ "$(whoami)" == "root" ]; then if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]; then echo "[ FAIL ] Do NOT run this script as root!" exit 1 @@ -265,7 +265,7 @@ if [ "${shortname}" == "core" ]; then # Download the serverlist. This is the complete list of all supported servers. # Download to tmp dir - fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${tmpdir}/data" "serverlist.csv" "noexecutecmd" "norun" "noforce" "nomd5" + fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${tmpdir}/data" "serverlist.csv" "nochmodx" "norun" "noforcedl" "nomd5" # if missing in lgsm dir copy it accross if [ ! -f "${serverlist}" ]; then mkdir -p "${datadir}" @@ -317,7 +317,7 @@ else # Load the default config. If missing download it. If changed reload it. if [ ! -f "${configdirdefault}/config-lgsm/${servername}/_default.cfg" ];then mkdir -p "${configdirdefault}/config-lgsm/${servername}" - fn_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + fn_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "nochmodx" "norun" "noforcedl" "nomd5" fi if [ ! -f "${configdirserver}/_default.cfg" ];then mkdir -p "${configdirserver}" @@ -332,14 +332,14 @@ else source "${configdirserver}/_default.cfg" # Load the common.cfg config. If missing download it if [ ! -f "${configdirserver}/common.cfg" ];then - fn_fetch_config "lgsm/config-default/config-lgsm" "common-template.cfg" "${configdirserver}" "common.cfg" "${executecmd}" "noexecutecmd" "norun" "noforce" "nomd5" + fn_fetch_config "lgsm/config-default/config-lgsm" "common-template.cfg" "${configdirserver}" "common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" source "${configdirserver}/common.cfg" else source "${configdirserver}/common.cfg" fi # Load the instance.cfg config. If missing download it if [ ! -f "${configdirserver}/${servicename}.cfg" ];then - fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${servicename}.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${servicename}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" source "${configdirserver}/${servicename}.cfg" else source "${configdirserver}/${servicename}.cfg" From b486b1a5f7c52e9aa24da1c3c245d6177922f3a2 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Apr 2017 21:16:17 +0100 Subject: [PATCH 0657/1895] fixed curl checkers --- lgsm/functions/core_dl.sh | 4 ++-- linuxgsm.sh | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 665162859..f40959f0d 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -233,8 +233,8 @@ fn_update_function(){ # Defines curl 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 curlpath in "${curlpaths}" +curl_paths_array=($(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl) +for curlpath in "${curl_paths_array}" do if [ -x "${curlpath}" ]; then break diff --git a/linuxgsm.sh b/linuxgsm.sh index 7270b3b87..dd8357855 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -63,9 +63,9 @@ fn_bootstrap_fetch_file(){ if [ ! -d "${local_filedir}" ]; then mkdir -p "${local_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 curlpath in ${curlpaths} + # Defines curl path + curl_paths_array=($(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl) + for curlpath in "${curl_paths_array}" do if [ -x "${curlpath}" ]; then break From 9fb96c6aeece376630f1b050e69e67fb70b12641 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Apr 2017 22:24:53 +0100 Subject: [PATCH 0658/1895] added logdir --- linuxgsm.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index dd8357855..0207e8644 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -22,12 +22,13 @@ shortname="core" servername="core" gamename="core" lockselfname=".${servicename}.lock" -steamcmddir="${rootdir}/steamcmd" lgsmdir="${rootdir}/lgsm" +logdir="${rootdir}/log" +steamcmddir="${rootdir}/steamcmd" +serverfiles="${rootdir}/serverfiles" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" configdir="${lgsmdir}/config-lgsm" configdirserver="${configdir}/${servername}" configdirdefault="${lgsmdir}/config-default" From 0759d00067207a092469a72ef6345fbd569a1054 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 16 Apr 2017 22:41:28 +0100 Subject: [PATCH 0659/1895] improved _default.cfg handling --- linuxgsm.sh | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 0207e8644..8d95ae6b9 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -80,8 +80,10 @@ fn_bootstrap_fetch_file(){ local exitcode=$? if [ ${exitcode} -ne 0 ]; then echo -e "\e[0;31mFAIL\e[0m\n" - echo -e "${remote_fileurl}" | tee -a "${scriptlog}" - echo "${curlcmd}" | tee -a "${scriptlog}" + if [ -f "${scriptlog}" ]; then + echo -e "${remote_fileurl}" | tee -a "${scriptlog}" + echo "${curlcmd}" | tee -a "${scriptlog}" + fi exit 1 else echo -e "\e[0;32mOK\e[0m" @@ -322,12 +324,28 @@ else fi if [ ! -f "${configdirserver}/_default.cfg" ];then mkdir -p "${configdirserver}" + echo -ne " copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${servername}/_default.cfg" "${configdirserver}/_default.cfg" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi else function_file_diff=$(diff -q ${configdirdefault}/config-lgsm/${servername}/_default.cfg ${configdirserver}/_default.cfg) if [ "${function_file_diff}" != "" ]; then - echo "_default.cfg has been altered. Reloading config." + fn_print_warn_nl "_default.cfg has been altered. reloading config." + echo -ne " copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${servername}/_default.cfg" "${configdirserver}/_default.cfg" + exitcode=$? + if [ ${exitcode} -ne 0 ]; then + echo -e "\e[0;31mFAIL\e[0m\n" + exit 1 + else + echo -e "\e[0;32mOK\e[0m" + fi fi fi source "${configdirserver}/_default.cfg" From e2e1ee8c69bc8c69eeb2e149e80731121926d188 Mon Sep 17 00:00:00 2001 From: Christoph Raible Date: Fri, 28 Apr 2017 09:23:37 +0200 Subject: [PATCH 0660/1895] Update check_deps.sh binutils not part of the standard installation of Ubuntu (tested on 17.04) "strings"-command is missing and used in install_config.sh --- lgsm/functions/check_deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index a256c6abc..01fe38c9b 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -145,7 +145,7 @@ if [ -n "$(command -v dpkg-query)" ]; then array_deps_missing=() # LinuxGSM requirements - array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python bzip2 gzip unzip ) + array_deps_required=( curl wget ca-certificates file bsdmainutils util-linux python bzip2 gzip unzip binutils ) # All servers except ts3 require tmux if [ "${gamename}" != "TeamSpeak 3" ]; then From 2a9290b5951299c12e356e7169de52520a27b218 Mon Sep 17 00:00:00 2001 From: Christoph Raible Date: Fri, 28 Apr 2017 13:18:51 +0200 Subject: [PATCH 0661/1895] Update install_server_files.sh Updated UnrealTournament Serverfile + Checksum --- lgsm/functions/install_server_files.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index edee16e9f..f86abd801 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -34,7 +34,7 @@ fn_install_server_files(){ elif [ "${gamename}" == "Unreal Tournament 99" ]; then fileurl="http://files.gameservermanagers.com/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; filedir="${tmpdir}"; filename="ut99-server-451-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" elif [ "${gamename}" == "Unreal Tournament" ]; then - fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Server-XAN-3270765-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3270765-Linux.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="8791dc087383061d7f7f9f523237b8b3" + fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Server-XAN-3395761-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3395761-Linux.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="f04ad5b96865b19613303331ff4075eb" elif [ "${gamename}" == "Unreal Tournament 3" ]; then fileurl="http://files.gameservermanagers.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; filedir="${tmpdir}"; filename="UT3-linux-server-2.1.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then From add483114f090d822a0d821b3013817eefa80ff1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 28 Apr 2017 18:57:01 +0100 Subject: [PATCH 0662/1895] Testing main script file check --- lgsm/functions/command_update_functions.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index cf711023f..a3c5cd16a 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -26,6 +26,17 @@ else fn_print_ok_eol_nl fi +echo -ne " checking ${selfname}...\c" +config_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) +if [ "${config_file_diff}" != "" ]; then + fn_print_update_eol_nl + fn_script_log_info "checking ${selfname}: UPDATE" + rm -f "${tmpdir}/linuxgsm.sh" + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "linuxgsm.sh" "noexecutecmd" "norun" "noforce" "nomd5" +else + fn_print_ok_eol_nl +fi + # Check and update functions if [ -n "${functionsdir}" ]; then if [ -d "${functionsdir}" ]; then From 664a7d6da1a6674c596d8c34e059286996c5fd8d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 28 Apr 2017 19:03:46 +0100 Subject: [PATCH 0663/1895] download linuxgsm.sh in to tmp dir for comparisons --- linuxgsm.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/linuxgsm.sh b/linuxgsm.sh index 8d95ae6b9..811ea5db9 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -363,6 +363,10 @@ else else source "${configdirserver}/${servicename}.cfg" fi + # Load the linuxgsm.sh in to tmpdir. If missing download it + if [ ! -f "${tmpdir}/linuxgsm.sh" ];then + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nomd5" + fi getopt=$1 core_getopt.sh fi \ No newline at end of file From 9ac42470fe24c8c09f2c155e229603ba22ccd0e3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 28 Apr 2017 19:05:29 +0100 Subject: [PATCH 0664/1895] re wording --- lgsm/functions/command_update_functions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index a3c5cd16a..a05269d4e 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -26,7 +26,7 @@ else fn_print_ok_eol_nl fi -echo -ne " checking ${selfname}...\c" +echo -ne " checking linuxgsm.sh...\c" config_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) if [ "${config_file_diff}" != "" ]; then fn_print_update_eol_nl From 87927d82eb926317f3a565699c6213a17eab7954 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 28 Apr 2017 19:08:08 +0100 Subject: [PATCH 0665/1895] now checks and replaces linuxgsm.sh in tmpdir --- lgsm/functions/command_update_functions.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index a05269d4e..a1f05e0e1 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -28,11 +28,11 @@ fi echo -ne " checking linuxgsm.sh...\c" config_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) -if [ "${config_file_diff}" != "" ]; then +if [ "${config_script_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking ${selfname}: UPDATE" rm -f "${tmpdir}/linuxgsm.sh" - fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "linuxgsm.sh" "noexecutecmd" "norun" "noforce" "nomd5" + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nomd5" else fn_print_ok_eol_nl fi From def1f23447859ce2c68dc1d7ad483449630357fb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 28 Apr 2017 21:24:23 +0100 Subject: [PATCH 0666/1895] Source and Goldsource glibc requirements have increased source 2.15 goldsource 2.14 --- lgsm/functions/info_glibc.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 339c3d0ae..c8cf49edb 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -110,8 +110,11 @@ elif [ "${engine}" == "realvirtuality" ]; then elif [ "${engine}" == "seriousengine35" ]; then glibcrequired="2.13" glibcfix="yes" -elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then - glibcrequired="2.3.6" +elif [ "${engine}" == "source" ]; then + glibcrequired="2.15" + glibcfix="no" +elif [ "${engine}" == "goldsource" ] ; then + glibcrequired="2.14" glibcfix="no" elif [ "${engine}" == "spark" ]; then glibcrequired="2.15" From 115b762d42f6ad285b7387cb8e6dea09d455e879 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 29 Apr 2017 14:39:08 +0100 Subject: [PATCH 0667/1895] glibc fix tf2 requirements --- lgsm/functions/fix_glibc.sh | 2 +- lgsm/functions/info_glibc.sh | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index a36b568ac..d7c6a7f0b 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -20,7 +20,7 @@ do done # libm.so.6 -local libm_servers_array=( "Black Mesa: Deathmatch" "Codename CURE" "Day of Infamy" "Double Action: Boogaloo" "Empires Mod" "Fistful of Frags" "Garry's Mod" "GoldenEye: Source" "Insurgency" "Natural Selection 2" "NS2: Combat" "No More Room in Hell" ) +local libm_servers_array=( "Black Mesa: Deathmatch" "Codename CURE" "Day of Infamy" "Double Action: Boogaloo" "Empires Mod" "Fistful of Frags" "Garry's Mod" "GoldenEye: Source" "Insurgency" "Natural Selection 2" "NS2: Combat" "No More Room in Hell" "Team Fortress 2" ) for libm_server in "${libm_servers_array[@]}" do if [ "${gamename}" == "${libm_server}" ]; then diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index c8cf49edb..842801611 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -113,8 +113,8 @@ elif [ "${engine}" == "seriousengine35" ]; then elif [ "${engine}" == "source" ]; then glibcrequired="2.15" glibcfix="no" -elif [ "${engine}" == "goldsource" ] ; then - glibcrequired="2.14" +elif [ "${engine}" == "goldsource" ]; then + glibcrequired="2.3.4" glibcfix="no" elif [ "${engine}" == "spark" ]; then glibcrequired="2.15" @@ -143,6 +143,9 @@ elif [ "${engine}" == "unreal4" ]; then elif [ "${engine}" == "unity3d" ]; then glibcrequired="2.15" glibcfix="no" +elif [ "${engine}" == "Team Fortress 2" ]; then + glibcrequired="2.15" + glibcfix="yes" elif [ "${gamename}" == "TeamSpeak 3" ]; then glibcrequired="NOT REQUIRED" glibcfix="no" From ec82b624939bb298b56143620a08ef0b12bae742 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 29 Apr 2017 14:52:12 +0100 Subject: [PATCH 0668/1895] added 2>/dev/null to all command if statements --- lgsm/functions/check_deps.sh | 28 +++++++++++------------ lgsm/functions/command_dev_detect_deps.sh | 4 ++-- lgsm/functions/command_fastdl.sh | 2 +- lgsm/functions/command_stop.sh | 2 +- lgsm/functions/info_distro.sh | 2 +- lgsm/functions/install_server_files.sh | 2 +- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh index 01fe38c9b..1635b65c4 100644 --- a/lgsm/functions/check_deps.sh +++ b/lgsm/functions/check_deps.sh @@ -18,10 +18,10 @@ fn_deps_detector(){ depstatus=0 deptocheck="${javaversion}" unset javacheck - elif [ -n "$(command -v apt-get)" ]; then + elif [ -n "$(command -v apt-get 2>/dev/null)" ]; then dpkg-query -W -f='${Status}' ${deptocheck} 2>/dev/null | grep -q -P '^install ok installed$' depstatus=$? - elif [ -n "$(command -v yum)" ]; then + elif [ -n "$(command -v yum 2>/dev/null)" ]; then yum -q list installed ${deptocheck} > /dev/null 2>&1 depstatus=$? fi @@ -56,15 +56,15 @@ fn_deps_email(){ array_deps_required+=( exim4 ) elif [ -d /etc/sendmail ]; then array_deps_required+=( sendmail ) - elif [ -n "$(command -v dpkg-query)" ]; then + elif [ -n "$(command -v dpkg-query 2>/dev/null)" ]; then array_deps_required+=( mailutils postfix ) - elif [ -n "$(command -v yum)" ]; then + elif [ -n "$(command -v yum 2>/dev/null)" ]; then array_deps_required+=( mailx postfix ) fi else - if [ -n "$(command -v dpkg-query)" ]; then + if [ -n "$(command -v dpkg-query 2>/dev/null)" ]; then array_deps_required+=( mailutils postfix ) - elif [ -n "$(command -v yum)" ]; then + elif [ -n "$(command -v yum 2>/dev/null)" ]; then array_deps_required+=( mailx postfix ) fi fi @@ -89,10 +89,10 @@ fn_found_missing_deps(){ echo -en "...\r" sleep 1 echo -en " \r" - if [ -n "$(command -v dpkg-query)" ]; then + if [ -n "$(command -v dpkg-query 2>/dev/null)" ]; then cmd="sudo dpkg --add-architecture i386; sudo apt-get update; sudo apt-get -y install ${array_deps_missing[@]}" eval ${cmd} - elif [ -n "$(command -v yum)" ]; then + elif [ -n "$(command -v yum 2>/dev/null)" ]; then cmd="sudo yum -y install ${array_deps_missing[@]}" eval ${cmd} fi @@ -107,9 +107,9 @@ fn_found_missing_deps(){ echo "" fn_print_warning_nl "$(whoami) does not have sudo access. Manually install dependencies." fn_script_log_warn "$(whoami) does not have sudo access. Manually install dependencies." - if [ -n "$(command -v dpkg-query)" ]; then + if [ -n "$(command -v dpkg-query 2>/dev/null)" ]; then echo " sudo dpkg --add-architecture i386; sudo apt-get update; sudo apt-get install ${array_deps_missing[@]}" - elif [ -n "$(command -v yum)" ]; then + elif [ -n "$(command -v yum 2>/dev/null)" ]; then echo " sudo yum install ${array_deps_missing[@]}" fi echo "" @@ -140,7 +140,7 @@ if [ "${function_selfname}" == "command_install.sh" ]; then fi # Check will only run if using apt-get or yum -if [ -n "$(command -v dpkg-query)" ]; then +if [ -n "$(command -v dpkg-query 2>/dev/null)" ]; then # Generate array of missing deps array_deps_missing=() @@ -149,7 +149,7 @@ if [ -n "$(command -v dpkg-query)" ]; then # All servers except ts3 require tmux if [ "${gamename}" != "TeamSpeak 3" ]; then - if [ "$(command -v tmux)" ]||[ "$(which tmux 2>/dev/null)" ]||[ -f "/usr/bin/tmux" ]||[ -f "/bin/tmux" ]; then + if [ "$(command -v tmux 2>/dev/null)" ]||[ "$(which tmux 2>/dev/null)" ]||[ -f "/usr/bin/tmux" ]||[ -f "/bin/tmux" ]; then tmuxcheck=1 # Added for users compiling tmux from source to bypass check. else array_deps_required+=( tmux ) @@ -219,7 +219,7 @@ if [ -n "$(command -v dpkg-query)" ]; then fn_deps_email fn_check_loop -elif [ -n "$(command -v yum)" ]; then +elif [ -n "$(command -v yum 2>/dev/null)" ]; then # Generate array of missing deps array_deps_missing=() @@ -232,7 +232,7 @@ elif [ -n "$(command -v yum)" ]; then # All servers except ts3 require tmux if [ "${gamename}" != "TeamSpeak 3" ]; then - if [ "$(command -v tmux)" ]||[ "$(which tmux 2>/dev/null)" ]||[ -f "/usr/bin/tmux" ]||[ -f "/bin/tmux" ]; then + if [ "$(command -v tmux 2>/dev/null)" ]||[ "$(which tmux 2>/dev/null)" ]||[ -f "/usr/bin/tmux" ]||[ -f "/bin/tmux" ]; then tmuxcheck=1 # Added for users compiling tmux from source to bypass check. else array_deps_required+=( tmux ) diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 42ea13880..478cb1f3a 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -34,9 +34,9 @@ elif [ "${executable}" == "./ts3server_startscript.sh" ]; then executable=ts3server_linux_amd64 fi -if [ "$(command -v eu-readelf)" ]; then +if [ "$(command -v eu-readelf 2>/dev/null)" ]; then readelf=eu-readelf -elif [ "$(command -v readelf)" ]; then +elif [ "$(command -v readelf 2>/dev/null)" ]; then readelf=readelf else echo "readelf/eu-readelf not installed" diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 34ea98d0c..6c52b6a72 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -23,7 +23,7 @@ luafastdlfile="lgsm_cl_force_fastdl.lua" luafastdlfullpath="${luasvautorundir}/${luafastdlfile}" # Check if bzip2 is installed -if [ -z "$(command -v bzip2)" ]; then +if [ -z "$(command -v bzip2 2>/dev/null)" ]; then fn_print_fail "bzip2 is not installed" fn_script_log_fatal "bzip2 is not installed" core_exit.sh diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index fe88c43ce..1443fac8d 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -113,7 +113,7 @@ fn_stop_graceful_sdtd(){ 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 + elif [ "$(command -v expect 2>/dev/null)" ]||[ "$(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}" diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index abc3fff59..882b8412b 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -37,7 +37,7 @@ glibcversion="$(ldd --version | sed -n '1s/.* //p')" ## tmux version # e.g: tmux 1.6 -if [ -z "$(command -V tmux)" ]; then +if [ -z "$(command -V tmux 2>/dev/null)" ]; then tmuxv="${red}NOT INSTALLED!${default}" else if [ "$(tmux -V|sed "s/tmux //" | sed -n '1 p' | tr -cd '[:digit:]')" -lt "16" ] 2>/dev/null; then diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index f86abd801..aaef4fb33 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -72,7 +72,7 @@ fn_install_server_files_steamcmd(){ # Detects if unbuffer command is available for 32 bit distributions only. info_distro.sh - if [ $(command -v stdbuf) ]&&[ "${arch}" != "x86_64" ]; then + if [ $(command -v stdbuf 2>/dev/null) ]&&[ "${arch}" != "x86_64" ]; then unbuffer="stdbuf -i0 -o0 -e0" fi From e5d9b3ca37e49fb0d1e65b6d128469e01582e313 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 29 Apr 2017 14:54:56 +0100 Subject: [PATCH 0669/1895] glibc fix tf2 requirements --- lgsm/functions/fix_glibc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index d7c6a7f0b..de808f0f6 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -11,7 +11,7 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" ## i386 # libstdc++.so.6 -local libstdc_servers_array=( "ARMA 3" "Blade Symphony" "Garry's Mod" "GoldenEye: Source" "Just Cause 2" ) +local libstdc_servers_array=( "ARMA 3" "Blade Symphony" "Garry's Mod" "GoldenEye: Source" "Just Cause 2" "Team Fortress 2" ) for libstdc_server in "${libstdc_servers_array[@]}" do if [ "${gamename}" == "${libstdc_server}" ]; then From 161888480ddc0cf7ea86a23c1332bc5b703a44a8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 29 Apr 2017 15:00:01 +0100 Subject: [PATCH 0670/1895] glibc fix tf2 requirements --- lgsm/functions/fix_glibc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index de808f0f6..cbab27069 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -29,7 +29,7 @@ do done # libc.so.6 -local libc_servers_array=( "Black Mesa: Deathmatch" "Blade Symphony" "Garry's Mod" "GoldenEye: Source" ) +local libc_servers_array=( "Black Mesa: Deathmatch" "Blade Symphony" "Garry's Mod" "GoldenEye: Source" "Team Fortress 2" ) for libc_server in "${libc_servers_array[@]}" do if [ "${gamename}" == "${libc_server}" ]; then From 2d8cc127ff4e45f85e696a08a6c734d36f6ae146 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Apr 2017 14:21:52 +0100 Subject: [PATCH 0671/1895] Improvements to dev features deps detect now checks all files rather than just the executable file --- lgsm/functions/command_dev_detect_deps.sh | 75 +++++++++------------- lgsm/functions/command_dev_detect_glibc.sh | 12 ++-- 2 files changed, 33 insertions(+), 54 deletions(-) diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 478cb1f3a..784e7c8e5 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -8,32 +8,11 @@ local commandname="DEPS-DETECT" local commandaction="Deps-Detect" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -check.sh -cd "${executabledir}" -if [ "${executable}" == "./hlds_run" ]; then - executable=hlds_linux -elif [ "${executable}" == "./srcds_run" ]||[ "${executable}" == "./dabds.sh" ]||[ "${executable}" == "./srcds_run.sh" ]; then - executable=srcds_linux -elif [ "${executable}" == "./server_linux32" ]; then - executable=libSpark_Core.so -elif [ "${executable}" == "./runSam3_DedicatedServer.sh" ]; then - executable=Sam3_DedicatedServer -elif [ "${executable}" == "./7DaysToDie.sh" ]; then - executable=7DaysToDie.x86 -elif [ "${executable}" == "./ucc-bin" ]; then - - if [ -f "${executabledir}/ucc-bin-real" ]; then - executable=ucc-bin-real - elif [ -f "${executabledir}/ut2004-bin" ]; then - executable=ut2004-bin - else - executable=ut-bin - fi - -elif [ "${executable}" == "./ts3server_startscript.sh" ]; then - executable=ts3server_linux_amd64 -fi - +echo "=================================" +echo "Dependencies Checker" +echo "=================================" +echo "Checking directory: " +echo "${filesdir}" if [ "$(command -v eu-readelf 2>/dev/null)" ]; then readelf=eu-readelf elif [ "$(command -v readelf 2>/dev/null)" ]; then @@ -42,29 +21,34 @@ else echo "readelf/eu-readelf not installed" fi -${readelf} -d ${executable} |grep NEEDED|awk '{ print $5 }'|sed 's/\[//g'|sed 's/\]//g' > "${tmpdir}/.depdetect_readelf" +files=$(find ${filesdir} | wc -l) +find "${filesdir}" -type f -print0 | +while IFS= read -r -d $'\0' line; do + ${readelf} -d "${line}" 2>/dev/null|grep NEEDED|awk '{ print $5 }'|sed 's/\[//g;s/\]//g' >> "${tmpdir}/.depdetect_readelf" + echo -n "${i} / ${files}" $'\r' + ((i++)) +done +sort "${tmpdir}/.depdetect_readelf" |uniq >"${tmpdir}/.depdetect_readelf_uniq" -echo "yum install " > "${tmpdir}/.depdetect_centos_list_uniq" -echo "apt-get install " > "${tmpdir}/.depdetect_ubuntu_list_uniq" -echo "apt-get install " > "${tmpdir}/.depdetect_debian_list_uniq" while read lib; do - sharedlib=${lib} - if [ "${lib}" == "libm.so.6" ]||[ "${lib}" == "libc.so.6" ]||[ "${lib}" == "libpthread.so.0" ]||[ "${lib}" == "libdl.so.2" ]||[ "${lib}" == "libnsl.so.1" ]||[ "${lib}" == "libgcc_s.so.1" ]||[ "${lib}" == "librt.so.1" ]||[ "${lib}" == "ld-linux.so.2" ]; then + + if [ "${lib}" == "libm.so.6" ]||[ "${lib}" == "libc.so.6" ]||[ "${lib}" == "libtcmalloc_minimal.so.4" ]||[ "${lib}" == "libpthread.so.0" ]||[ "${lib}" == "libdl.so.2" ]||[ "${lib}" == "libnsl.so.1" ]||[ "${lib}" == "libgcc_s.so.1" ]||[ "${lib}" == "librt.so.1" ]||[ "${lib}" == "ld-linux.so.2" ]; then echo "glibc.i686" >> "${tmpdir}/.depdetect_centos_list" echo "lib32gcc1" >> "${tmpdir}/.depdetect_ubuntu_list" echo "lib32gcc1" >> "${tmpdir}/.depdetect_debian_list" - elif [ "${lib}" == "libstdc++.so.6" ]; then echo "libstdc++.i686" >> "${tmpdir}/.depdetect_centos_list" echo "libstdc++6:i386" >> "${tmpdir}/.depdetect_ubuntu_list" echo "libstdc++6:i386" >> "${tmpdir}/.depdetect_debian_list" - elif [ "${lib}" == "libstdc++.so.5" ]; then echo "compat-libstdc++-33.i686" >> "${tmpdir}/.depdetect_centos_list" echo "libstdc++5:i386" >> "${tmpdir}/.depdetect_ubuntu_list" echo "libstdc++5:i386" >> "${tmpdir}/.depdetect_debian_list" - + elif [ "${lib}" == "libcurl-gnutls.so.4" ]; then + echo "libcurl.i686" >> "${tmpdir}/.depdetect_centos_list" + echo "libcurl4-gnutls-dev:i386" >> "${tmpdir}/.depdetect_ubuntu_list" + echo "libcurl4-gnutls-dev:i386" >> "${tmpdir}/.depdetect_debian_list" elif [ "${lib}" == "libspeex.so.1" ]||[ "${lib}" == "libspeexdsp.so.1" ]; then echo "speex.i686" >> "${tmpdir}/.depdetect_centos_list" echo "speex:i386" >> "${tmpdir}/.depdetect_ubuntu_list" @@ -80,14 +64,17 @@ while read lib; do echo "libtbb2" >> "${tmpdir}/.depdetect_ubuntu_list" echo "libtbb2" >> "${tmpdir}/.depdetect_debian_list" - elif [ "${lib}" == "libtier0.so" ]||[ "${lib}" == "Core.so" ]||[ "${lib}" == "Editor.so" ]||[ "${lib}" == "Engine.so" ]||[ "${lib}" == "liblua.so" ]||[ "${lib}" == "libsteam_api.so" ]||[ "${lib}" == "ld-linux-x86-64.so.2" ]||[ "${lib}" == "libPhysX3_x86.so" ]||[ "${lib}" == "libPhysX3Common_x86.so" ]||[ "${lib}" == "libPhysX3Cooking_x86.so" ]; then + elif [ "${lib}" == "libtier0.so" ]||[ "${lib}" == "libtier0_srv.so" ]||[ "${lib}" == "libvstdlib_srv.so" ]||[ "${lib}" == "Core.so" ]||[ "${lib}" == "libvstdlib.so" ]||[ "${lib}" == "libtier0_s.so" ]||[ "${lib}" == "Editor.so" ]||[ "${lib}" == "Engine.so" ]||[ "${lib}" == "liblua.so" ]||[ "${lib}" == "libsteam_api.so" ]||[ "${lib}" == "ld-linux-x86-64.so.2" ]||[ "${lib}" == "libPhysX3_x86.so" ]||[ "${lib}" == "libPhysX3Common_x86.so" ]||[ "${lib}" == "libPhysX3Cooking_x86.so" ]; then # Known shared libs what dont requires dependencies : else unknownlib=1 echo "${lib}" >> "${tmpdir}/.depdetect_unknown" fi -done < "${tmpdir}/.depdetect_readelf" + +done < "${tmpdir}/.depdetect_readelf_uniq" + + sort "${tmpdir}/.depdetect_centos_list" | uniq >> "${tmpdir}/.depdetect_centos_list_uniq" sort "${tmpdir}/.depdetect_ubuntu_list" | uniq >> "${tmpdir}/.depdetect_ubuntu_list_uniq" sort "${tmpdir}/.depdetect_debian_list" | uniq >> "${tmpdir}/.depdetect_debian_list_uniq" @@ -95,10 +82,10 @@ if [ "${unknownlib}" == "1" ]; then sort "${tmpdir}/.depdetect_unknown" | uniq >> "${tmpdir}/.depdetect_unknown_uniq" fi -awk -vORS=' ' '{ print $1, $2 }' "${tmpdir}/.depdetect_centos_list_uniq" > "${tmpdir}/.depdetect_centos_line" -awk -vORS=' ' '{ print $1, $2 }' "${tmpdir}/.depdetect_ubuntu_list_uniq" > "${tmpdir}/.depdetect_ubuntu_line" -awk -vORS=' ' '{ print $1, $2 }' "${tmpdir}/.depdetect_debian_list_uniq" > "${tmpdir}/.depdetect_debian_line" - +awk -vORS='' '{ print $1,$2 }' "${tmpdir}/.depdetect_centos_list_uniq" > "${tmpdir}/.depdetect_centos_line" +awk -vORS='' '{ print $1,$2 }' "${tmpdir}/.depdetect_ubuntu_list_uniq" > "${tmpdir}/.depdetect_ubuntu_line" +awk -vORS='' '{ print $1,$2 }' "${tmpdir}/.depdetect_debian_list_uniq" > "${tmpdir}/.depdetect_debian_line" +echo "" echo "" echo "Required Dependencies" echo "=================================" @@ -128,10 +115,6 @@ echo "" echo "Required Librarys" echo "=================================" sort "${tmpdir}/.depdetect_readelf" |uniq -echo "" -echo "ldd" -echo "=================================" -ldd ${executable} echo -en "\n" rm -f "${tmpdir}/.depdetect_centos_line" rm -f "${tmpdir}/.depdetect_centos_list" @@ -150,4 +133,4 @@ rm -f "${tmpdir}/.depdetect_readelf" rm -f "${tmpdir}/.depdetect_unknown" rm -f "${tmpdir}/.depdetect_unknown_uniq" -core_exit.sh +core_exit.sh \ No newline at end of file diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index 536a12c2a..08b178117 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -1,5 +1,5 @@ #!/bin/bash -# command_dev_detect_glibc.sh function +# LinuxGSM command_dev_detect_glibc.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Automatically detects the version of GLIBC that is required. @@ -15,10 +15,6 @@ if [ -z "$(command -v objdump)" ]; then core_exit.sh fi -if [ -z "${filesdir}" ]; then - dir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -fi - if [ -d "${filesdir}" ]; then echo "Checking directory: " echo "${filesdir}" @@ -29,10 +25,10 @@ fi echo "" files=$(find ${filesdir} | wc -l) -find ${filesdir} -type f -print0 | +find "${filesdir}" -type f -print0 | while IFS= read -r -d $'\0' line; do - objdump -T $line 2>/dev/null|grep -oP "GLIBC[^ ]+" >>"${tmpdir}/detect_glibc.tmp" - echo -n "$i / $files" $'\r' + objdump -T "${line}" 2>/dev/null|grep -oP "GLIBC[^ ]+" >>"${tmpdir}/detect_glibc.tmp" + echo -n "${i} / ${files}" $'\r' ((i++)) done echo "" From 73a55392f7534ab009ed8a8fb5bbb1be33eba542 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Apr 2017 15:08:33 +0100 Subject: [PATCH 0672/1895] fixes to deps_detect --- lgsm/functions/command_dev_detect_deps.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 784e7c8e5..8f7cde8bb 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -20,11 +20,14 @@ elif [ "$(command -v readelf 2>/dev/null)" ]; then else echo "readelf/eu-readelf not installed" fi - files=$(find ${filesdir} | wc -l) find "${filesdir}" -type f -print0 | while IFS= read -r -d $'\0' line; do - ${readelf} -d "${line}" 2>/dev/null|grep NEEDED|awk '{ print $5 }'|sed 's/\[//g;s/\]//g' >> "${tmpdir}/.depdetect_readelf" + if [ "${readelf}" == "eu-readelf" ];then + ${readelf} -d "${line}" 2>/dev/null|grep NEEDED|awk '{ print $4 }'|sed 's/\[//g;s/\]//g' >> "${tmpdir}/.depdetect_readelf" + else + ${readelf} -d "${line}" 2>/dev/null|grep NEEDED|awk '{ print $5 }'|sed 's/\[//g;s/\]//g' >> "${tmpdir}/.depdetect_readelf" + fi echo -n "${i} / ${files}" $'\r' ((i++)) done @@ -32,7 +35,6 @@ done sort "${tmpdir}/.depdetect_readelf" |uniq >"${tmpdir}/.depdetect_readelf_uniq" while read lib; do - if [ "${lib}" == "libm.so.6" ]||[ "${lib}" == "libc.so.6" ]||[ "${lib}" == "libtcmalloc_minimal.so.4" ]||[ "${lib}" == "libpthread.so.0" ]||[ "${lib}" == "libdl.so.2" ]||[ "${lib}" == "libnsl.so.1" ]||[ "${lib}" == "libgcc_s.so.1" ]||[ "${lib}" == "librt.so.1" ]||[ "${lib}" == "ld-linux.so.2" ]; then echo "glibc.i686" >> "${tmpdir}/.depdetect_centos_list" echo "lib32gcc1" >> "${tmpdir}/.depdetect_ubuntu_list" @@ -129,7 +131,7 @@ rm -f "${tmpdir}/.depdetect_ubuntu_list" rm -f "${tmpdir}/.depdetect_ubuntu_list_uniq" rm -f "${tmpdir}/.depdetect_readelf" - +rm -f "${tmpdir}/.depdetect_readelf_uniq" rm -f "${tmpdir}/.depdetect_unknown" rm -f "${tmpdir}/.depdetect_unknown_uniq" From 0543871467dc489015aef5f80ab97ebdc9b5d91e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Apr 2017 16:13:38 +0100 Subject: [PATCH 0673/1895] Added glibcfix for CSGO already works on centos 6 as csgo comes with linked librarys however added libstdc++.so anyway --- lgsm/functions/fix_glibc.sh | 2 +- lgsm/functions/info_glibc.sh | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index cbab27069..2125c9b20 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -11,7 +11,7 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" ## i386 # libstdc++.so.6 -local libstdc_servers_array=( "ARMA 3" "Blade Symphony" "Garry's Mod" "GoldenEye: Source" "Just Cause 2" "Team Fortress 2" ) +local libstdc_servers_array=( "ARMA 3" "Blade Symphony" "Counter-Strike: Global Offensive" "Garry's Mod" "GoldenEye: Source" "Just Cause 2" "Team Fortress 2" ) for libstdc_server in "${libstdc_servers_array[@]}" do if [ "${gamename}" == "${libstdc_server}" ]; then diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 842801611..425a49608 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -38,6 +38,9 @@ elif [ "${gamename}" == "Call of Duty: World at War" ]; then elif [ "${gamename}" == "Codename CURE" ]; then glibcrequired="2.15" glibcfix="yes" +elif [ "${gamename}" == "Counter-Strike: Global Offensive" ]; then + glibcrequired="2.15" + glibcfix="yes" elif [ "${gamename}" == "Day of Infamy" ]; then glibcrequired="2.15" glibcfix="yes" From 9fe21a69993e3d775b5bb449bd3ab632aa70b2cc Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Apr 2017 16:41:41 +0100 Subject: [PATCH 0674/1895] detect glibc now shows the the files that require glibc and the version --- lgsm/functions/command_dev_detect_glibc.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index 08b178117..4a28ed805 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -27,12 +27,19 @@ echo "" files=$(find ${filesdir} | wc -l) find "${filesdir}" -type f -print0 | while IFS= read -r -d $'\0' line; do + glibcversion=$(objdump -T "${line}" 2>/dev/null|grep -oP "GLIBC[^ ]+" |grep -v GLIBCXX|sort|uniq|sort -r --version-sort| head -n 1) + if [ "${glibcversion}" ];then + echo "${glibcversion}: ${line}" >>"${tmpdir}/detect_glibc_files.tmp" + fi objdump -T "${line}" 2>/dev/null|grep -oP "GLIBC[^ ]+" >>"${tmpdir}/detect_glibc.tmp" echo -n "${i} / ${files}" $'\r' ((i++)) done echo "" +cat "${tmpdir}/detect_glibc_files.tmp" +echo "" cat "${tmpdir}/detect_glibc.tmp"|sort|uniq|sort -r --version-sort rm "${tmpdir}/detect_glibc.tmp" +rm "${tmpdir}/detect_glibc_files.tmp" core_exit.sh From 2fa2de030ca52ab32449956b1084ce6f1b634c91 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Apr 2017 17:03:29 +0100 Subject: [PATCH 0675/1895] glibcfix for pvkii --- lgsm/functions/fix_glibc.sh | 2 +- lgsm/functions/info_glibc.sh | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index 2125c9b20..45370b76d 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -20,7 +20,7 @@ do done # libm.so.6 -local libm_servers_array=( "Black Mesa: Deathmatch" "Codename CURE" "Day of Infamy" "Double Action: Boogaloo" "Empires Mod" "Fistful of Frags" "Garry's Mod" "GoldenEye: Source" "Insurgency" "Natural Selection 2" "NS2: Combat" "No More Room in Hell" "Team Fortress 2" ) +local libm_servers_array=( "Black Mesa: Deathmatch" "Codename CURE" "Day of Infamy" "Double Action: Boogaloo" "Empires Mod" "Fistful of Frags" "Garry's Mod" "GoldenEye: Source" "Insurgency" "Natural Selection 2" "NS2: Combat" "No More Room in Hell" "Pirates, Vikings, and Knights II" "Team Fortress 2" ) for libm_server in "${libm_servers_array[@]}" do if [ "${gamename}" == "${libm_server}" ]; then diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index 425a49608..c7ccccc87 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -74,6 +74,9 @@ elif [ "${gamename}" == "No More Room in Hell" ]; then elif [ "${gamename}" == "Project Cars" ]; then glibcrequired="2.4" glibcfix="no" +elif [ "${gamename}" == "Pirates, Vikings, and Knights II" ]; then + glibcrequired="2.15" + glibcfix="yes" elif [ "${gamename}" == "Quake 2" ]; then glibcrequired="NOT REQUIRED" glibcfix="no" From d6f13a18f25eb9ac1ea788fcd7380df09f65da6f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Apr 2017 17:47:46 +0100 Subject: [PATCH 0676/1895] reverted source back to 2.3.6 not all servers are not 2.15 --- lgsm/functions/info_glibc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index c7ccccc87..f4c1a3f95 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -117,7 +117,7 @@ elif [ "${engine}" == "seriousengine35" ]; then glibcrequired="2.13" glibcfix="yes" elif [ "${engine}" == "source" ]; then - glibcrequired="2.15" + glibcrequired="2.3.6" glibcfix="no" elif [ "${engine}" == "goldsource" ]; then glibcrequired="2.3.4" From 24033d01c7e0094b24bfc18deb4cda6150657bb4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Apr 2017 20:09:48 +0100 Subject: [PATCH 0677/1895] fixes issue #1393 --- lgsm/functions/alert_pushbullet.sh | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh index 05276b010..0b209fe07 100644 --- a/lgsm/functions/alert_pushbullet.sh +++ b/lgsm/functions/alert_pushbullet.sh @@ -8,10 +8,32 @@ local commandname="ALERT" local commandaction="Alert" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +# converts text to ascii then passes to curl. allowing special characters to be sent e.g % +# http://stackoverflow.com/a/10660730 +fn_rawurlencode() { + local string="${1}" + local strlen=${#string} + local encoded="" + local pos c o + + for (( pos=0 ; pos Date: Sun, 30 Apr 2017 21:19:39 +0100 Subject: [PATCH 0678/1895] How allows for multiple appids to pass though updater for csco --- lgsm/functions/update_steamcmd.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 8720af82c..c1cff9a82 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -140,6 +140,7 @@ fn_update_request_log(){ } fn_update_steamcmd_check(){ + appid="${1}" fn_appmanifest_check # Checks for server update from SteamCMD fn_print_dots "Checking for update: SteamCMD" @@ -185,7 +186,6 @@ fn_update_steamcmd_check(){ sleep 1 echo -e " Current build: ${red}${currentbuild}${default}" echo -e " Available build: ${green}${availablebuild}${default}" - echo -e "" echo -e " https://steamdb.info/app/${appid}/" sleep 1 echo "" @@ -236,7 +236,10 @@ if [ "${engine}" == "goldsource" ]||[ "${forceupdate}" == "1" ]; then if [ "${status}" != "0" ]; then exitbypass=1 command_stop.sh - fn_update_steamcmd_dl + if [ "${gamename}" == "Classic Offensive" ]; then + appid="${appid_co}" + fn_update_steamcmd_dl + fi exitbypass=1 command_start.sh else @@ -244,5 +247,8 @@ if [ "${engine}" == "goldsource" ]||[ "${forceupdate}" == "1" ]; then fi else fn_update_request_log - fn_update_steamcmd_check + fn_update_steamcmd_check "${appid}" + if [ "${gamename}" == "Classic Offensive" ]; then + fn_update_steamcmd_check "${appid_co}" + fi fi From 41607910213d9e0629ad56b161afbd43e0e39720 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Apr 2017 21:22:38 +0100 Subject: [PATCH 0679/1895] removed bad code --- lgsm/functions/update_steamcmd.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index c1cff9a82..03bc34f9c 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -236,10 +236,7 @@ if [ "${engine}" == "goldsource" ]||[ "${forceupdate}" == "1" ]; then if [ "${status}" != "0" ]; then exitbypass=1 command_stop.sh - if [ "${gamename}" == "Classic Offensive" ]; then - appid="${appid_co}" - fn_update_steamcmd_dl - fi + fn_update_steamcmd_dl exitbypass=1 command_start.sh else @@ -248,6 +245,7 @@ if [ "${engine}" == "goldsource" ]||[ "${forceupdate}" == "1" ]; then else fn_update_request_log fn_update_steamcmd_check "${appid}" + # will also check for second appid if [ "${gamename}" == "Classic Offensive" ]; then fn_update_steamcmd_check "${appid_co}" fi From 67c9eb7b1fcc1a6ac9049cf52e9106aae9392b1e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Apr 2017 21:31:09 +0100 Subject: [PATCH 0680/1895] added check for csco --- lgsm/functions/command_validate.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index eb6d13c15..7900be071 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -51,10 +51,18 @@ check_status.sh if [ "${status}" != "0" ]; then exitbypass=1 command_stop.sh - fn_validation + fn_validation "${appid}" + # will also check for second appid + if [ "${gamename}" == "Classic Offensive" ]; then + fn_validation "${appid_co}" + fi exitbypass=1 command_start.sh else fn_validation + # will also check for second appid + if [ "${gamename}" == "Classic Offensive" ]; then + fn_validation "${appid_co}" + fi fi core_exit.sh From 26b717b0f80795a6a45bf1b0fb48c1beda662e2c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Apr 2017 21:42:47 +0100 Subject: [PATCH 0681/1895] forgot to add ${1} --- lgsm/functions/command_validate.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 7900be071..f7a3ecd68 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -9,6 +9,7 @@ local commandaction="Validate" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_validation(){ + appid="${1}" echo "" echo -e " * Validating may overwrite some customised files." echo -en " * https://developer.valvesoftware.com/wiki/SteamCMD#Validate" From f423f4d6acd8c4114e8cffc509aeaa4477caaab9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Apr 2017 21:49:07 +0100 Subject: [PATCH 0682/1895] fixes #1345 --- lgsm/functions/command_start.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 6a20a0e23..bc24cd6cb 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -31,8 +31,9 @@ fn_start_teamspeak3(){ fn_script_log_error "${servername} is already running" core_exit.sh fi - - mv "${scriptlog}" "${scriptlogdate}" + if [ -f "${scriptlog}" ]; then + mv "${scriptlog}" "${scriptlogdate}" + fi # Create lockfile date > "${rootdir}/${lockselfname}" cd "${executabledir}" @@ -56,7 +57,7 @@ fn_start_teamspeak3(){ fn_start_tmux(){ fn_parms - + # check for tmux size variables if [[ "${servercfgtmuxwidth}" =~ ^[0-9]+$ ]]; then sessionwidth="${servercfgtmuxwidth}" From 927c34ff1cdfcc26c70d7e2850a036bfe73801d3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Apr 2017 21:53:08 +0100 Subject: [PATCH 0683/1895] Release 170530 --- 7DaysToDie/sdtdserver | 2 +- ARKSurvivalEvolved/arkserver | 2 +- Arma3/arma3server | 2 +- BallisticOverkill/boserver | 2 +- Battlefield1942/bf1942server | 2 +- BlackMesa/bmdmserver | 2 +- BladeSymphony/bsserver | 2 +- BrainBread2/bb2server | 2 +- CallOfDuty/codserver | 2 +- CallOfDuty2/cod2server | 2 +- CallOfDuty4/cod4server | 2 +- CallOfDutyUnitedOffensive/coduoserver | 2 +- CallOfDutyWorldAtWar/codwawserver | 2 +- ClassicOffensive/coserver | 2 +- CodenameCURE/ccserver | 2 +- CounterStrike/csserver | 2 +- CounterStrikeConditionZero/csczserver | 2 +- CounterStrikeGlobalOffensive/csgoserver | 2 +- CounterStrikeSource/cssserver | 2 +- DayOfDefeat/dodserver | 2 +- DayOfDefeatSource/dodsserver | 2 +- DayOfInfamy/doiserver | 2 +- DeathmatchClassic/dmcserver | 2 +- DontStarveTogether/dstserver | 2 +- DoubleActionBoogaloo/dabserver | 2 +- EmpiresMod/emserver | 2 +- Factorio/fctrserver | 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 +- Minecraft/mcserver | 2 +- MultiTheftAuto/mtaserver | 2 +- Mumble/mumbleserver | 2 +- NS2Combat/ns2cserver | 2 +- NaturalSelection2/ns2server | 2 +- NoMoreRoomInHell/nmrihserver | 2 +- OpposingForce/opforserver | 2 +- PiratesVikingandKnightsII/pvkiiserver | 2 +- ProjectCars/pcserver | 2 +- ProjectZomboid/pzserver | 2 +- Quake2/q2server | 2 +- Quake3/q3server | 2 +- QuakeLive/qlserver | 2 +- QuakeWorld/qwserver | 2 +- RedOrchestra/roserver | 2 +- Ricochet/ricochetserver | 2 +- Rust/rustserver | 2 +- SeriousSam3BFE/ss3sserver | 2 +- Starbound/sbserver | 2 +- SvenCoop/svenserver | 2 +- TeamFortress2/tf2server | 2 +- TeamFortressClassic/tfcserver | 2 +- TeamSpeak3/ts3server | 2 +- Teeworlds/twserver | 2 +- Terraria/terrariaserver | 2 +- TowerUnite/tuserver | 2 +- UnrealTournament/utserver | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament3/ut3server | 2 +- UnrealTournament99/ut99server | 2 +- WolfensteinEnemyTerritory/wetserver | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_ts3server.sh | 2 +- 72 files changed, 72 insertions(+), 72 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index fe579d3df..ea3022ba2 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 6770d4128..793e91315 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Arma3/arma3server b/Arma3/arma3server index 4b7d9e90e..f4dce07d9 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/BallisticOverkill/boserver b/BallisticOverkill/boserver index 1f29990be..4c687fc75 100644 --- a/BallisticOverkill/boserver +++ b/BallisticOverkill/boserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Battlefield1942/bf1942server b/Battlefield1942/bf1942server index efd27a892..cbb3e19b8 100644 --- a/Battlefield1942/bf1942server +++ b/Battlefield1942/bf1942server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index 29d4cb903..dbaaca6da 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index 96c27899e..5907de290 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index 3647d5a32..dd8b8e97d 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/CallOfDuty/codserver b/CallOfDuty/codserver index f4d092300..1f5298a20 100755 --- a/CallOfDuty/codserver +++ b/CallOfDuty/codserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/CallOfDuty2/cod2server b/CallOfDuty2/cod2server index 9b918fc1b..d81184ede 100755 --- a/CallOfDuty2/cod2server +++ b/CallOfDuty2/cod2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server index 50432244f..9b1efae78 100644 --- a/CallOfDuty4/cod4server +++ b/CallOfDuty4/cod4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/CallOfDutyUnitedOffensive/coduoserver b/CallOfDutyUnitedOffensive/coduoserver index 9011ead88..ea7e5ca31 100755 --- a/CallOfDutyUnitedOffensive/coduoserver +++ b/CallOfDutyUnitedOffensive/coduoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/CallOfDutyWorldAtWar/codwawserver b/CallOfDutyWorldAtWar/codwawserver index 81bac8ca1..36b1d3c99 100755 --- a/CallOfDutyWorldAtWar/codwawserver +++ b/CallOfDutyWorldAtWar/codwawserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/ClassicOffensive/coserver b/ClassicOffensive/coserver index 8800f55db..65870a09f 100644 --- a/ClassicOffensive/coserver +++ b/ClassicOffensive/coserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index 15a57e0af..acef2e2db 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/CounterStrike/csserver b/CounterStrike/csserver index ac18e4e20..013a14d59 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index d02caa924..4da72eeb4 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index 75ffa7265..daa188ed3 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index 7ccc2a688..e9631fe69 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index 17e6bf90a..fbf0beb8f 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 6710ec756..966374459 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/DayOfInfamy/doiserver b/DayOfInfamy/doiserver index e26f95010..e102e82b6 100644 --- a/DayOfInfamy/doiserver +++ b/DayOfInfamy/doiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index 9308ced64..db9cfab39 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index d84b8084a..7a0afb612 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index ab0f3c770..95a7a6bc1 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/EmpiresMod/emserver b/EmpiresMod/emserver index a9b9def1c..6576ecfad 100644 --- a/EmpiresMod/emserver +++ b/EmpiresMod/emserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 54e76a5f2..94a127ec3 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index aaf73016c..24ecb2799 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index d9b06c24a..7d5a29f3b 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index 9182365d6..c1f309ad2 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index a32f50903..59aa52a3c 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index 701678eb9..27bdaeb25 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index aa5a19990..d06784ac6 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index 445551956..59de19019 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Insurgency/insserver b/Insurgency/insserver index 6bf8c6787..429c1ac56 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/JustCause2/jc2server b/JustCause2/jc2server index f6491db66..9c7b8feb1 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index cd3d4c8d8..d156bc938 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index fae715724..eae269463 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index 8b9761476..fbf4fc6c8 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Minecraft/mcserver b/Minecraft/mcserver index 5e703eec3..9405a3318 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver index d82e00754..ff4a38cd8 100644 --- a/MultiTheftAuto/mtaserver +++ b/MultiTheftAuto/mtaserver @@ -12,7 +12,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index 369a26206..d496468ab 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index c5abeb46f..2aa894f0d 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index af5e65d24..98d63ac4f 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index 7aac993bc..7a3630697 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index 915a6944a..8dd9187c7 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index 5ab0e2396..d34b4927c 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/ProjectCars/pcserver b/ProjectCars/pcserver index 64b6bd5e8..40e7196b0 100755 --- a/ProjectCars/pcserver +++ b/ProjectCars/pcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index 191505d57..67253aba3 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Quake2/q2server b/Quake2/q2server index 601fff1cc..997513ed9 100644 --- a/Quake2/q2server +++ b/Quake2/q2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Quake3/q3server b/Quake3/q3server index 9a0dced71..078166599 100644 --- a/Quake3/q3server +++ b/Quake3/q3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index 1fdaec287..efd3b5001 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/QuakeWorld/qwserver b/QuakeWorld/qwserver index 5d0cb3b8a..046bedc3c 100644 --- a/QuakeWorld/qwserver +++ b/QuakeWorld/qwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index ea82680d5..428049752 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index 641fc84e1..7431c204e 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Rust/rustserver b/Rust/rustserver index 6ac1ac5f9..c043cb5b5 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index a6b4d53f0..f66c3484a 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Starbound/sbserver b/Starbound/sbserver index cd7f8c40a..c7b64c85d 100644 --- a/Starbound/sbserver +++ b/Starbound/sbserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/SvenCoop/svenserver b/SvenCoop/svenserver index 0f6fb9829..2e446771a 100644 --- a/SvenCoop/svenserver +++ b/SvenCoop/svenserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index 25d262dd3..6cbec42fd 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index 834472249..11ff2ea08 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index f5a39f220..29eca5257 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Teeworlds/twserver b/Teeworlds/twserver index 0325f3889..5cfdd096c 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index f0a893134..bff3c907a 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/TowerUnite/tuserver b/TowerUnite/tuserver index eb356d6fd..5fc2fe0cf 100644 --- a/TowerUnite/tuserver +++ b/TowerUnite/tuserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/UnrealTournament/utserver b/UnrealTournament/utserver index 055f689bc..cff447cca 100644 --- a/UnrealTournament/utserver +++ b/UnrealTournament/utserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index 760efbf53..d2ae92a6c 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/UnrealTournament3/ut3server b/UnrealTournament3/ut3server index 369b7e643..d3962d00b 100644 --- a/UnrealTournament3/ut3server +++ b/UnrealTournament3/ut3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index e1fa68fb3..aa98c02c7 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/WolfensteinEnemyTerritory/wetserver b/WolfensteinEnemyTerritory/wetserver index 22ef30bd0..aec0d17e2 100644 --- a/WolfensteinEnemyTerritory/wetserver +++ b/WolfensteinEnemyTerritory/wetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index 360345341..bf6f174dc 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -17,7 +17,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index e2bf7b12d..575e73057 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170305" +version="170530" ########################## ######## Settings ######## From 0cfdc82f33c1b43c064fc5283f6f50df0d1f7dbc Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 30 Apr 2017 22:00:23 +0100 Subject: [PATCH 0684/1895] corrected steamuser and password --- ClassicOffensive/coserver | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ClassicOffensive/coserver b/ClassicOffensive/coserver index 65870a09f..0d7c44751 100644 --- a/ClassicOffensive/coserver +++ b/ClassicOffensive/coserver @@ -96,8 +96,8 @@ appid_co="600380" branch="" ## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login -steamuser="accountname" -steampass='accountpassword' +steamuser="username" +steampass='password' ## Github Branch Select # Allows for the use of different function files From 267936408f897067bae6b6e5885c26d318f214c1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 1 May 2017 16:53:24 +0100 Subject: [PATCH 0685/1895] Updated URLs for updating metamod and sourcemod --- lgsm/functions/mods_list.sh | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh index 1709f9cdf..e1f686751 100644 --- a/lgsm/functions/mods_list.sh +++ b/lgsm/functions/mods_list.sh @@ -15,16 +15,17 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" # Get a proper URL for mods that don't provide a good one (optional) fn_script_log_info "Retrieving latest mods URLs" # Metamod -metamodscrapeurl="http://www.gsptalk.com/mirror/sourcemod" -metamodlatestfile="$(wget "${metamodscrapeurl}/?MD" -q -O -| grep "mmsource" | grep "\-linux" | head -n1 | awk -F '>' '{ print $3 }' | awk -F '<' '{ print $1}')" -metamoddownloadurl="http://cdn.probablyaserver.com/sourcemod/" -metamodurl="${metamoddownloadurl}/${metamodlatestfile}" +metamodmversion="1.10" +metamodscrapeurl="https://mms.alliedmods.net/mmsdrop/${metamodmversion}/mmsource-latest-linux" +metamodlatestfile="$(wget "${metamodscrapeurl}" -q -O -)" +metamoddownloadurl="https://www.metamodsource.net/latest.php?os=linux&version=${metamodmversion}" +metamodurl="${metamoddownloadurl}" # Sourcemod sourcemodmversion="1.8" sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}/sourcemod-latest-linux" sourcemodlatestfile="$(wget "${sourcemodscrapeurl}" -q -O -)" -sourcemoddownloadurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}" -sourcemodurl="${sourcemoddownloadurl}/${sourcemodlatestfile}" +sourcemoddownloadurl="https://www.sourcemod.net/latest.php?os=linux&version=${sourcemodmversion}" +sourcemodurl="${sourcemoddownloadurl}" # Define mods information (required) From 1faefc686b5a48b4f3222008bb45d80d16cba1a4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 1 May 2017 16:56:23 +0100 Subject: [PATCH 0686/1895] Release 170501 --- 7DaysToDie/sdtdserver | 2 +- ARKSurvivalEvolved/arkserver | 2 +- Arma3/arma3server | 2 +- BallisticOverkill/boserver | 2 +- Battlefield1942/bf1942server | 2 +- BlackMesa/bmdmserver | 2 +- BladeSymphony/bsserver | 2 +- BrainBread2/bb2server | 2 +- CallOfDuty/codserver | 2 +- CallOfDuty2/cod2server | 2 +- CallOfDuty4/cod4server | 2 +- CallOfDutyUnitedOffensive/coduoserver | 2 +- CallOfDutyWorldAtWar/codwawserver | 2 +- ClassicOffensive/coserver | 2 +- CodenameCURE/ccserver | 2 +- CounterStrike/csserver | 2 +- CounterStrikeConditionZero/csczserver | 2 +- CounterStrikeGlobalOffensive/csgoserver | 2 +- CounterStrikeSource/cssserver | 2 +- DayOfDefeat/dodserver | 2 +- DayOfDefeatSource/dodsserver | 2 +- DayOfInfamy/doiserver | 2 +- DeathmatchClassic/dmcserver | 2 +- DontStarveTogether/dstserver | 2 +- DoubleActionBoogaloo/dabserver | 2 +- EmpiresMod/emserver | 2 +- Factorio/fctrserver | 2 +- FistfulOfFrags/fofserver | 2 +- GarrysMod/gmodserver | 2 +- GoldenEyeSource/gesserver | 2 +- HalfLife2Deathmatch/hl2dmserver | 2 +- HalfLifeDeathmatch/hldmserver | 2 +- HalfLifeDeathmatchSource/hldmsserver | 2 +- Hurtworld/hwserver | 2 +- JustCause2/jc2server | 2 +- KillingFloor/kfserver | 2 +- Left4Dead/l4dserver | 2 +- Left4Dead2/l4d2server | 2 +- Minecraft/mcserver | 2 +- MultiTheftAuto/mtaserver | 2 +- Mumble/mumbleserver | 2 +- NS2Combat/ns2cserver | 2 +- NaturalSelection2/ns2server | 2 +- NoMoreRoomInHell/nmrihserver | 2 +- OpposingForce/opforserver | 2 +- PiratesVikingandKnightsII/pvkiiserver | 2 +- ProjectCars/pcserver | 2 +- ProjectZomboid/pzserver | 2 +- Quake2/q2server | 2 +- Quake3/q3server | 2 +- QuakeLive/qlserver | 2 +- QuakeWorld/qwserver | 2 +- RedOrchestra/roserver | 2 +- Ricochet/ricochetserver | 2 +- Rust/rustserver | 2 +- SeriousSam3BFE/ss3sserver | 2 +- Starbound/sbserver | 2 +- SvenCoop/svenserver | 2 +- TeamFortress2/tf2server | 2 +- TeamFortressClassic/tfcserver | 2 +- TeamSpeak3/ts3server | 2 +- Teeworlds/twserver | 2 +- Terraria/terrariaserver | 2 +- TowerUnite/tuserver | 2 +- UnrealTournament/utserver | 2 +- UnrealTournament2004/ut2k4server | 2 +- UnrealTournament3/ut3server | 2 +- UnrealTournament99/ut99server | 2 +- WolfensteinEnemyTerritory/wetserver | 2 +- tests/tests_jc2server.sh | 2 +- tests/tests_ts3server.sh | 2 +- 71 files changed, 71 insertions(+), 71 deletions(-) diff --git a/7DaysToDie/sdtdserver b/7DaysToDie/sdtdserver index ea3022ba2..dbbf0fba9 100644 --- a/7DaysToDie/sdtdserver +++ b/7DaysToDie/sdtdserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/ARKSurvivalEvolved/arkserver b/ARKSurvivalEvolved/arkserver index 793e91315..88ead7003 100644 --- a/ARKSurvivalEvolved/arkserver +++ b/ARKSurvivalEvolved/arkserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Arma3/arma3server b/Arma3/arma3server index f4dce07d9..43e36fd12 100644 --- a/Arma3/arma3server +++ b/Arma3/arma3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/BallisticOverkill/boserver b/BallisticOverkill/boserver index 4c687fc75..50098b9c4 100644 --- a/BallisticOverkill/boserver +++ b/BallisticOverkill/boserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Battlefield1942/bf1942server b/Battlefield1942/bf1942server index cbb3e19b8..82d5d7ca2 100644 --- a/Battlefield1942/bf1942server +++ b/Battlefield1942/bf1942server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/BlackMesa/bmdmserver b/BlackMesa/bmdmserver index dbaaca6da..a05b5c64f 100644 --- a/BlackMesa/bmdmserver +++ b/BlackMesa/bmdmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/BladeSymphony/bsserver b/BladeSymphony/bsserver index 5907de290..9b366cdb6 100644 --- a/BladeSymphony/bsserver +++ b/BladeSymphony/bsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/BrainBread2/bb2server b/BrainBread2/bb2server index dd8b8e97d..d07abca01 100644 --- a/BrainBread2/bb2server +++ b/BrainBread2/bb2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/CallOfDuty/codserver b/CallOfDuty/codserver index 1f5298a20..fcd52e95f 100755 --- a/CallOfDuty/codserver +++ b/CallOfDuty/codserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/CallOfDuty2/cod2server b/CallOfDuty2/cod2server index d81184ede..d3738c3cb 100755 --- a/CallOfDuty2/cod2server +++ b/CallOfDuty2/cod2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/CallOfDuty4/cod4server b/CallOfDuty4/cod4server index 9b1efae78..9938eeec1 100644 --- a/CallOfDuty4/cod4server +++ b/CallOfDuty4/cod4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/CallOfDutyUnitedOffensive/coduoserver b/CallOfDutyUnitedOffensive/coduoserver index ea7e5ca31..c43dbe39a 100755 --- a/CallOfDutyUnitedOffensive/coduoserver +++ b/CallOfDutyUnitedOffensive/coduoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/CallOfDutyWorldAtWar/codwawserver b/CallOfDutyWorldAtWar/codwawserver index 36b1d3c99..87f90e7e4 100755 --- a/CallOfDutyWorldAtWar/codwawserver +++ b/CallOfDutyWorldAtWar/codwawserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/ClassicOffensive/coserver b/ClassicOffensive/coserver index 0d7c44751..aea85085b 100644 --- a/ClassicOffensive/coserver +++ b/ClassicOffensive/coserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/CodenameCURE/ccserver b/CodenameCURE/ccserver index acef2e2db..61ed5280f 100644 --- a/CodenameCURE/ccserver +++ b/CodenameCURE/ccserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/CounterStrike/csserver b/CounterStrike/csserver index 013a14d59..cfc11987e 100644 --- a/CounterStrike/csserver +++ b/CounterStrike/csserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/CounterStrikeConditionZero/csczserver b/CounterStrikeConditionZero/csczserver index 4da72eeb4..a7b51fd92 100644 --- a/CounterStrikeConditionZero/csczserver +++ b/CounterStrikeConditionZero/csczserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/CounterStrikeGlobalOffensive/csgoserver b/CounterStrikeGlobalOffensive/csgoserver index daa188ed3..ca38e8943 100755 --- a/CounterStrikeGlobalOffensive/csgoserver +++ b/CounterStrikeGlobalOffensive/csgoserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/CounterStrikeSource/cssserver b/CounterStrikeSource/cssserver index e9631fe69..db0db41a4 100644 --- a/CounterStrikeSource/cssserver +++ b/CounterStrikeSource/cssserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/DayOfDefeat/dodserver b/DayOfDefeat/dodserver index fbf0beb8f..63c339103 100644 --- a/DayOfDefeat/dodserver +++ b/DayOfDefeat/dodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/DayOfDefeatSource/dodsserver b/DayOfDefeatSource/dodsserver index 966374459..4e8abe899 100644 --- a/DayOfDefeatSource/dodsserver +++ b/DayOfDefeatSource/dodsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/DayOfInfamy/doiserver b/DayOfInfamy/doiserver index e102e82b6..d2bfccffa 100644 --- a/DayOfInfamy/doiserver +++ b/DayOfInfamy/doiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/DeathmatchClassic/dmcserver b/DeathmatchClassic/dmcserver index db9cfab39..03920b08d 100644 --- a/DeathmatchClassic/dmcserver +++ b/DeathmatchClassic/dmcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/DontStarveTogether/dstserver b/DontStarveTogether/dstserver index 7a0afb612..17d0aa98b 100644 --- a/DontStarveTogether/dstserver +++ b/DontStarveTogether/dstserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/DoubleActionBoogaloo/dabserver b/DoubleActionBoogaloo/dabserver index 95a7a6bc1..af35a2e65 100644 --- a/DoubleActionBoogaloo/dabserver +++ b/DoubleActionBoogaloo/dabserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/EmpiresMod/emserver b/EmpiresMod/emserver index 6576ecfad..6d42c540b 100644 --- a/EmpiresMod/emserver +++ b/EmpiresMod/emserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Factorio/fctrserver b/Factorio/fctrserver index 94a127ec3..a149b4684 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/FistfulOfFrags/fofserver b/FistfulOfFrags/fofserver index 24ecb2799..699629cfc 100644 --- a/FistfulOfFrags/fofserver +++ b/FistfulOfFrags/fofserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/GarrysMod/gmodserver b/GarrysMod/gmodserver index 7d5a29f3b..4e83cc9ca 100644 --- a/GarrysMod/gmodserver +++ b/GarrysMod/gmodserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/GoldenEyeSource/gesserver b/GoldenEyeSource/gesserver index c1f309ad2..de996e9cd 100644 --- a/GoldenEyeSource/gesserver +++ b/GoldenEyeSource/gesserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/HalfLife2Deathmatch/hl2dmserver b/HalfLife2Deathmatch/hl2dmserver index 59aa52a3c..24dc2f9ac 100644 --- a/HalfLife2Deathmatch/hl2dmserver +++ b/HalfLife2Deathmatch/hl2dmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatch/hldmserver b/HalfLifeDeathmatch/hldmserver index 27bdaeb25..fd750286f 100644 --- a/HalfLifeDeathmatch/hldmserver +++ b/HalfLifeDeathmatch/hldmserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/HalfLifeDeathmatchSource/hldmsserver b/HalfLifeDeathmatchSource/hldmsserver index d06784ac6..8c0f7d26b 100644 --- a/HalfLifeDeathmatchSource/hldmsserver +++ b/HalfLifeDeathmatchSource/hldmsserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index 59de19019..fb118edf3 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/JustCause2/jc2server b/JustCause2/jc2server index 9c7b8feb1..ffe1515cd 100644 --- a/JustCause2/jc2server +++ b/JustCause2/jc2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/KillingFloor/kfserver b/KillingFloor/kfserver index d156bc938..bd3e75966 100644 --- a/KillingFloor/kfserver +++ b/KillingFloor/kfserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Left4Dead/l4dserver b/Left4Dead/l4dserver index eae269463..1b475c36a 100644 --- a/Left4Dead/l4dserver +++ b/Left4Dead/l4dserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Left4Dead2/l4d2server b/Left4Dead2/l4d2server index fbf4fc6c8..b6d88db05 100644 --- a/Left4Dead2/l4d2server +++ b/Left4Dead2/l4d2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Minecraft/mcserver b/Minecraft/mcserver index 9405a3318..e9b79a31a 100644 --- a/Minecraft/mcserver +++ b/Minecraft/mcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver index ff4a38cd8..f252e247a 100644 --- a/MultiTheftAuto/mtaserver +++ b/MultiTheftAuto/mtaserver @@ -12,7 +12,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Mumble/mumbleserver b/Mumble/mumbleserver index d496468ab..11eaf164b 100644 --- a/Mumble/mumbleserver +++ b/Mumble/mumbleserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index 2aa894f0d..f5357d570 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index 98d63ac4f..514f6aaae 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/NoMoreRoomInHell/nmrihserver b/NoMoreRoomInHell/nmrihserver index 7a3630697..5465d6da4 100644 --- a/NoMoreRoomInHell/nmrihserver +++ b/NoMoreRoomInHell/nmrihserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/OpposingForce/opforserver b/OpposingForce/opforserver index 8dd9187c7..49969aea4 100644 --- a/OpposingForce/opforserver +++ b/OpposingForce/opforserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/PiratesVikingandKnightsII/pvkiiserver b/PiratesVikingandKnightsII/pvkiiserver index d34b4927c..fcb5e8944 100644 --- a/PiratesVikingandKnightsII/pvkiiserver +++ b/PiratesVikingandKnightsII/pvkiiserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/ProjectCars/pcserver b/ProjectCars/pcserver index 40e7196b0..ff365e2b5 100755 --- a/ProjectCars/pcserver +++ b/ProjectCars/pcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/ProjectZomboid/pzserver b/ProjectZomboid/pzserver index 67253aba3..d16f48cad 100644 --- a/ProjectZomboid/pzserver +++ b/ProjectZomboid/pzserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Quake2/q2server b/Quake2/q2server index 997513ed9..f5fd308da 100644 --- a/Quake2/q2server +++ b/Quake2/q2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Quake3/q3server b/Quake3/q3server index 078166599..28a1c7e6d 100644 --- a/Quake3/q3server +++ b/Quake3/q3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/QuakeLive/qlserver b/QuakeLive/qlserver index efd3b5001..b13547643 100755 --- a/QuakeLive/qlserver +++ b/QuakeLive/qlserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/QuakeWorld/qwserver b/QuakeWorld/qwserver index 046bedc3c..4b5a81ade 100644 --- a/QuakeWorld/qwserver +++ b/QuakeWorld/qwserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/RedOrchestra/roserver b/RedOrchestra/roserver index 428049752..dd7a993c1 100644 --- a/RedOrchestra/roserver +++ b/RedOrchestra/roserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Ricochet/ricochetserver b/Ricochet/ricochetserver index 7431c204e..337de7dc6 100644 --- a/Ricochet/ricochetserver +++ b/Ricochet/ricochetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Rust/rustserver b/Rust/rustserver index c043cb5b5..286cebecf 100644 --- a/Rust/rustserver +++ b/Rust/rustserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/SeriousSam3BFE/ss3sserver b/SeriousSam3BFE/ss3sserver index f66c3484a..c8b55401a 100644 --- a/SeriousSam3BFE/ss3sserver +++ b/SeriousSam3BFE/ss3sserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Starbound/sbserver b/Starbound/sbserver index c7b64c85d..d62a65f6d 100644 --- a/Starbound/sbserver +++ b/Starbound/sbserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/SvenCoop/svenserver b/SvenCoop/svenserver index 2e446771a..1231420ee 100644 --- a/SvenCoop/svenserver +++ b/SvenCoop/svenserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/TeamFortress2/tf2server b/TeamFortress2/tf2server index 6cbec42fd..ee3df1aa6 100644 --- a/TeamFortress2/tf2server +++ b/TeamFortress2/tf2server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/TeamFortressClassic/tfcserver b/TeamFortressClassic/tfcserver index 11ff2ea08..80ddac44a 100644 --- a/TeamFortressClassic/tfcserver +++ b/TeamFortressClassic/tfcserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/TeamSpeak3/ts3server b/TeamSpeak3/ts3server index 29eca5257..ec90355f0 100644 --- a/TeamSpeak3/ts3server +++ b/TeamSpeak3/ts3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Teeworlds/twserver b/Teeworlds/twserver index 5cfdd096c..e55fc9d6a 100644 --- a/Teeworlds/twserver +++ b/Teeworlds/twserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/Terraria/terrariaserver b/Terraria/terrariaserver index bff3c907a..a07455be6 100644 --- a/Terraria/terrariaserver +++ b/Terraria/terrariaserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/TowerUnite/tuserver b/TowerUnite/tuserver index 5fc2fe0cf..ad3af2ae3 100644 --- a/TowerUnite/tuserver +++ b/TowerUnite/tuserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/UnrealTournament/utserver b/UnrealTournament/utserver index cff447cca..624ae6365 100644 --- a/UnrealTournament/utserver +++ b/UnrealTournament/utserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/UnrealTournament2004/ut2k4server b/UnrealTournament2004/ut2k4server index d2ae92a6c..48aa8e578 100644 --- a/UnrealTournament2004/ut2k4server +++ b/UnrealTournament2004/ut2k4server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/UnrealTournament3/ut3server b/UnrealTournament3/ut3server index d3962d00b..bffcbb5d9 100644 --- a/UnrealTournament3/ut3server +++ b/UnrealTournament3/ut3server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/UnrealTournament99/ut99server b/UnrealTournament99/ut99server index aa98c02c7..a947d53ee 100644 --- a/UnrealTournament99/ut99server +++ b/UnrealTournament99/ut99server @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/WolfensteinEnemyTerritory/wetserver b/WolfensteinEnemyTerritory/wetserver index aec0d17e2..49c7377e1 100644 --- a/WolfensteinEnemyTerritory/wetserver +++ b/WolfensteinEnemyTerritory/wetserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index bf6f174dc..1ca5e060f 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -17,7 +17,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 575e73057..6f6534c36 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## From ece8bc52be2629ed90e6cf285a17137812282d08 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 1 May 2017 17:18:25 +0100 Subject: [PATCH 0687/1895] removed duplicate tf2 info --- lgsm/functions/info_glibc.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/lgsm/functions/info_glibc.sh b/lgsm/functions/info_glibc.sh index f4c1a3f95..ef89fccbc 100644 --- a/lgsm/functions/info_glibc.sh +++ b/lgsm/functions/info_glibc.sh @@ -149,9 +149,6 @@ elif [ "${engine}" == "unreal4" ]; then elif [ "${engine}" == "unity3d" ]; then glibcrequired="2.15" glibcfix="no" -elif [ "${engine}" == "Team Fortress 2" ]; then - glibcrequired="2.15" - glibcfix="yes" elif [ "${gamename}" == "TeamSpeak 3" ]; then glibcrequired="NOT REQUIRED" glibcfix="no" From 22a8f19eee5b991b837c9e3c6f2e884a0ea5b820 Mon Sep 17 00:00:00 2001 From: Digital-Storm Date: Tue, 2 May 2017 16:59:53 -0400 Subject: [PATCH 0688/1895] Add updatebranch variable Add updatebranch variable. --- Factorio/fctrserver | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Factorio/fctrserver b/Factorio/fctrserver index a149b4684..2100c2733 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -49,6 +49,7 @@ channeltag="" ## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update updateonstart="off" +updatebranch="stable" ## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup maxbackups="4" @@ -187,4 +188,4 @@ fi core_dl.sh core_functions.sh getopt=$1 -core_getopt.sh \ No newline at end of file +core_getopt.sh From e4e18f7122ae0a86ce89e62f55a242283611a3d8 Mon Sep 17 00:00:00 2001 From: Digital-Storm Date: Tue, 2 May 2017 17:03:22 -0400 Subject: [PATCH 0689/1895] Added support for mimetype application/x-xz Factorio now uses the mimetype application/x-xz for compressed experimental builds. Added the tar extraction command for this. --- lgsm/functions/core_dl.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index d6c9b58ca..606f0b442 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -60,6 +60,8 @@ fn_dl_extract(){ tarcmd=$(tar -zxf "${filedir}/${filename}" -C "${extractdir}") elif [ "${mime}" == "application/x-bzip2" ]; then tarcmd=$(tar -jxf "${filedir}/${filename}" -C "${extractdir}") + elif [ "${mime}" == "application/x-xz" ]; then + tarcmd=$(tar -xf "${filedir}/${filename}" -C "${extractdir}") elif [ "${mime}" == "application/zip" ]; then tarcmd=$(unzip -d "${extractdir}" "${filedir}/${filename}") fi From 3b49592e9149a0aed99b9ac14da54378d2b9bb3d Mon Sep 17 00:00:00 2001 From: Digital-Storm Date: Tue, 2 May 2017 17:05:05 -0400 Subject: [PATCH 0690/1895] currentbuild return only 1 line Current experimental loads multiple base version files, modified to tail -1 and return only 1 line, so updater checks version properly. --- lgsm/functions/update_factorio.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index cbb39ef18..934a30dbb 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -49,7 +49,7 @@ fn_update_factorio_currentbuild(){ fi # Get current build from logs - currentbuild=$(grep "Loading mod base" "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null|awk '{print $5}') + currentbuild=$(grep "Loading mod base" "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null|awk '{print $5}'|tail -1) if [ -z "${currentbuild}" ]; then fn_print_error_nl "Checking for update: factorio.com: Current build version not found" fn_script_log_error "Checking for update: factorio.com: Current build version not found" @@ -60,7 +60,7 @@ fn_update_factorio_currentbuild(){ command_stop.sh exitbypass=1 command_start.sh - currentbuild=$(grep "Loading mod base" "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null|awk '{print $5}') + currentbuild=$(grep "Loading mod base" "${consolelogdir}"/"${servicename}"-console.log 2> /dev/null|awk '{print $5}'|tail -1) if [ -z "${currentbuild}" ]; then fn_print_fail_nl "Checking for update: factorio.com: Current build version still not found" fn_script_log_fatal "Checking for update: factorio.com: Current build version still not found" From e2f05f1ff3309397b780373044ae0670d8a28b1a Mon Sep 17 00:00:00 2001 From: Digital-Storm Date: Tue, 2 May 2017 17:07:21 -0400 Subject: [PATCH 0691/1895] Modified available build to use updatebranch var Added updatebranch var to the available build url. --- lgsm/functions/update_factorio.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 934a30dbb..5b9d64e8d 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -76,7 +76,7 @@ fn_update_factorio_arch(){ fn_update_factorio_availablebuild(){ # Gets latest build info. - availablebuild=$(curl -s https://www.factorio.com/download-headless/stable | grep 'headless/linux64' | head -n 1 | grep -oP '(?<=get-download/).*?(?=/)') + availablebuild=$(curl -s https://www.factorio.com/download-headless/"${updatebranch}" | grep 'headless/linux64' | head -n 1 | grep -oP '(?<=get-download/).*?(?=/)') sleep 1 # Checks if availablebuild variable has been set From a7756d8102de7958953972b42b7deaaca6780241 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 00:14:19 +0100 Subject: [PATCH 0692/1895] corrected date --- Insurgency/insserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Insurgency/insserver b/Insurgency/insserver index 429c1ac56..95efd7b8c 100644 --- a/Insurgency/insserver +++ b/Insurgency/insserver @@ -14,7 +14,7 @@ if [ -f ".dev-debug" ]; then set -x fi -version="170530" +version="170501" ########################## ######## Settings ######## From cfb0b17d6e44cddcb66e34c8097cd8f787515a99 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 00:29:45 +0100 Subject: [PATCH 0693/1895] Basic self update feature work in progress --- lgsm/functions/command_update_functions.sh | 27 +++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index a1f05e0e1..081fa4f4f 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -27,12 +27,33 @@ else fi echo -ne " checking linuxgsm.sh...\c" -config_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) -if [ "${config_script_diff}" != "" ]; then +tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) +if [ "${tmp_script_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking ${selfname}: UPDATE" rm -f "${tmpdir}/linuxgsm.sh" - fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nomd5" + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "linuxgsm.sh" "noexecutecmd" "norun" "noforce" "nomd5" + # Compare selfname against linuxgsm.sh in the tmp dir. Ignoring server specific vars. + script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${tmpdir}/linuxgsm.sh") <(sed '/shortname/d;/servername/d;/gamename/d' "${rootdir}/${selfname}")) + if [ "${script_diff}" != "" ]; then + echo -ne " backup linuxgsm.sh...\c" + cp "${rootdir}/${selfname}" "${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" + if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + echo -en "${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" + fi + copyshortname="$(grep -m 1 shortname=)" "${rootdir}/${selfname}" + copyservername="$(grep -m 1 servername=)" "${rootdir}/${selfname}" + copygamename="$(grep -m 1 gamename=)" "${rootdir}/${selfname}" + + cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" + sed -i 's/shortname="core"/${copyshortname}/g' "${rootdir}/${selfname}" + sed -i 's/shortname="core"/${copyshortname}/g' "${rootdir}/${selfname}" + sed -i 's/shortname="core"/${copyshortname}/g' "${rootdir}/${selfname}" + fi else fn_print_ok_eol_nl fi From c5756d8e846513aff06257136dd409f9f54e8588 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 00:53:38 +0100 Subject: [PATCH 0694/1895] Further improvements --- lgsm/functions/command_update_functions.sh | 38 +++++++++++----------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 081fa4f4f..255471582 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -34,26 +34,26 @@ if [ "${tmp_script_diff}" != "" ]; then rm -f "${tmpdir}/linuxgsm.sh" fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "linuxgsm.sh" "noexecutecmd" "norun" "noforce" "nomd5" # Compare selfname against linuxgsm.sh in the tmp dir. Ignoring server specific vars. - script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${tmpdir}/linuxgsm.sh") <(sed '/shortname/d;/servername/d;/gamename/d' "${rootdir}/${selfname}")) - if [ "${script_diff}" != "" ]; then - echo -ne " backup linuxgsm.sh...\c" - cp "${rootdir}/${selfname}" "${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" - if [ $? -ne 0 ]; then - fn_print_fail_eol_nl - core_exit.sh - else - fn_print_ok_eol_nl - echo -en "${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" - fi - copyshortname="$(grep -m 1 shortname=)" "${rootdir}/${selfname}" - copyservername="$(grep -m 1 servername=)" "${rootdir}/${selfname}" - copygamename="$(grep -m 1 gamename=)" "${rootdir}/${selfname}" - - cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" - sed -i 's/shortname="core"/${copyshortname}/g' "${rootdir}/${selfname}" - sed -i 's/shortname="core"/${copyshortname}/g' "${rootdir}/${selfname}" - sed -i 's/shortname="core"/${copyshortname}/g' "${rootdir}/${selfname}" +fi +script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${tmpdir}/linuxgsm.sh") <(sed '/shortname/d;/servername/d;/gamename/d' "${rootdir}/${selfname}")) +if [ "${script_diff}" != "" ]; then + echo -ne " backup linuxgsm.sh...\c" + cp "${rootdir}/${selfname}" "${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" + if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + echo -en "${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" fi + copyshortname="$(grep -m 1 shortname= "${rootdir}/${selfname}")" + copyservername="$(grep -m 1 servername= "${rootdir}/${selfname}")" + copygamename="$(grep -m 1 gamename= "${rootdir}/${selfname}")" + + cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" + sed -i 's/shortname="core"/${copyshortname}/g' "${rootdir}/${selfname}" + sed -i 's/shortname="core"/${copyshortname}/g' "${rootdir}/${selfname}" + sed -i 's/shortname="core"/${copyshortname}/g' "${rootdir}/${selfname}" else fn_print_ok_eol_nl fi From dae72efd96b03419e9fbc1195b72caa78c72d51a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 00:56:01 +0100 Subject: [PATCH 0695/1895] double quotes --- lgsm/functions/command_update_functions.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 255471582..808d87951 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -51,9 +51,9 @@ if [ "${script_diff}" != "" ]; then copygamename="$(grep -m 1 gamename= "${rootdir}/${selfname}")" cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" - sed -i 's/shortname="core"/${copyshortname}/g' "${rootdir}/${selfname}" - sed -i 's/shortname="core"/${copyshortname}/g' "${rootdir}/${selfname}" - sed -i 's/shortname="core"/${copyshortname}/g' "${rootdir}/${selfname}" + sed -i "'"s/shortname="core"/${copyshortname}/g"'" "${rootdir}/${selfname}" + sed -i "'"s/shortname="core"/${copyservername}/g"'" "${rootdir}/${selfname}" + sed -i "'"s/shortname="core"/${copygamename}/g"'" "${rootdir}/${selfname}" else fn_print_ok_eol_nl fi From 9ccb9f68b20e9eeba814a079cf09e96e2d7f4b13 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 00:59:36 +0100 Subject: [PATCH 0696/1895] thanks autocomplete --- lgsm/functions/command_update_functions.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 808d87951..848c65b68 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -51,9 +51,9 @@ if [ "${script_diff}" != "" ]; then copygamename="$(grep -m 1 gamename= "${rootdir}/${selfname}")" cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" - sed -i "'"s/shortname="core"/${copyshortname}/g"'" "${rootdir}/${selfname}" - sed -i "'"s/shortname="core"/${copyservername}/g"'" "${rootdir}/${selfname}" - sed -i "'"s/shortname="core"/${copygamename}/g"'" "${rootdir}/${selfname}" + sed -i "s/shortname="core"/${copyshortname}/g" "${rootdir}/${selfname}" + sed -i "s/shortname="core"/${copyservername}/g" "${rootdir}/${selfname}" + sed -i "s/shortname="core"/${copygamename}/g" "${rootdir}/${selfname}" else fn_print_ok_eol_nl fi From 8dfb3adf4bfce9153877b2e92e57171139299046 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 18:52:57 +0100 Subject: [PATCH 0697/1895] fixing sed --- lgsm/functions/command_update_functions.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 848c65b68..a729e4084 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -51,9 +51,9 @@ if [ "${script_diff}" != "" ]; then copygamename="$(grep -m 1 gamename= "${rootdir}/${selfname}")" cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" - sed -i "s/shortname="core"/${copyshortname}/g" "${rootdir}/${selfname}" - sed -i "s/shortname="core"/${copyservername}/g" "${rootdir}/${selfname}" - sed -i "s/shortname="core"/${copygamename}/g" "${rootdir}/${selfname}" + sed -i "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${rootdir}/${selfname}" + sed -i "s/servername=\"core\"/servername=\"${servername}\"/g" "${rootdir}/${selfname}" + sed -i "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${rootdir}/${selfname}" else fn_print_ok_eol_nl fi From 4e1ac470a0cfa4e62984ec6e8d0ed116974cc413 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 18:57:05 +0100 Subject: [PATCH 0698/1895] tidy up --- lgsm/functions/command_update_functions.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index a729e4084..2b15a2d86 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -34,6 +34,8 @@ if [ "${tmp_script_diff}" != "" ]; then rm -f "${tmpdir}/linuxgsm.sh" fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "linuxgsm.sh" "noexecutecmd" "norun" "noforce" "nomd5" # Compare selfname against linuxgsm.sh in the tmp dir. Ignoring server specific vars. +else + fn_print_ok_eol_nl fi script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${tmpdir}/linuxgsm.sh") <(sed '/shortname/d;/servername/d;/gamename/d' "${rootdir}/${selfname}")) if [ "${script_diff}" != "" ]; then @@ -46,9 +48,6 @@ if [ "${script_diff}" != "" ]; then fn_print_ok_eol_nl echo -en "${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" fi - copyshortname="$(grep -m 1 shortname= "${rootdir}/${selfname}")" - copyservername="$(grep -m 1 servername= "${rootdir}/${selfname}")" - copygamename="$(grep -m 1 gamename= "${rootdir}/${selfname}")" cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" sed -i "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${rootdir}/${selfname}" From ee302aca4071b186866b298150cd43791116b096 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 18:59:33 +0100 Subject: [PATCH 0699/1895] corrected fetch file --- lgsm/functions/command_update_functions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 2b15a2d86..98de90669 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -32,7 +32,7 @@ if [ "${tmp_script_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking ${selfname}: UPDATE" rm -f "${tmpdir}/linuxgsm.sh" - fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "linuxgsm.sh" "noexecutecmd" "norun" "noforce" "nomd5" + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nomd5" # Compare selfname against linuxgsm.sh in the tmp dir. Ignoring server specific vars. else fn_print_ok_eol_nl From d4c14e215866779acac8e53aa056e3c1320b43f4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 19:13:07 +0100 Subject: [PATCH 0700/1895] using selfname --- lgsm/functions/command_update_functions.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 98de90669..05c19566a 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -26,7 +26,7 @@ else fn_print_ok_eol_nl fi -echo -ne " checking linuxgsm.sh...\c" +echo -ne " checking remote linuxgsm.sh...\c" tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) if [ "${tmp_script_diff}" != "" ]; then fn_print_update_eol_nl @@ -37,9 +37,10 @@ if [ "${tmp_script_diff}" != "" ]; then else fn_print_ok_eol_nl fi +echo -ne " checking ${selfname}...\c" script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${tmpdir}/linuxgsm.sh") <(sed '/shortname/d;/servername/d;/gamename/d' "${rootdir}/${selfname}")) if [ "${script_diff}" != "" ]; then - echo -ne " backup linuxgsm.sh...\c" + echo -ne " backup ${selfname}...\c" cp "${rootdir}/${selfname}" "${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" if [ $? -ne 0 ]; then fn_print_fail_eol_nl From 7fd3177c8982e7d1975713ac5b72b6dc7a72a61b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 19:20:14 +0100 Subject: [PATCH 0701/1895] renaming update_functions to update_linuxgsm --- lgsm/functions/check.sh | 2 +- ...ommand_update_functions.sh => command_update_linuxgsm.sh} | 2 +- lgsm/functions/core_functions.sh | 5 +++++ lgsm/functions/core_getopt.sh | 4 ++-- 4 files changed, 9 insertions(+), 4 deletions(-) rename lgsm/functions/{command_update_functions.sh => command_update_linuxgsm.sh} (98%) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index ec067de66..5fd1bc241 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -17,7 +17,7 @@ if [ "${function_selfname}" != "command_monitor.sh" ];then check_permissions.sh fi -if [ "${function_selfname}" != "command_install.sh" ]&&[ "${function_selfname}" != "command_update_functions.sh" ]&&[ "${function_selfname}" != "command_details.sh" ]&&[ "${function_selfname}" != "command_postdetails.sh" ]; then +if [ "${function_selfname}" != "command_install.sh" ]&&[ "${function_selfname}" != "command_update_functions.sh" ]&&[ "${function_selfname}" != "command_update_linuxgsm.sh" ]&&[ "${function_selfname}" != "command_details.sh" ]&&[ "${function_selfname}" != "command_postdetails.sh" ]; then check_system_dir.sh fi diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_linuxgsm.sh similarity index 98% rename from lgsm/functions/command_update_functions.sh rename to lgsm/functions/command_update_linuxgsm.sh index 05c19566a..991da06eb 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -1,5 +1,5 @@ #!/bin/bash -# LinuxGSM command_update_functions.sh function +# LinuxGSM command_update_linuxgsm.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com # Description: Deletes the functions dir to allow re-downloading of functions from GitHub. diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index f7a4ac79c..d915b1c9f 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -392,6 +392,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +command_update_linuxgsm.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + command_update.sh(){ functionfile="${FUNCNAME}" fn_fetch_function diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index a17487eb5..79275ed43 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -17,7 +17,7 @@ cmd_restart=( "r;restart" "command_restart.sh" "Restart the server." ) cmd_details=( "dt;details" "command_details.sh" "Display server information." ) cmd_postdetails=( "pd;postdetails" "command_postdetails.sh" "Post details to hastebin (removing passwords)." ) cmd_backup=( "b;backup" "command_backup.sh" "Create backup archives of the server." ) -cmd_update_functions=( "ul;update-lgsm;uf;update-functions" "command_update_functions.sh" "Update LinuxGSM functions." ) +cmd_update_linuxgsm=( "ul;update-lgsm;uf;update-functions" "command_update_linuxgsm.sh" "Update LinuxGSM." ) cmd_test_alert=( "ta;test-alert" "command_test_alert.sh" "Send a test alert." ) cmd_monitor=( "m;monitor" "command_monitor.sh" "Check server status and restart if crashed." ) # Console servers only @@ -66,7 +66,7 @@ if [ -n "${appid}" ]; then fi # Update LGSM -currentopt+=( "${cmd_update_functions[@]}" ) +currentopt+=( "${cmd_update_linuxgsm[@]}" ) #Backup currentopt+=( "${cmd_backup[@]}" ) From 938d94c8f855c0076d9e8febbd667376048f3092 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 19:24:45 +0100 Subject: [PATCH 0702/1895] setup redirect --- lgsm/functions/command_update_functions.sh | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 lgsm/functions/command_update_functions.sh diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh new file mode 100644 index 000000000..5233a38a7 --- /dev/null +++ b/lgsm/functions/command_update_functions.sh @@ -0,0 +1,8 @@ +#!/bin/bash +# LinuxGSM command_update_functions.sh function +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +# Description: Deletes the functions dir to allow re-downloading of functions from GitHub. +# Legacy Command + +command_update_linuxgsm.sh \ No newline at end of file From dadeaed9754fc391e690445a2c7808efa56ef256 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 19:25:44 +0100 Subject: [PATCH 0703/1895] redirect --- lgsm/functions/command_update_functions.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lgsm/functions/command_update_functions.sh b/lgsm/functions/command_update_functions.sh index 5233a38a7..f8acf652b 100644 --- a/lgsm/functions/command_update_functions.sh +++ b/lgsm/functions/command_update_functions.sh @@ -5,4 +5,9 @@ # Description: Deletes the functions dir to allow re-downloading of functions from GitHub. # Legacy Command +command_update_linuxgsm.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + command_update_linuxgsm.sh \ No newline at end of file From d34833efceec92666973eea185bec08d89adebaf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 19:35:48 +0100 Subject: [PATCH 0704/1895] improving messages --- lgsm/functions/command_update_linuxgsm.sh | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 991da06eb..ee69a7a96 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -26,7 +26,7 @@ else fn_print_ok_eol_nl fi -echo -ne " checking remote linuxgsm.sh...\c" +echo -ne " checking linuxgsm.sh...\c" tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) if [ "${tmp_script_diff}" != "" ]; then fn_print_update_eol_nl @@ -40,6 +40,7 @@ fi echo -ne " checking ${selfname}...\c" script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${tmpdir}/linuxgsm.sh") <(sed '/shortname/d;/servername/d;/gamename/d' "${rootdir}/${selfname}")) if [ "${script_diff}" != "" ]; then + fn_print_update_eol_nl echo -ne " backup ${selfname}...\c" cp "${rootdir}/${selfname}" "${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" if [ $? -ne 0 ]; then @@ -47,13 +48,19 @@ if [ "${script_diff}" != "" ]; then core_exit.sh else fn_print_ok_eol_nl - echo -en "${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" + echo -e " Backup: ${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" fi - + echo -ne " fetch ${selfname}...\c" cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" sed -i "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${rootdir}/${selfname}" sed -i "s/servername=\"core\"/servername=\"${servername}\"/g" "${rootdir}/${selfname}" sed -i "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${rootdir}/${selfname}" + if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi else fn_print_ok_eol_nl fi From f6a53387672e5e84159f78548eea943cc8899183 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 21:38:50 +0100 Subject: [PATCH 0705/1895] moved linuxgsm.sh to tmpdir --- lgsm/functions/command_update_linuxgsm.sh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index ee69a7a96..a6de4f26f 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -24,21 +24,23 @@ if [ "${config_file_diff}" != "" ]; then fn_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" else fn_print_ok_eol_nl + fn_script_log_info "checking config _default.cfg: OK" fi echo -ne " checking linuxgsm.sh...\c" -tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) +tmp_script_diff=$(diff "${functionsdir}/linuxgsm.sh" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) if [ "${tmp_script_diff}" != "" ]; then fn_print_update_eol_nl - fn_script_log_info "checking ${selfname}: UPDATE" - rm -f "${tmpdir}/linuxgsm.sh" + fn_script_log_info "checking linuxgsm.sh: UPDATE" + rm -f "${functionsdir}/linuxgsm.sh" fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nomd5" # Compare selfname against linuxgsm.sh in the tmp dir. Ignoring server specific vars. else + fn_script_log_info "checking linuxgsm.sh: OK" fn_print_ok_eol_nl fi echo -ne " checking ${selfname}...\c" -script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${tmpdir}/linuxgsm.sh") <(sed '/shortname/d;/servername/d;/gamename/d' "${rootdir}/${selfname}")) +script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${functionsdir}/linuxgsm.sh") <(sed '/shortname/d;/servername/d;/gamename/d' "${rootdir}/${selfname}")) if [ "${script_diff}" != "" ]; then fn_print_update_eol_nl echo -ne " backup ${selfname}...\c" @@ -50,8 +52,8 @@ if [ "${script_diff}" != "" ]; then fn_print_ok_eol_nl echo -e " Backup: ${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" fi - echo -ne " fetch ${selfname}...\c" - cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" + echo -ne " fetching ${selfname}...\c" + cp "${functionsdir}/linuxgsm.sh" "${rootdir}/${selfname}" sed -i "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${rootdir}/${selfname}" sed -i "s/servername=\"core\"/servername=\"${servername}\"/g" "${rootdir}/${selfname}" sed -i "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${rootdir}/${selfname}" From fbef65489e207c50a0827818013245da9a6375d5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 21:39:38 +0100 Subject: [PATCH 0706/1895] removed gamename as not required to start the server --- linuxgsm.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 811ea5db9..a31fea535 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -2,11 +2,13 @@ # Project: Game Server Managers - LinuxGSM # Author: Daniel Gibbs # License: MIT License, Copyright (c) 2017 Daniel Gibbs -# Purpose: Counter-Strike: Global Offensive | Server Management Script +# Purpose: Linux Game Server Management Script # Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors # Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki # Website: https://gameservermanagers.com +# DO NOT EDIT THIS FILE + # Debugging if [ -f ".dev-debug" ]; then exec 5>dev-debug.log @@ -15,12 +17,11 @@ if [ -f ".dev-debug" ]; then fi version="170305" +shortname="core" +servername="core" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" servicename="${selfname}" -shortname="core" -servername="core" -gamename="core" lockselfname=".${servicename}.lock" lgsmdir="${rootdir}/lgsm" logdir="${rootdir}/log" @@ -242,7 +243,6 @@ fn_install_file(){ cp -R "${selfname}" "${local_filename}" sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}" sed -i -e "s/servername=\"core\"/servername=\"${servername}\"/g" "${local_filename}" - sed -i -e "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${local_filename}" echo "Installed ${gamename} server as ${local_filename}" echo "./${local_filename} install" exit From 8005263f4c928ec51b4fb5a274bc8b69861ed133 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 21:40:15 +0100 Subject: [PATCH 0707/1895] updated check_ip info for new config location --- lgsm/functions/check_ip.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index 5ae639237..c9b5ce97f 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -29,7 +29,8 @@ if [ "${gamename}" != "TeamSpeak 3" ]&&[ "${gamename}" != "Mumble" ]&&[ "${travi echo -en "${servercfgfullpath}\n" echo -en "Set ${ipinconfigvar} to one of the following:\n" else - fn_print_information "Specify the IP you want to use within the ${selfname} script.\n" + fn_print_information "Specify the IP you want to use within the LinuxGSM config file." + echo -en "Location: ${configdir}\n" echo -en "Set ip=\"0.0.0.0\" to one of the following:\n" fi echo -en "${getip}\n" From a1cf14c65f993159ce10fc3a4edab5c29e4a5bc5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 21:46:48 +0100 Subject: [PATCH 0708/1895] moving linuxgsm.sh to functions dir --- lgsm/functions/command_update_linuxgsm.sh | 4 ++-- linuxgsm.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index a6de4f26f..f2e30d3e4 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -33,7 +33,7 @@ if [ "${tmp_script_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking linuxgsm.sh: UPDATE" rm -f "${functionsdir}/linuxgsm.sh" - fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nomd5" + fn_fetch_file_github "" "linuxgsm.sh" "${functionsdir}" "nochmodx" "norun" "noforcedl" "nomd5" # Compare selfname against linuxgsm.sh in the tmp dir. Ignoring server specific vars. else fn_script_log_info "checking linuxgsm.sh: OK" @@ -44,7 +44,7 @@ script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${functionsdi if [ "${script_diff}" != "" ]; then fn_print_update_eol_nl echo -ne " backup ${selfname}...\c" - cp "${rootdir}/${selfname}" "${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" + cp "${rootdir}/${selfname}" "${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" if [ $? -ne 0 ]; then fn_print_fail_eol_nl core_exit.sh diff --git a/linuxgsm.sh b/linuxgsm.sh index a31fea535..1deb84ee0 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -364,8 +364,8 @@ else source "${configdirserver}/${servicename}.cfg" fi # Load the linuxgsm.sh in to tmpdir. If missing download it - if [ ! -f "${tmpdir}/linuxgsm.sh" ];then - fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nomd5" + if [ ! -f "${functionsdir}/linuxgsm.sh" ];then + fn_fetch_file_github "" "linuxgsm.sh" "${functionsdir}" "nochmodx" "norun" "noforcedl" "nomd5" fi getopt=$1 core_getopt.sh From cfd51e5a3918632fd05efcfde76068f6285ce3ea Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 21:47:41 +0100 Subject: [PATCH 0709/1895] moved backup dir to lgsm/backup --- lgsm/config-default/config-lgsm/arkserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/arma3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/csgoserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 35a8d1949..4d4e4325e 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -74,7 +74,7 @@ servercfgdefault="GameUserSettings.ini" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${logdir}" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index ac83b822d..bcc5c06bf 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -85,7 +85,7 @@ servercfgfullpath="${servercfgdir}/${servercfg}" networkcfgfullpath="${servercfgdir}/${networkcfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories #gamelogdir="" # No server logs available diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 718d8d132..7c36ed20f 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -98,7 +98,7 @@ servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories gamelogdir="${systemdir}/logs" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index b8576295e..47f6b2157 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -74,7 +74,7 @@ servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory -backupdir="${rootdir}/backups" +backupdir="${lgsmdir}/backup" ## Logging Directories gamelogdir="${logdir}/server" From ce59ea792c7fdcc68c7dd8b381fa9e872cf6e8be Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 21:49:12 +0100 Subject: [PATCH 0710/1895] mkdr backup dir --- lgsm/functions/command_update_linuxgsm.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index f2e30d3e4..29f98e3e2 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -44,6 +44,7 @@ script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${functionsdi if [ "${script_diff}" != "" ]; then fn_print_update_eol_nl echo -ne " backup ${selfname}...\c" + mkdir -p "${backupdir}/script/" cp "${rootdir}/${selfname}" "${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" if [ $? -ne 0 ]; then fn_print_fail_eol_nl From dc1ccbf9c81e52800cc70545f2f30bc39dd5460f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 21:51:39 +0100 Subject: [PATCH 0711/1895] made linuxgsm.sh chmod x --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 1deb84ee0..9e76d998d 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -365,7 +365,7 @@ else fi # Load the linuxgsm.sh in to tmpdir. If missing download it if [ ! -f "${functionsdir}/linuxgsm.sh" ];then - fn_fetch_file_github "" "linuxgsm.sh" "${functionsdir}" "nochmodx" "norun" "noforcedl" "nomd5" + fn_fetch_file_github "" "linuxgsm.sh" "${functionsdir}" "chmod" "norun" "noforcedl" "nomd5" fi getopt=$1 core_getopt.sh From 5112a8f386f2d759e18439376ffb423c8a9d460d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 21:53:02 +0100 Subject: [PATCH 0712/1895] bug --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 9e76d998d..16349de53 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -365,7 +365,7 @@ else fi # Load the linuxgsm.sh in to tmpdir. If missing download it if [ ! -f "${functionsdir}/linuxgsm.sh" ];then - fn_fetch_file_github "" "linuxgsm.sh" "${functionsdir}" "chmod" "norun" "noforcedl" "nomd5" + fn_fetch_file_github "" "linuxgsm.sh" "${functionsdir}" "chmodx" "norun" "noforcedl" "nomd5" fi getopt=$1 core_getopt.sh From 3ef7ca287909345728550d5f73caa9b50157b267 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 22:38:42 +0100 Subject: [PATCH 0713/1895] updated download variables --- .../command_install_resources_mta.sh | 2 +- lgsm/functions/command_update_linuxgsm.sh | 2 +- lgsm/functions/core_dl.sh | 2 +- lgsm/functions/fix_glibc.sh | 12 ++++---- lgsm/functions/fix_mta.sh | 3 +- lgsm/functions/install_config.sh | 5 ++-- lgsm/functions/install_mta_resources.sh | 2 +- lgsm/functions/install_server_files.sh | 30 +++++++++---------- lgsm/functions/monitor_gsquery.sh | 2 +- 9 files changed, 29 insertions(+), 31 deletions(-) diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh index 07b6e4440..84365fc5b 100644 --- a/lgsm/functions/command_install_resources_mta.sh +++ b/lgsm/functions/command_install_resources_mta.sh @@ -12,7 +12,7 @@ fn_install_resources(){ echo "" echo "Installing Default Resources" echo "=================================" - fn_fetch_file "http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip" "${tmpdir}" "mtasa-resources-latest.zip" "noexecute" "norun" "noforce" "nomd5" + fn_fetch_file "http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip" "${tmpdir}" "mtasa-resources-latest.zip" "nochmodx" "norun" "noforce" "nomd5" fn_dl_extract "${tmpdir}" "mtasa-resources-latest.zip" "${resourcesdir}" echo "Default Resources Installed." } diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 29f98e3e2..fa3f08762 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -21,7 +21,7 @@ if [ "${config_file_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking config _default.cfg: UPDATE" rm -f "${configdirdefault}/config-lgsm/${servername}/_default.cfg" - fn_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "noexecutecmd" "norun" "noforce" "nomd5" + fn_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "nochmodx" "norun" "noforce" "nomd5" else fn_print_ok_eol_nl fn_script_log_info "checking config _default.cfg: OK" diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index f40959f0d..512aa22fe 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -190,7 +190,7 @@ fn_fetch_config(){ remote_fileurl="${githuburl}" local_filedir="${3}" local_filename="${4}" - chmodx="noexecutecmd" + chmodx="nochmodx" run="norun" forcedl="noforce" md5="nomd5" diff --git a/lgsm/functions/fix_glibc.sh b/lgsm/functions/fix_glibc.sh index a36b568ac..c84526bfc 100644 --- a/lgsm/functions/fix_glibc.sh +++ b/lgsm/functions/fix_glibc.sh @@ -15,7 +15,7 @@ local libstdc_servers_array=( "ARMA 3" "Blade Symphony" "Garry's Mod" "GoldenEye 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" + fn_fetch_file_github "lgsm/lib/ubuntu12.04/i386" "libstdc++.so.6" "${lgsmdir}/lib" "nochmodx" "norun" "noforce" "nomd5" fi done @@ -24,7 +24,7 @@ local libm_servers_array=( "Black Mesa: Deathmatch" "Codename CURE" "Day of Infa 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" + fn_fetch_file_github "lgsm/lib/ubuntu12.04/i386" "libm.so.6" "${lgsmdir}/lib" "nochmodx" "norun" "noforce" "nomd5" fi done @@ -33,7 +33,7 @@ local libc_servers_array=( "Black Mesa: Deathmatch" "Blade Symphony" "Garry's Mo for libc_server in "${libc_servers_array[@]}" do if [ "${gamename}" == "${libc_server}" ]; then - fn_fetch_file_github "lgsm/lib/ubuntu12.04/i386" "libc.so.6" "${lgsmdir}/lib" "noexecutecmd" "norun" "noforce" "nomd5" + fn_fetch_file_github "lgsm/lib/ubuntu12.04/i386" "libc.so.6" "${lgsmdir}/lib" "nochmodx" "norun" "noforce" "nomd5" fi done @@ -42,7 +42,7 @@ local libpthread_servers_array=( "Black Mesa: Deathmatch" "Blade Symphony" "Garr for libpthread_server in "${libpthread_servers_array[@]}" do if [ "${gamename}" == "${libpthread_server}" ]; then - fn_fetch_file_github "lgsm/lib/ubuntu12.04/i386" "libpthread.so.0" "${lgsmdir}/lib" "noexecutecmd" "norun" "noforce" "nomd5" + fn_fetch_file_github "lgsm/lib/ubuntu12.04/i386" "libpthread.so.0" "${lgsmdir}/lib" "nochmodx" "norun" "noforce" "nomd5" fi done @@ -53,7 +53,7 @@ local libm_servers_array=( "Factorio" ) for libm_server in "${libm_servers_array[@]}" do if [ "${gamename}" == "${libm_server}" ]; then - fn_fetch_file_github "lgsm/lib/ubuntu12.04/amd64" "libm.so.6" "${lgsmdir}/lib" "noexecutecmd" "norun" "noforce" "nomd5" + fn_fetch_file_github "lgsm/lib/ubuntu12.04/amd64" "libm.so.6" "${lgsmdir}/lib" "nochmodx" "norun" "noforce" "nomd5" fi done @@ -62,7 +62,7 @@ local libc_servers_array=( "Factorio" ) for libc_server in "${libc_servers_array[@]}" do if [ "${gamename}" == "${libc_server}" ]; then - fn_fetch_file_github "lgsm/lib/ubuntu12.04/amd64" "libc.so.6" "${lgsmdir}/lib" "noexecutecmd" "norun" "noforce" "nomd5" + fn_fetch_file_github "lgsm/lib/ubuntu12.04/amd64" "libc.so.6" "${lgsmdir}/lib" "nochmodx" "norun" "noforce" "nomd5" fi done diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh index ebefc79d2..3bc38ac44 100644 --- a/lgsm/functions/fix_mta.sh +++ b/lgsm/functions/fix_mta.sh @@ -12,8 +12,7 @@ if [ ! -f "${lgsmdir}/lib/libmysqlclient.so.16" ]; then fixname="libmysqlclient16" fn_fix_msg_start_nl sleep 1 - fileurl="https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16"; filedir="${lgsmdir}/lib"; filename="libmysqlclient.so.16"; executecmd="executecmd" run="norun"; force="noforce"; md5="6c188e0f8fb5d7a29f4bc413b9fed6c2" - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + fn_fetch_file "https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16" "${lgsmdir}/lib" "libmysqlclient.so.16" "chmodx" "norun" "noforce" "6c188e0f8fb5d7a29f4bc413b9fed6c2" fn_fix_msg_end fi diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index 0b6f7e744..bca134421 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -19,11 +19,10 @@ fn_check_cfgdir(){ # Downloads default configs from Game-Server-Configs repo to lgsm/config-default fn_fetch_default_config(){ - mkdir -pv "${lgsmdir}/config-default" + mkdir -p "${lgsmdir}/config-default/config-game" githuburl="https://github.com/GameServerManagers/Game-Server-Configs/master" for config in "${array_configs[@]}"; do - fileurl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master/${gamedirname}/${config}"; filedir="${lgsmdir}/config-default/config-game"; filename="${config}"; executecmd="noexecute" run="norun"; force="noforce" - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + fn_fetch_file "${githuburl}/${config}" "${lgsmdir}/config-default/config-game" "${config}" "nochmodx" "norun" "noforce" "nomd5" done } diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index 6abfc598a..bed82c594 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -19,7 +19,7 @@ fn_install_libmysqlclient16(){ sleep 1 sudo -v > /dev/null 2>&1 if [ $? -eq 0 ]; then - fn_fetch_file "https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16" "${filedir}" "libmysqlclient.so.16" "executecmd" "norun" "noforce" "6c188e0f8fb5d7a29f4bc413b9fed6c2" + fn_fetch_file "https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16" "${filedir}" "libmysqlclient.so.16" "chmodx" "norun" "noforce" "6c188e0f8fb5d7a29f4bc413b9fed6c2" sudo mv "${tmpdir}/libmysqlclient.so.16" "/usr/lib/libmysqlclient.so.16" else fn_print_fail_nl "Failed to install libmysqlclient16, $(whoami) does not have sudo access. Download it manually and place it in /usr/lib" diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 39c2934bc..636f0dea5 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -10,35 +10,35 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_install_server_files(){ if [ "${gamename}" == "Battlefield: 1942" ]; then - fileurl="http://files.gameservermanagers.com/BattleField1942/bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; filedir="${tmpdir}"; filename="bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="a86a5d3cd64ca59abcc9bb9f777c2e5d" + remote_fileurl="http://files.gameservermanagers.com/BattleField1942/bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="a86a5d3cd64ca59abcc9bb9f777c2e5d" elif [ "${gamename}" == "Call of Duty" ]; then - fileurl="http://files.gameservermanagers.com/CallOfDuty/cod-lnxded-1.5b-full.tar.bz2"; filedir="${tmpdir}"; filename="cod-lnxded-1.5-large.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="19629895a4cf6fd8f6d1ee198b5304cd" + remote_fileurl="http://files.gameservermanagers.com/CallOfDuty/cod-lnxded-1.5b-full.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="cod-lnxded-1.5-large.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="19629895a4cf6fd8f6d1ee198b5304cd" elif [ "${gamename}" == "Call of Duty: United Offensive" ]; then - fileurl="http://files.gameservermanagers.com/CallOfDutyUnitedOffensive/coduo-lnxded-1.51b-full.tar.bz2"; filedir="${tmpdir}"; filename="coduo-lnxded-1.51b-full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="f1804ef13036e2b4ab535db000b19e97" + remote_fileurl="http://files.gameservermanagers.com/CallOfDutyUnitedOffensive/coduo-lnxded-1.51b-full.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="coduo-lnxded-1.51b-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f1804ef13036e2b4ab535db000b19e97" elif [ "${gamename}" == "Call of Duty 2" ]; then - fileurl="http://files.gameservermanagers.com/CallOfDuty2/cod2-lnxded-1.3-full.tar.bz2"; filedir="${tmpdir}"; filename="cod2-lnxded-1.3-full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="078128f83d06dc3d7699428dc2870214" + remote_fileurl="http://files.gameservermanagers.com/CallOfDuty2/cod2-lnxded-1.3-full.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="cod2-lnxded-1.3-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="078128f83d06dc3d7699428dc2870214" elif [ "${gamename}" == "Call of Duty 4" ]; then - fileurl="http://files.gameservermanagers.com/CallOfDuty4/cod4x18_dedrun.tar.bz2"; filedir="${tmpdir}"; filename="cod4x18_dedrun.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="bebdfc1755626462bdaad49f6f926c08" + remote_fileurl="http://files.gameservermanagers.com/CallOfDuty4/cod4x18_dedrun.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="cod4x18_dedrun.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="bebdfc1755626462bdaad49f6f926c08" elif [ "${gamename}" == "Call of Duty: World at War" ]; then - fileurl="http://files.gameservermanagers.com/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.bz2"; filedir="${tmpdir}"; filename="codwaw-lnxded-1.7-full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="0489697ff3bf678c109bfb377d1b7895" + remote_fileurl="http://files.gameservermanagers.com/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="codwaw-lnxded-1.7-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="0489697ff3bf678c109bfb377d1b7895" elif [ "${gamename}" == "GoldenEye: Source" ]; then - fileurl="http://files.gameservermanagers.com/GoldenEyeSource/GoldenEye_Source_v5.0.1_full_server_linux.tar.bz2"; filedir="${tmpdir}"; filename="GoldenEye_Source_v5.0.1_server_full_Linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="ea227a150300abe346e757380325f84c" + remote_fileurl="http://files.gameservermanagers.com/GoldenEyeSource/GoldenEye_Source_v5.0.1_full_server_linux.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="GoldenEye_Source_v5.0.1_server_full_Linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="ea227a150300abe346e757380325f84c" elif [ "${gamename}" == "Quake 2" ]; then - fileurl="http://files.gameservermanagers.com/Quake2/quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; filedir="${tmpdir}"; filename="quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="0b8c7e2d51f40b56b328c69e986e7c5f" + remote_fileurl="http://files.gameservermanagers.com/Quake2/quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="0b8c7e2d51f40b56b328c69e986e7c5f" elif [ "${gamename}" == "Quake 3: Arena" ]; then - fileurl="http://files.gameservermanagers.com/Quake3/quake3-1.32c-x86-full-linux.tar.bz2"; filedir="${tmpdir}"; filename="quake3-1.32c-x86-full-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="fd7258d827474f67663dda297bff4306" + remote_fileurl="http://files.gameservermanagers.com/Quake3/quake3-1.32c-x86-full-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="quake3-1.32c-x86-full-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="fd7258d827474f67663dda297bff4306" elif [ "${gamename}" == "QuakeWorld" ]; then - fileurl="http://files.gameservermanagers.com/QuakeWorld/nquake.server.linux.083116.full.tar.bz2"; filedir="${tmpdir}"; filename="nquake.server.linux.083116.full.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="75a409cf08d808f075e4dacdc7b21b78" + remote_fileurl="http://files.gameservermanagers.com/QuakeWorld/nquake.server.linux.083116.full.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="nquake.server.linux.083116.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="75a409cf08d808f075e4dacdc7b21b78" elif [ "${gamename}" == "Unreal Tournament 2004" ]; then - fileurl="http://files.gameservermanagers.com/UnrealTournament2004/ut2004-server-3339-ultimate-linux.tar.bz2"; filedir="${tmpdir}"; filename="ut2004-server-3339-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" + remote_fileurl="http://files.gameservermanagers.com/UnrealTournament2004/ut2004-server-3339-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="ut2004-server-3339-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" elif [ "${gamename}" == "Unreal Tournament 99" ]; then - fileurl="http://files.gameservermanagers.com/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; filedir="${tmpdir}"; filename="ut99-server-451-ultimate-linux.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" + remote_fileurl="http://files.gameservermanagers.com/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="ut99-server-451-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" elif [ "${gamename}" == "Unreal Tournament" ]; then - fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Server-XAN-3270765-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3270765-Linux.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="8791dc087383061d7f7f9f523237b8b3" + remote_fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Server-XAN-3270765-Linux.zip"; local_filedir="${tmpdir}"; local_filedir="UnrealTournament-Server-XAN-3270765-Linux.zip"; chmodx="nochmodx" run="norun"; force="noforce"; md5="8791dc087383061d7f7f9f523237b8b3" elif [ "${gamename}" == "Unreal Tournament 3" ]; then - fileurl="http://files.gameservermanagers.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; filedir="${tmpdir}"; filename="UT3-linux-server-2.1.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" + remote_fileurl="http://files.gameservermanagers.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="UT3-linux-server-2.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then - fileurl="http://files.gameservermanagers.com/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; filedir="${tmpdir}"; filename="enemy-territory.260b.tar.bz2"; executecmd="noexecute" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" + remote_fileurl="http://files.gameservermanagers.com/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="enemy-territory.260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" fi fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" fn_dl_extract "${filedir}" "${filename}" "${serverfiles}" diff --git a/lgsm/functions/monitor_gsquery.sh b/lgsm/functions/monitor_gsquery.sh index c874dc452..f5bbdb6f6 100644 --- a/lgsm/functions/monitor_gsquery.sh +++ b/lgsm/functions/monitor_gsquery.sh @@ -13,7 +13,7 @@ if [ "${gsquery}" == "yes" ]; then # Downloads gsquery.py if missing if [ ! -f "${functionsdir}/gsquery.py" ]; then - fn_fetch_file_github "lgsm/functions" "gsquery.py" "${functionsdir}" "executecmd" "norun" "noforce" "nomd5" + fn_fetch_file_github "lgsm/functions" "gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" fi info_config.sh From 98fb5ec811e7c8ed1e6daf166373224d35a7df7f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 22:38:53 +0100 Subject: [PATCH 0714/1895] tidy --- lgsm/functions/check.sh | 2 -- lgsm/functions/core_functions.sh | 18 +++++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 5fd1bc241..58933851e 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -79,8 +79,6 @@ do fi done - - local allowed_commands_array=( command_details.sh command_monitor.sh command_start.sh command_stop.sh command_ts3_server_pass.sh command_update.sh command_details.sh command_validate.sh ) for allowed_command in "${allowed_commands_array[@]}" do diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index d915b1c9f..1de00e85a 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -46,15 +46,15 @@ fn_fetch_function } command_postdetails.sh(){ - functionfile="${FUNCNAME}" - tempffname="${functionfile}" - # First, grab the command_postdetails.sh file - fn_fetch_function - # But then next, command_details.sh needs to also be pulled - # because command_postdetails.sh sources its functions -CedarLUG - functionfile="command_details.sh" - fn_fetch_function - functionfile="${tempffname}" +functionfile="${FUNCNAME}" +tempffname="${functionfile}" +# First, grab the command_postdetails.sh file +fn_fetch_function +# But then next, command_details.sh needs to also be pulled +# because command_postdetails.sh sources its functions -CedarLUG +functionfile="command_details.sh" +fn_fetch_function +functionfile="${tempffname}" } command_details.sh(){ From 4c64348c0deb33510ffba0b7e48cbebc81db3697 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 22:46:09 +0100 Subject: [PATCH 0715/1895] removed libmysqlclient install as handled by fix_mta.sh also updated the install message --- lgsm/functions/install_mta_resources.sh | 28 +++---------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh index bed82c594..1107ad0aa 100644 --- a/lgsm/functions/install_mta_resources.sh +++ b/lgsm/functions/install_mta_resources.sh @@ -9,28 +9,6 @@ local commandname="INSTALL" local commandaction="Install" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -fn_install_libmysqlclient16(){ - echo "" - echo "Checking if libmysqlclient16 is installed" - echo "=================================" - sleep 1 - if [ ! -f "/usr/lib/libmysqlclient.so.16" ]; then - fn_print_warn_nl "libmysqlclient16 not installed. Installing.." - sleep 1 - sudo -v > /dev/null 2>&1 - if [ $? -eq 0 ]; then - fn_fetch_file "https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16" "${filedir}" "libmysqlclient.so.16" "chmodx" "norun" "noforce" "6c188e0f8fb5d7a29f4bc413b9fed6c2" - sudo mv "${tmpdir}/libmysqlclient.so.16" "/usr/lib/libmysqlclient.so.16" - else - fn_print_fail_nl "Failed to install libmysqlclient16, $(whoami) does not have sudo access. Download it manually and place it in /usr/lib" - sleep 1 - fi - else - echo "libmysqlclient16 already installed." - fi -} - -fn_install_libmysqlclient16 - -fn_print_information_nl "Server is inoperable by default without resources, you can install default ones by running the command install-default-resources" -echo "" +fn_print_information_nl "${gamename} will not function without resources!" +echo " * install default resources using ./${selfname} install-default-resources" +echo " * download resources from https://community.multitheftauto.com" From 26e5d14f245d71a65f4da7579746e1754a1934dd Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 22:47:59 +0100 Subject: [PATCH 0716/1895] tabs --- lgsm/functions/command_fastdl.sh | 48 ++++++++++++++++---------------- lgsm/functions/core_functions.sh | 2 +- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh index 34ea98d0c..b040bccaa 100644 --- a/lgsm/functions/command_fastdl.sh +++ b/lgsm/functions/command_fastdl.sh @@ -115,32 +115,32 @@ fn_fastdl_dirs(){ # Using this gist https://gist.github.com/agunnerson-ibm/efca449565a3e7356906 fn_human_readable_file_size(){ - local abbrevs=( - $((1 << 60)):ZB - $((1 << 50)):EB - $((1 << 40)):TB - $((1 << 30)):GB - $((1 << 20)):MB - $((1 << 10)):KB - $((1)):bytes - ) + local abbrevs=( + $((1 << 60)):ZB + $((1 << 50)):EB + $((1 << 40)):TB + $((1 << 30)):GB + $((1 << 20)):MB + $((1 << 10)):KB + $((1)):bytes + ) - local bytes="${1}" - local precision="${2}" + local bytes="${1}" + local precision="${2}" - if [[ "${bytes}" == "1" ]]; then - echo "1 byte" - else - for item in "${abbrevs[@]}"; do - local factor="${item%:*}" - local abbrev="${item#*:}" - if [[ "${bytes}" -ge "${factor}" ]]; then - local size="$(bc -l <<< "${bytes} / ${factor}")" - printf "%.*f %s\n" "${precision}" "${size}" "${abbrev}" - break - fi - done - fi + if [[ "${bytes}" == "1" ]]; then + echo "1 byte" + else + for item in "${abbrevs[@]}"; do + local factor="${item%:*}" + local abbrev="${item#*:}" + if [[ "${bytes}" -ge "${factor}" ]]; then + local size="$(bc -l <<< "${bytes} / ${factor}")" + printf "%.*f %s\n" "${precision}" "${size}" "${abbrev}" + break + fi + done + fi } # Provides info about the fastdl directory content and prompts for confirmation diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 1de00e85a..d6dc9f09b 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -543,7 +543,7 @@ fn_fetch_function # Creates tmp dir if missing if [ ! -d "${tmpdir}" ]; then - mkdir -p "${tmpdir}" + mkdir -p "${tmpdir}" fi # Calls on-screen messages (bootstrap) From 6a7ad3db7f38116483ff48f771b06522fad03778 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 23:03:30 +0100 Subject: [PATCH 0717/1895] filesdir is now serverfiles --- lgsm/functions/alert_email.sh | 2 +- lgsm/functions/check_system_dir.sh | 15 +++++++++++---- lgsm/functions/command_details.sh | 2 +- lgsm/functions/info_distro.sh | 6 +++--- lgsm/functions/install_server_files.sh | 4 ++-- tests/tests_jc2server.sh | 2 +- tests/tests_ts3server.sh | 2 +- 7 files changed, 20 insertions(+), 13 deletions(-) diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index a49dda347..36541706d 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -83,7 +83,7 @@ fn_details_disk(){ echo -e "Total: ${totalspace}" echo -e "Used: ${usedspace}" echo -e "Available: ${availspace}" - echo -e "Serverfiles: ${filesdirdu}" + echo -e "Serverfiles: ${serverfilesdu}" if [ -d "${backupdir}" ]; then echo -e "Backups: ${backupdirdu}" fi diff --git a/lgsm/functions/check_system_dir.sh b/lgsm/functions/check_system_dir.sh index 0e5c39718..c08fb33a7 100644 --- a/lgsm/functions/check_system_dir.sh +++ b/lgsm/functions/check_system_dir.sh @@ -2,15 +2,22 @@ # LinuxGSM check_system_dir.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -# Description: Checks if systemdir is accessible. +# Description: Checks if systemdir/serverfiles is accessible. local commandname="CHECK" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -if [ ! -d "${systemdir}" ]; then - fn_print_fail_nl "Cannot access ${systemdir}: No such directory" +if [ "${function_selfname}" != "command_validate.sh" ];then + checkdir="${serverfiles}" +else + checkdir="${systemdir}" +fi + +if [ ! -d "${checkdir}" ]; then + fn_print_fail_nl "Cannot access ${checkdir}: No such directory" if [ -d "${scriptlogdir}" ]; then - fn_script_log_fatal "Cannot access ${systemdir}: No such directory." + fn_script_log_fatal "Cannot access ${checkdir}: No such directory." fi core_exit.sh fi + diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 106eb0041..843b09eaf 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -83,7 +83,7 @@ fn_details_disk(){ echo -e "${blue}Used:\t${default}${usedspace}" echo -e "${blue}Available:\t${default}${availspace}" echo -e "${blue}LinuxGSM Total:\t${default}${rootdirdu}" - echo -e "${blue}Serverfiles:\t${default}${filesdirdu}" + echo -e "${blue}Serverfiles:\t${default}${serverfilesdu}" if [ -d "${backupdir}" ]; then echo -e "${blue}Backups:\t${default}${backupdirdu}" fi diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index c83dff8a1..d85d89fb6 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -95,9 +95,9 @@ if [ -z "${rootdirdu}" ]; then fi ## LinuxGSM used space in serverfiles dir. -filesdirdu=$(du -sh "${serverfiles}" 2> /dev/null | awk '{print $1}') -if [ -z "${filesdirdu}" ]; then - filesdirdu="0M" +serverfilesdu=$(du -sh "${serverfiles}" 2> /dev/null | awk '{print $1}') +if [ -z "${serverfilesdu}" ]; then + serverfilesdu="0M" fi ## LinuxGSM used space total minus backup dir. diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 636f0dea5..916c3fbb8 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -86,10 +86,10 @@ fn_install_server_files_steamcmd(){ fi elif [ "${counter}" -ge "5" ]; then if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} -validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${branch} validate +quit local exitcode=$? else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} -validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} validate +quit local exitcode=$? fi fi diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index ae554e85a..edfeb983d 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -90,7 +90,7 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories systemdir="${serverfiles}" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index d19223269..308c59a57 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -77,7 +77,7 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories systemdir="${serverfiles}" From 73770c5696cc956be35be8210b6cd1380016f0d8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 23:11:20 +0100 Subject: [PATCH 0718/1895] fixes #880 if no telnet password is set it sets one. This will cause the telnet login attempt to fail rather than stall. --- lgsm/functions/command_stop.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 3996f523e..fb30b4ad8 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -88,6 +88,9 @@ fn_stop_graceful_goldsource(){ # Attempts graceful of 7 Days To Die using telnet. fn_stop_telnet_sdtd(){ + if [ ! "${telnetpass}"]; then + telnetpass="NOTSET" + fi sdtd_telnet_shutdown=$( expect -c ' proc abort {} { puts "Timeout or EOF\n" From 980aae42ff58ab06ba0fc5db9c356eca54192788 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 23:25:52 +0100 Subject: [PATCH 0719/1895] corrected if --- lgsm/functions/command_stop.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index fb30b4ad8..18a9c53dd 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -88,7 +88,7 @@ fn_stop_graceful_goldsource(){ # Attempts graceful of 7 Days To Die using telnet. fn_stop_telnet_sdtd(){ - if [ ! "${telnetpass}"]; then + if [ -z "${telnetpass}"]; then telnetpass="NOTSET" fi sdtd_telnet_shutdown=$( expect -c ' From b3bf65c424444c17cb9e2a6d551cde61cd114f15 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 4 May 2017 23:26:18 +0100 Subject: [PATCH 0720/1895] fixes #1152 --- lgsm/functions/alert_email.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index 36541706d..c15b6df30 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -231,7 +231,7 @@ fn_details_disk fn_details_gameserver fn_alert_email_template_logs if [ -n "${emailfrom}" ]; then - mail -s "${alertsubject}" -a "From: ${emailfrom}" "${email}" < "${emaillog}" + mail -s "${alertsubject}" -r "${emailfrom}" "${email}" < "${emaillog}" else mail -s "${alertsubject}" "${email}" < "${emaillog}" fi From 3ef9d523ec25026666bc8cb42773d8513b824790 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 8 May 2017 21:57:37 +0100 Subject: [PATCH 0721/1895] reverted back to tmp dir --- lgsm/functions/command_update_linuxgsm.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index fa3f08762..d009a3026 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -28,19 +28,19 @@ else fi echo -ne " checking linuxgsm.sh...\c" -tmp_script_diff=$(diff "${functionsdir}/linuxgsm.sh" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) +tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) if [ "${tmp_script_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking linuxgsm.sh: UPDATE" - rm -f "${functionsdir}/linuxgsm.sh" - fn_fetch_file_github "" "linuxgsm.sh" "${functionsdir}" "nochmodx" "norun" "noforcedl" "nomd5" + rm -f "${tmpdir}/linuxgsm.sh" + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nomd5" # Compare selfname against linuxgsm.sh in the tmp dir. Ignoring server specific vars. else fn_script_log_info "checking linuxgsm.sh: OK" fn_print_ok_eol_nl fi echo -ne " checking ${selfname}...\c" -script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${functionsdir}/linuxgsm.sh") <(sed '/shortname/d;/servername/d;/gamename/d' "${rootdir}/${selfname}")) +script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${tmpdir}/linuxgsm.sh") <(sed '/shortname/d;/servername/d;/gamename/d' "${rootdir}/${selfname}")) if [ "${script_diff}" != "" ]; then fn_print_update_eol_nl echo -ne " backup ${selfname}...\c" @@ -54,7 +54,7 @@ if [ "${script_diff}" != "" ]; then echo -e " Backup: ${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" fi echo -ne " fetching ${selfname}...\c" - cp "${functionsdir}/linuxgsm.sh" "${rootdir}/${selfname}" + cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" sed -i "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${rootdir}/${selfname}" sed -i "s/servername=\"core\"/servername=\"${servername}\"/g" "${rootdir}/${selfname}" sed -i "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${rootdir}/${selfname}" From 9d046fcb8e161d62916953309c5bc6b268f265ee Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 8 May 2017 22:05:32 +0100 Subject: [PATCH 0722/1895] Added optionto delete unknown functions in function dir should a non existant or random file be put in to the functions dir it will be removed --- lgsm/functions/command_update_linuxgsm.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index d009a3026..9f916cc4c 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -75,8 +75,14 @@ if [ -n "${functionsdir}" ]; then for functionfile in * do echo -ne " checking function ${functionfile}...\c" - function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}")) - if [ "${function_file_diff}" != "" ]; then + function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}";exitcode=$?)) + exitcode=$? + if [ "${exitcode}" -ne 0 ]; then + fn_print_fail_eol_nl + echo -ne " removing unknown function ${functionfile}...\c" + fn_script_log_fatal "removing unknown function ${functionfile}" + rm -f "${functionfile}" + elif [ "${function_file_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking function ${functionfile}: UPDATE" rm -rf "${functionsdir}/${functionfile}" From a086d9fbbcd7d59b463ae91f1e58463d31b82710 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 8 May 2017 22:05:54 +0100 Subject: [PATCH 0723/1895] removed var --- lgsm/functions/command_update_linuxgsm.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 9f916cc4c..372f3f860 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -76,7 +76,6 @@ if [ -n "${functionsdir}" ]; then do echo -ne " checking function ${functionfile}...\c" function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}";exitcode=$?)) - exitcode=$? if [ "${exitcode}" -ne 0 ]; then fn_print_fail_eol_nl echo -ne " removing unknown function ${functionfile}...\c" From cc91a5ea3e512e74a0b6fdf969e70203deff5fd3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 8 May 2017 22:11:29 +0100 Subject: [PATCH 0724/1895] improved exitcode --- lgsm/functions/command_update_linuxgsm.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 372f3f860..a1afd048c 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -75,8 +75,8 @@ if [ -n "${functionsdir}" ]; then for functionfile in * do echo -ne " checking function ${functionfile}...\c" - function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}";exitcode=$?)) - if [ "${exitcode}" -ne 0 ]; then + function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}")) + if [ $? -ne 0 ]; then fn_print_fail_eol_nl echo -ne " removing unknown function ${functionfile}...\c" fn_script_log_fatal "removing unknown function ${functionfile}" From baf6705ff562b75a0ac5b126cbef1d9abefb4d8d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 8 May 2017 22:11:43 +0100 Subject: [PATCH 0725/1895] reverted back to tmpdir --- linuxgsm.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 16349de53..5e6a519b1 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -364,8 +364,8 @@ else source "${configdirserver}/${servicename}.cfg" fi # Load the linuxgsm.sh in to tmpdir. If missing download it - if [ ! -f "${functionsdir}/linuxgsm.sh" ];then - fn_fetch_file_github "" "linuxgsm.sh" "${functionsdir}" "chmodx" "norun" "noforcedl" "nomd5" + if [ ! -f "${tmpdir}/linuxgsm.sh" ];then + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" fi getopt=$1 core_getopt.sh From 0839e549bcfa88370acf19fd989fc7c9e4b1e936 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 8 May 2017 22:18:40 +0100 Subject: [PATCH 0726/1895] added exit code for removal of stray functions --- lgsm/functions/command_update_linuxgsm.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index a1afd048c..5436e05db 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -81,6 +81,12 @@ if [ -n "${functionsdir}" ]; then echo -ne " removing unknown function ${functionfile}...\c" fn_script_log_fatal "removing unknown function ${functionfile}" rm -f "${functionfile}" + if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi elif [ "${function_file_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking function ${functionfile}: UPDATE" From 141916bd843549216b058e9db9638c8acef6fc29 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 8 May 2017 22:37:45 +0100 Subject: [PATCH 0727/1895] checks the file exists remotly currenlty doubles the http requests but not sure of a better way currently --- lgsm/functions/command_update_linuxgsm.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 5436e05db..5fbe32e6b 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -75,8 +75,10 @@ if [ -n "${functionsdir}" ]; then for functionfile in * do echo -ne " checking function ${functionfile}...\c" - function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}")) - if [ $? -ne 0 ]; then + get_function_file=$(${curlpath} --fail -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}") + exitcode=$? + function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlpath} --fail -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}")) + if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl echo -ne " removing unknown function ${functionfile}...\c" fn_script_log_fatal "removing unknown function ${functionfile}" From 2bc7a638b4ee84434a69a1ea632b551d78b7eb41 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 8 May 2017 22:52:51 +0100 Subject: [PATCH 0728/1895] typo --- linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 5e6a519b1..0ca3f28e7 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -269,7 +269,7 @@ if [ "${shortname}" == "core" ]; then # Download the serverlist. This is the complete list of all supported servers. # Download to tmp dir fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${tmpdir}/data" "serverlist.csv" "nochmodx" "norun" "noforcedl" "nomd5" - # if missing in lgsm dir copy it accross + # if missing in lgsm dir copy it across if [ ! -f "${serverlist}" ]; then mkdir -p "${datadir}" cp -R "${serverlist_tmp}" "${serverlist}" From 4ebdad007fd0a75b82991d83fa2cf2c601999b88 Mon Sep 17 00:00:00 2001 From: compositebowman Date: Mon, 8 May 2017 18:57:35 -0400 Subject: [PATCH 0729/1895] Added Steam AppID fix for Red Orchestra --- lgsm/functions/fix_ro.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh index 3498ee9c8..f4a9a7af4 100644 --- a/lgsm/functions/fix_ro.sh +++ b/lgsm/functions/fix_ro.sh @@ -17,6 +17,9 @@ 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 Steam AppID fix." +sed -i 's/1210/1200/g' "${systemdir}/steam_appid.txt" +sleep 1 echo "applying server name fix." sleep 1 echo "forcing server restart..." @@ -26,4 +29,4 @@ sleep 5 command_stop.sh command_start.sh sleep 5 -command_stop.sh \ No newline at end of file +command_stop.sh From 8008501f5ad22c7172dd23c5c255212320e312a0 Mon Sep 17 00:00:00 2001 From: Marvin Lehmann Date: Thu, 11 May 2017 20:21:19 +0200 Subject: [PATCH 0730/1895] Added graceful shutdown for Terraria --- lgsm/functions/command_stop.sh | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 1443fac8d..37cc54c11 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -228,6 +228,34 @@ fn_stop_graceful_mta(){ fn_stop_tmux } +# Attempts graceful of source using rcon 'exit' command. +fn_stop_graceful_terraria(){ + fn_print_dots "Graceful: sending \"exit\"" + fn_script_log_info "Graceful: sending \"exit\"" + # sends exit + tmux send -t "${servicename}" exit ENTER > /dev/null 2>&1 + # waits up to 30 seconds giving the server time to shutdown gracefuly + for seconds in {1..30}; do + check_status.sh + if [ "${status}" == "0" ]; then + fn_print_ok "Graceful: sending \"exit\": ${seconds}: " + fn_print_ok_eol_nl + fn_script_log_pass "Graceful: sending \"exit\": OK: ${seconds} seconds" + break + fi + sleep 1 + fn_print_dots "Graceful: sending \"exit\": ${seconds}" + done + check_status.sh + if [ "${status}" != "0" ]; then + fn_print_error "Graceful: sending \"exit\": " + fn_print_fail_eol_nl + fn_script_log_error "Graceful: sending \"exit\": FAIL" + fi + sleep 1 + fn_stop_tmux +} + fn_stop_graceful_select(){ if [ "${gamename}" == "7 Days To Die" ]; then fn_stop_graceful_sdtd @@ -241,6 +269,8 @@ fn_stop_graceful_select(){ fn_stop_graceful_minecraft elif [ "${engine}" == "renderware" ]; then fn_stop_graceful_mta + elif [ "${engine}" == "terraria" ]; then + fn_stop_graceful_terraria else fn_stop_tmux fi From b8ef5f85a8b093b258d127b8320d61027b259706 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 11 May 2017 19:37:28 +0100 Subject: [PATCH 0731/1895] Legacy: core functions now download --- lgsm/functions/core_functions.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index d6dc9f09b..571f8ce5d 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -9,7 +9,11 @@ core_dl.sh(){ functionfile="${FUNCNAME}" -fn_bootstrap_fetch_file_github "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" +if [ -z $(type fn_bootstrap_fetch_file_github) ];then + fn_fetch_core_dl "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" +else + fn_bootstrap_fetch_file_github "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" +fi } core_exit.sh(){ @@ -553,6 +557,4 @@ core_messages.sh core_dl.sh # Calls the global Ctrl-C trap -core_trap.sh - - +core_trap.sh \ No newline at end of file From 115a8d61278071577d804444273b58257fa13a62 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 11 May 2017 19:44:25 +0100 Subject: [PATCH 0732/1895] Added legacy function to handle legacy scripts --- lgsm/functions/core_functions.sh | 28 ++++++++++++++++++++++------ lgsm/functions/core_legacy.sh | 9 +++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 lgsm/functions/core_legacy.sh diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index 571f8ce5d..c319cd55a 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -9,13 +9,31 @@ core_dl.sh(){ functionfile="${FUNCNAME}" -if [ -z $(type fn_bootstrap_fetch_file_github) ];then +if [ "$(type fn_fetch_core_dl)" ];then fn_fetch_core_dl "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" else fn_bootstrap_fetch_file_github "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" fi } +core_messages.sh(){ +functionfile="${FUNCNAME}" +if [ "$(type fn_fetch_core_dl)" ];then + fn_fetch_core_dl "lgsm/functions" "core_messages.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" +else + fn_bootstrap_fetch_file_github "lgsm/functions" "core_messages.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" +fi +} + +core_legacy.sh(){ +functionfile="${FUNCNAME}" +if [ "$(type fn_fetch_core_dl)" ];then + fn_fetch_core_dl "lgsm/functions" "core_legacy.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" +else + fn_bootstrap_fetch_file_github "lgsm/functions" "core_legacy.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" +fi +} + core_exit.sh(){ functionfile="${FUNCNAME}" fn_fetch_function @@ -31,11 +49,6 @@ functionfile="${FUNCNAME}" fn_fetch_function } -core_messages.sh(){ -functionfile="${FUNCNAME}" -fn_bootstrap_fetch_file_github "lgsm/functions" "core_messages.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" -} - # Commands @@ -550,6 +563,9 @@ if [ ! -d "${tmpdir}" ]; then mkdir -p "${tmpdir}" fi +# Calls code required for legacy servers +core_legacy.sh + # Calls on-screen messages (bootstrap) core_messages.sh diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh new file mode 100644 index 000000000..e7938e16d --- /dev/null +++ b/lgsm/functions/core_legacy.sh @@ -0,0 +1,9 @@ +#!/bin/bash +# LinuxGSM core_legacy.sh function +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +# Description: Code for backwards compatability with older versions of LinuxGSM. + +if [ -z ${serverfiles} ]; then + serverfiles="${filesdir}" +fi \ No newline at end of file From 324fa47b2ad4595549135f29a426e30d36b4545c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 11 May 2017 19:57:54 +0100 Subject: [PATCH 0733/1895] Legacy: getting logs to work --- lgsm/functions/core_legacy.sh | 6 +++++- lgsm/functions/install_logs.sh | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index e7938e16d..f309894a6 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -4,6 +4,10 @@ # Website: https://gameservermanagers.com # Description: Code for backwards compatability with older versions of LinuxGSM. -if [ -z ${serverfiles} ]; then +if [ -z "${serverfiles}" ]; then serverfiles="${filesdir}" +fi + +if [ -z "${logdir}" ]; then + logdir="${rootdir}/log" fi \ No newline at end of file diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 65a09ed18..bcadafc36 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -15,11 +15,11 @@ if [ "${checklogs}" != "1" ]; then fi sleep 1 # Create script and console log directories -mkdir -v "${logdir}" -mkdir -v "${scriptlogdir}" +mkdir -pv "${logdir}" +mkdir -pv "${scriptlogdir}" touch "${scriptlog}" if [ -n "${consolelogdir}" ]; then - mkdir -v "${consolelogdir}" + mkdir -pv "${consolelogdir}" touch "${consolelog}" fi From b3ae3cb7bc673e277ee4b7313ce094405c335621 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 11 May 2017 20:03:23 +0100 Subject: [PATCH 0734/1895] Legacy: Added steamcmddir --- lgsm/functions/core_legacy.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index f309894a6..de9d6408a 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -10,4 +10,8 @@ fi if [ -z "${logdir}" ]; then logdir="${rootdir}/log" -fi \ No newline at end of file +fi + +if [ -z "${steamcmddir}" ]; then + steamcmddir="${rootdir}/steamcmd" +fi From 441ff9071253086d1eb37ceb7eeb024db9309626 Mon Sep 17 00:00:00 2001 From: Marvin Lehmann Date: Thu, 11 May 2017 23:14:43 +0200 Subject: [PATCH 0735/1895] Fixed graceful select order --- lgsm/functions/command_stop.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 37cc54c11..a66886a93 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -259,18 +259,18 @@ fn_stop_graceful_terraria(){ fn_stop_graceful_select(){ if [ "${gamename}" == "7 Days To Die" ]; then fn_stop_graceful_sdtd - elif [ "${gamename}" == "Factorio" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Multi Theft Auto" ]||[ "${engine}" == "unity3d" ]||[ "${engine}" == "unreal4" ]||[ "${engine}" == "unreal3" ]||[ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ]||[ "${gamename}" == "Mumble" ]; then - fn_stop_graceful_ctrlc - elif [ "${engine}" == "source" ]||[ "${engine}" == "quake" ]||[ "${engine}" == "idtech2" ]||[ "${engine}" == "idtech3" ]||[ "${engine}" == "idtech3_ql" ]||[ "${engine}" == "Just Cause 2" ]; then - fn_stop_graceful_quit - elif [ "${engine}" == "goldsource" ]; then - fn_stop_graceful_goldsource + elif [ "${gamename}" == "Terraria" ]; then + fn_stop_graceful_terraria elif [ "${engine}" == "lwjgl2" ]; then fn_stop_graceful_minecraft elif [ "${engine}" == "renderware" ]; then fn_stop_graceful_mta - elif [ "${engine}" == "terraria" ]; then - fn_stop_graceful_terraria + elif [ "${engine}" == "goldsource" ]; then + fn_stop_graceful_goldsource + elif [ "${gamename}" == "Factorio" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Multi Theft Auto" ]||[ "${engine}" == "unity3d" ]||[ "${engine}" == "unreal4" ]||[ "${engine}" == "unreal3" ]||[ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ]||[ "${gamename}" == "Mumble" ]; then + fn_stop_graceful_ctrlc + elif [ "${engine}" == "source" ]||[ "${engine}" == "quake" ]||[ "${engine}" == "idtech2" ]||[ "${engine}" == "idtech3" ]||[ "${engine}" == "idtech3_ql" ]||[ "${engine}" == "Just Cause 2" ]; then + fn_stop_graceful_quit else fn_stop_tmux fi From 1d41567c8b47bf06a9903793d6eaefccd8d9019f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 11 May 2017 22:35:08 +0100 Subject: [PATCH 0736/1895] fixed config installation --- lgsm/functions/install_config.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh index bca134421..7d3b118e4 100644 --- a/lgsm/functions/install_config.sh +++ b/lgsm/functions/install_config.sh @@ -20,9 +20,9 @@ fn_check_cfgdir(){ # Downloads default configs from Game-Server-Configs repo to lgsm/config-default fn_fetch_default_config(){ mkdir -p "${lgsmdir}/config-default/config-game" - githuburl="https://github.com/GameServerManagers/Game-Server-Configs/master" + githuburl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master" for config in "${array_configs[@]}"; do - fn_fetch_file "${githuburl}/${config}" "${lgsmdir}/config-default/config-game" "${config}" "nochmodx" "norun" "noforce" "nomd5" + fn_fetch_file "${githuburl}/${gamedirname}/${config}" "${lgsmdir}/config-default/config-game" "${config}" "nochmodx" "norun" "noforce" "nomd5" done } From 9225fce14788bd9bb68fed55cd615328d8dee197 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 11 May 2017 22:36:04 +0100 Subject: [PATCH 0737/1895] added mkdir -pv --- lgsm/functions/check_steamcmd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 2b8cb0f0b..9aab57f9f 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -8,7 +8,7 @@ local commandname="CHECK" fn_install_steamcmd(){ if [ ! -d "${steamcmddir}" ]; then - mkdir -v "${steamcmddir}" + mkdir -pv "${steamcmddir}" fi fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "${tmpdir}" "steamcmd_linux.tar.gz" fn_dl_extract "${tmpdir}" "steamcmd_linux.tar.gz" "${steamcmddir}" From 898619be856a399b02c743e451aa6af0f5c00908 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 11 May 2017 22:50:51 +0100 Subject: [PATCH 0738/1895] Altered getopt to move update-lgsm --- lgsm/functions/core_getopt.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 79275ed43..391b47665 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -17,15 +17,15 @@ cmd_restart=( "r;restart" "command_restart.sh" "Restart the server." ) cmd_details=( "dt;details" "command_details.sh" "Display server information." ) cmd_postdetails=( "pd;postdetails" "command_postdetails.sh" "Post details to hastebin (removing passwords)." ) cmd_backup=( "b;backup" "command_backup.sh" "Create backup archives of the server." ) -cmd_update_linuxgsm=( "ul;update-lgsm;uf;update-functions" "command_update_linuxgsm.sh" "Update LinuxGSM." ) +cmd_update_linuxgsm=( "ul;update-lgsm;uf;update-functions" "command_update_linuxgsm.sh" "Check and apply any LinuxGSM updates." ) cmd_test_alert=( "ta;test-alert" "command_test_alert.sh" "Send a test alert." ) cmd_monitor=( "m;monitor" "command_monitor.sh" "Check server status and restart if crashed." ) # Console servers only cmd_console=( "c;console" "command_console.sh" "Access server console." ) cmd_debug=( "d;debug" "command_debug.sh" "Start server directly in your terminal." ) # Update servers only -cmd_update=( "u;update" "command_update.sh" "Check and apply any updates." ) -cmd_force_update=( "fu;force-update;update-restart;ur" "forceupdate=1; command_update.sh" "Bypass update check and apply any updates." ) +cmd_update=( "u;update" "command_update.sh" "Check and apply any server updates." ) +cmd_force_update=( "fu;force-update;update-restart;ur" "forceupdate=1; command_update.sh" "Apply server updates bypassing check." ) # SteamCMD servers only cmd_validate=( "v;validate" "command_validate.sh" "Validate server files with SteamCMD." ) # Server with mods-install @@ -51,6 +51,9 @@ cmd_dev_detect_ldd=( "dl;detect-ldd" "command_dev_detect_ldd.sh" "Detect require currentopt=( "${cmd_start[@]}" "${cmd_stop[@]}" "${cmd_restart[@]}" "${cmd_monitor[@]}" "${cmd_test_alert[@]}" "${cmd_details[@]}" "${cmd_postdetails[@]}" ) +# Update LGSM +currentopt+=( "${cmd_update_linuxgsm[@]}" ) + # Exclude noupdate games here if [ "${gamename}" != "Battlefield: 1942" ]&&[ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "idtech3" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]; then currentopt+=( "${cmd_update[@]}" ) @@ -65,9 +68,6 @@ if [ -n "${appid}" ]; then currentopt+=( "${cmd_validate[@]}" ) fi -# Update LGSM -currentopt+=( "${cmd_update_linuxgsm[@]}" ) - #Backup currentopt+=( "${cmd_backup[@]}" ) From 4e2e9539129eed524c624be5e7cc710cf7de286a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 11 May 2017 23:06:56 +0100 Subject: [PATCH 0739/1895] corrected type if to dev/null errors the errors should not appear as it was breaking the if statement --- lgsm/functions/core_functions.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index c319cd55a..a417ca36c 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -9,7 +9,7 @@ core_dl.sh(){ functionfile="${FUNCNAME}" -if [ "$(type fn_fetch_core_dl)" ];then +if [ "$(type fn_fetch_core_dl 2>/dev/null)" ];then fn_fetch_core_dl "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" else fn_bootstrap_fetch_file_github "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" @@ -18,7 +18,7 @@ fi core_messages.sh(){ functionfile="${FUNCNAME}" -if [ "$(type fn_fetch_core_dl)" ];then +if [ "$(type fn_fetch_core_dl 2>/dev/null)" ];then fn_fetch_core_dl "lgsm/functions" "core_messages.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" else fn_bootstrap_fetch_file_github "lgsm/functions" "core_messages.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" @@ -27,7 +27,7 @@ fi core_legacy.sh(){ functionfile="${FUNCNAME}" -if [ "$(type fn_fetch_core_dl)" ];then +if [ "$(type fn_fetch_core_dl 2>/dev/null)" ];then fn_fetch_core_dl "lgsm/functions" "core_legacy.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" else fn_bootstrap_fetch_file_github "lgsm/functions" "core_legacy.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" From 40c36615cdb1b2c510aece11446fcabd27de7f12 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 11 May 2017 23:11:04 +0100 Subject: [PATCH 0740/1895] code tidy then --- lgsm/functions/check.sh | 2 +- lgsm/functions/check_system_dir.sh | 2 +- lgsm/functions/check_tmuxception.sh | 4 ++-- lgsm/functions/command_dev_detect_deps.sh | 2 +- lgsm/functions/command_dev_detect_glibc.sh | 2 +- lgsm/functions/command_start.sh | 2 +- lgsm/functions/core_functions.sh | 6 +++--- lgsm/functions/info_config.sh | 1 - lgsm/functions/install_gslt.sh | 4 ++-- lgsm/functions/mods_core.sh | 4 ++-- linuxgsm.sh | 12 ++++++------ 11 files changed, 20 insertions(+), 21 deletions(-) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index 58933851e..c8e17cb05 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -13,7 +13,7 @@ local commandname="CHECK" check_root.sh check_tmuxception.sh -if [ "${function_selfname}" != "command_monitor.sh" ];then +if [ "${function_selfname}" != "command_monitor.sh" ]; then check_permissions.sh fi diff --git a/lgsm/functions/check_system_dir.sh b/lgsm/functions/check_system_dir.sh index c08fb33a7..f10f09a9d 100644 --- a/lgsm/functions/check_system_dir.sh +++ b/lgsm/functions/check_system_dir.sh @@ -7,7 +7,7 @@ local commandname="CHECK" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -if [ "${function_selfname}" != "command_validate.sh" ];then +if [ "${function_selfname}" != "command_validate.sh" ]; then checkdir="${serverfiles}" else checkdir="${systemdir}" diff --git a/lgsm/functions/check_tmuxception.sh b/lgsm/functions/check_tmuxception.sh index 53f6febd5..528e85966 100644 --- a/lgsm/functions/check_tmuxception.sh +++ b/lgsm/functions/check_tmuxception.sh @@ -8,7 +8,7 @@ local commandname="check" fn_check_is_in_tmux(){ - if [ -n "${TMUX}" ];then + if [ -n "${TMUX}" ]; then fn_print_fail_nl "tmuxception error: Sorry Cobb you cannot start a tmux session inside of a tmux session." fn_script_log_fatal "Tmuxception error: Attempted to start a tmux session inside of a tmux session." fn_print_information_nl "LinuxGSM creates a tmux session when starting the server." @@ -18,7 +18,7 @@ fn_check_is_in_tmux(){ fi } fn_check_is_in_screen(){ - if [ -n "${STY}" ];then + if [ -n "${STY}" ]; then fn_print_fail_nl "tmuxception error: Sorry Cobb you cannot start a tmux session inside of a screen session." fn_script_log_fatal "Tmuxception error: Attempted to start a tmux session inside of a screen session." fn_print_information_nl "LinuxGSM creates a tmux session when starting the server." diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 8f7cde8bb..1ee46b238 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -23,7 +23,7 @@ fi files=$(find ${filesdir} | wc -l) find "${filesdir}" -type f -print0 | while IFS= read -r -d $'\0' line; do - if [ "${readelf}" == "eu-readelf" ];then + if [ "${readelf}" == "eu-readelf" ]; then ${readelf} -d "${line}" 2>/dev/null|grep NEEDED|awk '{ print $4 }'|sed 's/\[//g;s/\]//g' >> "${tmpdir}/.depdetect_readelf" else ${readelf} -d "${line}" 2>/dev/null|grep NEEDED|awk '{ print $5 }'|sed 's/\[//g;s/\]//g' >> "${tmpdir}/.depdetect_readelf" diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh index 6f085a590..bfb7a80cf 100644 --- a/lgsm/functions/command_dev_detect_glibc.sh +++ b/lgsm/functions/command_dev_detect_glibc.sh @@ -32,7 +32,7 @@ files=$(find ${serverfiles} | wc -l) find ${serverfiles} -type f -print0 | while IFS= read -r -d $'\0' line; do glibcversion=$(objdump -T "${line}" 2>/dev/null|grep -oP "GLIBC[^ ]+" |grep -v GLIBCXX|sort|uniq|sort -r --version-sort| head -n 1) - if [ "${glibcversion}" ];then + if [ "${glibcversion}" ]; then echo "${glibcversion}: ${line}" >>"${tmpdir}/detect_glibc_files.tmp" fi objdump -T "${line}" 2>/dev/null|grep -oP "GLIBC[^ ]+" >>"${tmpdir}/detect_glibc.tmp" diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index a912e77ed..e1db4ab5f 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -37,7 +37,7 @@ fn_start_teamspeak3(){ # Create lockfile date > "${rootdir}/${lockselfname}" cd "${executabledir}" - if [ "${ts3serverpass}" == "1" ];then + if [ "${ts3serverpass}" == "1" ]; then ./ts3server_startscript.sh start serveradmin_password="${newpassword}" inifile="${servercfgfullpath}" > /dev/null 2>&1 else ./ts3server_startscript.sh start inifile="${servercfgfullpath}" > /dev/null 2>&1 diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index a417ca36c..b95ef9e66 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -9,7 +9,7 @@ core_dl.sh(){ functionfile="${FUNCNAME}" -if [ "$(type fn_fetch_core_dl 2>/dev/null)" ];then +if [ "$(type fn_fetch_core_dl 2>/dev/null)" ]; then fn_fetch_core_dl "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" else fn_bootstrap_fetch_file_github "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" @@ -18,7 +18,7 @@ fi core_messages.sh(){ functionfile="${FUNCNAME}" -if [ "$(type fn_fetch_core_dl 2>/dev/null)" ];then +if [ "$(type fn_fetch_core_dl 2>/dev/null)" ]; then fn_fetch_core_dl "lgsm/functions" "core_messages.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" else fn_bootstrap_fetch_file_github "lgsm/functions" "core_messages.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" @@ -27,7 +27,7 @@ fi core_legacy.sh(){ functionfile="${FUNCNAME}" -if [ "$(type fn_fetch_core_dl 2>/dev/null)" ];then +if [ "$(type fn_fetch_core_dl 2>/dev/null)" ]; then fn_fetch_core_dl "lgsm/functions" "core_legacy.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" else fn_bootstrap_fetch_file_github "lgsm/functions" "core_legacy.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nomd5" diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index a179efbb4..80ec3ce68 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -21,7 +21,6 @@ fn_info_config_avalanche(){ maxplayers="${zero}" port="${zero}" else - servername=$(grep "Name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/Name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') serverpassword=$(grep "Password" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]') diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh index 5f62539d7..954a78af1 100644 --- a/lgsm/functions/install_gslt.sh +++ b/lgsm/functions/install_gslt.sh @@ -26,7 +26,7 @@ fn_script_log_info "Get more info and a token here:" fn_script_log_info "https://gameservermanagers.com/gslt" echo "" if [ -z "${autoinstall}" ]; then - if [ "${gamename}" != "Tower Unite" ];then + if [ "${gamename}" != "Tower Unite" ]; then echo "Enter token below (Can be blank)." echo -n "GSLT TOKEN: " read token @@ -34,7 +34,7 @@ if [ -z "${autoinstall}" ]; then fi fi sleep 1 -if [ "${gamename}" == "Tower Unite" ];then +if [ "${gamename}" == "Tower Unite" ]; then echo "The GSLT can be changed by editing ${servercfg}." fn_script_log_info "The GSLT can be changed by editing ${servercfg}." else diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index 7e9c1cdf9..b5bf221fc 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -230,7 +230,7 @@ fn_mods_installed_list(){ # Increment line check ((installedmodsline++)) done - if [ -n "${installedmodscount}" ] ;then + if [ -n "${installedmodscount}" ] ; then fn_script_log_info "${installedmodscount} addons/mods are currently installed" fi } @@ -345,7 +345,7 @@ fn_mod_compatible_test(){ # Create mods files and directories if it doesn't exist fn_create_mods_dir(){ # Create lgsm data modsdir - if [ ! -d "${modsdir}" ];then + if [ ! -d "${modsdir}" ]; then echo -en "creating LinuxGSM mods data directory ${modsdir}..." mkdir -p "${modsdir}" exitcode=$? diff --git a/linuxgsm.sh b/linuxgsm.sh index 0ca3f28e7..0f85c5070 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -281,7 +281,7 @@ if [ "${shortname}" == "core" ]; then fi fi - if [ ! -f "${serverlist}" ];then + if [ ! -f "${serverlist}" ]; then echo "[ FAIL ] serverlist.csv could not be loaded." exit 1 fi @@ -318,11 +318,11 @@ else # Load LinuxGSM configs # These are required to get all the default variables for the specific server. # Load the default config. If missing download it. If changed reload it. - if [ ! -f "${configdirdefault}/config-lgsm/${servername}/_default.cfg" ];then + if [ ! -f "${configdirdefault}/config-lgsm/${servername}/_default.cfg" ]; then mkdir -p "${configdirdefault}/config-lgsm/${servername}" fn_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "nochmodx" "norun" "noforcedl" "nomd5" fi - if [ ! -f "${configdirserver}/_default.cfg" ];then + if [ ! -f "${configdirserver}/_default.cfg" ]; then mkdir -p "${configdirserver}" echo -ne " copying _default.cfg...\c" cp -R "${configdirdefault}/config-lgsm/${servername}/_default.cfg" "${configdirserver}/_default.cfg" @@ -350,21 +350,21 @@ else fi source "${configdirserver}/_default.cfg" # Load the common.cfg config. If missing download it - if [ ! -f "${configdirserver}/common.cfg" ];then + if [ ! -f "${configdirserver}/common.cfg" ]; then fn_fetch_config "lgsm/config-default/config-lgsm" "common-template.cfg" "${configdirserver}" "common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nomd5" source "${configdirserver}/common.cfg" else source "${configdirserver}/common.cfg" fi # Load the instance.cfg config. If missing download it - if [ ! -f "${configdirserver}/${servicename}.cfg" ];then + if [ ! -f "${configdirserver}/${servicename}.cfg" ]; then fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${servicename}.cfg" "nochmodx" "norun" "noforcedl" "nomd5" source "${configdirserver}/${servicename}.cfg" else source "${configdirserver}/${servicename}.cfg" fi # Load the linuxgsm.sh in to tmpdir. If missing download it - if [ ! -f "${tmpdir}/linuxgsm.sh" ];then + if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nomd5" fi getopt=$1 From e82deb4a918ff153367986834d7d28feeec76c42 Mon Sep 17 00:00:00 2001 From: Marvin Lehmann Date: Fri, 12 May 2017 00:34:10 +0200 Subject: [PATCH 0741/1895] Compare gamename instead of engine for MC and MTA - removed unneeded checks - corrected comments --- lgsm/functions/command_stop.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index a66886a93..30f391b8a 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -172,7 +172,7 @@ fn_stop_graceful_sdtd(){ fn_stop_tmux } -# Attempts graceful of source using rcon 'stop' command. +# Attempts graceful of Minecraft using rcon 'stop' command. fn_stop_graceful_minecraft(){ fn_print_dots "Graceful: sending \"stop\"" fn_script_log_info "Graceful: sending \"stop\"" @@ -228,7 +228,7 @@ fn_stop_graceful_mta(){ fn_stop_tmux } -# Attempts graceful of source using rcon 'exit' command. +# Attempts graceful of Terraria using 'exit' console command. fn_stop_graceful_terraria(){ fn_print_dots "Graceful: sending \"exit\"" fn_script_log_info "Graceful: sending \"exit\"" @@ -261,13 +261,13 @@ fn_stop_graceful_select(){ fn_stop_graceful_sdtd elif [ "${gamename}" == "Terraria" ]; then fn_stop_graceful_terraria - elif [ "${engine}" == "lwjgl2" ]; then + elif [ "${gamename}" == "Minecraft" ]; then fn_stop_graceful_minecraft - elif [ "${engine}" == "renderware" ]; then + elif [ "${gamename}" == "Multi Theft Auto" ]; then fn_stop_graceful_mta elif [ "${engine}" == "goldsource" ]; then fn_stop_graceful_goldsource - elif [ "${gamename}" == "Factorio" ]||[ "${gamename}" == "Minecraft" ]||[ "${gamename}" == "Multi Theft Auto" ]||[ "${engine}" == "unity3d" ]||[ "${engine}" == "unreal4" ]||[ "${engine}" == "unreal3" ]||[ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ]||[ "${gamename}" == "Mumble" ]; then + elif [ "${gamename}" == "Factorio" ]||[ "${engine}" == "unity3d" ]||[ "${engine}" == "unreal4" ]||[ "${engine}" == "unreal3" ]||[ "${engine}" == "unreal2" ]||[ "${engine}" == "unreal" ]||[ "${gamename}" == "Mumble" ]; then fn_stop_graceful_ctrlc elif [ "${engine}" == "source" ]||[ "${engine}" == "quake" ]||[ "${engine}" == "idtech2" ]||[ "${engine}" == "idtech3" ]||[ "${engine}" == "idtech3_ql" ]||[ "${engine}" == "Just Cause 2" ]; then fn_stop_graceful_quit From 905e854227fed5a13130004fa2df93cfedaff3ae Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 12 May 2017 16:31:56 +0100 Subject: [PATCH 0742/1895] space --- MultiTheftAuto/mtaserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MultiTheftAuto/mtaserver b/MultiTheftAuto/mtaserver index f252e247a..c627879e4 100644 --- a/MultiTheftAuto/mtaserver +++ b/MultiTheftAuto/mtaserver @@ -26,7 +26,7 @@ version="170501" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters # Edit with care fn_parms(){ -parms=" " +parms="" } #### LinuxGSM Settings #### From 3ee3fcb484920a8a169f3950345dba79ad32c1b3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 12 May 2017 17:02:47 +0100 Subject: [PATCH 0743/1895] removec rconpassword --- lgsm/functions/info_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 80ec3ce68..79c80919f 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -210,8 +210,8 @@ fn_info_config_factorio(){ # Not Set servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers=:-"0"} - rconpassword=${rconpassword=:-"NOT SET"} fi } From b72381c16820455f24a9ced7973a79675a0a4d9e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 12 May 2017 17:04:05 +0100 Subject: [PATCH 0744/1895] added /save-${servicename}.zip to identify the save --- Factorio/fctrserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Factorio/fctrserver b/Factorio/fctrserver index a149b4684..12423a73d 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -30,7 +30,7 @@ ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="--start-server ${filesdir}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" +parms="--start-server ${filesdir}/save-${servicename}.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" } #### LinuxGSM Settings #### From bbbcb94dfdcd9c858bfd54bc7b49cb06785a57e0 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 12 May 2017 17:09:12 +0100 Subject: [PATCH 0745/1895] Added more DST details --- lgsm/functions/command_details.sh | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 843b09eaf..b3250325e 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -153,9 +153,14 @@ fn_details_gameserver(){ echo -e "${blue}Tick rate:\t${default}${tickrate}" fi - # Cluster (Don't Starve Together) - if [ -n "${cluster}" ]; then - echo -e "${blue}Cluster:\t${default}${cluster}" + # Sharding (Don't Starve Together) + if [ -n "${sharding}" ]; then + echo -e "${blue}Sharding:\t${default}${sharding}" + fi + + # Master (Don't Starve Together) + if [ -n "${master}" ]; then + echo -e "${blue}Master:\t${default}${master}" fi # Shard (Don't Starve Together) @@ -163,6 +168,16 @@ fn_details_gameserver(){ echo -e "${blue}Shard:\t${default}${shard}" fi + # Cluster (Don't Starve Together) + if [ -n "${cluster}" ]; then + echo -e "${blue}Cluster:\t${default}${cluster}" + fi + + # Cave (Don't Starve Together) + if [ -n "${cave}" ]; then + echo -e "${blue}Cave:\t${default}${cave}" + fi + # TeamSpeak dbplugin if [ -n "${dbplugin}" ]; then echo -e "${blue}dbplugin:\t${default}${dbplugin}" From 2717fedd2d3e671ef53991f9a01009b12a06ad58 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 12 May 2017 17:35:58 +0100 Subject: [PATCH 0746/1895] Working on info_parms --- lgsm/functions/info_parms.sh | 176 +++++++++++++---------------------- 1 file changed, 66 insertions(+), 110 deletions(-) diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 17be983fd..c20fe39f0 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -2,7 +2,7 @@ # LinuxGSM info_parms.sh function # Author: Daniel Gibbs # Website: https://gameservermanagers.com -# Description: Gets specific details from server parameters. +# Description: If specific parms are not set then this will be displayed in details. local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" @@ -15,139 +15,95 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" unavailable="${red}UNAVAILABLE${default}" zero="${red}0${default}" -fn_info_config_quakelive(){ - # Not Set - port=${port:-"NOT SET"} +fn_info_parms_ark(){ + port=${port:-"0"} + queryport=${queryport:-"0"} rconport=${rconport:-"0"} - rconpassword=${rconpassword:-"NOT SET"} - statsport=${statsport:-"0"} - statspassword=${statspassword:-"NOT SET"} - mappool=${mappool:-"NOT SET"} - rconpassword=${rconpassword:-"NOT SET"} + maxplayers=${maxplayers:-"0"} } -fn_info_config_source(){ +fn_info_parms_realvirtuality(){ + port=${port:-"0"} +} + +fn_info_parms_cod(){ defaultmap=${defaultmap:-"NOT SET"} maxplayers=${maxplayers:-"0"} port=${port:-"0"} - clientport=${clientport:-"0"} } -fn_info_config_spark(){ - # Not Set +fn_info_parms_dst(){ + sharding=${sharding:-"NOT SET"} + master=${master:-"NOT SET"} + shard=${shard:-"NOT SET"} + cluster=${cluster:-"NOT SET"} + cave=${cave:-"NOT SET"} + +fn_info_parms_factorio(){ port=${port:-"0"} - queryport=$((port + 1)) - maxplayers=${maxplayers:-"0"} - webadminuser=${webadminuser:-"NOT SET"} - webadminpass=${webadminpass:-"NOT SET"} - webadminport=${webadminport:-"0"} + rconport=${rconport:-"0"} + rconpassword=${rconpassword:-"NOT SET"} } -fn_info_config_teeworlds(){ - if [ ! -f "${servercfgfullpath}" ]; then - servername="unnamed server" - serverpassword="${unavailable}" - rconpassword="${unavailable}" - port="8303" - maxplayers="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:]') - maxplayers=$(grep "sv_max_clients" "${servercfgfullpath}" | tr -cd '[:digit:]') +fn_info_parms_hurtworld(){ + servername=${defaultmap:-"NOT SET"} + port=${port:-"0"} + queryport=${queryport:-"0"} + maxplayers=${maxplayers:-"0"} + defaultmap=${defaultmap:-"NOT SET"} + creativemode=${creativemode:-"NOT SET"} + x64mode=${creativemode:-"NOT SET"} + admins="" - # Not Set - servername=${servername:-"NOT SET"} - serverpassword=${serverpassword:-"NOT SET"} - rconpassword=${rconpassword:-"NOT SET"} - port=${port:-"8303"} - maxplayers=${maxplayers:-"12"} - fi + ## Advanced Server Start Settings + # Rollback server state (remove after start command) + loadsave="" + # Use unstable 64 bit server executable (O/1) + x64mode="0" } -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_parms_source(){ + defaultmap=${defaultmap:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + clientport=${clientport:-"0"} } -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 +fn_info_parms_spark(){ + defaultmap=${defaultmap:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + queryport=$((port + 1)) + servername=${servername:-"NOT SET"} + webadminuser=${webadminuser:-"NOT SET"} + webadminpass=${webadminpass:-"NOT SET"} + webadminport=${webadminport:-"0"} + mods=${mods:-"NOT SET"} + password=${password:-"NOT SET"} +} - # 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 +fn_info_parms_unreal(){ +: } -## 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 Live -elif [ "${gamename}" == "Quake Live" ]; then - fn_info_config_quakelive +# ARK: Survival Evolved +if [ "${gamename}" == "ARK: Survival Evolved" ]; then +fn_info_parms_ark # ARMA 3 elif [ "${engine}" == "realvirtuality" ]; then - fn_info_config_realvirtuality -# Serious Sam -elif [ "${engine}" == "seriousengine35" ]; then - fn_info_config_seriousengine35 -# Source Engine Games +fn_info_parms_realvirtuality +# Call of Duty +elif [ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${engine}" == "iw2.0" ]||[ "${engine}" == "iw3.0" ]; then + fn_info_parms_cod +# Factorio +elif [ "${gamename}" == "Factorio" ]; then + fn_info_parms_factorio elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then - fn_info_config_source + fn_info_parms_source # Spark elif [ "${engine}" == "spark" ]; then - fn_info_config_spark -# Teeworlds -elif [ "${engine}" == "teeworlds" ]; then - fn_info_config_teeworlds -# Terraria -elif [ "${engine}" == "terraria" ]; then - fn_info_config_terraria + fn_info_parms_spark # Unreal/Unreal 2 engine elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then - fn_info_config_unreal + fn_info_parms_unreal fi From a7e25ac613aa3512790ec719386d5fadba400ca1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 12 May 2017 17:37:43 +0100 Subject: [PATCH 0747/1895] changed map to defaultmap --- Hurtworld/hwserver | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Hurtworld/hwserver b/Hurtworld/hwserver index fb118edf3..1db590f8f 100644 --- a/Hurtworld/hwserver +++ b/Hurtworld/hwserver @@ -28,7 +28,7 @@ ip="0.0.0.0" port="12871" queryport="12881" maxplayers="20" -map="" #Optional +defaultmap="" #Optional creativemode="0" #Free Build: creativemode="1" logfile="gamelog.txt" @@ -45,7 +45,7 @@ x64mode="0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters # Edit with care | 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}\" " +parms="-batchmode -nographics -exec \"host ${port} ${defaultmap} ${loadsave};queryport ${queryport};maxplayers ${maxplayers};servername ${servername};creativemode ${creativemode};${admins}\" -logfile \"${logfile}\" " } #### LinuxGSM Settings #### From b15fb7b4640b16932c95962b6a7958cc324d76c5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 12 May 2017 17:40:57 +0100 Subject: [PATCH 0748/1895] Creative mode for hurtworld --- lgsm/functions/command_details.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index b3250325e..55df65e9d 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -178,6 +178,11 @@ fn_details_gameserver(){ echo -e "${blue}Cave:\t${default}${cave}" fi + # Creativemode (Hurtworld) + if [ -n "${creativemode}" ]; then + echo -e "${blue}Creativemode:\t${default}${creativemode}" + fi + # TeamSpeak dbplugin if [ -n "${dbplugin}" ]; then echo -e "${blue}dbplugin:\t${default}${dbplugin}" From 51d9a7623b04f433c145168ebede0f4b4a48bae4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 12 May 2017 22:33:31 +0100 Subject: [PATCH 0749/1895] added unreal --- lgsm/functions/info_parms.sh | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index c20fe39f0..166dbcd3b 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -52,14 +52,6 @@ fn_info_parms_hurtworld(){ maxplayers=${maxplayers:-"0"} defaultmap=${defaultmap:-"NOT SET"} creativemode=${creativemode:-"NOT SET"} - x64mode=${creativemode:-"NOT SET"} - admins="" - - ## Advanced Server Start Settings - # Rollback server state (remove after start command) - loadsave="" - # Use unstable 64 bit server executable (O/1) - x64mode="0" } fn_info_parms_source(){ @@ -83,15 +75,15 @@ fn_info_parms_spark(){ } fn_info_parms_unreal(){ -: + defaultmap=${defaultmap:-"NOT SET"} } # ARK: Survival Evolved if [ "${gamename}" == "ARK: Survival Evolved" ]; then -fn_info_parms_ark + fn_info_parms_ark # ARMA 3 elif [ "${engine}" == "realvirtuality" ]; then -fn_info_parms_realvirtuality + fn_info_parms_realvirtuality # Call of Duty elif [ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${engine}" == "iw2.0" ]||[ "${engine}" == "iw3.0" ]; then fn_info_parms_cod From 3b4659262a62b86aaa20f4dee9a0ded91c6bf459 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 12 May 2017 22:47:04 +0100 Subject: [PATCH 0750/1895] Changed to serverpassword show it will now show in details --- NS2Combat/ns2cserver | 4 ++-- NaturalSelection2/ns2server | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NS2Combat/ns2cserver b/NS2Combat/ns2cserver index f5357d570..99dfc1c00 100644 --- a/NS2Combat/ns2cserver +++ b/NS2Combat/ns2cserver @@ -36,10 +36,10 @@ webadminuser="admin" webadminpass="admin" webadminport="8080" mods="" -password="" +serverpassword="" # Add the following line to the parms if you want a private server. Ensuring # that the password variable above is not left empty. -# -password \"${password}\" +# -password \"${serverpassword}\" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ diff --git a/NaturalSelection2/ns2server b/NaturalSelection2/ns2server index 514f6aaae..91f0e9ea4 100644 --- a/NaturalSelection2/ns2server +++ b/NaturalSelection2/ns2server @@ -36,10 +36,10 @@ webadminuser="admin" webadminpass="admin" webadminport="8080" mods="" -password="" +serverpassword="" # Add the following line to the parms if you want a private server. Ensuring # that the password variable above is not left empty. -# -password \"${password}\" +# -password \"${serverpassword}\" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ From fffde74161a9a9f54f4c1b325f2a6d4d9a42919e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 13 May 2017 01:00:12 +0100 Subject: [PATCH 0751/1895] Added Quake World --- lgsm/functions/info_config.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 79c80919f..cf4a2546c 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -301,6 +301,24 @@ fn_info_config_projectzomboid(){ fi } +fn_info_config_quakeworld(){ + if [ ! -f "${servercfgfullpath}" ]; then + rconpassword="${unavailable}" + servername="${unavailable}" + serverpassword="${unavailable}" + maxplayers="${zero}" + else + rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + maxplayers=$(grep "maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + + # Not Set + rconpassword=${rconpassword:-"NOT SET"} + servername=${servername:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + fi +} + fn_info_config_quake2(){ if [ ! -f "${servercfgfullpath}" ]; then rconpassword="${unavailable}" @@ -732,6 +750,9 @@ elif [ "${engine}" == "dontstarve" ]; then # Factorio elif [ "${gamename}" == "Factorio" ]; then fn_info_config_factorio +# QuakeWorld +elif [ "${gamename}" == "QuakeWorld" ]; then + fn_info_config_quakeworld # Quake 2 elif [ "${gamename}" == "Quake 2" ]; then fn_info_config_quake2 From c5d9b0c8d108d6a1f50a8972a6c1e508feb28728 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 13 May 2017 01:00:24 +0100 Subject: [PATCH 0752/1895] Added more games --- lgsm/functions/info_parms.sh | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 166dbcd3b..4839cfa66 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -46,7 +46,7 @@ fn_info_parms_factorio(){ } fn_info_parms_hurtworld(){ - servername=${defaultmap:-"NOT SET"} + servername=${servername:-"NOT SET"} port=${port:-"0"} queryport=${queryport:-"0"} maxplayers=${maxplayers:-"0"} @@ -54,6 +54,19 @@ fn_info_parms_hurtworld(){ creativemode=${creativemode:-"NOT SET"} } +fn_info_parms_projectzomboid(){ + adminpassword=${adminpassword:-"NOT SET"} +} + +fn_info_parms_quakeworld(){ + port=${port:-"0"} +} + +fn_info_parms_quake2(){ + port=${port:-"0"} + defaultmap=${defaultmap:-"NOT SET"} +} + fn_info_parms_source(){ defaultmap=${defaultmap:-"NOT SET"} maxplayers=${maxplayers:-"0"} @@ -67,11 +80,11 @@ fn_info_parms_spark(){ port=${port:-"0"} queryport=$((port + 1)) servername=${servername:-"NOT SET"} + serverpassword=${serverpassword:-"NOT SET"} webadminuser=${webadminuser:-"NOT SET"} webadminpass=${webadminpass:-"NOT SET"} webadminport=${webadminport:-"0"} mods=${mods:-"NOT SET"} - password=${password:-"NOT SET"} } fn_info_parms_unreal(){ @@ -90,6 +103,13 @@ elif [ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: Unit # Factorio elif [ "${gamename}" == "Factorio" ]; then fn_info_parms_factorio +# Project Zomboid +elif [ "${engine}" == "projectzomboid" ]; then + fn_info_parms_projectzomboid +elif [ "${gamename}" == "QuakeWorld" ]; then + fn_info_parms_quakeworld +elif [ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]; then + fn_info_parms_quake2 elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then fn_info_parms_source # Spark From fc84e30d95a768ad5b8ae16855710c24c958adfa Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 14 May 2017 19:42:14 +0100 Subject: [PATCH 0753/1895] Added more servers --- lgsm/functions/info_parms.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 4839cfa66..2101dc706 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -67,6 +67,17 @@ fn_info_parms_quake2(){ defaultmap=${defaultmap:-"NOT SET"} } +fn_info_parms_rust(){ + servername=${servername:-"NOT SET"} + port=${port:-"0"} + rconport=${rconport:-"0"} + rconpassword=${rconpassword:-"NOT SET"} + rconweb=${rconweb:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + saveinterval=${saveinterval:-"0"} + tickrate=${tickrate:-"0"} +} + fn_info_parms_source(){ defaultmap=${defaultmap:-"NOT SET"} maxplayers=${maxplayers:-"0"} @@ -87,6 +98,11 @@ fn_info_parms_spark(){ mods=${mods:-"NOT SET"} } +fn_info_config_towerunite(){ + port=${port:-"0"} + queryport=${queryport:-"0"} +} + fn_info_parms_unreal(){ defaultmap=${defaultmap:-"NOT SET"} } @@ -110,11 +126,19 @@ elif [ "${gamename}" == "QuakeWorld" ]; then fn_info_parms_quakeworld elif [ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]; then fn_info_parms_quake2 +# Rust +elif [ "${gamename}" == "Rust" ]; then + fn_info_parms_rust +# Serious Sam +elif [ "${engine}" == "seriousengine35" ]; then + fn_info_config_seriousengine35 elif [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then fn_info_parms_source # Spark elif [ "${engine}" == "spark" ]; then fn_info_parms_spark +elif [ "${gamename}" == "Tower Unite" ]; then + fn_info_config_towerunite # Unreal/Unreal 2 engine elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then fn_info_parms_unreal From 016f321125c508f6abd139205df4cb7e4c857bd5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 14 May 2017 19:42:29 +0100 Subject: [PATCH 0754/1895] Added extra rust details --- lgsm/functions/command_details.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 55df65e9d..4ac96281f 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -123,6 +123,11 @@ fn_details_gameserver(){ echo -e "${blue}RCON password:\t${default}${rconpassword}" fi + # RCON web (Rust) + if [ -n "${rconweb}" ]; then + echo -e "${blue}RCON web:\t${default}${rconweb}" + fi + # Admin password if [ -n "${adminpassword}" ]; then echo -e "${blue}Admin password:\t${default}${adminpassword}" @@ -193,6 +198,11 @@ fn_details_gameserver(){ echo -e "${blue}ASE:\t${default}${ase}" fi + # Save interval (Rust) + if [ -n "${saveinterval}" ]; then + echo -e "${blue}ASE:\t${default}${saveinterval} s" + fi + # Online status if [ "${status}" == "0" ]; then echo -e "${blue}Status:\t${red}OFFLINE${default}" From 9798fa6f5ccbb19f20f2204cdf4bb8756b2462c3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 14 May 2017 20:08:56 +0100 Subject: [PATCH 0755/1895] Added unreal3 details --- lgsm/functions/info_config.sh | 7 +++++++ lgsm/functions/info_parms.sh | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index cf4a2546c..18f772050 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -607,6 +607,10 @@ fn_info_config_unreal(){ fi } +fn_info_config_unreal3(){ + servername=$(grep "ServerName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') +} + fn_info_config_sdtd(){ if [ ! -f "${servercfgfullpath}" ]; then servername="${unavailable}" @@ -800,6 +804,9 @@ elif [ "${gamename}" == "Tower Unite" ]; then # Unreal/Unreal 2 engine elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then fn_info_config_unreal +# Unreal 3 engine +elif [ "${engine}" == "unreal3" ]; then + fn_info_config_unreal3 # 7 Day To Die (unity3d) elif [ "${gamename}" == "7 Days To Die" ]; then fn_info_config_sdtd diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index 2101dc706..d1bdd5b41 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -107,6 +107,15 @@ fn_info_parms_unreal(){ defaultmap=${defaultmap:-"NOT SET"} } +fn_info_parms_unreal3(){ + port=${port:-"0"} + queryport=${queryport:-"0"} + defaultmap=${defaultmap:-"NOT SET"} + maxplayers=${maxplayers:-"0"} + serverpassword=${serverpassword:-"NOT SET"} + adminpassword=${adminpassword:-"NOT SET"} +} + # ARK: Survival Evolved if [ "${gamename}" == "ARK: Survival Evolved" ]; then fn_info_parms_ark @@ -142,4 +151,7 @@ elif [ "${gamename}" == "Tower Unite" ]; then # Unreal/Unreal 2 engine elif [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then fn_info_parms_unreal +# Unreal/Unreal 2 engine +elif [ "${engine}" == "unreal3" ]; then + fn_info_parms_unreal3 fi From 4d3d20c61b09a3a1c8c898c3bfc086a950b2db68 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 14 May 2017 22:58:46 +0100 Subject: [PATCH 0756/1895] Added -ini= as was not applying the config --- UnrealTournament3/ut3server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnrealTournament3/ut3server b/UnrealTournament3/ut3server index bffcbb5d9..d5476d837 100644 --- a/UnrealTournament3/ut3server +++ b/UnrealTournament3/ut3server @@ -40,7 +40,7 @@ maxplayers="32" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters # Edit with care | List of game types and mutators : http://wiki.unrealadmin.org/FAQ:UT3 fn_parms(){ -parms="server ${defaultmap}?Game=${game}?bIsDedicated=${isdedicated}?bIsLanMatch=${islanmatch}?bUsesStats=${usesstats}?bShouldAdvertise=${shouldadvertise}?PureServer=${pureserver}?bAllowJoinInProgress=${allowjoininprogress}?MaxPlayers=${maxplayers}?Mutator=${mutators} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}" +parms="server ${defaultmap}?Game=${game}?bIsDedicated=${isdedicated}?bIsLanMatch=${islanmatch}?bUsesStats=${usesstats}?bShouldAdvertise=${shouldadvertise}?PureServer=${pureserver}?bAllowJoinInProgress=${allowjoininprogress}?MaxPlayers=${maxplayers}?Mutator=${mutators} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog} -ini=${servercfgfullpath}"" } #### LinuxGSM Settings #### From 93f31b254686e4cd6d1f1c699223a31de8d693c8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 14 May 2017 23:04:30 +0100 Subject: [PATCH 0757/1895] Added details for ut3 --- lgsm/functions/info_config.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 18f772050..22b7520af 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -608,7 +608,17 @@ fn_info_config_unreal(){ } fn_info_config_unreal3(){ - servername=$(grep "ServerName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + webadminpass="${unavailable}" + else + servername=$(grep "ServerName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + webadminpass=$(grep grep "AdminPassword" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') + + # Not Set + servername=${servername:-"NOT SET"} + webadminpass=${webadminpass:-"NOT SET"} + fi } fn_info_config_sdtd(){ From b9d40f7e64a4a4f193f7db15908b5bc97f3b6695 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 14 May 2017 23:13:44 +0100 Subject: [PATCH 0758/1895] added legacymode flag --- lgsm/functions/core_legacy.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index de9d6408a..e61a74817 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -5,6 +5,7 @@ # Description: Code for backwards compatability with older versions of LinuxGSM. if [ -z "${serverfiles}" ]; then + legacymode=1 serverfiles="${filesdir}" fi From 68e4f8ef9d24db8d6e6d8dba70d1115f0b03223d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 14 May 2017 23:15:52 +0100 Subject: [PATCH 0759/1895] If legacymode is on then bypass certain updates --- lgsm/functions/command_update_linuxgsm.sh | 92 ++++++++++++----------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 5fbe32e6b..a91781c1b 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -14,58 +14,60 @@ check.sh fn_script_log_info "Updating LinuxGSM" echo -ne "\n" -# Check and update _default.cfg -echo -ne " checking config _default.cfg...\c" -config_file_diff=$(diff "${configdirdefault}/config-lgsm/${servername}/_default.cfg" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${servername}/_default.cfg")) -if [ "${config_file_diff}" != "" ]; then - fn_print_update_eol_nl - fn_script_log_info "checking config _default.cfg: UPDATE" - rm -f "${configdirdefault}/config-lgsm/${servername}/_default.cfg" - fn_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "nochmodx" "norun" "noforce" "nomd5" -else - fn_print_ok_eol_nl - fn_script_log_info "checking config _default.cfg: OK" -fi +if [ -z "${legacymode}" ];then + # Check and update _default.cfg + echo -ne " checking config _default.cfg...\c" + config_file_diff=$(diff "${configdirdefault}/config-lgsm/${servername}/_default.cfg" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${servername}/_default.cfg")) + if [ "${config_file_diff}" != "" ]; then + fn_print_update_eol_nl + fn_script_log_info "checking config _default.cfg: UPDATE" + rm -f "${configdirdefault}/config-lgsm/${servername}/_default.cfg" + fn_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "nochmodx" "norun" "noforce" "nomd5" + else + fn_print_ok_eol_nl + fn_script_log_info "checking config _default.cfg: OK" + fi -echo -ne " checking linuxgsm.sh...\c" -tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) -if [ "${tmp_script_diff}" != "" ]; then - fn_print_update_eol_nl - fn_script_log_info "checking linuxgsm.sh: UPDATE" - rm -f "${tmpdir}/linuxgsm.sh" - fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nomd5" - # Compare selfname against linuxgsm.sh in the tmp dir. Ignoring server specific vars. -else - fn_script_log_info "checking linuxgsm.sh: OK" - fn_print_ok_eol_nl -fi -echo -ne " checking ${selfname}...\c" -script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${tmpdir}/linuxgsm.sh") <(sed '/shortname/d;/servername/d;/gamename/d' "${rootdir}/${selfname}")) -if [ "${script_diff}" != "" ]; then - fn_print_update_eol_nl - echo -ne " backup ${selfname}...\c" - mkdir -p "${backupdir}/script/" - cp "${rootdir}/${selfname}" "${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" - if [ $? -ne 0 ]; then - fn_print_fail_eol_nl - core_exit.sh + echo -ne " checking linuxgsm.sh...\c" + tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh")) + if [ "${tmp_script_diff}" != "" ]; then + fn_print_update_eol_nl + fn_script_log_info "checking linuxgsm.sh: UPDATE" + rm -f "${tmpdir}/linuxgsm.sh" + fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nomd5" + # Compare selfname against linuxgsm.sh in the tmp dir. Ignoring server specific vars. else + fn_script_log_info "checking linuxgsm.sh: OK" fn_print_ok_eol_nl - echo -e " Backup: ${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" fi - echo -ne " fetching ${selfname}...\c" - cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" - sed -i "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${rootdir}/${selfname}" - sed -i "s/servername=\"core\"/servername=\"${servername}\"/g" "${rootdir}/${selfname}" - sed -i "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${rootdir}/${selfname}" - if [ $? -ne 0 ]; then - fn_print_fail_eol_nl - core_exit.sh + echo -ne " checking ${selfname}...\c" + script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${tmpdir}/linuxgsm.sh") <(sed '/shortname/d;/servername/d;/gamename/d' "${rootdir}/${selfname}")) + if [ "${script_diff}" != "" ]; then + fn_print_update_eol_nl + echo -ne " backup ${selfname}...\c" + mkdir -p "${backupdir}/script/" + cp "${rootdir}/${selfname}" "${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" + if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + echo -e " Backup: ${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" + fi + echo -ne " fetching ${selfname}...\c" + cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" + sed -i "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${rootdir}/${selfname}" + sed -i "s/servername=\"core\"/servername=\"${servername}\"/g" "${rootdir}/${selfname}" + sed -i "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${rootdir}/${selfname}" + if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi else fn_print_ok_eol_nl fi -else - fn_print_ok_eol_nl fi # Check and update functions From bb1c120208262157a09b0ea8c8accc7b81466000 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 14 May 2017 23:24:34 +0100 Subject: [PATCH 0760/1895] corrected bug --- lgsm/functions/install_server_files.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index c839027d6..34814f3c6 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -34,7 +34,7 @@ fn_install_server_files(){ elif [ "${gamename}" == "Unreal Tournament 99" ]; then remote_fileurl="http://files.gameservermanagers.com/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="ut99-server-451-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" elif [ "${gamename}" == "Unreal Tournament" ]; then - fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Server-XAN-3395761-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3395761-Linux.zip"; executecmd="noexecute" run="norun"; force="noforce"; md5="f04ad5b96865b19613303331ff4075eb" + fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Client-XAN-3395761-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3395761-Linux.zip"; chmodx="noexecute" run="norun"; force="noforce"; md5="f04ad5b96865b19613303331ff4075eb" elif [ "${gamename}" == "Unreal Tournament 3" ]; then remote_fileurl="http://files.gameservermanagers.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="UT3-linux-server-2.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then From d95edc3f7d39eb4084984eafa452426e640bb3ff Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 14 May 2017 23:41:13 +0100 Subject: [PATCH 0761/1895] corrected ut files bug --- lgsm/functions/install_server_files.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 34814f3c6..592ab2810 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -34,7 +34,7 @@ fn_install_server_files(){ elif [ "${gamename}" == "Unreal Tournament 99" ]; then remote_fileurl="http://files.gameservermanagers.com/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="ut99-server-451-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" elif [ "${gamename}" == "Unreal Tournament" ]; then - fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Client-XAN-3395761-Linux.zip"; filedir="${tmpdir}"; filename="UnrealTournament-Server-XAN-3395761-Linux.zip"; chmodx="noexecute" run="norun"; force="noforce"; md5="f04ad5b96865b19613303331ff4075eb" + remote_fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Client-XAN-3395761-Linux.zip"; local_filedir="${tmpdir}"; local_filedir="UnrealTournament-Server-XAN-3395761-Linux.zip"; chmodx="noexecute" run="norun"; force="noforce"; md5="f04ad5b96865b19613303331ff4075eb" elif [ "${gamename}" == "Unreal Tournament 3" ]; then remote_fileurl="http://files.gameservermanagers.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="UT3-linux-server-2.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then From 85290d6b72c90051599ff8674e5ac7eddeae6bbe Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 14 May 2017 23:46:59 +0100 Subject: [PATCH 0762/1895] corrected download settings --- lgsm/functions/install_server_files.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 592ab2810..f68a7db2f 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -40,7 +40,7 @@ fn_install_server_files(){ elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then remote_fileurl="http://files.gameservermanagers.com/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="enemy-territory.260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" fi - fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" fn_dl_extract "${filedir}" "${filename}" "${serverfiles}" } From 4f8eb26f0099cd5f75c3e43aa26ebbaf90954e24 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 14 May 2017 23:54:52 +0100 Subject: [PATCH 0763/1895] corrected local_filename --- lgsm/functions/install_server_files.sh | 30 +++++++++++++------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index f68a7db2f..6cdcd6dc9 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -10,35 +10,35 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" fn_install_server_files(){ if [ "${gamename}" == "Battlefield: 1942" ]; then - remote_fileurl="http://files.gameservermanagers.com/BattleField1942/bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="a86a5d3cd64ca59abcc9bb9f777c2e5d" + remote_fileurl="http://files.gameservermanagers.com/BattleField1942/bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="bf1942_lnxded-1.61-hacked-to-1.612.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="a86a5d3cd64ca59abcc9bb9f777c2e5d" elif [ "${gamename}" == "Call of Duty" ]; then - remote_fileurl="http://files.gameservermanagers.com/CallOfDuty/cod-lnxded-1.5b-full.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="cod-lnxded-1.5-large.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="19629895a4cf6fd8f6d1ee198b5304cd" + remote_fileurl="http://files.gameservermanagers.com/CallOfDuty/cod-lnxded-1.5b-full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod-lnxded-1.5-large.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="19629895a4cf6fd8f6d1ee198b5304cd" elif [ "${gamename}" == "Call of Duty: United Offensive" ]; then - remote_fileurl="http://files.gameservermanagers.com/CallOfDutyUnitedOffensive/coduo-lnxded-1.51b-full.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="coduo-lnxded-1.51b-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f1804ef13036e2b4ab535db000b19e97" + remote_fileurl="http://files.gameservermanagers.com/CallOfDutyUnitedOffensive/coduo-lnxded-1.51b-full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="coduo-lnxded-1.51b-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f1804ef13036e2b4ab535db000b19e97" elif [ "${gamename}" == "Call of Duty 2" ]; then - remote_fileurl="http://files.gameservermanagers.com/CallOfDuty2/cod2-lnxded-1.3-full.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="cod2-lnxded-1.3-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="078128f83d06dc3d7699428dc2870214" + remote_fileurl="http://files.gameservermanagers.com/CallOfDuty2/cod2-lnxded-1.3-full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod2-lnxded-1.3-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="078128f83d06dc3d7699428dc2870214" elif [ "${gamename}" == "Call of Duty 4" ]; then - remote_fileurl="http://files.gameservermanagers.com/CallOfDuty4/cod4x18_dedrun.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="cod4x18_dedrun.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="bebdfc1755626462bdaad49f6f926c08" + remote_fileurl="http://files.gameservermanagers.com/CallOfDuty4/cod4x18_dedrun.tar.bz2"; local_filedir="${tmpdir}"; local_filename="cod4x18_dedrun.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="bebdfc1755626462bdaad49f6f926c08" elif [ "${gamename}" == "Call of Duty: World at War" ]; then - remote_fileurl="http://files.gameservermanagers.com/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="codwaw-lnxded-1.7-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="0489697ff3bf678c109bfb377d1b7895" + remote_fileurl="http://files.gameservermanagers.com/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="codwaw-lnxded-1.7-full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="0489697ff3bf678c109bfb377d1b7895" elif [ "${gamename}" == "GoldenEye: Source" ]; then - remote_fileurl="http://files.gameservermanagers.com/GoldenEyeSource/GoldenEye_Source_v5.0.1_full_server_linux.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="GoldenEye_Source_v5.0.1_server_full_Linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="ea227a150300abe346e757380325f84c" + remote_fileurl="http://files.gameservermanagers.com/GoldenEyeSource/GoldenEye_Source_v5.0.1_full_server_linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="GoldenEye_Source_v5.0.1_server_full_Linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="ea227a150300abe346e757380325f84c" elif [ "${gamename}" == "Quake 2" ]; then - remote_fileurl="http://files.gameservermanagers.com/Quake2/quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="0b8c7e2d51f40b56b328c69e986e7c5f" + remote_fileurl="http://files.gameservermanagers.com/Quake2/quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; local_filedir="${tmpdir}"; local_filename="quake2-3.20-glibc-i386-full-linux2.0.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="0b8c7e2d51f40b56b328c69e986e7c5f" elif [ "${gamename}" == "Quake 3: Arena" ]; then - remote_fileurl="http://files.gameservermanagers.com/Quake3/quake3-1.32c-x86-full-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="quake3-1.32c-x86-full-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="fd7258d827474f67663dda297bff4306" + remote_fileurl="http://files.gameservermanagers.com/Quake3/quake3-1.32c-x86-full-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="quake3-1.32c-x86-full-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="fd7258d827474f67663dda297bff4306" elif [ "${gamename}" == "QuakeWorld" ]; then - remote_fileurl="http://files.gameservermanagers.com/QuakeWorld/nquake.server.linux.083116.full.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="nquake.server.linux.083116.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="75a409cf08d808f075e4dacdc7b21b78" + remote_fileurl="http://files.gameservermanagers.com/QuakeWorld/nquake.server.linux.083116.full.tar.bz2"; local_filedir="${tmpdir}"; local_filename="nquake.server.linux.083116.full.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="75a409cf08d808f075e4dacdc7b21b78" elif [ "${gamename}" == "Unreal Tournament 2004" ]; then - remote_fileurl="http://files.gameservermanagers.com/UnrealTournament2004/ut2004-server-3339-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="ut2004-server-3339-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" + remote_fileurl="http://files.gameservermanagers.com/UnrealTournament2004/ut2004-server-3339-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut2004-server-3339-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="67c5e2cd9c2a4b04f163962ee41eff54" elif [ "${gamename}" == "Unreal Tournament 99" ]; then - remote_fileurl="http://files.gameservermanagers.com/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="ut99-server-451-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" + remote_fileurl="http://files.gameservermanagers.com/UnrealTournament99/ut99-server-451-ultimate-linux.tar.bz2"; local_filedir="${tmpdir}"; local_filename="ut99-server-451-ultimate-linux.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="49cb24d0550ff6ddeaba6007045c6edd" elif [ "${gamename}" == "Unreal Tournament" ]; then - remote_fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Client-XAN-3395761-Linux.zip"; local_filedir="${tmpdir}"; local_filedir="UnrealTournament-Server-XAN-3395761-Linux.zip"; chmodx="noexecute" run="norun"; force="noforce"; md5="f04ad5b96865b19613303331ff4075eb" + remote_fileurl="https://s3.amazonaws.com/unrealtournament/UnrealTournament-Client-XAN-3395761-Linux.zip"; local_filedir="${tmpdir}"; local_filename="UnrealTournament-Server-XAN-3395761-Linux.zip"; chmodx="noexecute" run="norun"; force="noforce"; md5="f04ad5b96865b19613303331ff4075eb" elif [ "${gamename}" == "Unreal Tournament 3" ]; then - remote_fileurl="http://files.gameservermanagers.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="UT3-linux-server-2.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" + remote_fileurl="http://files.gameservermanagers.com/UnrealTournament3/UT3-linux-server-2.1.tar.bz2"; local_filedir="${tmpdir}"; local_filename="UT3-linux-server-2.1.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="2527437b46f1b47f20228d27d72395a6" elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then - remote_fileurl="http://files.gameservermanagers.com/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; local_filedir="${tmpdir}"; local_filedir="enemy-territory.260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" + remote_fileurl="http://files.gameservermanagers.com/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="enemy-territory.260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" fi fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" fn_dl_extract "${filedir}" "${filename}" "${serverfiles}" From 2becb1e700f0caa6c934e6d2da58f713ed1d7fa9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 15 May 2017 00:13:47 +0100 Subject: [PATCH 0764/1895] corrected extract vars --- lgsm/functions/install_server_files.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 6cdcd6dc9..84ca7264e 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -41,7 +41,7 @@ fn_install_server_files(){ remote_fileurl="http://files.gameservermanagers.com/WolfensteinEnemyTerritory/enemy-territory.260b.tar.bz2"; local_filedir="${tmpdir}"; local_filename="enemy-territory.260b.tar.bz2"; chmodx="nochmodx" run="norun"; force="noforce"; md5="f833f514bfcdd46b42c111f83350c5a7" fi fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" - fn_dl_extract "${filedir}" "${filename}" "${serverfiles}" + fn_dl_extract "${local_filedir}" "${local_filename}" "${serverfiles}" } fn_install_server_files_steamcmd(){ From 6d5ea2090cf7d65f4485851fa0c2ba66c8f695c7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 15 May 2017 15:36:04 +0100 Subject: [PATCH 0765/1895] renamed var to branch for continuity with steamCMD --- Factorio/fctrserver | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Factorio/fctrserver b/Factorio/fctrserver index d1d35192c..2c26f5754 100644 --- a/Factorio/fctrserver +++ b/Factorio/fctrserver @@ -49,7 +49,8 @@ channeltag="" ## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update updateonstart="off" -updatebranch="stable" +# Branch: stable or experimental +branch="stable" ## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup maxbackups="4" From a4cca5164945dd18582d37135b658ad27d185c2e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 15 May 2017 15:37:12 +0100 Subject: [PATCH 0766/1895] Added branch to details --- lgsm/functions/command_details.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 4ac96281f..5be6c9cc7 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -110,6 +110,11 @@ fn_details_gameserver(){ echo -e "${blue}Server name:\t${default}${servername}" fi + # Branch + if [ -n "${branch}" ]; then + echo -e "${blue}Branch:\t${default}${branch}" + fi + # Server ip echo -e "${blue}Server IP:\t${default}${ip}:${port}" From 910024ec2c35ae472bb21a177b1fa3ba13e9f7c1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 15 May 2017 17:08:59 +0100 Subject: [PATCH 0767/1895] Added info on available output and input in the console Servers like Rust done output anything in the console and dont allow input. This confuses many users. Added an if statement to display details about this. Other servers will also benefit from this. However I dont know which servers these messages apply to currently. --- lgsm/functions/command_console.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index 0a93a94fb..dd17de843 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -10,8 +10,15 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh fn_print_header +if [ "${gamename}" == "Rust" ]; then + fn_print_information_nl "${gamename} does not produce a verbose output to the console" +fi +if [ "${gamename}" == "Rust" ]; then + fn_print_information_nl "${gamename} does not allow server commands to be entered in to the console" +fi fn_print_information_nl "Press \"CTRL+b\" then \"d\" to exit console." fn_print_warning_nl "Do NOT press CTRL+c to exit." +echo " * https://github.com/GameServerManagers/LinuxGSM/wiki/Console" echo "" if ! fn_prompt_yn "Continue?" Y; then echo Exiting; return From a7e79a53500f581cba1a23b8922d3b25e28e5229 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 15 May 2017 19:27:26 +0100 Subject: [PATCH 0768/1895] renamed scriptlog to lgsmlog Since there are so many types of logs beign used now changing script to lgsm will clarify what you are working with --- .../config-lgsm/arkserver/_default.cfg | 8 ++--- .../config-lgsm/arma3server/_default.cfg | 9 ++--- .../config-lgsm/csgoserver/_default.cfg | 8 ++--- .../config-lgsm/sdtdserver/_default.cfg | 9 ++--- lgsm/functions/alert_email.sh | 14 ++++---- lgsm/functions/check_executable.sh | 2 +- lgsm/functions/check_logs.sh | 2 +- lgsm/functions/check_permissions.sh | 4 +-- lgsm/functions/check_root.sh | 2 +- lgsm/functions/check_steamcmd.sh | 4 +-- lgsm/functions/check_system_dir.sh | 2 +- lgsm/functions/command_backup.sh | 4 +-- lgsm/functions/command_start.sh | 18 +++++----- lgsm/functions/command_stop.sh | 8 ++--- lgsm/functions/command_validate.sh | 4 +-- lgsm/functions/core_dl.sh | 12 +++---- lgsm/functions/core_messages.sh | 36 +++++++++---------- lgsm/functions/fix_steamcmd.sh | 14 ++++---- lgsm/functions/install_logs.sh | 10 +++--- lgsm/functions/logs.sh | 36 ++++++++----------- lgsm/functions/update_steamcmd.sh | 6 ++-- linuxgsm.sh | 6 ++-- tests/tests_jc2server.sh | 8 ++--- tests/tests_ts3server.sh | 8 ++--- 24 files changed, 116 insertions(+), 118 deletions(-) diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 4d4e4325e..3c9aa13e6 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -79,12 +79,12 @@ backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${logdir}" gamelogdir="${systemdir}/Saved/Logs" -scriptlogdir="${logdir}/script" +lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index bcc5c06bf..f6b32f513 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -88,13 +88,14 @@ networkcfgfullpath="${servercfgdir}/${networkcfg}" backupdir="${lgsmdir}/backup" ## Logging Directories +logdir="${logdir}" #gamelogdir="" # No server logs available -scriptlogdir="${logdir}/script" +lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 7c36ed20f..9167c6bf9 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -102,12 +102,12 @@ backupdir="${lgsmdir}/backup" ## Logging Directories gamelogdir="${systemdir}/logs" -scriptlogdir="${logdir}/script" +lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 47f6b2157..6871a329f 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -77,14 +77,15 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${lgsmdir}/backup" ## Logging Directories +logdir="${logdir}" gamelogdir="${logdir}/server" -scriptlogdir="${logdir}/script" +lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" gamelog="${gamelogdir}/${servicename}-game.log" -scriptlog="${scriptlogdir}/${servicename}-script.log" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index c15b6df30..b017e0b63 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -173,15 +173,15 @@ fn_alert_email_template_logs(){ echo -e "${servicename} Logs" echo -e "=================================" - if [ -n "${scriptlog}" ]; then + if [ -n "${lgsmlog}" ]; then echo -e "\nScript log\n===================" - if [ ! "$(ls -A ${scriptlogdir})" ]; then - echo "${scriptlogdir} (NO LOG FILES)" - elif [ ! -s "${scriptlog}" ]; then - echo "${scriptlog} (LOG FILE IS EMPTY)" + if [ ! "$(ls -A ${lgsmlogdir})" ]; then + echo "${lgsmlogdir} (NO LOG FILES)" + elif [ ! -s "${lgsmlog}" ]; then + echo "${lgsmlog} (LOG FILE IS EMPTY)" else - echo "${scriptlog}" - tail -25 "${scriptlog}" + echo "${lgsmlog}" + tail -25 "${lgsmlog}" fi echo "" fi diff --git a/lgsm/functions/check_executable.sh b/lgsm/functions/check_executable.sh index cc90b435d..46effd85a 100644 --- a/lgsm/functions/check_executable.sh +++ b/lgsm/functions/check_executable.sh @@ -10,7 +10,7 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" # Check if executable exists if [ ! -f "${executabledir}/${execname}" ]; then fn_script_log_warn "Executable was not found: ${executabledir}/${execname}" - if [ -d "${scriptlogdir}" ]; then + if [ -d "${lgsmlogdir}" ]; then fn_print_fail_nl "Executable was not found:" echo " * ${executabledir}/${execname}" fi diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh index bc4f13bdf..c57d7ebbf 100644 --- a/lgsm/functions/check_logs.sh +++ b/lgsm/functions/check_logs.sh @@ -16,7 +16,7 @@ fn_check_logs(){ } # Create directories for the script and console logs -if [ ! -d "${scriptlogdir}" ]||[ ! -d "${consolelogdir}" ]&&[ "${gamename}" != "TeamSpeak 3" ]; then +if [ ! -d "${lgsmlogdir}" ]||[ ! -d "${consolelogdir}" ]&&[ "${gamename}" != "TeamSpeak 3" ]; then fn_check_logs fi diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh index 61cd9d472..2fdbfefe6 100644 --- a/lgsm/functions/check_permissions.sh +++ b/lgsm/functions/check_permissions.sh @@ -40,7 +40,7 @@ fn_check_ownership(){ find "${serverfiles}" -not -user $(whoami) -printf "%u\t\t%g\t%p\n" fi - } | column -s $'\t' -t | tee -a "${scriptlog}" + } | column -s $'\t' -t | tee -a "${lgsmlog}" echo "" fn_print_information_nl "please see https://github.com/GameServerManagers/LinuxGSM/wiki/FAQ#-fail--starting-game-server-ownership-issues-found" fn_script_log "For more information, please see https://github.com/GameServerManagers/LinuxGSM/wiki/FAQ#-fail--starting-game-server-ownership-issues-found" @@ -62,7 +62,7 @@ fn_check_permissions(){ { echo -e "File\n" find "${functionsdir}" -type f -not -executable -printf "%p\n" - } | column -s $'\t' -t | tee -a "${scriptlog}" + } | column -s $'\t' -t | tee -a "${lgsmlog}" if [ "${monitorflag}" == 1 ]; then alert="permissions" alert.sh diff --git a/lgsm/functions/check_root.sh b/lgsm/functions/check_root.sh index a71c993d2..710f88cea 100644 --- a/lgsm/functions/check_root.sh +++ b/lgsm/functions/check_root.sh @@ -9,7 +9,7 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" if [ $(whoami) = "root" ]; then fn_print_fail_nl "Do NOT run this script as root!" - if [ -d "${scriptlogdir}" ]; then + if [ -d "${lgsmlogdir}" ]; then fn_script_log_fatal "${selfname} attempted to run as root." fi core_exit.sh diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh index 9aab57f9f..dc4f66b8b 100644 --- a/lgsm/functions/check_steamcmd.sh +++ b/lgsm/functions/check_steamcmd.sh @@ -20,14 +20,14 @@ fn_check_steamcmd_user(){ if [ "${steamuser}" == "username" ]; then fn_print_fail_nl "Steam login not set. Update steamuser in ${selfname}" echo " * Change steamuser=\"username\" to a valid steam login." - if [ -d "${scriptlogdir}" ]; then + if [ -d "${lgsmlogdir}" ]; then fn_script_log_fatal "Steam login not set. Update steamuser in ${selfname}" fi core_exit.sh fi # Anonymous user is set if steamuser is missing if [ -z "${steamuser}" ]; then - if [ -d "${scriptlogdir}" ]; then + if [ -d "${lgsmlogdir}" ]; then fn_script_log_info "Using anonymous Steam login" fi steamuser="anonymous" diff --git a/lgsm/functions/check_system_dir.sh b/lgsm/functions/check_system_dir.sh index f10f09a9d..68acc3065 100644 --- a/lgsm/functions/check_system_dir.sh +++ b/lgsm/functions/check_system_dir.sh @@ -15,7 +15,7 @@ fi if [ ! -d "${checkdir}" ]; then fn_print_fail_nl "Cannot access ${checkdir}: No such directory" - if [ -d "${scriptlogdir}" ]; then + if [ -d "${lgsmlogdir}" ]; then fn_script_log_fatal "Cannot access ${checkdir}: No such directory." fi core_exit.sh diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 2ef072b0a..7448308cf 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -18,7 +18,7 @@ fn_backup_trap(){ fn_print_canceled_eol_nl fn_script_log_info "Backup ${backupname}.tar.gz: CANCELED" sleep 1 - rm -f "${backupdir}/${backupname}.tar.gz" | tee -a "${scriptlog}" + rm -f "${backupdir}/${backupname}.tar.gz" | tee -a "${lgsmlog}" echo -ne "backup ${backupname}.tar.gz..." fn_print_removed_eol_nl fn_script_log_info "Backup ${backupname}.tar.gz: REMOVED" @@ -118,7 +118,7 @@ fn_backup_compression(){ if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol fn_script_log_fatal "Backup in progress: FAIL" - echo "${tarcmd}" | tee -a "${scriptlog}" + echo "${tarcmd}" | tee -a "${lgsmlog}" fn_print_fail_nl "Starting backup" fn_script_log_fatal "Starting backup" else diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index e1db4ab5f..0c8d30395 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -31,8 +31,8 @@ fn_start_teamspeak3(){ fn_script_log_error "${servername} is already running" core_exit.sh fi - if [ -f "${scriptlog}" ]; then - mv "${scriptlog}" "${scriptlogdate}" + if [ -f "${lgsmlog}" ]; then + mv "${lgsmlog}" "${lgsmlogdate}" fi # Create lockfile date > "${rootdir}/${lockselfname}" @@ -79,7 +79,7 @@ fn_start_tmux(){ mv "${gamelog}" "${gamelogdate}" fi fi - mv "${scriptlog}" "${scriptlogdate}" + mv "${lgsmlog}" "${lgsmlogdate}" mv "${consolelog}" "${consolelogdate}" fi @@ -94,7 +94,7 @@ fn_start_tmux(){ # Create lockfile date > "${rootdir}/${lockselfname}" cd "${executabledir}" - tmux new-session -d -x "${sessionheight}" -y "${sessionwidth}" -s "${servicename}" "${executable} ${parms}" 2> "${scriptlogdir}/.${servicename}-tmux-error.tmp" + tmux new-session -d -x "${sessionheight}" -y "${sessionwidth}" -s "${servicename}" "${executable} ${parms}" 2> "${lgsmlogdir}/.${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" ] 2>/dev/null; then # Tmux compiled from source will not return a number, therefore bypass this check and trash the error @@ -127,20 +127,20 @@ fn_start_tmux(){ fn_print_fail_nl "Unable to start ${servername}" fn_script_log_fatal "Unable to start ${servername}" sleep 1 - if [ -s "${scriptlogdir}/.${servicename}-tmux-error.tmp" ]; then + if [ -s "${lgsmlogdir}/.${servicename}-tmux-error.tmp" ]; then fn_print_fail_nl "Unable to start ${servername}: Tmux error:" fn_script_log_fatal "Unable to start ${servername}: Tmux error:" echo "" echo "Command" echo "=================================" - echo "tmux new-session -d -s \"${servicename}\" \"${executable} ${parms}\"" | tee -a "${scriptlog}" + echo "tmux new-session -d -s \"${servicename}\" \"${executable} ${parms}\"" | tee -a "${lgsmlog}" echo "" echo "Error" echo "=================================" - cat "${scriptlogdir}/.${servicename}-tmux-error.tmp" | tee -a "${scriptlog}" + cat "${lgsmlogdir}/.${servicename}-tmux-error.tmp" | tee -a "${lgsmlog}" # Detected error https://gameservermanagers.com/support - if [ $(grep -c "Operation not permitted" "${scriptlogdir}/.${servicename}-tmux-error.tmp") ]; then + if [ $(grep -c "Operation not permitted" "${lgsmlogdir}/.${servicename}-tmux-error.tmp") ]; then echo "" echo "Fix" echo "=================================" @@ -172,7 +172,7 @@ fn_start_tmux(){ fn_print_ok "${servername}" fn_script_log_pass "Started ${servername}" fi - rm "${scriptlogdir}/.${servicename}-tmux-error.tmp" + rm "${lgsmlogdir}/.${servicename}-tmux-error.tmp" echo -en "\n" } diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh index 805cda4e3..071915aee 100644 --- a/lgsm/functions/command_stop.sh +++ b/lgsm/functions/command_stop.sh @@ -161,10 +161,10 @@ fn_stop_graceful_sdtd(){ fn_print_error_nl "Graceful: telnet: Unknown error" fn_script_log_error "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}" + echo -en "\n" | tee -a "${lgsmlog}" + echo -en "Telnet output:" | tee -a "${lgsmlog}" + echo -en "\n ${sdtd_telnet_shutdown}" | tee -a "${lgsmlog}" + echo -en "\n\n" | tee -a "${lgsmlog}" fi else fn_print_warn "Graceful: telnet: expect not installed: " diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh index 15b35eacd..392eab2b7 100644 --- a/lgsm/functions/command_validate.sh +++ b/lgsm/functions/command_validate.sh @@ -27,9 +27,9 @@ fn_validation(){ fi if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +app_update "${appid}" ${branch} validate +quit| tee -a "${lgsmlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} validate +quit| tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} validate +quit| tee -a "${lgsmlog}" fi if [ $? != 0 ]; then fn_print_fail_nl "Validating files: SteamCMD" diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 512aa22fe..7afe93d21 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -69,7 +69,7 @@ fn_dl_extract(){ if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Extracting download: FAIL" - echo "${extractcmd}" | tee -a "${scriptlog}" + echo "${extractcmd}" | tee -a "${lgsmlog}" core_exit.sh else fn_print_ok_eol_nl @@ -84,7 +84,7 @@ fn_fetch_trap(){ fn_print_canceled_eol_nl fn_script_log_info "Downloading ${local_filename}...CANCELED" sleep 1 - rm -f "${local_filedir}/${local_filename}" | tee -a "${scriptlog}" + rm -f "${local_filedir}/${local_filename}" | tee -a "${lgsmlog}" echo -ne "downloading ${local_filename}..." fn_print_removed_eol_nl fn_script_log_info "Downloading ${local_filename}...REMOVED" @@ -120,15 +120,15 @@ fn_fetch_file(){ local exitcode=$? if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl - if [ -f "${scriptlog}" ]; then + if [ -f "${lgsmlog}" ]; then fn_script_log_fatal "Downloading ${local_filename}: FAIL" fi - echo -e "${remote_fileurl}" | tee -a "${scriptlog}" - echo "${curlcmd}" | tee -a "${scriptlog}" + echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" + echo "${curlcmd}" | tee -a "${lgsmlog}" core_exit.sh else fn_print_ok_eol_nl - if [ -f "${scriptlog}" ]; then + if [ -f "${lgsmlog}" ]; then fn_script_log_pass "Downloading ${local_filename}: OK" fi fi diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh index 2e1286d7e..f38139d12 100644 --- a/lgsm/functions/core_messages.sh +++ b/lgsm/functions/core_messages.sh @@ -27,22 +27,22 @@ fi ######################## ## Feb 28 14:56:58 ut99-server: Monitor: fn_script_log(){ - if [ -d "${scriptlogdir}" ]; then + if [ -d "${lgsmlogdir}" ]; then if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${commandname}: ${1}" >> "${scriptlog}" + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${commandname}: ${1}" >> "${lgsmlog}" else - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${1}" >> "${scriptlog}" + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${1}" >> "${lgsmlog}" fi fi } ## Feb 28 14:56:58 ut99-server: Monitor: PASS: fn_script_log_pass(){ - if [ -d "${scriptlogdir}" ]; then + if [ -d "${lgsmlogdir}" ]; then if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${commandname}: PASS: ${1}" >> "${scriptlog}" + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${commandname}: PASS: ${1}" >> "${lgsmlog}" else - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: PASS: ${1}" >> "${scriptlog}" + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: PASS: ${1}" >> "${lgsmlog}" fi fi exitcode=0 @@ -50,11 +50,11 @@ fn_script_log_pass(){ ## Feb 28 14:56:58 ut99-server: Monitor: FATAL: fn_script_log_fatal(){ - if [ -d "${scriptlogdir}" ]; then + if [ -d "${lgsmlogdir}" ]; then if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${commandname}: FATAL: ${1}" >> "${scriptlog}" + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${commandname}: FATAL: ${1}" >> "${lgsmlog}" else - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: FATAL: ${1}" >> "${scriptlog}" + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: FATAL: ${1}" >> "${lgsmlog}" fi fi exitcode=1 @@ -62,11 +62,11 @@ fn_script_log_fatal(){ ## Feb 28 14:56:58 ut99-server: Monitor: ERROR: fn_script_log_error(){ - if [ -d "${scriptlogdir}" ]; then + if [ -d "${lgsmlogdir}" ]; then if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${commandname}: ERROR: ${1}" >> "${scriptlog}" + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${commandname}: ERROR: ${1}" >> "${lgsmlog}" else - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ERROR: ${1}" >> "${scriptlog}" + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ERROR: ${1}" >> "${lgsmlog}" fi fi exitcode=2 @@ -74,11 +74,11 @@ fn_script_log_error(){ ## Feb 28 14:56:58 ut99-server: Monitor: WARN: fn_script_log_warn(){ - if [ -d "${scriptlogdir}" ]; then + if [ -d "${lgsmlogdir}" ]; then if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${commandname}: WARN: ${1}" >> "${scriptlog}" + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${commandname}: WARN: ${1}" >> "${lgsmlog}" else - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: WARN: ${1}" >> "${scriptlog}" + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: WARN: ${1}" >> "${lgsmlog}" fi fi exitcode=3 @@ -86,11 +86,11 @@ fn_script_log_warn(){ ## Feb 28 14:56:58 ut99-server: Monitor: INFO: fn_script_log_info(){ - if [ -d "${scriptlogdir}" ]; then + if [ -d "${lgsmlogdir}" ]; then if [ -n "${commandname}" ]; then - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${commandname}: INFO: ${1}" >> "${scriptlog}" + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${commandname}: INFO: ${1}" >> "${lgsmlog}" else - echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: INFO: ${1}" >> "${scriptlog}" + echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: INFO: ${1}" >> "${lgsmlog}" fi fi } diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh index 693398739..e1380d9e3 100644 --- a/lgsm/functions/fix_steamcmd.sh +++ b/lgsm/functions/fix_steamcmd.sh @@ -12,8 +12,8 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" if [ ! -f "${HOME}/.steam/sdk32/steamclient.so" ]; then fixname="steamclient.so general" fn_fix_msg_start - mkdir -pv "${HOME}/.steam/sdk32" >> "${scriptlog}" - cp -v "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${scriptlog}" + mkdir -pv "${HOME}/.steam/sdk32" >> "${lgsmlog}" + cp -v "${steamcmddir}/linux32/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so" >> "${lgsmlog}" fn_fix_msg_end fi @@ -22,8 +22,8 @@ if [ "${gamename}" == "Serious Sam 3: BFE" ]; then if [ ! -f "${HOME}/.steam/bin32/libsteam.so" ]; then fixname="libsteam.so" fn_fix_msg_start - mkdir -pv "${HOME}/.steam/bin32" >> "${scriptlog}" - cp -v "${serverfiles}/Bin/libsteam.so" "${HOME}/.steam/bin32/libsteam.so" >> "${scriptlog}" + mkdir -pv "${HOME}/.steam/bin32" >> "${lgsmlog}" + cp -v "${serverfiles}/Bin/libsteam.so" "${HOME}/.steam/bin32/libsteam.so" >> "${lgsmlog}" fn_fix_msg_end fi elif [ "${gamename}" == "Hurtworld" ]; then @@ -31,13 +31,13 @@ elif [ "${gamename}" == "Hurtworld" ]; then if [ ! -f "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" ]; then fixname="steamclient.so x86" fn_fix_msg_start - cp -v "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${scriptlog}" + cp -v "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86/steamclient.so" >> "${lgsmlog}" fn_fix_msg_end fi if [ ! -f "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" ]; then fixname="steamclient.so x86_64" fn_fix_msg_start - cp -v "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${scriptlog}" + cp -v "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/Hurtworld_Data/Plugins/x86_64/steamclient.so" >> "${lgsmlog}" fn_fix_msg_end fi elif [ "${gamename}" == "Tower Unite" ]; then @@ -45,7 +45,7 @@ elif [ "${gamename}" == "Tower Unite" ]; then if [ ! -f "${executabledir}/steamclient.so" ]; then fixname="steamclient.so" fn_fix_msg_start - cp -v "${serverfiles}/linux64/steamclient.so" "${executabledir}/steamclient.so" >> "${scriptlog}" + cp -v "${serverfiles}/linux64/steamclient.so" "${executabledir}/steamclient.so" >> "${lgsmlog}" fn_fix_msg_end fi fi diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index bcadafc36..12d7002c4 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -14,16 +14,18 @@ if [ "${checklogs}" != "1" ]; then echo "=================================" fi sleep 1 -# Create script and console log directories +# Create LinuxGSM logs mkdir -pv "${logdir}" -mkdir -pv "${scriptlogdir}" -touch "${scriptlog}" +mkdir -pv "${lgsmlogdir}" +touch "${lgsmlog}" + +# Create Console logs if [ -n "${consolelogdir}" ]; then mkdir -pv "${consolelogdir}" touch "${consolelog}" fi -# Create gamelogdir if variable exists but directory does not +# Create Game logs if [ -n "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then mkdir -pv "${gamelogdir}" fi diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index 2fd0fc626..6e877140c 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -28,7 +28,7 @@ if [ "${status}" != "0" ] && [ "${function_selfname}" == "command_start.sh" ] && 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 +if [ $(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; then fn_print_dots "Starting" # Set common logs directories commonlogs="${systemdir}/logs" @@ -46,29 +46,29 @@ if [ $(find "${scriptlogdir}"/ -type f -mtime +"${logdays}"|wc -l) -ne "0" ]; th fn_script_log_info "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 {} \; + find "${lgsmlogdir}"/ -type f -mtime +"${logdays}"| tee >> "${lgsmlog}" + scriptcount=$(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}"|wc -l) + find "${lgsmlogdir}"/ -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 >> "${lgsmlog}" 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 >> "${lgsmlog}" consolecount=$(find "${consolelogdir}"/ -type f -mtime +"${logdays}"|wc -l) find "${consolelogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; fi # Common logfiles - if [ -d ${commonlogs} ]; then - find "${commonlogs}"/ -type f -mtime +"${logdays}"| tee >> "${scriptlog}" + if [ -d "${commonlogs}" ]; then + find "${commonlogs}"/ -type f -mtime +"${logdays}"| tee >> "${lgsmlog}" smcount=$(find "${commonlogs}"/ -type f -mtime +"${logdays}"|wc -l) find "${commonlogs}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; fi if [ -d ${commonsourcelogs} ]; then - find "${commonsourcelogs}"/* -type f -mtime +"${logdays}"| tee >> "${scriptlog}" + find "${commonsourcelogs}"/* -type f -mtime +"${logdays}"| tee >> "${lgsmlog}" smcount=$(find "${commonsourcelogs}"/* -type f -mtime +"${logdays}"|wc -l) find "${commonsourcelogs}"/* -mtime +"${logdays}" -type f -exec rm -f {} \; fi @@ -76,7 +76,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 >> "${lgsmlog}" smcount=$(find "${sourcemodlogdir}"/ -type f -mtime +"${logdays}"|wc -l) find "${sourcemodlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \; fi @@ -84,28 +84,22 @@ 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 >> "${lgsmlog}" 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 >> "${lgsmlog}" 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 {} \; - fi # Count total amount of files removed - count=$((${scriptcount} + ${consolecount} + ${gamecount} + ${srcdscount} + ${smcount} + ${ulxcount} + ${darkrpcount} + ${legacycount})) + countlogs=$((${scriptcount} + ${consolecount} + ${gamecount} + ${srcdscount} + ${smcount} + ${ulxcount} + ${darkrpcount})) # Job done - fn_print_ok_nl "Removed ${count} log files" - fn_script_log "Removed ${count} log files" + fn_print_ok_nl "Removed ${countlogs} log files" + fn_script_log "Removed ${countlogs} log files" fi diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index d75be3b05..1b09f3295 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -27,11 +27,11 @@ fn_update_steamcmd_dl(){ cd "${steamcmddir}" if [ "${engine}" == "goldsource" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_set_config 90 mod ${appidmod} +app_update "${appid}" ${branch} +quit | tee -a "${lgsmlog}" else - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} +quit | tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid}" ${branch} +quit | tee -a "${lgsmlog}" if [ "${gamename}" == "Classic Offensive" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid_co}" ${branch} +quit | tee -a "${scriptlog}" + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid_co}" ${branch} +quit | tee -a "${lgsmlog}" fi fi diff --git a/linuxgsm.sh b/linuxgsm.sh index 0f85c5070..01da46b56 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -81,9 +81,9 @@ fn_bootstrap_fetch_file(){ local exitcode=$? if [ ${exitcode} -ne 0 ]; then echo -e "\e[0;31mFAIL\e[0m\n" - if [ -f "${scriptlog}" ]; then - echo -e "${remote_fileurl}" | tee -a "${scriptlog}" - echo "${curlcmd}" | tee -a "${scriptlog}" + if [ -f "${lgsmlog}" ]; then + echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" + echo "${curlcmd}" | tee -a "${lgsmlog}" fi exit 1 else diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index ce9323db7..f990a20ca 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -106,14 +106,14 @@ backupdir="${rootdir}/backups" ## Logging Directories #gamelogdir="" # No server logs available -scriptlogdir="${rootdir}/log/script" +lgsmlogdir="${rootdir}/log/script" consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" ######################## diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 4371e6b20..2da2fdb87 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -93,12 +93,12 @@ backupdir="${rootdir}/backups" ## Logging Directories gamelogdir="${serverfiles}/logs" -scriptlogdir="${rootdir}/log/script" -scriptlog="${scriptlogdir}/${servicename}-script.log" -emaillog="${scriptlogdir}/${servicename}-email.log" +lgsmlogdir="${rootdir}/log/script" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" ######################## ######## Script ######## From c9d9a42511f8aef6aa94054809f59abb5c11cdad Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 15 May 2017 20:27:08 +0100 Subject: [PATCH 0769/1895] Corrected logdir location --- lgsm/config-default/config-lgsm/arkserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/arma3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/sdtdserver/_default.cfg | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index 3c9aa13e6..b0ebe82c7 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -77,7 +77,7 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${lgsmdir}/backup" ## Logging Directories -logdir="${logdir}" +logdir="${rootdir}/log" gamelogdir="${systemdir}/Saved/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index f6b32f513..6e6c9e80b 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -88,7 +88,7 @@ networkcfgfullpath="${servercfgdir}/${networkcfg}" backupdir="${lgsmdir}/backup" ## Logging Directories -logdir="${logdir}" +logdir="${rootdir}/log" #gamelogdir="" # No server logs available lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 6871a329f..4e38b147b 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -77,7 +77,7 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${lgsmdir}/backup" ## Logging Directories -logdir="${logdir}" +logdir="${rootdir}/log" gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" From aae6c321cc5bd296897f900fa626252507cfaf25 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 15 May 2017 21:21:28 +0100 Subject: [PATCH 0770/1895] new solution to prevent symlink from being created when not required If the gamelogdir is within the logdir then no symlink is created. --- lgsm/functions/install_logs.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 12d7002c4..054d19445 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -30,9 +30,12 @@ if [ -n "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then mkdir -pv "${gamelogdir}" fi -# Symlink gamelogdir to lgsm logs if variable exists +# Symlink to gamelogdir +# unless gamelogdir is within logdir +# e.g serverfiles/log is not within log/: symlink created +# log/server is in log/: symlink not created if [ -n "${gamelogdir}" ]; then - if [ ! -h "${logdir}/server" ]; then + if [ "${gamelogdir:0:${#logdir}}" != "${logdir}" ];then ln -nfsv "${gamelogdir}" "${logdir}/server" fi fi From 94880d2e5630268c2ee3078907c304aaebebaeed Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 15 May 2017 21:28:28 +0100 Subject: [PATCH 0771/1895] added logdir --- lgsm/config-default/config-lgsm/csgoserver/_default.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 9167c6bf9..8859f933b 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -101,6 +101,7 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${lgsmdir}/backup" ## Logging Directories +logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" From 2a4948071368b84ecc8cbe9208366cd81dff41b8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 15 May 2017 21:28:36 +0100 Subject: [PATCH 0772/1895] changed -h to -L --- lgsm/functions/install_logs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 054d19445..2f3fb7379 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -42,7 +42,7 @@ fi # If server uses SteamCMD create a symbolic link to the Steam logs if [ -d "${rootdir}/Steam/logs" ]; then - if [ ! -h "${logdir}/steamcmd" ]; then + if [ ! -L "${logdir}/steamcmd" ]; then ln -nfsv "${rootdir}/Steam/logs" "${logdir}/steamcmd" fi fi From 28b5d3ff5a2cb912ccee122edf1aceccc7b0419e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 15 May 2017 21:46:07 +0100 Subject: [PATCH 0773/1895] now correctly checks if gamelogdir is missing and needs installing --- lgsm/functions/check_logs.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh index c57d7ebbf..f82d7babd 100644 --- a/lgsm/functions/check_logs.sh +++ b/lgsm/functions/check_logs.sh @@ -20,7 +20,8 @@ if [ ! -d "${lgsmlogdir}" ]||[ ! -d "${consolelogdir}" ]&&[ "${gamename}" != "Te fn_check_logs fi -# Create gamelogdir if variable exist but dir does not exist -if [ -n "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then +# Create gamelogdir +# If variable exists gamelogdir exists and log/server does not +if [ -n "${gamelogdir}" ]&&[ -d "${gamelogdir}" ]&&[ ! -d "${logdir}/server" ]; then fn_check_logs fi From e1d6adfa0e24871ee8bce2a07e1338e042441794 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 15 May 2017 22:03:01 +0100 Subject: [PATCH 0774/1895] added scriptlogdir to legacy vars --- lgsm/functions/core_legacy.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index e61a74817..28293c787 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -13,6 +13,10 @@ if [ -z "${logdir}" ]; then logdir="${rootdir}/log" fi +if [ -z "${lgsmlogdir}" ]; then + lgsmlogdir="${scriptlogdir}" +fi + if [ -z "${steamcmddir}" ]; then steamcmddir="${rootdir}/steamcmd" fi From a8811b39cdf134f21efc713a8f5d48b8fc828c25 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 15 May 2017 22:12:38 +0100 Subject: [PATCH 0775/1895] added scriptlog to legacy vars --- lgsm/functions/core_legacy.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index 28293c787..1f13cc72a 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -17,6 +17,14 @@ if [ -z "${lgsmlogdir}" ]; then lgsmlogdir="${scriptlogdir}" fi +if [ -z "${lgsmlog}" ]; then + lgsmlog="${scriptlog}" +fi + +if [ -z "${scriptlogdate}" ]; then + lgsmlogdate="${scriptlogdate}" +fi + if [ -z "${steamcmddir}" ]; then steamcmddir="${rootdir}/steamcmd" fi From eaf1f78842607421faca1eda1dc96eb6712b06da Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 15 May 2017 22:18:27 +0100 Subject: [PATCH 0776/1895] Added scriptlogdir to legacy vars --- lgsm/functions/core_legacy.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh index 1f13cc72a..938aeb845 100644 --- a/lgsm/functions/core_legacy.sh +++ b/lgsm/functions/core_legacy.sh @@ -21,6 +21,10 @@ if [ -z "${lgsmlog}" ]; then lgsmlog="${scriptlog}" fi +if [ -z "${lgsmlogdir}" ]; then + lgsmlogdir="${scriptlogdir}" +fi + if [ -z "${scriptlogdate}" ]; then lgsmlogdate="${scriptlogdate}" fi From 96ece6a4de2a24aa547f500286146ac87415c52c Mon Sep 17 00:00:00 2001 From: Digital-Storm Date: Tue, 16 May 2017 19:57:28 -0400 Subject: [PATCH 0777/1895] renamed var to branch for continuity with steamCMD Renamed updatebranch variable to branch to coincide with the change to the fctrserver.sh variable change in commit 6d5ea2090cf7d65f4485851fa0c2ba66c8f695c7 --- lgsm/functions/update_factorio.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 5b9d64e8d..4ef1c4bfb 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -76,7 +76,7 @@ fn_update_factorio_arch(){ fn_update_factorio_availablebuild(){ # Gets latest build info. - availablebuild=$(curl -s https://www.factorio.com/download-headless/"${updatebranch}" | grep 'headless/linux64' | head -n 1 | grep -oP '(?<=get-download/).*?(?=/)') + availablebuild=$(curl -s https://www.factorio.com/download-headless/"${branch}" | grep 'headless/linux64' | head -n 1 | grep -oP '(?<=get-download/).*?(?=/)') sleep 1 # Checks if availablebuild variable has been set From babf94ef8ad9727b30f2ecfad6f15e83283c600c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 17 May 2017 22:39:15 +0100 Subject: [PATCH 0778/1895] created _default.cfg --- .../config-lgsm/arkserver/_default.cfg | 4 +- .../config-lgsm/arma3server/_default.cfg | 9 +- .../config-lgsm/bb2server/_default.cfg | 116 ++++++++++++ .../config-lgsm/bf1942server/_default.cfg | 172 ++++++++++++++++++ .../config-lgsm/bmdmserver/_default.cfg | 117 ++++++++++++ .../config-lgsm/boserver/_default.cfg | 109 +++++++++++ .../config-lgsm/bsserver/_default.cfg | 114 ++++++++++++ .../config-lgsm/ccserver/_default.cfg | 111 +++++++++++ .../config-lgsm/cod2server/_default.cfg | 98 ++++++++++ .../config-lgsm/cod4server/_default.cfg | 98 ++++++++++ .../config-lgsm/codserver/_default.cfg | 97 ++++++++++ .../config-lgsm/coduoserver/_default.cfg | 98 ++++++++++ .../config-lgsm/codwawserver/_default.cfg | 98 ++++++++++ .../config-lgsm/coserver/_default.cfg | 139 ++++++++++++++ .../config-lgsm/csserver/_default.cfg | 111 +++++++++++ 15 files changed, 1488 insertions(+), 3 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/bb2server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/bf1942server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/bmdmserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/boserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/bsserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/ccserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/cod2server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/cod4server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/codserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/coduoserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/codwawserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/coserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/csserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index b0ebe82c7..ec10b2529 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -3,8 +3,8 @@ ################################## # DO NOT EDIT WILL BE OVERWRITTEN! # Copy settings from here and use them in either -# common.cfg - applys settings to every instance -# [instance].cfg - applys settings to specific instance +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance #### Server Settings #### diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg index 6e6c9e80b..3bed76e5d 100644 --- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg @@ -1,3 +1,11 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + #### Server Settings #### ## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login @@ -89,7 +97,6 @@ backupdir="${lgsmdir}/backup" ## Logging Directories logdir="${rootdir}/log" -#gamelogdir="" # No server logs available lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg new file mode 100644 index 000000000..0dd6c3bdd --- /dev/null +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -0,0 +1,116 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="bba_barracks" +maxplayers="20" +port="27015" +sourcetvport="27020" +clientport="27005" +ip="0.0.0.0" + +## Optional: Game Server Login Token +# GSLT can be used for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game brainbread2 -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="475370" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="BrainBread 2" +engine="source" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="bb2-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}/brainbread2" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg new file mode 100644 index 000000000..7f97d2dfb --- /dev/null +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -0,0 +1,172 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="+hostServer 1 +dedicated 1" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + + +#### Advanced Variables #### + +# Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Battlefield: 1942" +engine="refractor" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="bf1942-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${systemdir}" +executable="./start.sh" +servercfg="serversettings.con" +servercfgdefault="serversettings.con" +servercfgdir="${systemdir}/mods/bf1942/settings" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${filesdir}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" + +######################## +######## Script ######## +###### Do not edit ##### +######################## + +# 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 -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_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_fetch_core_dl +} + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + +core_dl.sh +core_functions.sh +getopt=$1 +core_getopt.sh diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg new file mode 100644 index 000000000..1cc5aaff6 --- /dev/null +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -0,0 +1,117 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="dm_bounce" +maxplayers="16" +port="27015" +sourcetvport="27020" +clientport="27005" +ip="0.0.0.0" + +## Optional: Game Server Login Token +# GSLT can be used for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game bms -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## SteamCMD Settings +# Server appid +appid="346680" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Black Mesa: Deathmatch" +engine="source" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="bmdm-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}/bms" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg new file mode 100644 index 000000000..d55c4b30e --- /dev/null +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -0,0 +1,109 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Optional: Game Server Login Token +# GSLT can be used for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" +ip="" +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms=" -batchmode -nographics -dedicated -configfile=${servercfgfullpath}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## SteamCMD Settings +# Server appid +appid="416880" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Ballistic Overkill" +engine="unity3d" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="bo-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./BODS.x86" +servercfg="${servicename}.txt" +servercfgdefault="config.txt" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg new file mode 100644 index 000000000..76ddbe299 --- /dev/null +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -0,0 +1,114 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="duel_winter" +maxplayers="16" +port="27015" +sourcetvport="27020" +clientport="27005" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-autoupdate -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="228780" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Blade Symphony" +engine="source" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="bs-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}/berimbau" +executabledir="${filesdir}" +executable="./srcds_run.sh" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg new file mode 100644 index 000000000..0e9835728 --- /dev/null +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -0,0 +1,111 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="cbe_bunker" +maxplayers="6" +port="27015" +sourcetvport="27020" +clientport="27005" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game cure -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="383410" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Codename CURE" +engine="source" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="cc-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}/cure" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg new file mode 100644 index 000000000..d9ced17cd --- /dev/null +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -0,0 +1,98 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="mp_leningrad" +maxclients="20" +port="28960" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### Advanced Variables #### + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Call of Duty 2" +engine="iw2.0" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="cod2-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./cod2_lnxded" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/main" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${filesdir}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg new file mode 100644 index 000000000..8295442e1 --- /dev/null +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -0,0 +1,98 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="mp_crossfire" +maxclients="32" +port="28960" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### Advanced Variables #### + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Call of Duty 4" +engine="iw3.0" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="cod4-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./cod4x18_dedrun" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/main" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${filesdir}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg new file mode 100644 index 000000000..68aa5f7c0 --- /dev/null +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -0,0 +1,97 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="mp_neuville" +maxclients="20" +port="28960" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### Advanced Variables #### + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Call of Duty" +engine="idtech3" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="cod-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./cod_lnxded" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/main" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${filesdir}/Logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg new file mode 100644 index 000000000..1d3627536 --- /dev/null +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -0,0 +1,98 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="mp_cassino" +maxclients="20" +port="28960" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### Advanced Variables #### + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Call of Duty: United Offensive" +engine="idtech3" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="coduo-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./coduo_lnxded" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/uo" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${filesdir}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg new file mode 100644 index 000000000..5a097121c --- /dev/null +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -0,0 +1,98 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="mp_castle" +maxclients="20" +port="28960" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### Advanced Variables #### + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Call of Duty: World at War" +engine="iw3.0" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="codwaw-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./codwaw_lnxded" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/main" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${filesdir}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/coserver/_default.cfg b/lgsm/config-default/config-lgsm/coserver/_default.cfg new file mode 100644 index 000000000..4d2eeb5ea --- /dev/null +++ b/lgsm/config-default/config-lgsm/coserver/_default.cfg @@ -0,0 +1,139 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +# https://developer.valvesoftware.com/wiki/Counter-Strike:_Global_Offensive_Dedicated_Servers#Starting_the_Server +# [Game Modes] gametype gamemode +# Arms Race 1 0 +# Classic Casual 0 0 +# Classic Competitive 0 1 +# Demolition 1 1 +# Deathmatch 1 2 +gametype="0" +gamemode="0" +defaultmap="de_mirage" +mapgroup="mg_active" +maxplayers="16" +tickrate="64" +port="27015" +sourcetvport="27020" +clientport="27005" +ip="0.0.0.0" + +## Required: Game Server Login Token +# GSLT is required for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Optional: Workshop Parameters +# https://developer.valvesoftware.com/wiki/CSGO_Workshop_For_Server_Operators +# To get an authkey visit - http://steamcommunity.com/dev/apikey +# authkey="" +# ws_collection_id="" +# ws_start_map="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game csco -usercon -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers_override ${maxplayers} +mapgroup ${mapgroup} +game_mode ${gamemode} +game_type ${gametype} +host_workshop_collection ${ws_collection_id} +workshop_start_map ${ws_start_map} -authkey ${authkey}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="740" +appid_co="600380" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login +steamuser="username" +steampass='password' + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Classic Offensive" +engine="source" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="co-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}/csco" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg new file mode 100644 index 000000000..d79a1a7cd --- /dev/null +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -0,0 +1,111 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="de_dust2" +maxplayers="16" +port="27015" +clientport="27005" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game cstrike -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### Advanced Variables #### + +## SteamCMD Settings +# Server appid +appid="90" +appidmod="cstrike" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Counter-Strike 1.6" +engine="goldsource" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="cs-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}/cstrike" +executabledir="${filesdir}" +executable="./hlds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file From f7409b6206e12e53de1327b20ed43d8112cfd109 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 17 May 2017 22:49:08 +0100 Subject: [PATCH 0779/1895] Added if lgsmlog --- lgsm/functions/core_dl.sh | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 7afe93d21..13e9d8951 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -69,7 +69,10 @@ fn_dl_extract(){ if [ ${exitcode} -ne 0 ]; then fn_print_fail_eol_nl fn_script_log_fatal "Extracting download: FAIL" - echo "${extractcmd}" | tee -a "${lgsmlog}" + if [ -f "${lgsmlog}" ]; then + echo "${extractcmd}" >> "${lgsmlog}" + fi + echo "${extractcmd}" core_exit.sh else fn_print_ok_eol_nl @@ -84,7 +87,7 @@ fn_fetch_trap(){ fn_print_canceled_eol_nl fn_script_log_info "Downloading ${local_filename}...CANCELED" sleep 1 - rm -f "${local_filedir}/${local_filename}" | tee -a "${lgsmlog}" + rm -f "${local_filedir}/${local_filename}" echo -ne "downloading ${local_filename}..." fn_print_removed_eol_nl fn_script_log_info "Downloading ${local_filename}...REMOVED" @@ -122,9 +125,11 @@ fn_fetch_file(){ fn_print_fail_eol_nl if [ -f "${lgsmlog}" ]; then fn_script_log_fatal "Downloading ${local_filename}: FAIL" + echo -e "${remote_fileurl}" >> "${lgsmlog}" + echo "${curlcmd}" >> "${lgsmlog}" fi - echo -e "${remote_fileurl}" | tee -a "${lgsmlog}" - echo "${curlcmd}" | tee -a "${lgsmlog}" + echo -e "${remote_fileurl}" + echo "${curlcmd}" core_exit.sh else fn_print_ok_eol_nl From 7448417599c277df985fe560d2470a02f182dc1e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 17 May 2017 23:06:17 +0100 Subject: [PATCH 0780/1895] removed branch select in _default.cfg has to be set in linuxgsm.sh --- lgsm/config-default/config-lgsm/codserver/_default.cfg | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 68aa5f7c0..0c913ed2b 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -44,13 +44,6 @@ logdays="7" #### Advanced Variables #### -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - ## LinuxGSM Server Details # Do not edit gamename="Call of Duty" From 8b4ae10dc7b67bc5e1a230a84a76812f6e9242e7 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 17 May 2017 23:25:02 +0100 Subject: [PATCH 0781/1895] Corrected logdirs --- lgsm/config-default/config-lgsm/codserver/_default.cfg | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 0c913ed2b..dbc36f59a 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -78,12 +78,13 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${rootdir}/backups" ## Logging Directories +logdir="${rootdir}/log" gamelogdir="${filesdir}/Logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -scriptlog="${scriptlogdir}/${servicename}-script.log" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" -emaillog="${scriptlogdir}/${servicename}-email.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" From fced24a75d60342a30c3e28b087ce85a9148dedb Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 17 May 2017 23:47:21 +0100 Subject: [PATCH 0782/1895] added error checking to log installing --- lgsm/functions/install_logs.sh | 60 +++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 2f3fb7379..7efaee162 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -15,19 +15,55 @@ if [ "${checklogs}" != "1" ]; then fi sleep 1 # Create LinuxGSM logs -mkdir -pv "${logdir}" -mkdir -pv "${lgsmlogdir}" -touch "${lgsmlog}" +echo -ne "installing log dir: ${logdir}..." +mkdir -p "${logdir}" +if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh +else + fn_print_ok_eol_nl +fi +echo -ne "installing LinuxGSM log dir: ${lgsmlogdir}..." +mkdir -v "${lgsmlogdir}" +if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh +else + fn_print_ok_eol_nl +fi +echo -ne "creating LinuxGSM log: ${lgsmlog}..." +touch -v "${lgsmlog}" +if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh +else + fn_print_ok_eol_nl +fi # Create Console logs if [ -n "${consolelogdir}" ]; then - mkdir -pv "${consolelogdir}" + echo -ne "installing console log dir: ${consolelogdir}..." + mkdir -v "${consolelogdir}" + if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi + echo -ne "creating console log:" touch "${consolelog}" fi # Create Game logs if [ -n "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then - mkdir -pv "${gamelogdir}" + echo -ne "installing game log dir: ${gamelogdir}..." + mkdir -v "${gamelogdir}" + if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi fi # Symlink to gamelogdir @@ -36,14 +72,28 @@ fi # log/server is in log/: symlink not created if [ -n "${gamelogdir}" ]; then if [ "${gamelogdir:0:${#logdir}}" != "${logdir}" ];then + echo -ne "creating symlink to game log dir: ${gamelogdir} > ${logdir}/server..." ln -nfsv "${gamelogdir}" "${logdir}/server" + if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi fi fi # If server uses SteamCMD create a symbolic link to the Steam logs if [ -d "${rootdir}/Steam/logs" ]; then if [ ! -L "${logdir}/steamcmd" ]; then + echo -ne "creating symlink to steam log dir: ${rootdir}/Steam/logs > ${logdir}/steamcmd..." ln -nfsv "${rootdir}/Steam/logs" "${logdir}/steamcmd" + if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi fi fi sleep 1 From ae6338f5edefbcc9f5f3ad97ed96b96ed524abe1 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 17 May 2017 23:47:49 +0100 Subject: [PATCH 0783/1895] removed -v option from touch --- lgsm/functions/install_logs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 7efaee162..0b17ad3bc 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -33,7 +33,7 @@ else fn_print_ok_eol_nl fi echo -ne "creating LinuxGSM log: ${lgsmlog}..." -touch -v "${lgsmlog}" +touch "${lgsmlog}" if [ $? -ne 0 ]; then fn_print_fail_eol_nl core_exit.sh From 921e5ebb0fe37554442a4e36f5b0df8c46e70355 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Wed, 17 May 2017 23:52:59 +0100 Subject: [PATCH 0784/1895] removed v option from mkdir --- lgsm/functions/install_logs.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 0b17ad3bc..dfa25e8a4 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -25,7 +25,7 @@ else fi echo -ne "installing LinuxGSM log dir: ${lgsmlogdir}..." -mkdir -v "${lgsmlogdir}" +mkdir -p "${lgsmlogdir}" if [ $? -ne 0 ]; then fn_print_fail_eol_nl core_exit.sh @@ -43,7 +43,7 @@ fi # Create Console logs if [ -n "${consolelogdir}" ]; then echo -ne "installing console log dir: ${consolelogdir}..." - mkdir -v "${consolelogdir}" + mkdir -p "${consolelogdir}" if [ $? -ne 0 ]; then fn_print_fail_eol_nl core_exit.sh @@ -57,7 +57,7 @@ fi # Create Game logs if [ -n "${gamelogdir}" ]&&[ ! -d "${gamelogdir}" ]; then echo -ne "installing game log dir: ${gamelogdir}..." - mkdir -v "${gamelogdir}" + mkdir -p "${gamelogdir}" if [ $? -ne 0 ]; then fn_print_fail_eol_nl core_exit.sh From 2350a8b4c0cc66c5badadb6bb62a4817d295844e Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 18 May 2017 00:03:27 +0100 Subject: [PATCH 0785/1895] corrected some variables --- .../config-lgsm/bb2server/_default.cfg | 2 +- .../config-lgsm/bf1942server/_default.cfg | 2 +- .../config-lgsm/bmdmserver/_default.cfg | 2 +- .../config-lgsm/boserver/_default.cfg | 2 +- .../config-lgsm/bsserver/_default.cfg | 2 +- .../config-lgsm/ccserver/_default.cfg | 2 +- .../config-lgsm/cod2server/_default.cfg | 2 +- .../config-lgsm/cod4server/_default.cfg | 2 +- .../config-lgsm/codserver/_default.cfg | 17 ++--------------- .../config-lgsm/coduoserver/_default.cfg | 2 +- .../config-lgsm/codwawserver/_default.cfg | 2 +- .../config-lgsm/coserver/_default.cfg | 2 +- .../config-lgsm/csserver/_default.cfg | 2 +- 13 files changed, 14 insertions(+), 27 deletions(-) diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 0dd6c3bdd..ca24739e7 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -112,5 +112,5 @@ consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index 7f97d2dfb..a1fd9189c 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -92,7 +92,7 @@ consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" ######################## diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index 1cc5aaff6..a54c2b910 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -113,5 +113,5 @@ consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index d55c4b30e..32251d5ee 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -105,5 +105,5 @@ consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 76ddbe299..234b2dba0 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -110,5 +110,5 @@ lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 0e9835728..994ee8d8d 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -107,5 +107,5 @@ consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index d9ced17cd..6fdaa8aaf 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -94,5 +94,5 @@ consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index 8295442e1..b992b08ed 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -94,5 +94,5 @@ consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index dbc36f59a..5f6de5d88 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -42,29 +42,16 @@ stoponbackup="on" consolelogging="on" logdays="7" -#### Advanced Variables #### +#### LinuxGSM Advanced Settings #### ## LinuxGSM Server Details # Do not edit gamename="Call of Duty" engine="idtech3" -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="cod-server" - #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${filesdir}" executabledir="${filesdir}" @@ -87,5 +74,5 @@ consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 1d3627536..06e82f46a 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -94,5 +94,5 @@ consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index 5a097121c..dfef61085 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -94,5 +94,5 @@ consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/coserver/_default.cfg b/lgsm/config-default/config-lgsm/coserver/_default.cfg index 4d2eeb5ea..b5d2b700a 100644 --- a/lgsm/config-default/config-lgsm/coserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coserver/_default.cfg @@ -135,5 +135,5 @@ consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index d79a1a7cd..34d147e03 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -107,5 +107,5 @@ consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file From 26269a04a8a074d1577866e0c32eafafb999cf71 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 18 May 2017 00:08:20 +0100 Subject: [PATCH 0786/1895] added error check for touch consolelog --- lgsm/functions/install_logs.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index dfa25e8a4..f7591af22 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -50,8 +50,14 @@ if [ -n "${consolelogdir}" ]; then else fn_print_ok_eol_nl fi - echo -ne "creating console log:" + echo -ne "creating console log: ${consolelog}..." touch "${consolelog}" + if [ $? -ne 0 ]; then + fn_print_fail_eol_nl + core_exit.sh + else + fn_print_ok_eol_nl + fi fi # Create Game logs From 1db661be4bcd422cfec0b225cb9af437301e7e09 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 18 May 2017 00:11:08 +0100 Subject: [PATCH 0787/1895] renamed filesdir to serverfiles --- lgsm/config-default/config-lgsm/bb2server/_default.cfg | 6 +++--- .../config-lgsm/bf1942server/_default.cfg | 6 +++--- .../config-default/config-lgsm/bmdmserver/_default.cfg | 6 +++--- lgsm/config-default/config-lgsm/boserver/_default.cfg | 6 +++--- lgsm/config-default/config-lgsm/bsserver/_default.cfg | 6 +++--- lgsm/config-default/config-lgsm/ccserver/_default.cfg | 6 +++--- .../config-default/config-lgsm/cod2server/_default.cfg | 10 +++++----- .../config-default/config-lgsm/cod4server/_default.cfg | 10 +++++----- lgsm/config-default/config-lgsm/codserver/_default.cfg | 8 ++++---- .../config-lgsm/coduoserver/_default.cfg | 10 +++++----- .../config-lgsm/codwawserver/_default.cfg | 10 +++++----- lgsm/config-default/config-lgsm/coserver/_default.cfg | 6 +++--- lgsm/config-default/config-lgsm/csserver/_default.cfg | 6 +++--- lgsm/functions/command_dev_detect_deps.sh | 6 +++--- lgsm/functions/install_logs.sh | 8 ++++---- lgsm/functions/install_server_files.sh | 4 ++-- 16 files changed, 57 insertions(+), 57 deletions(-) diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index ca24739e7..5e31e6304 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -88,11 +88,11 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}/brainbread2" -executabledir="${filesdir}" +systemdir="${serverfiles}/brainbread2" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index a1fd9189c..05ac58284 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -68,10 +68,10 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}" +systemdir="${serverfiles}" executabledir="${systemdir}" executable="./start.sh" servercfg="serversettings.con" @@ -84,7 +84,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/Logs" +gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index a54c2b910..d4c669c82 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -88,11 +88,11 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}/bms" -executabledir="${filesdir}" +systemdir="${serverfiles}/bms" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 32251d5ee..267e71cbd 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -80,11 +80,11 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./BODS.x86" servercfg="${servicename}.txt" servercfgdefault="config.txt" diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 234b2dba0..5f745f8ab 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -87,11 +87,11 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}/berimbau" -executabledir="${filesdir}" +systemdir="${serverfiles}/berimbau" +executabledir="${serverfiles}" executable="./srcds_run.sh" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 994ee8d8d..81dff0aa9 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -83,11 +83,11 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}/cure" -executabledir="${filesdir}" +systemdir="${serverfiles}/cure" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index 6fdaa8aaf..c3b731df1 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -16,7 +16,7 @@ ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" } #### LinuxGSM Settings #### @@ -70,11 +70,11 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./cod2_lnxded" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" @@ -86,7 +86,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/Logs" +gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index b992b08ed..a45271e22 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -16,7 +16,7 @@ ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" } #### LinuxGSM Settings #### @@ -70,11 +70,11 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./cod4x18_dedrun" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" @@ -86,7 +86,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/Logs" +gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index 5f6de5d88..ddb47ef23 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -16,7 +16,7 @@ ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" } #### LinuxGSM Settings #### @@ -53,8 +53,8 @@ engine="idtech3" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./cod_lnxded" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" @@ -66,7 +66,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/Logs" +gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 06e82f46a..3255a26f4 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -16,7 +16,7 @@ ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" } #### LinuxGSM Settings #### @@ -70,11 +70,11 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./coduo_lnxded" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" @@ -86,7 +86,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/Logs" +gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index dfef61085..d55129dab 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -16,7 +16,7 @@ ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" } #### LinuxGSM Settings #### @@ -70,11 +70,11 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./codwaw_lnxded" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" @@ -86,7 +86,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/Logs" +gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/coserver/_default.cfg b/lgsm/config-default/config-lgsm/coserver/_default.cfg index b5d2b700a..4ca937e3c 100644 --- a/lgsm/config-default/config-lgsm/coserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coserver/_default.cfg @@ -111,11 +111,11 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}/csco" -executabledir="${filesdir}" +systemdir="${serverfiles}/csco" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index 34d147e03..ac42430a4 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -83,11 +83,11 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}/cstrike" -executabledir="${filesdir}" +systemdir="${serverfiles}/cstrike" +executabledir="${serverfiles}" executable="./hlds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 1ee46b238..5536f7bed 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -12,7 +12,7 @@ echo "=================================" echo "Dependencies Checker" echo "=================================" echo "Checking directory: " -echo "${filesdir}" +echo "${serverfiles}" if [ "$(command -v eu-readelf 2>/dev/null)" ]; then readelf=eu-readelf elif [ "$(command -v readelf 2>/dev/null)" ]; then @@ -20,8 +20,8 @@ elif [ "$(command -v readelf 2>/dev/null)" ]; then else echo "readelf/eu-readelf not installed" fi -files=$(find ${filesdir} | wc -l) -find "${filesdir}" -type f -print0 | +files=$(find ${serverfiles} | wc -l) +find "${serverfiles}" -type f -print0 | while IFS= read -r -d $'\0' line; do if [ "${readelf}" == "eu-readelf" ]; then ${readelf} -d "${line}" 2>/dev/null|grep NEEDED|awk '{ print $4 }'|sed 's/\[//g;s/\]//g' >> "${tmpdir}/.depdetect_readelf" diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index f7591af22..43e33d8d3 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -45,16 +45,16 @@ if [ -n "${consolelogdir}" ]; then echo -ne "installing console log dir: ${consolelogdir}..." mkdir -p "${consolelogdir}" if [ $? -ne 0 ]; then - fn_print_fail_eol_nl - core_exit.sh + fn_print_fail_eol_nl + core_exit.sh else fn_print_ok_eol_nl fi echo -ne "creating console log: ${consolelog}..." touch "${consolelog}" if [ $? -ne 0 ]; then - fn_print_fail_eol_nl - core_exit.sh + fn_print_fail_eol_nl + core_exit.sh else fn_print_ok_eol_nl fi diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh index 84ca7264e..02692f9a2 100644 --- a/lgsm/functions/install_server_files.sh +++ b/lgsm/functions/install_server_files.sh @@ -85,7 +85,7 @@ fn_install_server_files_steamcmd(){ local exitcode=$? if [ "${gamename}" == "Classic Offensive" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid_co}" ${branch} +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid_co}" ${branch} +quit local exitcode=$? fi fi @@ -98,7 +98,7 @@ fn_install_server_files_steamcmd(){ local exitcode=$? if [ "${gamename}" == "Classic Offensive" ]; then - ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${filesdir}" +app_update "${appid_co}" ${branch} -validate +quit + ${unbuffer} ./steamcmd.sh +login "${steamuser}" "${steampass}" +force_install_dir "${serverfiles}" +app_update "${appid_co}" ${branch} -validate +quit local exitcode=$? fi fi From bdfc44e15cfbf98a04e45d2e8b831d15ae56f1c9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 18 May 2017 00:14:04 +0100 Subject: [PATCH 0788/1895] removed v option from ln --- lgsm/functions/install_logs.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index 43e33d8d3..c8c12c454 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -79,7 +79,7 @@ fi if [ -n "${gamelogdir}" ]; then if [ "${gamelogdir:0:${#logdir}}" != "${logdir}" ];then echo -ne "creating symlink to game log dir: ${gamelogdir} > ${logdir}/server..." - ln -nfsv "${gamelogdir}" "${logdir}/server" + ln -nfs "${gamelogdir}" "${logdir}/server" if [ $? -ne 0 ]; then fn_print_fail_eol_nl core_exit.sh @@ -93,7 +93,7 @@ fi if [ -d "${rootdir}/Steam/logs" ]; then if [ ! -L "${logdir}/steamcmd" ]; then echo -ne "creating symlink to steam log dir: ${rootdir}/Steam/logs > ${logdir}/steamcmd..." - ln -nfsv "${rootdir}/Steam/logs" "${logdir}/steamcmd" + ln -nfs "${rootdir}/Steam/logs" "${logdir}/steamcmd" if [ $? -ne 0 ]; then fn_print_fail_eol_nl core_exit.sh From f277f8b2825da89da51e9482926ed736669eb411 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Thu, 18 May 2017 00:22:06 +0100 Subject: [PATCH 0789/1895] corrected symlink message --- lgsm/functions/install_logs.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh index c8c12c454..31528050c 100644 --- a/lgsm/functions/install_logs.sh +++ b/lgsm/functions/install_logs.sh @@ -78,7 +78,7 @@ fi # log/server is in log/: symlink not created if [ -n "${gamelogdir}" ]; then if [ "${gamelogdir:0:${#logdir}}" != "${logdir}" ];then - echo -ne "creating symlink to game log dir: ${gamelogdir} > ${logdir}/server..." + echo -ne "creating symlink to game log dir: ${logdir}/server -> ${gamelogdir}..." ln -nfs "${gamelogdir}" "${logdir}/server" if [ $? -ne 0 ]; then fn_print_fail_eol_nl @@ -92,7 +92,7 @@ fi # If server uses SteamCMD create a symbolic link to the Steam logs if [ -d "${rootdir}/Steam/logs" ]; then if [ ! -L "${logdir}/steamcmd" ]; then - echo -ne "creating symlink to steam log dir: ${rootdir}/Steam/logs > ${logdir}/steamcmd..." + echo -ne "creating symlink to steam log dir: ${logdir}/steamcmd -> ${rootdir}/Steam/logs..." ln -nfs "${rootdir}/Steam/logs" "${logdir}/steamcmd" if [ $? -ne 0 ]; then fn_print_fail_eol_nl From 6a4444662d6ccb7c8e66d677eda5f3759769ac65 Mon Sep 17 00:00:00 2001 From: Scarsz Date: Sun, 21 May 2017 09:14:29 -0700 Subject: [PATCH 0790/1895] Fix typo in lgsm/functions README --- lgsm/functions/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lgsm/functions/README.md b/lgsm/functions/README.md index f18a8a161..01de5f0c7 100644 --- a/lgsm/functions/README.md +++ b/lgsm/functions/README.md @@ -1,11 +1,11 @@ -

    Linux Game Server Manager - Functions

    +# Linux Game Server Manager - Functions These functions are universal functions that work in all scripts. -

    Function Names

    +## Function Names Functions have been named to give an idea of what the function does. -* core: Essential functions that are will always run first. +* core: Essential functions that will always run first. * command: Primary command function. * check: Runs checks that will either halt on or fix an issue. * dev: development functions. From 0bfbdbc01fe662114459fc7aa5a195d617b08e0c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 May 2017 21:30:46 +0100 Subject: [PATCH 0791/1895] Got rid of double returns --- CONTRIBUTING.md | 5 +---- lgsm/functions/alert_email.sh | 3 --- lgsm/functions/command_backup.sh | 1 - lgsm/functions/command_details.sh | 1 - lgsm/functions/command_dev_detect_deps.sh | 2 -- lgsm/functions/command_monitor.sh | 1 - lgsm/functions/command_postdetails.sh | 1 - lgsm/functions/command_ts3_server_pass.sh | 2 -- lgsm/functions/core_dl.sh | 2 -- lgsm/functions/core_functions.sh | 7 ------- lgsm/functions/core_getopt.sh | 1 - lgsm/functions/fix.sh | 1 - lgsm/functions/gsquery.py | 1 - lgsm/functions/info_distro.sh | 1 - lgsm/functions/mods_core.sh | 2 -- lgsm/functions/update_factorio.sh | 1 - lgsm/functions/update_minecraft.sh | 1 - lgsm/functions/update_mta.sh | 1 - lgsm/functions/update_mumble.sh | 1 - lgsm/functions/update_steamcmd.sh | 1 - lgsm/functions/update_ts3.sh | 1 - linuxgsm.sh | 1 - 22 files changed, 1 insertion(+), 37 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fbbbb0430..0da1e4963 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,7 +36,4 @@ This will help us in understanding your code and determining where problems may Start reading our code and you'll get the hang of it. Explore how functions are organized and you'll see how we strive for readable code. Please give the following document a read and adjust your code according to its specifications. -[Syntax & Coding Conventions](https://github.com/GameServerManagers/LinuxGSM/wiki/Syntax-&-Conventions) - - - +[Syntax & Coding Conventions](https://github.com/GameServerManagers/LinuxGSM/wiki/Syntax-&-Conventions) \ No newline at end of file diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh index b017e0b63..ab6922d0f 100644 --- a/lgsm/functions/alert_email.sh +++ b/lgsm/functions/alert_email.sh @@ -16,7 +16,6 @@ fn_details_email(){ echo -e "${alertbody}" >> "${emaillog}" } - fn_details_os(){ # # Distro Details @@ -90,8 +89,6 @@ fn_details_disk(){ } | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"| tee -a "${emaillog}" > /dev/null 2>&1 } - - fn_details_gameserver(){ # # Quake Live Server Details diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh index 7448308cf..b99215f4a 100644 --- a/lgsm/functions/command_backup.sh +++ b/lgsm/functions/command_backup.sh @@ -63,7 +63,6 @@ fn_backup_init(){ fi } - # Check if server is started and wether to stop it fn_backup_stop_server(){ check_status.sh diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 5be6c9cc7..4fc5a7094 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -380,7 +380,6 @@ fn_details_statusbottom(){ echo -e "" } - # Engine Specific details fn_details_ark(){ diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh index 5536f7bed..e292264ba 100644 --- a/lgsm/functions/command_dev_detect_deps.sh +++ b/lgsm/functions/command_dev_detect_deps.sh @@ -73,10 +73,8 @@ while read lib; do unknownlib=1 echo "${lib}" >> "${tmpdir}/.depdetect_unknown" fi - done < "${tmpdir}/.depdetect_readelf_uniq" - sort "${tmpdir}/.depdetect_centos_list" | uniq >> "${tmpdir}/.depdetect_centos_list_uniq" sort "${tmpdir}/.depdetect_ubuntu_list" | uniq >> "${tmpdir}/.depdetect_ubuntu_list_uniq" sort "${tmpdir}/.depdetect_debian_list" | uniq >> "${tmpdir}/.depdetect_debian_list_uniq" diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index 0064ab439..cd12285cf 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -105,7 +105,6 @@ check.sh logs.sh info_config.sh - fn_monitor_check_lockfile fn_monitor_check_update fn_monitor_msg_checking diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh index e535e554c..414569381 100644 --- a/lgsm/functions/command_postdetails.sh +++ b/lgsm/functions/command_postdetails.sh @@ -107,7 +107,6 @@ if ! grep -q "^steamuser[= ]\"anonymous\"" "${tmpfile}" ; then sed -i -e 's/steamuser[= ]"[^"]*/steamuser "--stripped--/' "${tmpfile}" fi - if [ "${posttarget}" == "http://pastebin.com" ] ; then fn_print_dots "Posting details to pastbin.com for ${postexpire}" sleep 1 diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh index 964b93211..2e40691dd 100644 --- a/lgsm/functions/command_ts3_server_pass.sh +++ b/lgsm/functions/command_ts3_server_pass.sh @@ -9,7 +9,6 @@ local commandname="TS3-CHANGE-PASS" local commandaction="ServerAdmin Password Change" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" - fn_serveradmin_password_prompt(){ fn_print_header echo "Press \"CTRL+b d\" to exit console." @@ -23,7 +22,6 @@ fn_serveradmin_password_prompt(){ read -p "Enter new password : " newpassword } - fn_serveradmin_password_set(){ fn_print_info_nl "Starting server with new password..." fn_script_log_info "Starting server with new password" diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 13e9d8951..46cab72b5 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -154,7 +154,6 @@ fn_fetch_file(){ fi } - # GitHub file download functions # Used to simplify downloading specific files from GitHub @@ -236,7 +235,6 @@ fn_update_function(){ fn_fetch_file "${remote_fileurl}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}" } - # Defines curl path curl_paths_array=($(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl) for curlpath in "${curl_paths_array}" diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh index b95ef9e66..31e8987e1 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -49,7 +49,6 @@ functionfile="${FUNCNAME}" fn_fetch_function } - # Commands command_console.sh(){ @@ -226,7 +225,6 @@ functionfile="${FUNCNAME}" fn_fetch_function } - # Compress compress_unreal2_maps.sh(){ @@ -273,7 +271,6 @@ functionfile="${FUNCNAME}" fn_fetch_function } - # Fix fix.sh(){ @@ -368,7 +365,6 @@ functionfile="${FUNCNAME}" fn_fetch_function } - # Alert alert.sh(){ @@ -393,7 +389,6 @@ functionfile="${FUNCNAME}" fn_fetch_function } - # Monitor monitor_gsquery.sh(){ @@ -401,7 +396,6 @@ functionfile="${FUNCNAME}" fn_fetch_function } - # Update command_update_functions.sh(){ @@ -454,7 +448,6 @@ functionfile="${FUNCNAME}" fn_fetch_function } - # ## Installer functions # diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index 391b47665..470a4fb69 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -71,7 +71,6 @@ fi #Backup currentopt+=( "${cmd_backup[@]}" ) - # Exclude games without a console if [ "${gamename}" != "TeamSpeak 3" ]; then currentopt+=( "${cmd_console[@]}" "${cmd_debug[@]}" ) diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh index 250709cca..3f18a685b 100644 --- a/lgsm/functions/fix.sh +++ b/lgsm/functions/fix.sh @@ -36,7 +36,6 @@ fn_fix_msg_end(){ fi } - # Fixes that are run on start if [ "${function_selfname}" != "command_install.sh" ]; then if [ -n "${appid}" ]; then diff --git a/lgsm/functions/gsquery.py b/lgsm/functions/gsquery.py index 05d18f9fc..e1f5c3f77 100644 --- a/lgsm/functions/gsquery.py +++ b/lgsm/functions/gsquery.py @@ -76,7 +76,6 @@ class PythonGSQ: if not self.option.port: self.fatal_error('No port supplied.', 4) - if __name__ == '__main__': parser = optparse.OptionParser( usage='usage: python %prog [options]', diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh index c8253f295..0c2c770a3 100644 --- a/lgsm/functions/info_distro.sh +++ b/lgsm/functions/info_distro.sh @@ -54,7 +54,6 @@ minutes=$(( uptime/60%60 )) hours=$(( uptime/60/60%24 )) days=$(( uptime/60/60/24 )) - ### Performance information ## Average server load diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh index b5bf221fc..62d08ef1d 100644 --- a/lgsm/functions/mods_core.sh +++ b/lgsm/functions/mods_core.sh @@ -16,8 +16,6 @@ extractdir="${modstmpdir}/extract" modsinstalledlist="installed-mods.txt" modsinstalledlistfullpath="${modsdir}/${modsinstalledlist}" - - ## Installation # Download management diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh index 3d0a73357..b39a4f86b 100644 --- a/lgsm/functions/update_factorio.sh +++ b/lgsm/functions/update_factorio.sh @@ -151,7 +151,6 @@ fn_update_factorio_compare(){ fi } - fn_update_factorio_arch if [ "${installer}" == "1" ]; then fn_update_factorio_availablebuild diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh index b28700fef..00fa96a08 100644 --- a/lgsm/functions/update_minecraft.sh +++ b/lgsm/functions/update_minecraft.sh @@ -144,7 +144,6 @@ fn_update_compare(){ fi } - if [ "${installer}" == "1" ]; then fn_update_availablebuild fn_update_dl diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh index 72aaf65ec..2afc94abd 100644 --- a/lgsm/functions/update_mta.sh +++ b/lgsm/functions/update_mta.sh @@ -139,7 +139,6 @@ fn_update_mta_compare(){ fi } - if [ "${installer}" == "1" ]; then fn_mta_get_availablebuild fn_update_mta_dl diff --git a/lgsm/functions/update_mumble.sh b/lgsm/functions/update_mumble.sh index b16ea69c4..9f2ee5629 100644 --- a/lgsm/functions/update_mumble.sh +++ b/lgsm/functions/update_mumble.sh @@ -151,7 +151,6 @@ fn_update_mumble_compare(){ fi } - fn_update_mumble_arch if [ "${installer}" == "1" ]; then fn_update_mumble_availablebuild diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh index 1b09f3295..ff9cd8672 100644 --- a/lgsm/functions/update_steamcmd.sh +++ b/lgsm/functions/update_steamcmd.sh @@ -229,7 +229,6 @@ fn_update_steamcmd_check(){ fi } - if [ "${engine}" == "goldsource" ]||[ "${forceupdate}" == "1" ]; then # Goldsource servers bypass checks as fn_update_steamcmd_check does not work for appid 90 servers. # forceupdate bypasses checks diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh index 982d7aecb..7ecd3d202 100644 --- a/lgsm/functions/update_ts3.sh +++ b/lgsm/functions/update_ts3.sh @@ -178,7 +178,6 @@ fn_update_ts3_compare(){ fi } - fn_update_ts3_arch if [ "${installer}" == "1" ]; then fn_update_ts3_availablebuild diff --git a/linuxgsm.sh b/linuxgsm.sh index 01da46b56..0d52bec24 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -34,7 +34,6 @@ configdir="${lgsmdir}/config-lgsm" configdirserver="${configdir}/${servername}" configdirdefault="${lgsmdir}/config-default" - ## GitHub Branch Select # Allows for the use of different function files # from a different repo and/or branch. From 21eed95f9f9718be288c7ec8c97c70b3fa51e287 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Fri, 26 May 2017 22:04:48 +0100 Subject: [PATCH 0792/1895] Uploading all configs Not fully tested yet --- .../config-lgsm/arkserver/_default.cfg | 4 +- .../config-lgsm/bb2server/_default.cfg | 25 +--- .../config-lgsm/bf1942server/_default.cfg | 98 +-------------- .../config-lgsm/bmdmserver/_default.cfg | 28 +---- .../config-lgsm/boserver/_default.cfg | 24 +--- .../config-lgsm/bsserver/_default.cfg | 26 +--- .../config-lgsm/ccserver/_default.cfg | 25 +--- .../config-lgsm/cod2server/_default.cfg | 28 +---- .../config-lgsm/cod4server/_default.cfg | 28 +---- .../config-lgsm/codserver/_default.cfg | 6 +- .../config-lgsm/coduoserver/_default.cfg | 30 +---- .../config-lgsm/codwawserver/_default.cfg | 28 +---- .../config-lgsm/coserver/_default.cfg | 37 ++---- .../config-lgsm/csczserver/_default.cfg | 94 ++++++++++++++ .../config-lgsm/csgoserver/_default.cfg | 26 ++-- .../config-lgsm/csserver/_default.cfg | 28 +---- .../config-lgsm/cssserver/_default.cfg | 96 ++++++++++++++ .../config-lgsm/dabserver/_default.cfg | 91 ++++++++++++++ .../config-lgsm/dmcserver/_default.cfg | 91 ++++++++++++++ .../config-lgsm/dodserver/_default.cfg | 91 ++++++++++++++ .../config-lgsm/dodsserver/_default.cfg | 91 ++++++++++++++ .../config-lgsm/doiserver/_default.cfg | 93 ++++++++++++++ .../config-lgsm/dstserver/_default.cfg | 101 +++++++++++++++ .../config-lgsm/emserver/_default.cfg | 96 ++++++++++++++ .../config-lgsm/fctrserver/_default.cfg | 80 ++++++++++++ .../config-lgsm/fofserver/_default.cfg | 91 ++++++++++++++ .../config-lgsm/gesserver/_default.cfg | 90 +++++++++++++ .../config-lgsm/gmodserver/_default.cfg | 107 ++++++++++++++++ .../config-lgsm/hl2dmserver/_default.cfg | 91 ++++++++++++++ .../config-lgsm/hldmserver/_default.cfg | 90 +++++++++++++ .../config-lgsm/hldmsserver/_default.cfg | 91 ++++++++++++++ .../config-lgsm/hwserver/_default.cfg | 114 +++++++++++++++++ .../config-lgsm/insserver/_default.cfg | 93 ++++++++++++++ .../config-lgsm/jc2server/_default.cfg | 83 ++++++++++++ .../config-lgsm/kfserver/_default.cfg | 96 ++++++++++++++ .../config-lgsm/l4d2server/_default.cfg | 90 +++++++++++++ .../config-lgsm/l4dserver/_default.cfg | 90 +++++++++++++ .../config-lgsm/mcserver/_default.cfg | 85 +++++++++++++ .../config-lgsm/mtaserver/_default.cfg | 80 ++++++++++++ .../config-lgsm/mumbleserver/_default.cfg | 75 +++++++++++ .../config-lgsm/nmrihserver/_default.cfg | 96 ++++++++++++++ .../config-lgsm/ns2cserver/_default.cfg | 101 +++++++++++++++ .../config-lgsm/ns2server/_default.cfg | 101 +++++++++++++++ .../config-lgsm/opforserver/_default.cfg | 91 ++++++++++++++ .../config-lgsm/pcserver/_default.cfg | 84 +++++++++++++ .../config-lgsm/pvkiiserver/_default.cfg | 91 ++++++++++++++ .../config-lgsm/pzserver/_default.cfg | 86 +++++++++++++ .../config-lgsm/q2server/_default.cfg | 77 ++++++++++++ .../config-lgsm/q3server/_default.cfg | 77 ++++++++++++ .../config-lgsm/qlserver/_default.cfg | 88 +++++++++++++ .../config-lgsm/qwserver/_default.cfg | 76 +++++++++++ .../config-lgsm/ricochetserver/_default.cfg | 110 ++++++++++++++++ .../config-lgsm/roserver/_default.cfg | 103 +++++++++++++++ .../config-lgsm/rustserver/_default.cfg | 119 ++++++++++++++++++ .../config-lgsm/sbserver/_default.cfg | 90 +++++++++++++ .../config-lgsm/sdtdserver/_default.cfg | 4 +- .../config-lgsm/ss3server/_default.cfg | 88 +++++++++++++ .../config-lgsm/svenserver/_default.cfg | 90 +++++++++++++ .../config-lgsm/terrariaserver/_default.cfg | 89 +++++++++++++ .../config-lgsm/tf2server/_default.cfg | 96 ++++++++++++++ .../config-lgsm/tfcserver/_default.cfg | 91 ++++++++++++++ .../config-lgsm/ts3server/_default.cfg | 68 ++++++++++ .../config-lgsm/tuserver/_default.cfg | 88 +++++++++++++ .../config-lgsm/twserver/_default.cfg | 90 +++++++++++++ .../config-lgsm/ut2k4server/_default.cfg | 78 ++++++++++++ .../config-lgsm/ut3server/_default.cfg | 89 +++++++++++++ .../config-lgsm/ut99server/_default.cfg | 77 ++++++++++++ .../config-lgsm/utserver/_default.cfg | 79 ++++++++++++ .../config-lgsm/wetserver/_default.cfg | 72 +++++++++++ tests/tests_jc2server.sh | 10 -- tests/tests_ts3server.sh | 10 -- 71 files changed, 4848 insertions(+), 392 deletions(-) create mode 100644 lgsm/config-default/config-lgsm/csczserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/cssserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/dabserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/dmcserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/dodserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/dodsserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/doiserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/dstserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/emserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/fctrserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/fofserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/gesserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/gmodserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/hldmserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/hldmsserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/hwserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/insserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/jc2server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/kfserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/l4d2server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/l4dserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/mcserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/mtaserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/mumbleserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/nmrihserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/ns2cserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/ns2server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/opforserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/pcserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/pzserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/q2server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/q3server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/qlserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/qwserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/ricochetserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/roserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/rustserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/sbserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/ss3server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/svenserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/terrariaserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/tf2server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/tfcserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/ts3server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/tuserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/twserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/ut2k4server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/ut3server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/ut99server/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/utserver/_default.cfg create mode 100644 lgsm/config-default/config-lgsm/wetserver/_default.cfg diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg index ec10b2529..b8cdf0c69 100644 --- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg @@ -9,11 +9,11 @@ #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" port="7777" queryport="27015" rconport="27020" maxplayers="70" -ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ @@ -87,4 +87,4 @@ emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg index 5e31e6304..148e261c9 100644 --- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg @@ -9,12 +9,12 @@ #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="bba_barracks" -maxplayers="20" +ip="0.0.0.0" port="27015" -sourcetvport="27020" clientport="27005" -ip="0.0.0.0" +sourcetvport="27020" +defaultmap="bba_barracks" +maxplayers="20" ## Optional: Game Server Login Token # GSLT can be used for running a public server. @@ -62,13 +62,6 @@ appid="475370" # Example: "-beta latest_experimental" branch="" -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - ## LinuxGSM Server Details # Do not edit gamename="BrainBread 2" @@ -80,16 +73,6 @@ servicename="bb2-server" #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}/brainbread2" executabledir="${serverfiles}" diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg index 05ac58284..1ed6d40e2 100644 --- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg +++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg @@ -39,15 +39,7 @@ stoponbackup="on" consolelogging="on" logdays="7" - -#### Advanced Variables #### - -# Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" +#### LinuxGSM Advanced Settings #### ## LinuxGSM Server Details # Do not edit @@ -60,16 +52,6 @@ servicename="bf1942-server" #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}" executabledir="${systemdir}" @@ -93,80 +75,4 @@ emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" - -######################## -######## Script ######## -###### Do not edit ##### -######################## - -# 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 -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_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_fetch_core_dl -} - -# Prevent from running this script as root. -if [ "$(whoami)" = "root" ]; then - if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then - echo "[ FAIL ] Do NOT run this script as root!" - exit 1 - else - core_functions.sh - check_root.sh - fi -fi - -core_dl.sh -core_functions.sh -getopt=$1 -core_getopt.sh +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg index d4c669c82..8b0115281 100644 --- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg @@ -9,12 +9,12 @@ #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="dm_bounce" -maxplayers="16" +ip="0.0.0.0" port="27015" -sourcetvport="27020" clientport="27005" -ip="0.0.0.0" +sourcetvport="27020" +defaultmap="dm_bounce" +maxplayers="16" ## Optional: Game Server Login Token # GSLT can be used for running a public server. @@ -54,13 +54,6 @@ logdays="7" #### LinuxGSM Advanced Settings #### -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - ## SteamCMD Settings # Server appid appid="346680" @@ -80,16 +73,6 @@ servicename="bmdm-server" #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}/bms" executabledir="${serverfiles}" @@ -99,7 +82,6 @@ servercfgdefault="server.cfg" servercfgdir="${systemdir}/cfg" servercfgfullpath="${servercfgdir}/${servercfg}" - ## Backup Directory backupdir="${rootdir}/backups" @@ -114,4 +96,4 @@ emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg index 267e71cbd..d08358669 100644 --- a/lgsm/config-default/config-lgsm/boserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg @@ -13,6 +13,7 @@ # More info: https://gameservermanagers.com/gslt gslt="" ip="" + ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ parms=" -batchmode -nographics -dedicated -configfile=${servercfgfullpath}" @@ -46,13 +47,6 @@ logdays="7" #### LinuxGSM Advanced Settings #### -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - ## SteamCMD Settings # Server appid appid="416880" @@ -66,22 +60,9 @@ branch="" gamename="Ballistic Overkill" engine="unity3d" -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="bo-server" - #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" @@ -91,7 +72,6 @@ servercfgdefault="config.txt" servercfgdir="${systemdir}" servercfgfullpath="${servercfgdir}/${servercfg}" - ## Backup Directory backupdir="${rootdir}/backups" @@ -106,4 +86,4 @@ emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg index 5f745f8ab..0dc2fafd7 100644 --- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg @@ -13,12 +13,12 @@ steamuser="username" steampass='password' ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="duel_winter" -maxplayers="16" +ip="0.0.0.0" port="27015" -sourcetvport="27020" clientport="27005" -ip="0.0.0.0" +sourcetvport="27020" +defaultmap="duel_winter" +maxplayers="16" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ @@ -61,13 +61,6 @@ appid="228780" # Example: "-beta latest_experimental" branch="" -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - ## LinuxGSM Server Details # Do not edit gamename="Blade Symphony" @@ -79,16 +72,6 @@ servicename="bs-server" #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}/berimbau" executabledir="${serverfiles}" @@ -110,5 +93,6 @@ lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" +## Logs Naming lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg index 81dff0aa9..8293759d4 100644 --- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg @@ -9,12 +9,12 @@ #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="cbe_bunker" -maxplayers="6" +ip="0.0.0.0" port="27015" -sourcetvport="27020" clientport="27005" -ip="0.0.0.0" +sourcetvport="27020" +defaultmap="cbe_bunker" +maxplayers="6" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ @@ -57,13 +57,6 @@ appid="383410" # Example: "-beta latest_experimental" branch="" -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - ## LinuxGSM Server Details # Do not edit gamename="Codename CURE" @@ -75,16 +68,6 @@ servicename="cc-server" #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}/cure" executabledir="${serverfiles}" diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg index c3b731df1..b9a083c06 100644 --- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg @@ -9,10 +9,10 @@ #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="mp_leningrad" -maxclients="20" -port="28960" ip="0.0.0.0" +port="28960" +defaultmap="mp_leningrad" +maxplayers="20" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ @@ -42,36 +42,16 @@ stoponbackup="on" consolelogging="on" logdays="7" -#### Advanced Variables #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" +#### LinuxGSM Advanced Settings #### ## LinuxGSM Server Details # Do not edit gamename="Call of Duty 2" engine="iw2.0" -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="cod2-server" - #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg index a45271e22..7da88f5b0 100644 --- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg @@ -9,10 +9,10 @@ #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="mp_crossfire" -maxclients="32" -port="28960" ip="0.0.0.0" +port="28960" +defaultmap="mp_crossfire" +maxplayers="32" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ @@ -42,36 +42,16 @@ stoponbackup="on" consolelogging="on" logdays="7" -#### Advanced Variables #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" +#### LinuxGSM Advanced Settings #### ## LinuxGSM Server Details # Do not edit gamename="Call of Duty 4" engine="iw3.0" -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="cod4-server" - #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg index ddb47ef23..a816d6497 100644 --- a/lgsm/config-default/config-lgsm/codserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg @@ -9,10 +9,10 @@ #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="mp_neuville" -maxclients="20" -port="28960" ip="0.0.0.0" +port="28960" +defaultmap="mp_neuville" +maxplayers="20" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg index 3255a26f4..2d2036114 100644 --- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg @@ -9,14 +9,14 @@ #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="mp_cassino" -maxclients="20" -port="28960" ip="0.0.0.0" +port="28960" +defaultmap="mp_cassino" +maxplayers="20" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxclients} +exec ${servercfg} +map ${defaultmap}" +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 1 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}" } #### LinuxGSM Settings #### @@ -42,36 +42,16 @@ stoponbackup="on" consolelogging="on" logdays="7" -#### Advanced Variables #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" +#### LinuxGSM Advanced Settings #### ## LinuxGSM Server Details # Do not edit gamename="Call of Duty: United Offensive" engine="idtech3" -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="coduo-server" - #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg index d55129dab..d78b890e9 100644 --- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg @@ -9,10 +9,10 @@ #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="mp_castle" -maxclients="20" -port="28960" ip="0.0.0.0" +port="28960" +defaultmap="mp_castle" +maxplayers="20" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ @@ -42,36 +42,16 @@ stoponbackup="on" consolelogging="on" logdays="7" -#### Advanced Variables #### - -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" +#### LinuxGSM Advanced Settings #### ## LinuxGSM Server Details # Do not edit gamename="Call of Duty: World at War" engine="iw3.0" -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="codwaw-server" - #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" diff --git a/lgsm/config-default/config-lgsm/coserver/_default.cfg b/lgsm/config-default/config-lgsm/coserver/_default.cfg index 4ca937e3c..414f7683f 100644 --- a/lgsm/config-default/config-lgsm/coserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/coserver/_default.cfg @@ -10,22 +10,22 @@ ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters # https://developer.valvesoftware.com/wiki/Counter-Strike:_Global_Offensive_Dedicated_Servers#Starting_the_Server -# [Game Modes] gametype gamemode +# [Game Modes] gametype gamemode # Arms Race 1 0 -# Classic Casual 0 0 -# Classic Competitive 0 1 -# Demolition 1 1 -# Deathmatch 1 2 +# Classic Casual 0 0 +# Classic Competitive 0 1 +# Demolition 1 1 +# Deathmatch 1 2 gametype="0" gamemode="0" -defaultmap="de_mirage" mapgroup="mg_active" -maxplayers="16" -tickrate="64" +ip="0.0.0.0" port="27015" -sourcetvport="27020" clientport="27005" -ip="0.0.0.0" +sourcetvport="27020" +defaultmap="de_mirage" +maxplayers="16" +tickrate="64" ## Required: Game Server Login Token # GSLT is required for running a public server. @@ -85,13 +85,6 @@ branch="" steamuser="username" steampass='password' -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - ## LinuxGSM Server Details # Do not edit gamename="Classic Offensive" @@ -103,16 +96,6 @@ servicename="co-server" #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}/csco" executabledir="${serverfiles}" diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg new file mode 100644 index 000000000..b1a3ea20a --- /dev/null +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -0,0 +1,94 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +defaultmap="de_dust2" +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game czero -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="90" +appidmod="czero" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Counter-Strike: Condition Zero" +engine="goldsource" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="cscz-server" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/czero" +executabledir="${filesdir}" +executable="./hlds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg index 8859f933b..d9fdeb74c 100644 --- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg @@ -3,29 +3,29 @@ ################################## # DO NOT EDIT WILL BE OVERWRITTEN! # Copy settings from here and use them in either -# common.cfg - applys settings to every instance -# [instance].cfg - applys settings to specific instance +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters # https://developer.valvesoftware.com/wiki/Counter-Strike:_Global_Offensive_Dedicated_Servers#Starting_the_Server -# [Game Modes] gametype gamemode -# Arms Race 1 0 -# Classic Casual 0 0 -# Classic Competitive 0 1 -# Demolition 1 1 -# Deathmatch 1 2 +# [Game Modes] gametype gamemode +# Arms Race 1 0 +# Classic Casual 0 0 +# Classic Competitive 0 1 +# Demolition 1 1 +# Deathmatch 1 2 gametype="0" gamemode="0" -defaultmap="de_mirage" mapgroup="mg_active" +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="de_mirage" maxplayers="16" tickrate="64" -port="27015" -sourcetvport="27016" -clientport="27017" -ip="0.0.0.0" ## Required: Game Server Login Token # GSLT is required for running a public server. diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg index ac42430a4..4b46221d8 100644 --- a/lgsm/config-default/config-lgsm/csserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg @@ -9,11 +9,11 @@ #### Server Settings #### ## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters -defaultmap="de_dust2" -maxplayers="16" +ip="0.0.0.0" port="27015" clientport="27005" -ip="0.0.0.0" +defaultmap="de_dust2" +maxplayers="16" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ @@ -46,7 +46,7 @@ stoponbackup="on" consolelogging="on" logdays="7" -#### Advanced Variables #### +#### LinuxGSM Advanced Settings #### ## SteamCMD Settings # Server appid @@ -57,34 +57,14 @@ appidmod="cstrike" # Example: "-beta latest_experimental" branch="" -## Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="LinuxGSM" -githubbranch="master" - ## LinuxGSM Server Details # Do not edit gamename="Counter-Strike 1.6" engine="goldsource" -## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers -servicename="cs-server" - #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}/cstrike" executabledir="${serverfiles}" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg new file mode 100644 index 000000000..4d898a416 --- /dev/null +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -0,0 +1,96 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="de_dust2" +maxplayers="16" + +## Required: Game Server Login Token +# GSLT is required for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game cstrike -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +sv_setsteamaccount ${gslt} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="232330" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Counter-Strike: Source" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/cstrike" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg new file mode 100644 index 000000000..276b112f3 --- /dev/null +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -0,0 +1,91 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="da_rooftops" +maxplayers="10" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="317800" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Double Action: Boogaloo" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/dab" +executabledir="${filesdir}" +executable="./dabds.sh" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg new file mode 100644 index 000000000..2bf28c698 --- /dev/null +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -0,0 +1,91 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +defaultmap="dcdm5" +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game dmc -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="90" +appidmod="dmc" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Deathmatch Classic" +engine="goldsource" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/dmc" +executabledir="${filesdir}" +executable="./hlds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg new file mode 100644 index 000000000..b943c41a3 --- /dev/null +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -0,0 +1,91 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +defaultmap="dod_Anzio" +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game dod -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="90" +appidmod="dod" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Day of Defeat" +engine="goldsource" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/dod" +executabledir="${filesdir}" +executable="./hlds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg new file mode 100644 index 000000000..f40ef5451 --- /dev/null +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -0,0 +1,91 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="dod_Anzio" +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game dod -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="232290" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Day of Defeat: Source" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/dod" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg new file mode 100644 index 000000000..6652f72d9 --- /dev/null +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -0,0 +1,93 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="bastogne" +maxplayers="16" +tickrate="64" +workshop="0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game doi -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} +sv_workshop_enabled ${workshop}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="462310" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Day of Infamy" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/doi" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg new file mode 100644 index 000000000..204b9443a --- /dev/null +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -0,0 +1,101 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Installation Variables | https://github.com/GameServerManagers/LinuxGSM/wiki/Don't-Starve-Together +sharding="false" +master="true" +shard="Master" +cluster="Cluster_1" +cave="false" + +# Edit with care +persistentstorageroot="${HOME}/.klei" +confdir="DoNotStarveTogether" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-persistent_storage_root ${persistentstorageroot} -conf_dir ${confdir} -cluster ${cluster} -shard ${shard}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="343050" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Don't Starve Together" +engine="dontstarve" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="dst-server-${shard}" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}/bin" +executable="./dontstarve_dedicated_server_nullrenderer" +clustercfg="cluster.ini" +clustercfgdir="${persistentstorageroot}/${confdir}/${cluster}" +clustercfgfullpath="${clustercfgdir}/${clustercfg}" +clustercfgdefault="cluster.ini" +servercfg="server.ini" +servercfgdir="${clustercfgdir}/${shard}" +servercfgfullpath="${servercfgdir}/${servercfg}" +servercfgdefault="server.ini" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg new file mode 100644 index 000000000..4faa1aeb6 --- /dev/null +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -0,0 +1,96 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="emp_district" +maxplayers="62" + +## Optional: Game Server Login Token +# GSLT can be used for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game empires -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="460040" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Empires Mod" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/empires" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg new file mode 100644 index 000000000..a7b0da679 --- /dev/null +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -0,0 +1,80 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="34197" +rconport="34198" +rconpassword="CHANGE_ME" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="--start-server ${filesdir}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## LinuxGSM Server Details +# Do not edit +gamename="Factorio" +engine="factorio" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}/bin/x64" +executable="./factorio" +servercfg="${servicename}.json" +servercfgdefault="server-settings.json" +servercfgdir="${filesdir}/data" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${filesdir}" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg new file mode 100644 index 000000000..3d9b9f977 --- /dev/null +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -0,0 +1,91 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="fof_depot" +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game fof -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="295230" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Fistful of Frags" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/fof" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg new file mode 100644 index 000000000..f469b6ab8 --- /dev/null +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -0,0 +1,90 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="ge_archives" +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game gesource -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="310" # Source 2007 SDK +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="GoldenEye: Source" +engine="source" +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/gesource" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg new file mode 100644 index 000000000..2a57cf06f --- /dev/null +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -0,0 +1,107 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="gm_construct" +maxplayers="16" +tickrate="66" +gamemode="sandbox" + +## Workshop Parameters | http://wiki.garrysmod.com/page/Workshop_for_Dedicated_Servers +workshopauth="" +workshopcollectionid="" + +## 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. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +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}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="4020" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Garry's Mod" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/garrysmod" +addonsdir="${systemdir}/addons" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg new file mode 100644 index 000000000..ec4ecd9e5 --- /dev/null +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -0,0 +1,91 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="dm_lockdown" +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game hl2mp -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="232370" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Half Life 2: Deathmatch" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/hl2mp" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg new file mode 100644 index 000000000..7f01e865d --- /dev/null +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -0,0 +1,90 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +defaultmap="crossfire" +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game valve -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="90" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Half Life: Deathmatch" +engine="goldsource" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/valve" +executabledir="${filesdir}" +executable="./hlds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg new file mode 100644 index 000000000..ba4144d2c --- /dev/null +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -0,0 +1,91 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="crossfire" +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game hl1mp -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="255470" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Half-Life Deathmatch: Source" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/hl1mp" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg new file mode 100644 index 000000000..8049ebde7 --- /dev/null +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -0,0 +1,114 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +servername="Hurtworld LinuxGSM Server" +ip="0.0.0.0" +port="12871" +queryport="12881" +maxplayers="20" +map="" #Optional +creativemode="0" #Free Build: creativemode="1" +logfile="gamelog.txt" + +## Adding admins using STEAMID64 +# Example : addadmin 012345678901234567; addadmin 987654321098765432 +admins="" + +## Advanced Server Start Settings +# Rollback server state (remove after start command) +loadsave="" +# Use unstable 64 bit server executable (O/1) +x64mode="0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +# Edit with care | 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}\" " +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="405100" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Hurtworld" +engine="unity3d" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname=$(basename $(readlink -f "${BASH_SOURCE[0]}")) +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +if [ "${x64mode}" == "1" ]; then + executable="./Hurtworld.x86_64" +else + executable="./Hurtworld.x86" +fi + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${rootdir}/log/server" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg new file mode 100644 index 000000000..c8918645d --- /dev/null +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -0,0 +1,93 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="ministry" +maxplayers="16" +tickrate="64" +workshop="0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game insurgency -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -tickrate ${tickrate} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} +sv_workshop_enabled ${workshop} -norestart" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="237410" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Insurgency" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/insurgency" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg new file mode 100644 index 000000000..3d358bc2b --- /dev/null +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -0,0 +1,83 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="261140" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Just Cause 2" +engine="avalanche" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./Jcmp-Server" +servercfg="config.lua" +servercfgdefault="config.lua" +servercfgdir="${filesdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +#gamelogdir="" # No server logs available +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg new file mode 100644 index 000000000..6142eb4ec --- /dev/null +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -0,0 +1,96 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="KF-BioticsLab.rom" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="server ${defaultmap}?game=KFmod.KFGameType?VACSecured=true -nohomedir ini=${servercfg} log=${gamelog}" + +# Server Start Command for Objective mode +#defaultmap="KFO-Steamland" +#parms="server ${defaultmap}?Game=KFStoryGame.KFStoryGame?VACSecured=true -nohomedir ini=${servercfg} log=${gamelog}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="215360" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Killing Floor" +engine="unreal2" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/System" +executabledir="${systemdir}" +executable="./ucc-bin" +servercfg="${servicename}.ini" +servercfgdefault="Default.ini" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" +compressedmapsdir="${rootdir}/Maps-Compressed" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${rootdir}/log/server" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg new file mode 100644 index 000000000..9c9046c02 --- /dev/null +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -0,0 +1,90 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +defaultmap="c5m1_waterfront" +maxplayers="8" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game left4dead2 -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="222860" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Left 4 Dead 2" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/left4dead2" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg new file mode 100644 index 000000000..73c940e20 --- /dev/null +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -0,0 +1,90 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +defaultmap="l4d_hospital01_apartment" +maxplayers="8" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game left4dead -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="222840" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Left 4 Dead" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/left4dead" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg new file mode 100644 index 000000000..c23547386 --- /dev/null +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -0,0 +1,85 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +javaram="1024" # -Xmx$1024M + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="nogui" +} +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## LinuxGSM Server Details +# Do not edit +gamename="Minecraft" +engine="lwjgl2" + +#### Directories #### +# Edit with care + +## Work Directories +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" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="java -Xmx${javaram}M -jar ${filesdir}/minecraft_server.jar" +servercfg="server.properties" +servercfgdefault="server.properties" +servercfgdir="${filesdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg new file mode 100644 index 000000000..e78730fb6 --- /dev/null +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -0,0 +1,80 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +# Edit with care +fn_parms(){ +parms=" " +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +# Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="linuxgsm" +githubbranch="master" + +## LinuxGSM Server Details +# Do not edit +gamename="Multi Theft Auto" +engine="renderware" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +resourcesdir="${systemdir}/mods/deathmatch/resources" +executabledir="${systemdir}" +executable="./mta-server64" +servercfg="mtaserver.conf" +servercfgdir="${systemdir}/mods/deathmatch" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${filesdir}/mods/deathmatch/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg new file mode 100644 index 000000000..aece97398 --- /dev/null +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -0,0 +1,75 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### +# Use .ini config file for Mumble (Murmur) server. + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-fg -ini ${servercfgfullpath}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## LinuxGSM Server Details +# Do not edit +gamename="Mumble" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./murmur.x86" +servercfg="${servicename}.ini" +servercfgdefault="murmur.ini" +servercfgdir="${filesdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${rootdir}/log" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg new file mode 100644 index 000000000..e033af129 --- /dev/null +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -0,0 +1,96 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="nmo_broadway" +maxplayers="8" + +## Optional: Game Server Login Token +# GSLT can be used for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game nmrih -insecure -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="317670" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="No More Room in Hell" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/nmrih" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg new file mode 100644 index 000000000..c639687d9 --- /dev/null +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -0,0 +1,101 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +defaultmap="co_core" +maxplayers="24" +servername="NS2C Server" +webadminuser="admin" +webadminpass="admin" +webadminport="8080" +mods="" +password="" +# Add the following line to the parms if you want a private server. Ensuring +# that the password variable above is not left empty. +# -password \"${password}\" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +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}\"" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="313900" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="NS2: Combat" +engine="spark" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}/ia32" +executable="./ns2combatserver_linux32" +servercfgdir="${rootdir}/server1" +servercfgfullpath="${servercfgdir}" +modstoragedir="${servercfgdir}/Workshop" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg new file mode 100644 index 000000000..6da890e07 --- /dev/null +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -0,0 +1,101 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +defaultmap="ns2_summit" +maxplayers="24" +servername="NS2 Server" +webadminuser="admin" +webadminpass="admin" +webadminport="8080" +mods="" +password="" +# Add the following line to the parms if you want a private server. Ensuring +# that the password variable above is not left empty. +# -password \"${password}\" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-name \"${servername}\" -port ${port} -webadmin -webdomain ${ip} -webuser ${webadminuser} -webpassword \"${webadminpass}\" -webport ${webadminport} -map ${defaultmap} -limit ${maxplayers} -config_path \"${servercfgdir}\" -logdir \"${gamelogdir}\" -modstorage \"${modstoragedir}\" -mods \"${mods}\"" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="4940" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Natural Selection 2" +engine="spark" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./server_linux32" +servercfgdir="${rootdir}/server1" +servercfgfullpath="${servercfgdir}" +modstoragedir="${servercfgdir}/Workshop" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg new file mode 100644 index 000000000..a61a4b4d2 --- /dev/null +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -0,0 +1,91 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +defaultmap="op4_bootcamp" +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game gearbox -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" +} + +### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="90" +appidmod="gearbox" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Half-Life: Opposing Force" +engine="goldsource" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/gearbox" +executabledir="${filesdir}" +executable="./hlds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg new file mode 100644 index 000000000..e0398c448 --- /dev/null +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -0,0 +1,84 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +# Notification Alerts +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="--config ${servercfg}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="332670" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Project Cars" +engine="madness" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./DedicatedServerCmd" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg new file mode 100644 index 000000000..32888b654 --- /dev/null +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -0,0 +1,91 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="bt_island" +maxplayers="24" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game pvkii -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="17575" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Pirates, Vikings, and Knights II" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/pvkii" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg new file mode 100644 index 000000000..004bb6378 --- /dev/null +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -0,0 +1,86 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +adminpassword="CHANGE_ME" + +fn_parms(){ +parms="-ip ${ip} -adminpassword \"${adminpassword}\" -servername ${servicename}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="380870" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Project Zomboid" +engine="projectzomboid" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./start-server.sh" +servercfg="${servicename}.ini" +servercfgdefault="server.ini" +servercfgdir="${HOME}/Zomboid/Server" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${HOME}/Zomboid/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg new file mode 100644 index 000000000..5abcaa974 --- /dev/null +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -0,0 +1,77 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27910" +defaultmap="q2dm1" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="+set dedicated 1 +set ip ${ip} +set port ${port} +exec ${servercfg} +set deathmatch 1 +map ${defaultmap}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## LinuxGSM Server Details +# Do not edit +gamename="Quake 2" +engine="idtech2" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/baseq2" +executabledir="${filesdir}" +executable="./quake2" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${filesdir}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg new file mode 100644 index 000000000..028d45229 --- /dev/null +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -0,0 +1,77 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27960" +defaultmap="q3dm17" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set com_hunkMegs 32 +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## LinuxGSM Server Details +# Do not edit +gamename="Quake 3: Arena" +engine="idtech3" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/baseq3" +executabledir="${filesdir}" +executable="./q3ded" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${filesdir}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg new file mode 100644 index 000000000..22ef3204f --- /dev/null +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -0,0 +1,88 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +arch="x64" # x64 or x86 + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +# Edit with care | Install/Config Guide : https://steamcommunity.com/sharedfiles/filedetails/?id=542966946 +# Console Commands : http://www.regurge.at/ql/ +fn_parms(){ +parms="+exec ${servercfg}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="349090" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Quake Live" +engine="idtech3_ql" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable=$([ "${arch}" == 'x64' ] && echo "./run_server_x64.sh" || echo "./run_server_x86.sh") +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${filesdir}/baseq3" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${rootdir}/log/server" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg new file mode 100644 index 000000000..04eb9a69a --- /dev/null +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -0,0 +1,76 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27500" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-port ${port} -game ktx +exec ${servercfg}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## LinuxGSM Server Details +# Do not edit +gamename="QuakeWorld" +engine="quake" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/ktx" +executabledir="${filesdir}" +executable="./mvdsv" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg new file mode 100644 index 000000000..c0301588d --- /dev/null +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -0,0 +1,110 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +defaultmap="rc_arena" +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game ricochet -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" +} + +########################## +######## Settings ######## +########################## + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" + +## Optional: Game Server Login Token +# GSLT can be used for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="90" +appidmod="ricochet" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Ricochet" +engine="goldsource" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/ricochet" +executabledir="${filesdir}" +executable="./hlds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg new file mode 100644 index 000000000..f0c1ac587 --- /dev/null +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -0,0 +1,103 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +defaultmap="RO-Arad.rom" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="server ${defaultmap}?game=ROGame.ROTeamGame?VACSecured=true -nohomedir ini=${servercfg} log=${gamelog}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="223250" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Red Orchestra: Ostfront 41-45" +engine="unreal2" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" + +## Server Specific Directories +filesdir="${rootdir}/serverfiles" +systemdir="${filesdir}/system" +executabledir="${systemdir}" +executable="./ucc-bin" +servercfg="${servicename}.ini" +servercfgdefault="default.ini" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" +compressedmapsdir="${rootdir}/Maps-Compressed" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${rootdir}/log/server" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg new file mode 100644 index 000000000..9d898f131 --- /dev/null +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -0,0 +1,119 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +# More settings available after install in serverfiles/server/rust-server/server.cfg +ip="0.0.0.0" +port="28015" +rconport="28016" +rconpassword="CHANGE_ME" +rconweb="1" # Value is: 1 for Facepunch's web panel; 0 for RCON tools like Rusty or Rustadmin +servername="Rust" +maxplayers="50" +# Advanced Start Settings +seed="" # default random; range : 1 to 2147483647 ; used to change or reproduce a procedural map +worldsize="3000" # default 3000; range : 1000 to 6000 ; map size in meters +saveinterval="300" # Auto-save in seconds +tickrate="30" # default 30; range : 15 to 100 + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-batchmode +server.ip ${ip} +server.port ${port} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${servicename}\" ${conditionalseed} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile \"${gamelogdate}\"" +} + +# Specific to Rust +if [ -n "${seed}" ]; then + # If set, then add to start parms + conditionalseed="+server.seed ${seed}" +else + # Keep randomness of the number if not set + conditionalseed="" +fi + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="258550" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Rust" +engine="unity3d" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname=$(basename $(readlink -f "${BASH_SOURCE[0]}")) +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./RustDedicated" +serveridentitydir="${systemdir}/server/${servicename}" +servercfg="server.cfg" +servercfgdefault="server.cfg" +servercfgdir="${serveridentitydir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${rootdir}/log/server" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg new file mode 100644 index 000000000..3a1a5989f --- /dev/null +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -0,0 +1,90 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="211820" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Starbound" +engine="starbound" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}/linux" +executable="./starbound_server" +servercfg="starbound_server.config" +servercfgdefault="starbound_server.config" +servercfgdir="${filesdir}/storage" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${filesdir}/storage" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg index 4e38b147b..e7d2389e4 100644 --- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg @@ -3,8 +3,8 @@ ################################## # DO NOT EDIT WILL BE OVERWRITTEN! # Copy settings from here and use them in either -# common.cfg - applys settings to every instance -# [instance].cfg - applys settings to specific instance +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance #### Server Settings #### diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg new file mode 100644 index 000000000..fadf636cc --- /dev/null +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -0,0 +1,88 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +# Edit with care | https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master/SeriousSam3BFE/help/DedicatedServer_Readme.txt +fn_parms(){ +parms="+ip ${ip} +logfile ${gamelog} +exec ${servercfgfullpath}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="41080" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Serious Sam 3: BFE" +engine="seriousengine35" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/Bin" +executable="./runSam3_DedicatedServer.sh" +executabledir="${systemdir}" +servercfg="${servicename}.ini" +servercfgdefault="server.ini" +servercfgdir="${filesdir}/Content/SeriousSam3/Config" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${rootdir}/log/server" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg new file mode 100644 index 000000000..720f1248c --- /dev/null +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -0,0 +1,90 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +defaultmap="svencoop1" +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game svencoop -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="276060" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Sven Co-op" +engine="goldsource" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/svencoop" +executabledir="${filesdir}" +executable="./svends_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg new file mode 100644 index 000000000..1cf4f0570 --- /dev/null +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -0,0 +1,89 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-config ${servercfgfullpath}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="105600" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Terraria" +engine="terraria" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./TerrariaServer" +servercfg="${servicename}.txt" +servercfgdefault="serverconfig.txt" +servercfgdir="${filesdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +#gamelogdir="" # No server logs available +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg new file mode 100644 index 000000000..fca2e5bc1 --- /dev/null +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -0,0 +1,96 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +sourcetvport="27020" +defaultmap="cp_badlands" +maxplayers="16" + +## Optional: Game Server Login Token +# GSLT can be used for running a public server. +# More info: https://gameservermanagers.com/gslt +gslt="" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game tf -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="232250" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Team Fortress 2" +engine="source" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/tf" +executabledir="${filesdir}" +executable="./srcds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg new file mode 100644 index 000000000..2f7a9dd97 --- /dev/null +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -0,0 +1,91 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="27015" +clientport="27005" +defaultmap="dustbowl" +maxplayers="16" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-game tfc -strictportbind _ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} -maxplayers ${maxplayers}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="90" +appidmod="tfc" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Team Fortress Classic" +engine="goldsource" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/tfc" +executabledir="${filesdir}" +executable="./hlds_run" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg new file mode 100644 index 000000000..487254215 --- /dev/null +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -0,0 +1,68 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +# Edit serverfiles/ts3-server.ini after installation + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## LinuxGSM Server Details +# Do not edit +gamename="TeamSpeak 3" +servername="TeamSpeak 3 Server" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${filesdir}" +executable="./ts3server_startscript.sh" +servercfg="${servicename}.ini" +servercfgdefault="ts3server.ini" +servercfgdir="${filesdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${filesdir}/Logs" +scriptlogdir="${rootdir}/log/script" +scriptlog="${scriptlogdir}/${servicename}-script.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg new file mode 100644 index 000000000..f92175880 --- /dev/null +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -0,0 +1,88 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="7777" +queryport="27015" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-log -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -TowerServerINI=${servicename}.ini" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="439660" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Tower Unite" +engine="unreal4" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/Tower" +executabledir="${systemdir}/Binaries/Linux" +executable="./TowerServer-Linux-Shipping" +servercfgdir="${systemdir}/Binaries/Linux" +servercfg="${servicename}.ini" +servercfgfullpath="${servercfgdir}/${servercfg}" +servercfgdefault="TowerServer.ini" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${systemdir}/Saved/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg new file mode 100644 index 000000000..59b843bc0 --- /dev/null +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -0,0 +1,90 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## SteamCMD Login | https://github.com/GameServerManagers/LinuxGSM/wiki/SteamCMD#steamcmd-login +steamuser="username" +steampass='password' + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="-f ${servercfgfullpath}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="380840" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## LinuxGSM Server Details +# Do not edit +gamename="Teeworlds" +engine="teeworlds" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/tw" +executabledir="${systemdir}" +executable="./teeworlds_srv" +servercfg="${servicename}.cfg" # Teeworlds can also auto load any config if an autoexec.cfg file is present in the server dir +servercfgdefault="server.cfg" +servercfgdir="${filesdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${rootdir}/log/server" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg new file mode 100644 index 000000000..e6e88a063 --- /dev/null +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -0,0 +1,78 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="DM-Rankin" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="server ${defaultmap}?game=XGame.xDeathMatch -nohomedir ini=${servercfg} log=${gamelog}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## LinuxGSM Server Details +# Do not edit +gamename="Unreal Tournament 2004" +engine="unreal2" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/System" +executabledir="${systemdir}" +executable="./ucc-bin" +servercfg="${servicename}.ini" +servercfgdefault="UT2004.ini" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" +compressedmapsdir="${rootdir}/Maps-Compressed" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${rootdir}/log/server" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg new file mode 100644 index 000000000..f169e89f1 --- /dev/null +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -0,0 +1,89 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +ip="0.0.0.0" +port="7777" +queryport="25300" +defaultmap="VCTF-Suspense" +maxplayers="32" +game="UTGameContent.UTVehicleCTFGame_Content" +mutators="" #"UTGame.UTMutator_Instagib,UTGame.UTMutator_LowGrav" +isdedicated="true" +islanmatch="false" +usesstats="false" +shouldadvertise="true" +pureserver="1" +allowjoininprogress="true" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +# Edit with care | List of game types and mutators : http://wiki.unrealadmin.org/FAQ:UT3 +fn_parms(){ +parms="server ${defaultmap}?Game=${game}?bIsDedicated=${isdedicated}?bIsLanMatch=${islanmatch}?bUsesStats=${usesstats}?bShouldAdvertise=${shouldadvertise}?PureServer=${pureserver}?bAllowJoinInProgress=${allowjoininprogress}?MaxPlayers=${maxplayers}?Mutator=${mutators} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## LinuxGSM Server Details +# Do not edit +gamename="Unreal Tournament 3" +engine="unreal3" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${systemdir}/Binaries" +executable="./ut3" +servercfg="${servicename}.ini" +servercfgdefault="UTGame.ini" +servercfgdir="${systemdir}/UTGame/Config" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${rootdir}/log/server" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" +gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg new file mode 100644 index 000000000..ff405ee3f --- /dev/null +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -0,0 +1,77 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +defaultmap="DM-Deck16][" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="server ${defaultmap}.unr ini=${servercfgfullpath}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## LinuxGSM Server Details +# Do not edit +gamename="Unreal Tournament 99" +engine="unreal" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/System" +executabledir="${systemdir}" +executable="./ucc-bin" +servercfg="${servicename}.ini" +servercfgdefault="Default.ini" +servercfgdir="${systemdir}" +servercfgfullpath="${servercfgdir}/${servercfg}" +compressedmapsdir="${rootdir}/Maps-Compressed" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${filesdir}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg new file mode 100644 index 000000000..dfeb0ad9d --- /dev/null +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -0,0 +1,79 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +# For CTF: defaultmap="CTF-Face" gametype="CTF" +ip="0.0.0.0" +port="7777" +defaultmap="DM-Underland" +gametype="DM" +timelimit="10" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="UnrealTournament ${defaultmap}?Game=${gametype}?TimeLimit=${timelimit} -port=${port}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## LinuxGSM Server Details +# Do not edit +gamename="Unreal Tournament" +engine="unreal4" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}/LinuxServer" +executabledir="${systemdir}/Engine/Binaries/Linux" +executable="./UE4Server-Linux-Shipping" +servercfg="Game.ini" +servercfgdir="${systemdir}/UnrealTournament/Saved/Config/LinuxServer" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${filesdir}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg new file mode 100644 index 000000000..a8e98871e --- /dev/null +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -0,0 +1,72 @@ +################################## +######## Default Settings ######## +################################## +# DO NOT EDIT WILL BE OVERWRITTEN! +# Copy settings from here and use them in either +# common.cfg - applies settings to every instance +# [instance].cfg - applies settings to a specific instance + +#### Server Settings #### + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ + parms="+set net_strict 1 +set fs_homepath ${filesdir} +exec ${servercfg}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## LinuxGSM Server Details +# Do not edit +gamename="Wolfenstein: Enemy Territory" +engine="idtech3" + +#### Directories #### +# Edit with care + +## Server Specific Directories +systemdir="${filesdir}" +executabledir="${systemdir}" +executable="./etded" +servercfg="${servicename}.cfg" +servercfgdefault="server.cfg" +servercfgdir="${systemdir}/etmain" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +logdir="${rootdir}/log" +gamelogdir="${filesdir}/Logs" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" +lgsmlog="${lgsmlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${lgsmlogdir}/${servicename}-email.log" + +## Logs Naming +lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh index f990a20ca..425549143 100644 --- a/tests/tests_jc2server.sh +++ b/tests/tests_jc2server.sh @@ -82,16 +82,6 @@ servicename="jc2-server" #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh index 2da2fdb87..9ae9792a0 100644 --- a/tests/tests_ts3server.sh +++ b/tests/tests_ts3server.sh @@ -69,16 +69,6 @@ servicename="ts3-server" #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" From f763e4b96cef375b768e76c333d9f2475420f7d1 Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 18:12:09 -0700 Subject: [PATCH 0793/1895] Add squadserver main file --- Squad/squadserver | 199 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 Squad/squadserver diff --git a/Squad/squadserver b/Squad/squadserver new file mode 100644 index 000000000..7228e7ab8 --- /dev/null +++ b/Squad/squadserver @@ -0,0 +1,199 @@ +#!/bin/bash +# Project: Game Server Managers - LinuxGSM +# Author: Daniel Gibbs +# License: MIT License, Copyright (c) 2017 Daniel Gibbs +# Purpose: Squad | Server Management Script +# Contributors: https://github.com/GameServerManagers/LinuxGSM/graphs/contributors +# Documentation: https://github.com/GameServerManagers/LinuxGSM/wiki +# Website: https://gameservermanagers.com + +# Debugging +if [ -f ".dev-debug" ]; then + exec 5>dev-debug.log + BASH_XTRACEFD="5" + set -x +fi + +version="170501" + +########################## +######## Settings ######## +########################## + +#### Server Settings #### + +## Server Start Settings | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters +port="7787" +queryport="27165" +fixedmaxplayers="80" +randommapmode="ALWAYS" +ip="0.0.0.0" + +## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters +fn_parms(){ +parms="MULTIHOME=${ip} PORT=${port} QueryPort=${queryport} FIXEDMAXPLAYERS=${fixedmaxplayers} RANDOM={randommapmode}" +} + +#### LinuxGSM Settings #### + +## Notification Alerts +# (on|off) +# Email Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Email +emailalert="off" +email="email@example.com" +emailfrom="" + +# Pushbullet Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Pushbullet +pushbulletalert="off" +pushbullettoken="accesstoken" +channeltag="" + +## Updating | https://github.com/GameServerManagers/LinuxGSM/wiki/Update +updateonstart="off" + +## Backup | https://github.com/GameServerManagers/LinuxGSM/wiki/Backup +maxbackups="4" +maxbackupdays="30" +stoponbackup="on" + +## Logging | https://github.com/GameServerManagers/LinuxGSM/wiki/Logging +consolelogging="on" +logdays="7" + +#### LinuxGSM Advanced Settings #### + +## SteamCMD Settings +# Server appid +appid="403240" +# Steam App Branch Select +# Allows to opt into the various Steam app branches. Default branch is "". +# Example: "-beta latest_experimental" +branch="" + +## Github Branch Select +# Allows for the use of different function files +# from a different repo and/or branch. +githubuser="GameServerManagers" +githubrepo="LinuxGSM" +githubbranch="feature/squadserver" + +## LinuxGSM Server Details +# Do not edit +gamename="Squad" +engine="unreal4" + +## Service Name | https://github.com/GameServerManagers/LinuxGSM/wiki/Multiple-Servers +servicename="squad-server" + +#### Directories #### +# Edit with care + +## Work Directories +rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" +selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" +lockselfname=".${servicename}.lock" +lgsmdir="${rootdir}/lgsm" +functionsdir="${lgsmdir}/functions" +libdir="${lgsmdir}/lib" +tmpdir="${lgsmdir}/tmp" +filesdir="${rootdir}/serverfiles" + +## Server Specific Directories +systemdir="${filesdir}/Squad" +executabledir="${systemdir}/Binaries/Linux" +executable="./SquadServer" +servercfgdir="${systemdir}/ServerConfig" +servercfg="Server.cfg" +servercfgdefault="Server.cfg" +servercfgfullpath="${servercfgdir}/${servercfg}" + +## Backup Directory +backupdir="${rootdir}/backups" + +## Logging Directories +gamelogdir="${systemdir}/Saved/Logs" +scriptlogdir="${rootdir}/log/script" +consolelogdir="${rootdir}/log/console" +scriptlog="${scriptlogdir}/${servicename}-script.log" +consolelog="${consolelogdir}/${servicename}-console.log" +emaillog="${scriptlogdir}/${servicename}-email.log" + +## Logs Naming +scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" + +######################## +######## Script ######## +###### Do not edit ##### +######################## + +# 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 -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_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_fetch_core_dl +} + +# Prevent from running this script as root. +if [ "$(whoami)" = "root" ]; then + if [ ! -f "${functionsdir}/core_functions.sh" ]||[ ! -f "${functionsdir}/check_root.sh" ]||[ ! -f "${functionsdir}/core_messages.sh" ]||[ ! -f "${functionsdir}/core_exit.sh" ]; then + echo "[ FAIL ] Do NOT run this script as root!" + exit 1 + else + core_functions.sh + check_root.sh + fi +fi + +core_dl.sh +core_functions.sh +getopt=$1 +core_getopt.sh \ No newline at end of file From 79d9dcafd0ccbdc1e865c56af593a7a93d308ac6 Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 18:29:17 -0700 Subject: [PATCH 0794/1895] change executable to use included start script better to use it as it's included with the server & sets some environment info --- Squad/squadserver | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Squad/squadserver b/Squad/squadserver index 7228e7ab8..e16c730b2 100644 --- a/Squad/squadserver +++ b/Squad/squadserver @@ -100,8 +100,8 @@ filesdir="${rootdir}/serverfiles" ## Server Specific Directories systemdir="${filesdir}/Squad" -executabledir="${systemdir}/Binaries/Linux" -executable="./SquadServer" +executabledir="${systemdir}" +executable="./SquadServer.sh" servercfgdir="${systemdir}/ServerConfig" servercfg="Server.cfg" servercfgdefault="Server.cfg" From 60ed162d95e369129dbeed3b6641b36a876e047c Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 18:30:34 -0700 Subject: [PATCH 0795/1895] add Squad sections to command_details adds map rotation mode & port information --- lgsm/functions/command_details.sh | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 106eb0041..1286f04a2 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -173,6 +173,11 @@ fn_details_gameserver(){ echo -e "${blue}ASE:\t${default}${ase}" fi + # Random map rotation mode (Squad) + if [ -n "${randommapmode}"]; then + echo -e "${blue}Map rotation:\t${default}${randommapmode}" + fi + # Online status if [ "${status}" == "0" ]; then echo -e "${blue}Status:\t${red}OFFLINE${default}" @@ -190,7 +195,7 @@ fn_details_script(){ # Service name: ql-server # qlserver version: 150316 # User: lgsm - # Email alert: off + # Email alert: off # Update on start: off # Location: /home/lgsm/qlserver # Config file: /home/lgsm/qlserver/serverfiles/baseq3/ql-server.cfg @@ -656,6 +661,21 @@ fn_details_spark(){ } | column -s $'\t' -t } +fn_details_squad(){ + echo -e "netstat -atunp | grep SquadServer" + echo -e "" + { + echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" + echo -e "> Game\tINBOUND\t${port}\tudp" + # Don't do arithmetics if ever the port wasn't a numeric value + if [ "${port}" -eq "${port}" ]; then + echo -e "> RAW\tINBOUND\t$((port+1))\tudp" + fi + echo -e "> Query\tINBOUND\t${queryport}\tudp" + echo -e "> RCON\tINBOUND\t${rconport}\ttcp" + } | column -s $'\t' -t +} + fn_details_starbound(){ echo -e "netstat -atunp | grep starbound" echo -e "" @@ -861,6 +881,8 @@ fn_display_details() { fn_details_quake3 elif [ "${gamename}" == "Quake Live" ]; then fn_details_quakelive + elif [ "${gamename}" == "Squad"]; then + fn_details_squad elif [ "${gamename}" == "TeamSpeak 3" ]; then fn_details_teamspeak3 elif [ "${gamename}" == "Tower Unite" ]; then From d63c710d5ed801f822a0ce4bb4d4240200f256d3 Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 18:49:07 -0700 Subject: [PATCH 0796/1895] Add install_squad_license to prompt user to add a license key if wanted --- lgsm/functions/command_install.sh | 2 ++ lgsm/functions/install_squad_license.sh | 26 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 lgsm/functions/install_squad_license.sh diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 7bbc40f42..5f8fe3d30 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -36,6 +36,8 @@ elif [ "${gamename}" == "TeamSpeak 3" ]; then install_ts3db.sh elif [ "${gamename}" == "Multi Theft Auto" ]; then command_install_resources_mta.sh +elif [ "${gamename}" == "Squad" ]; then + install_squad_license.sh fi fix.sh diff --git a/lgsm/functions/install_squad_license.sh b/lgsm/functions/install_squad_license.sh new file mode 100644 index 000000000..a832ab16f --- /dev/null +++ b/lgsm/functions/install_squad_license.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# LinuxGSM install_squad_license.sh function +# Author: Daniel Gibbs +# Website: https://gameservermanagers.com +# Description: Configures the Squad server's license. + +local commandname="INSTALL" +local commandaction="Install" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +echo "" +echo "Squad Server License" +echo "=================================" +sleep 1 +echo "Server license is an optional feature for ${gamename} server" +fn_script_log_info "Server license is an optional feature for ${gamename} server" + +echo "Get more info and a server license here:" +echo "http://forums.joinsquad.com/topic/16519-server-licensing-general-info/" +fn_script_log_info "Get more info and a server license here:" +fn_script_log_info "http://forums.joinsquad.com/topic/16519-server-licensing-general-info/" +echo "" +sleep 1 +echo "The Squad server license can be changed by editing ${servercfgdir}/License.cfg." +fn_script_log_info "The Squad server license can be changed by editing ${selfname}." +echo "" \ No newline at end of file From 09e62c7ae84ffc8162d62958493470a2ccb3b037 Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 18:51:18 -0700 Subject: [PATCH 0797/1895] Add getopt block for Squad license prompt --- lgsm/functions/core_getopt.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh index a17487eb5..b877211c9 100644 --- a/lgsm/functions/core_getopt.sh +++ b/lgsm/functions/core_getopt.sh @@ -40,6 +40,7 @@ cmd_map_compressor_u99=( "mc;map-compressor" "compress_ut99_maps.sh" "Compresses cmd_map_compressor_u2=( "mc;map-compressor" "compress_unreal2_maps.sh" "Compresses all ${gamename} server maps." ) cmd_install_cdkey=( "cd;server-cd-key" "install_ut2k4_key.sh" "Add your server cd key." ) cmd_install_dst_token=( "ct;cluster-token" "install_dst_token.sh" "Configure cluster token." ) +cmd_install_squad_license=( "li;license" "install_squad_license.sh" "Add your Squad server license." ) cmd_fastdl=( "fd;fastdl" "command_fastdl.sh" "Build a FastDL directory." ) # Dev commands cmd_dev_debug=( "dev;developer" "command_dev_debug.sh" "Enable developer Mode." ) @@ -114,6 +115,11 @@ if [ "${gamename}" == "Multi Theft Auto" ]; then currentopt+=( "${cmd_install_default_resources[@]}" ) fi +# Squad license exclusive +if [ "${gamename}" == "Squad" ]; then + currentopt+=( "${cmd_install_squad_license[@]}" ) +fi + ## Mods commands if [ "${engine}" == "source" ]||[ "${gamename}" == "Rust" ]||[ "${gamename}" == "Hurtworld" ]||[ "${gamename}" == "7 Days To Die" ]; then currentopt+=( "${cmd_mods_install[@]}" "${cmd_mods_remove[@]}" "${cmd_mods_update[@]}" ) From 30c94db080a8d3180d679cc1ef75d8c2d12133bb Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 18:59:38 -0700 Subject: [PATCH 0798/1895] space love how touchy bash is --- lgsm/functions/command_details.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 1286f04a2..530f869e0 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -174,7 +174,7 @@ fn_details_gameserver(){ fi # Random map rotation mode (Squad) - if [ -n "${randommapmode}"]; then + if [ -n "${randommapmode}" ]; then echo -e "${blue}Map rotation:\t${default}${randommapmode}" fi @@ -881,7 +881,7 @@ fn_display_details() { fn_details_quake3 elif [ "${gamename}" == "Quake Live" ]; then fn_details_quakelive - elif [ "${gamename}" == "Squad"]; then + elif [ "${gamename}" == "Squad" ]; then fn_details_squad elif [ "${gamename}" == "TeamSpeak 3" ]; then fn_details_teamspeak3 From 56a9b7e310b352decfc269fddfa2d157e4a92a7f Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 19:08:04 -0700 Subject: [PATCH 0799/1895] Add install_squad_license.sh block to core_functions --- 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 1738928ca..7a095b96f 100644 --- a/lgsm/functions/core_functions.sh +++ b/lgsm/functions/core_functions.sh @@ -187,6 +187,11 @@ functionfile="${FUNCNAME}" fn_fetch_function } +install_squad_license.sh(){ +functionfile="${FUNCNAME}" +fn_fetch_function +} + command_mods_install.sh(){ functionfile="${FUNCNAME}" fn_fetch_function From daa57b9782dc2f985a987aa7c8a0d6331feee9dc Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 19:10:45 -0700 Subject: [PATCH 0800/1895] Add install_squad_license.sh block to command_install --- lgsm/functions/command_install.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 5f8fe3d30..092496b01 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -32,6 +32,8 @@ if [ "${gamename}" == "BrainBread 2" ]||[ "${gamename}" == "Black Mesa: Deathmat install_gslt.sh elif [ "${gamename}" == "Don't Starve Together" ]; then install_dst_token.sh +elif [ "${gamename}" == "Squad" ]; then + install_squad_license.sh elif [ "${gamename}" == "TeamSpeak 3" ]; then install_ts3db.sh elif [ "${gamename}" == "Multi Theft Auto" ]; then From 1b38006b9d0350efee9e8b0b5d1c1302bc838df7 Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 19:25:05 -0700 Subject: [PATCH 0801/1895] remove irrelevant entry for Squad details, read RCON port from cfg file --- lgsm/functions/command_details.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 530f869e0..9af448e76 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -662,15 +662,12 @@ fn_details_spark(){ } fn_details_squad(){ + rconport=$(cat ${servercfgdir}/Rcon.cfg | grep "Port=" | cut -c6-) # obtain rcon port from file echo -e "netstat -atunp | grep SquadServer" echo -e "" { echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" echo -e "> Game\tINBOUND\t${port}\tudp" - # Don't do arithmetics if ever the port wasn't a numeric value - if [ "${port}" -eq "${port}" ]; then - echo -e "> RAW\tINBOUND\t$((port+1))\tudp" - fi echo -e "> Query\tINBOUND\t${queryport}\tudp" echo -e "> RCON\tINBOUND\t${rconport}\ttcp" } | column -s $'\t' -t From 9fc01c2b940cb26e2602fad869803fea304dba88 Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 19:33:10 -0700 Subject: [PATCH 0802/1895] fix executabledir --- Squad/squadserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Squad/squadserver b/Squad/squadserver index e16c730b2..964b9b0ea 100644 --- a/Squad/squadserver +++ b/Squad/squadserver @@ -100,7 +100,7 @@ filesdir="${rootdir}/serverfiles" ## Server Specific Directories systemdir="${filesdir}/Squad" -executabledir="${systemdir}" +executabledir="${filesdir}" executable="./SquadServer.sh" servercfgdir="${systemdir}/ServerConfig" servercfg="Server.cfg" From a67300eb9ee21d1675e02497496fcbf872c59364 Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 19:54:56 -0700 Subject: [PATCH 0803/1895] move rcon info reading for squad, add read of server name & max players --- lgsm/functions/command_details.sh | 1 - lgsm/functions/info_config.sh | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh index 9af448e76..e1b9f418f 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -662,7 +662,6 @@ fn_details_spark(){ } fn_details_squad(){ - rconport=$(cat ${servercfgdir}/Rcon.cfg | grep "Port=" | cut -c6-) # obtain rcon port from file echo -e "netstat -atunp | grep SquadServer" echo -e "" { diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index a179efbb4..e40d8d1a5 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -703,6 +703,27 @@ fn_info_config_wolfensteinenemyterritory(){ fi } +fn_info_config_squad(){ + if [ ! -f "${servercfgfullpath}" ]; then + servername="${unavailable}" + maxplayers="${unavailable}" + else + servername="$(cat ${servercfgfullpath} | grep "ServerName=" | cut -c13- | rev | cut -c3- | rev)" + maxplayers="$(cat ${servercfgfullpath} | grep "MaxPlayers=" | cut -c12-)" + fi + + if [ ! -f "${servercfgdir}/Rcon.cfg" ]; then + rconport=${unavailable} + rconpassword=${unavailable} + else + rconport=$(cat ${servercfgdir}/Rcon.cfg | grep "Port=" | cut -c6-) + rconpassword=$(cat ${servercfgdir}/Rcon.cfg | grep "Password=" | cut -c6-) + if [ -z "${rconpassword}" ]; then + rconpassword="${cyan}DISABLED${default}" + fi + fi +} + # Just Cause 2 if [ "${engine}" == "avalanche" ]; then fn_info_config_avalanche @@ -787,4 +808,6 @@ elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fn_info_config_wolfensteinenemyterritory elif [ "${gamename}" == "Multi Theft Auto" ]; then fn_info_config_mta +elif [ "${gamename}" == "Squad"]; then + fn_info_config_squad fi From cdfdffef3719c2273eb4ac1d1bb4d6a7b0a4b957 Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 20:01:33 -0700 Subject: [PATCH 0804/1895] space love bash --- lgsm/functions/info_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index e40d8d1a5..a466e7e53 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -808,6 +808,6 @@ elif [ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then fn_info_config_wolfensteinenemyterritory elif [ "${gamename}" == "Multi Theft Auto" ]; then fn_info_config_mta -elif [ "${gamename}" == "Squad"]; then +elif [ "${gamename}" == "Squad" ]; then fn_info_config_squad fi From 432c3c48f3583457c12861ed8a6cea30e10e0a2c Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 20:16:02 -0700 Subject: [PATCH 0805/1895] fix up Squad block in info_config --- lgsm/functions/info_config.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index a466e7e53..80118f716 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -709,17 +709,17 @@ fn_info_config_squad(){ maxplayers="${unavailable}" else servername="$(cat ${servercfgfullpath} | grep "ServerName=" | cut -c13- | rev | cut -c3- | rev)" - maxplayers="$(cat ${servercfgfullpath} | grep "MaxPlayers=" | cut -c12-)" + maxplayers="$(cat ${servercfgfullpath} | grep "MaxPlayers=" | cut -c12- | tr -cd '[:digit:]')" fi if [ ! -f "${servercfgdir}/Rcon.cfg" ]; then rconport=${unavailable} rconpassword=${unavailable} else - rconport=$(cat ${servercfgdir}/Rcon.cfg | grep "Port=" | cut -c6-) - rconpassword=$(cat ${servercfgdir}/Rcon.cfg | grep "Password=" | cut -c6-) - if [ -z "${rconpassword}" ]; then - rconpassword="${cyan}DISABLED${default}" + rconport=$(cat ${servercfgdir}/Rcon.cfg | grep "Port=" | cut -c6- | tr -cd '[:digit:]') + rconpassword=$(cat ${servercfgdir}/Rcon.cfg | grep "Password=" | cut -c10-) + if [ -z "${rconpassword}" ]||[ ${#rconpassword} == 1 ]; then + rconpassword="${yellow}DISABLED${default}" fi fi } From 559ace3bab92b0a1f23ec75bc3667929e9557ce7 Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 20:40:34 -0700 Subject: [PATCH 0806/1895] remove duplicate entry in command_install for Squad don't code tired, boys --- lgsm/functions/command_install.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index 092496b01..f344cc598 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -38,8 +38,6 @@ elif [ "${gamename}" == "TeamSpeak 3" ]; then install_ts3db.sh elif [ "${gamename}" == "Multi Theft Auto" ]; then command_install_resources_mta.sh -elif [ "${gamename}" == "Squad" ]; then - install_squad_license.sh fi fix.sh From b54daa0484d26a1fe71b934feef5ac3aad4aae4a Mon Sep 17 00:00:00 2001 From: Scarsz Date: Fri, 26 May 2017 20:49:33 -0700 Subject: [PATCH 0807/1895] add missing $ oops --- Squad/squadserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Squad/squadserver b/Squad/squadserver index 964b9b0ea..3c3d04a0e 100644 --- a/Squad/squadserver +++ b/Squad/squadserver @@ -31,7 +31,7 @@ ip="0.0.0.0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="MULTIHOME=${ip} PORT=${port} QueryPort=${queryport} FIXEDMAXPLAYERS=${fixedmaxplayers} RANDOM={randommapmode}" +parms="MULTIHOME=${ip} PORT=${port} QueryPort=${queryport} FIXEDMAXPLAYERS=${fixedmaxplayers} RANDOM=${randommapmode}" } #### LinuxGSM Settings #### From f97fc6a7eaf9e1f17d01ef845a00c0841ac677f9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 10:48:45 +0100 Subject: [PATCH 0808/1895] Removed girhub branch --- lgsm/config-default/config-lgsm/mtaserver/_default.cfg | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index e78730fb6..909565c46 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -11,7 +11,7 @@ ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters # Edit with care fn_parms(){ -parms=" " +parms="" } #### LinuxGSM Settings #### @@ -39,13 +39,6 @@ logdays="7" #### LinuxGSM Advanced Settings #### -# Github Branch Select -# Allows for the use of different function files -# from a different repo and/or branch. -githubuser="GameServerManagers" -githubrepo="linuxgsm" -githubbranch="master" - ## LinuxGSM Server Details # Do not edit gamename="Multi Theft Auto" From 4599551e27097f03119141251c4f6d2f82c749b4 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 11:11:55 +0100 Subject: [PATCH 0809/1895] Changed to serverfies --- .../config-default/config-lgsm/csczserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/cssserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/dabserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/dmcserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/dodserver/_default.cfg | 4 ++-- .../config-default/config-lgsm/dodsserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/doiserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/dstserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/emserver/_default.cfg | 4 ++-- .../config-default/config-lgsm/fctrserver/_default.cfg | 10 +++++----- lgsm/config-default/config-lgsm/fofserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/gesserver/_default.cfg | 4 ++-- .../config-default/config-lgsm/gmodserver/_default.cfg | 4 ++-- .../config-lgsm/hl2dmserver/_default.cfg | 4 ++-- .../config-default/config-lgsm/hldmserver/_default.cfg | 4 ++-- .../config-lgsm/hldmsserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/hwserver/_default.cfg | 6 +++--- lgsm/config-default/config-lgsm/insserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/jc2server/_default.cfg | 6 +++--- lgsm/config-default/config-lgsm/kfserver/_default.cfg | 2 +- .../config-default/config-lgsm/l4d2server/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/l4dserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/mcserver/_default.cfg | 10 +++++----- lgsm/config-default/config-lgsm/mtaserver/_default.cfg | 4 ++-- .../config-lgsm/mumbleserver/_default.cfg | 6 +++--- .../config-lgsm/nmrihserver/_default.cfg | 4 ++-- .../config-default/config-lgsm/ns2cserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/ns2server/_default.cfg | 4 ++-- .../config-lgsm/opforserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/pcserver/_default.cfg | 4 ++-- .../config-lgsm/pvkiiserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/pzserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/q2server/_default.cfg | 6 +++--- lgsm/config-default/config-lgsm/q3server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/qlserver/_default.cfg | 6 +++--- lgsm/config-default/config-lgsm/qwserver/_default.cfg | 4 ++-- .../config-lgsm/ricochetserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/roserver/_default.cfg | 4 ++-- .../config-default/config-lgsm/rustserver/_default.cfg | 6 +++--- lgsm/config-default/config-lgsm/sbserver/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/ss3server/_default.cfg | 4 ++-- .../config-default/config-lgsm/svenserver/_default.cfg | 4 ++-- .../config-lgsm/terrariaserver/_default.cfg | 6 +++--- lgsm/config-default/config-lgsm/tf2server/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/tfcserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/ts3server/_default.cfg | 8 ++++---- lgsm/config-default/config-lgsm/tuserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/twserver/_default.cfg | 4 ++-- .../config-lgsm/ut2k4server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ut3server/_default.cfg | 2 +- .../config-default/config-lgsm/ut99server/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/utserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/wetserver/_default.cfg | 6 +++--- 53 files changed, 122 insertions(+), 122 deletions(-) diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg index b1a3ea20a..3f1a44c15 100644 --- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg @@ -69,8 +69,8 @@ servicename="cscz-server" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/czero" -executabledir="${filesdir}" +systemdir="${serverfiles}/czero" +executabledir="${serverfiles}" executable="./hlds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg index 4d898a416..485bba577 100644 --- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg @@ -71,8 +71,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/cstrike" -executabledir="${filesdir}" +systemdir="${serverfiles}/cstrike" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg index 276b112f3..3d00db3a2 100644 --- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg @@ -66,8 +66,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/dab" -executabledir="${filesdir}" +systemdir="${serverfiles}/dab" +executabledir="${serverfiles}" executable="./dabds.sh" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg index 2bf28c698..e5b32111f 100644 --- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg @@ -66,8 +66,8 @@ engine="goldsource" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/dmc" -executabledir="${filesdir}" +systemdir="${serverfiles}/dmc" +executabledir="${serverfiles}" executable="./hlds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg index b943c41a3..8d16ea264 100644 --- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg @@ -66,8 +66,8 @@ engine="goldsource" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/dod" -executabledir="${filesdir}" +systemdir="${serverfiles}/dod" +executabledir="${serverfiles}" executable="./hlds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg index f40ef5451..f4bf101c1 100644 --- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg @@ -66,8 +66,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/dod" -executabledir="${filesdir}" +systemdir="${serverfiles}/dod" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index 6652f72d9..f32e6137e 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -68,8 +68,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/doi" -executabledir="${filesdir}" +systemdir="${serverfiles}/doi" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg index 204b9443a..9a9f964c9 100644 --- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg @@ -72,8 +72,8 @@ servicename="dst-server-${shard}" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}/bin" +systemdir="${serverfiles}" +executabledir="${serverfiles}/bin" executable="./dontstarve_dedicated_server_nullrenderer" clustercfg="cluster.ini" clustercfgdir="${persistentstorageroot}/${confdir}/${cluster}" diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg index 4faa1aeb6..e818e87de 100644 --- a/lgsm/config-default/config-lgsm/emserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg @@ -71,8 +71,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/empires" -executabledir="${filesdir}" +systemdir="${serverfiles}/empires" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg index a7b0da679..ff9d72db1 100644 --- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg @@ -16,7 +16,7 @@ rconpassword="CHANGE_ME" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="--start-server ${filesdir}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" +parms="--start-server ${serverfiles}/save1.zip --server-settings ${servercfgfullpath} --port ${port} --rcon-port ${rconport} --rcon-password ${rconpassword}" } #### LinuxGSM Settings #### @@ -56,19 +56,19 @@ engine="factorio" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}/bin/x64" +systemdir="${serverfiles}" +executabledir="${serverfiles}/bin/x64" executable="./factorio" servercfg="${servicename}.json" servercfgdefault="server-settings.json" -servercfgdir="${filesdir}/data" +servercfgdir="${serverfiles}/data" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory backupdir="${rootdir}/backups" ## Logging Directories -gamelogdir="${filesdir}" +gamelogdir="${serverfiles}" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg index 3d9b9f977..eacb85911 100644 --- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg @@ -66,8 +66,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/fof" -executabledir="${filesdir}" +systemdir="${serverfiles}/fof" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/gesserver/_default.cfg b/lgsm/config-default/config-lgsm/gesserver/_default.cfg index f469b6ab8..8faf185e1 100644 --- a/lgsm/config-default/config-lgsm/gesserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gesserver/_default.cfg @@ -65,8 +65,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/gesource" -executabledir="${filesdir}" +systemdir="${serverfiles}/gesource" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg index 2a57cf06f..d04ccbfdb 100644 --- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg @@ -81,9 +81,9 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/garrysmod" +systemdir="${serverfiles}/garrysmod" addonsdir="${systemdir}/addons" -executabledir="${filesdir}" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg index ec4ecd9e5..d26929139 100644 --- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg @@ -66,8 +66,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/hl2mp" -executabledir="${filesdir}" +systemdir="${serverfiles}/hl2mp" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg index 7f01e865d..ca3c9a228 100644 --- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg @@ -65,8 +65,8 @@ engine="goldsource" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/valve" -executabledir="${filesdir}" +systemdir="${serverfiles}/valve" +executabledir="${serverfiles}" executable="./hlds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg index ba4144d2c..446e0545e 100644 --- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg @@ -66,8 +66,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/hl1mp" -executabledir="${filesdir}" +systemdir="${serverfiles}/hl1mp" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index fb496fbb5..69f0dacc6 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -86,11 +86,11 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" if [ "${x64mode}" == "1" ]; then executable="./Hurtworld.x86_64" else diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg index c8918645d..94102ad1a 100644 --- a/lgsm/config-default/config-lgsm/insserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg @@ -68,8 +68,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/insurgency" -executabledir="${filesdir}" +systemdir="${serverfiles}/insurgency" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg index 3d358bc2b..3c5ef330a 100644 --- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg @@ -58,12 +58,12 @@ engine="avalanche" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./Jcmp-Server" servercfg="config.lua" servercfgdefault="config.lua" -servercfgdir="${filesdir}" +servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 6142eb4ec..982e6a6a1 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -70,7 +70,7 @@ engine="unreal2" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/System" +systemdir="${serverfiles}/System" executabledir="${systemdir}" executable="./ucc-bin" servercfg="${servicename}.ini" diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg index 9c9046c02..17448efda 100644 --- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg @@ -65,8 +65,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/left4dead2" -executabledir="${filesdir}" +systemdir="${serverfiles}/left4dead2" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg index 73c940e20..6c558a8af 100644 --- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg @@ -65,8 +65,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/left4dead" -executabledir="${filesdir}" +systemdir="${serverfiles}/left4dead" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index c23547386..03527e7a6 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -57,15 +57,15 @@ selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" lockselfname=".${servicename}.lock" lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" -executable="java -Xmx${javaram}M -jar ${filesdir}/minecraft_server.jar" +systemdir="${serverfiles}" +executabledir="${serverfiles}" +executable="java -Xmx${javaram}M -jar ${serverfiles}/minecraft_server.jar" servercfg="server.properties" servercfgdefault="server.properties" -servercfgdir="${filesdir}" +servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg index 909565c46..7dad5a1c8 100644 --- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg @@ -48,7 +48,7 @@ engine="renderware" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" +systemdir="${serverfiles}" resourcesdir="${systemdir}/mods/deathmatch/resources" executabledir="${systemdir}" executable="./mta-server64" @@ -61,7 +61,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/mods/deathmatch/logs" +gamelogdir="${serverfiles}/mods/deathmatch/logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index aece97398..40d127f6b 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -50,12 +50,12 @@ gamename="Mumble" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./murmur.x86" servercfg="${servicename}.ini" servercfgdefault="murmur.ini" -servercfgdir="${filesdir}" +servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg index e033af129..388614101 100644 --- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg @@ -71,8 +71,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/nmrih" -executabledir="${filesdir}" +systemdir="${serverfiles}/nmrih" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg index 252e20729..a5bacf18d 100644 --- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg @@ -77,8 +77,8 @@ engine="spark" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}/ia32" +systemdir="${serverfiles}" +executabledir="${serverfiles}/ia32" executable="./ns2combatserver_linux32" servercfgdir="${rootdir}/server1" servercfgfullpath="${servercfgdir}" diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg index 6b058c288..9c40ed3a9 100644 --- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg @@ -77,8 +77,8 @@ engine="spark" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./server_linux32" servercfgdir="${rootdir}/server1" servercfgfullpath="${servercfgdir}" diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg index a61a4b4d2..f5ea12e1b 100644 --- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg @@ -66,8 +66,8 @@ engine="goldsource" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/gearbox" -executabledir="${filesdir}" +systemdir="${serverfiles}/gearbox" +executabledir="${serverfiles}" executable="./hlds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg index e0398c448..337940261 100644 --- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg @@ -59,8 +59,8 @@ engine="madness" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./DedicatedServerCmd" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg index 32888b654..09424358e 100644 --- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg @@ -66,8 +66,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/pvkii" -executabledir="${filesdir}" +systemdir="${serverfiles}/pvkii" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg index 004bb6378..a1542cf7c 100644 --- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg @@ -61,8 +61,8 @@ engine="projectzomboid" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./start-server.sh" servercfg="${servicename}.ini" servercfgdefault="server.ini" diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg index 5abcaa974..b9530b05e 100644 --- a/lgsm/config-default/config-lgsm/q2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg @@ -52,8 +52,8 @@ engine="idtech2" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/baseq2" -executabledir="${filesdir}" +systemdir="${serverfiles}/baseq2" +executabledir="${serverfiles}" executable="./quake2" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" @@ -65,7 +65,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/Logs" +gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg index 028d45229..026bbfc7a 100644 --- a/lgsm/config-default/config-lgsm/q3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg @@ -15,7 +15,7 @@ defaultmap="q3dm17" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ -parms="+set sv_punkbuster 0 +set fs_basepath ${filesdir} +set dedicated 1 +set com_hunkMegs 32 +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}" +parms="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 1 +set com_hunkMegs 32 +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}" } #### LinuxGSM Settings #### @@ -52,8 +52,8 @@ engine="idtech3" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/baseq3" -executabledir="${filesdir}" +systemdir="${serverfiles}/baseq3" +executabledir="${serverfiles}" executable="./q3ded" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" @@ -65,7 +65,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/Logs" +gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index 22ef3204f..a7fc888ee 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -63,12 +63,12 @@ engine="idtech3_ql" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable=$([ "${arch}" == 'x64' ] && echo "./run_server_x64.sh" || echo "./run_server_x86.sh") servercfg="${servicename}.cfg" servercfgdefault="server.cfg" -servercfgdir="${filesdir}/baseq3" +servercfgdir="${serverfiles}/baseq3" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg index 04eb9a69a..f22983a4d 100644 --- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg @@ -51,8 +51,8 @@ engine="quake" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/ktx" -executabledir="${filesdir}" +systemdir="${serverfiles}/ktx" +executabledir="${serverfiles}" executable="./mvdsv" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg index c0301588d..6779cb2eb 100644 --- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg @@ -85,8 +85,8 @@ engine="goldsource" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/ricochet" -executabledir="${filesdir}" +systemdir="${serverfiles}/ricochet" +executabledir="${serverfiles}" executable="./hlds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index f0c1ac587..a076a8243 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -75,8 +75,8 @@ libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" ## Server Specific Directories -filesdir="${rootdir}/serverfiles" -systemdir="${filesdir}/system" +serverfiles="${rootdir}/serverfiles" +systemdir="${serverfiles}/system" executabledir="${systemdir}" executable="./ucc-bin" servercfg="${servicename}.ini" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 9d898f131..74176bd96 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -89,11 +89,11 @@ lgsmdir="${rootdir}/lgsm" functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" -filesdir="${rootdir}/serverfiles" +serverfiles="${rootdir}/serverfiles" ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./RustDedicated" serveridentitydir="${systemdir}/server/${servicename}" servercfg="server.cfg" diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg index 3a1a5989f..634434a1c 100644 --- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg @@ -65,12 +65,12 @@ engine="starbound" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}/linux" +systemdir="${serverfiles}" +executabledir="${serverfiles}/linux" executable="./starbound_server" servercfg="starbound_server.config" servercfgdefault="starbound_server.config" -servercfgdir="${filesdir}/storage" +servercfgdir="${serverfiles}/storage" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory @@ -78,7 +78,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/storage" +gamelogdir="${serverfiles}/storage" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index fadf636cc..399fb82ac 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -62,12 +62,12 @@ engine="seriousengine35" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/Bin" +systemdir="${serverfiles}/Bin" executable="./runSam3_DedicatedServer.sh" executabledir="${systemdir}" servercfg="${servicename}.ini" servercfgdefault="server.ini" -servercfgdir="${filesdir}/Content/SeriousSam3/Config" +servercfgdir="${serverfiles}/Content/SeriousSam3/Config" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg index 720f1248c..8d5f4d37b 100644 --- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg @@ -65,8 +65,8 @@ engine="goldsource" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/svencoop" -executabledir="${filesdir}" +systemdir="${serverfiles}/svencoop" +executabledir="${serverfiles}" executable="./svends_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 1cf4f0570..60c3500ac 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -65,12 +65,12 @@ engine="terraria" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./TerrariaServer" servercfg="${servicename}.txt" servercfgdefault="serverconfig.txt" -servercfgdir="${filesdir}" +servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg index fca2e5bc1..549cc75b7 100644 --- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg +++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg @@ -71,8 +71,8 @@ engine="source" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/tf" -executabledir="${filesdir}" +systemdir="${serverfiles}/tf" +executabledir="${serverfiles}" executable="./srcds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg index 2f7a9dd97..94036e218 100644 --- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg @@ -66,8 +66,8 @@ engine="goldsource" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/tfc" -executabledir="${filesdir}" +systemdir="${serverfiles}/tfc" +executabledir="${serverfiles}" executable="./hlds_run" servercfg="${servicename}.cfg" servercfgdefault="server.cfg" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 487254215..192d8be34 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -46,12 +46,12 @@ servername="TeamSpeak 3 Server" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" -executabledir="${filesdir}" +systemdir="${serverfiles}" +executabledir="${serverfiles}" executable="./ts3server_startscript.sh" servercfg="${servicename}.ini" servercfgdefault="ts3server.ini" -servercfgdir="${filesdir}" +servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory @@ -59,7 +59,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/Logs" +gamelogdir="${serverfiles}/Logs" scriptlogdir="${rootdir}/log/script" scriptlog="${scriptlogdir}/${servicename}-script.log" emaillog="${scriptlogdir}/${servicename}-email.log" diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg index f92175880..4c53d4e7b 100644 --- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg @@ -63,7 +63,7 @@ engine="unreal4" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/Tower" +systemdir="${serverfiles}/Tower" executabledir="${systemdir}/Binaries/Linux" executable="./TowerServer-Linux-Shipping" servercfgdir="${systemdir}/Binaries/Linux" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 59b843bc0..8d2b0b3b3 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -65,12 +65,12 @@ engine="teeworlds" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/tw" +systemdir="${serverfiles}/tw" executabledir="${systemdir}" executable="./teeworlds_srv" servercfg="${servicename}.cfg" # Teeworlds can also auto load any config if an autoexec.cfg file is present in the server dir servercfgdefault="server.cfg" -servercfgdir="${filesdir}" +servercfgdir="${serverfiles}" servercfgfullpath="${servercfgdir}/${servercfg}" ## Backup Directory diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index e6e88a063..ab9bc3e48 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -51,7 +51,7 @@ engine="unreal2" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/System" +systemdir="${serverfiles}/System" executabledir="${systemdir}" executable="./ucc-bin" servercfg="${servicename}.ini" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index fbc0c0c4b..bb896fd80 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -63,7 +63,7 @@ engine="unreal3" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" +systemdir="${serverfiles}" executabledir="${systemdir}/Binaries" executable="./ut3" servercfg="${servicename}.ini" diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg index ff405ee3f..cc1e29ae6 100644 --- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg @@ -51,7 +51,7 @@ engine="unreal" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/System" +systemdir="${serverfiles}/System" executabledir="${systemdir}" executable="./ucc-bin" servercfg="${servicename}.ini" @@ -65,7 +65,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/Logs" +gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg index dfeb0ad9d..6f9451913 100644 --- a/lgsm/config-default/config-lgsm/utserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg @@ -55,7 +55,7 @@ engine="unreal4" # Edit with care ## Server Specific Directories -systemdir="${filesdir}/LinuxServer" +systemdir="${serverfiles}/LinuxServer" executabledir="${systemdir}/Engine/Binaries/Linux" executable="./UE4Server-Linux-Shipping" servercfg="Game.ini" @@ -67,7 +67,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/Logs" +gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg index a8e98871e..29e60593a 100644 --- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg @@ -10,7 +10,7 @@ ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters fn_parms(){ - parms="+set net_strict 1 +set fs_homepath ${filesdir} +exec ${servercfg}" + parms="+set net_strict 1 +set fs_homepath ${serverfiles} +exec ${servercfg}" } #### LinuxGSM Settings #### @@ -47,7 +47,7 @@ engine="idtech3" # Edit with care ## Server Specific Directories -systemdir="${filesdir}" +systemdir="${serverfiles}" executabledir="${systemdir}" executable="./etded" servercfg="${servicename}.cfg" @@ -60,7 +60,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${filesdir}/Logs" +gamelogdir="${serverfiles}/Logs" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" From 0e45d156a72e8e8350c32a0ed078892c03a7485b Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 11:24:05 +0100 Subject: [PATCH 0810/1895] missing bracket --- lgsm/functions/info_parms.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/info_parms.sh b/lgsm/functions/info_parms.sh index d1bdd5b41..72151a0e3 100644 --- a/lgsm/functions/info_parms.sh +++ b/lgsm/functions/info_parms.sh @@ -38,6 +38,7 @@ fn_info_parms_dst(){ shard=${shard:-"NOT SET"} cluster=${cluster:-"NOT SET"} cave=${cave:-"NOT SET"} +} fn_info_parms_factorio(){ port=${port:-"0"} From 15be75d42d86a5c270cc1b0124528c6716652fe6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 11:34:33 +0100 Subject: [PATCH 0811/1895] github_file_url_dir was being changed if _default.cfg was downloaded --- lgsm/functions/command_update_linuxgsm.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index a91781c1b..69b60bab2 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -77,6 +77,7 @@ if [ -n "${functionsdir}" ]; then for functionfile in * do echo -ne " checking function ${functionfile}...\c" + github_file_url_dir="lgsm/functions" get_function_file=$(${curlpath} --fail -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}") exitcode=$? function_file_diff=$(diff "${functionsdir}/${functionfile}" <(${curlpath} --fail -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}")) From f4c133ddf29a8b617887ebde504c8620c61c920a Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 11:43:14 +0100 Subject: [PATCH 0812/1895] Corrected backup dir location --- lgsm/functions/command_update_linuxgsm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 69b60bab2..92334ffe4 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -52,7 +52,7 @@ if [ -z "${legacymode}" ];then core_exit.sh else fn_print_ok_eol_nl - echo -e " Backup: ${tmpdir}/${selfname}-$(date +"%m_%d_%Y_%M").bak" + echo -e " Backup: ${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak" fi echo -ne " fetching ${selfname}...\c" cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" From 55bc729d1c5fdef382651a27606f816eb1c9bf43 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 11:55:53 +0100 Subject: [PATCH 0813/1895] serverlist.csv is now only in the tmp dir --- linuxgsm.sh | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 0d52bec24..e32a89dce 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -261,24 +261,12 @@ fi # LinuxGSM installer mode if [ "${shortname}" == "core" ]; then userinput=$1 - datadir="${lgsmdir}/data" + datadir="${tmpdir}/data" serverlist="${datadir}/serverlist.csv" - serverlist_tmp="${tmpdir}/data/serverlist.csv" # Download the serverlist. This is the complete list of all supported servers. # Download to tmp dir - fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${tmpdir}/data" "serverlist.csv" "nochmodx" "norun" "noforcedl" "nomd5" - # if missing in lgsm dir copy it across - if [ ! -f "${serverlist}" ]; then - mkdir -p "${datadir}" - cp -R "${serverlist_tmp}" "${serverlist}" - # check if the files are different. - else - file_diff=$(diff -q "${serverlist_tmp}" "${serverlist}") - if [ "${file_diff}" != "" ]; then - cp -Rf "${serverlist_tmp}" "${serverlist}" - fi - fi + fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "serverlist.csv" "nochmodx" "norun" "noforcedl" "nomd5" if [ ! -f "${serverlist}" ]; then echo "[ FAIL ] serverlist.csv could not be loaded." @@ -291,7 +279,7 @@ if [ "${shortname}" == "core" ]; then } | column -s $'\t' -t | more exit elif [ "${userinput}" == "install" ]; then - fn_install_menu result "LinuxGSM" "Select game to install" "lgsm/data/serverlist.csv" + fn_install_menu result "LinuxGSM" "Select game to install" "${serverlist}" userinput="${result}" fn_server_info if [ "${result}" == "${servername}" ]; then From 874b1bf4bf170f344e98cfc7f192d7bba058d1e8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 12:01:29 +0100 Subject: [PATCH 0814/1895] added rm to remove any existing serverlist --- linuxgsm.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index e32a89dce..1c0eb3664 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -265,9 +265,11 @@ if [ "${shortname}" == "core" ]; then serverlist="${datadir}/serverlist.csv" # Download the serverlist. This is the complete list of all supported servers. - # Download to tmp dir - fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "serverlist.csv" "nochmodx" "norun" "noforcedl" "nomd5" + if [ -f "${serverlist}" ]; then + rm "${serverlist}" + fi + fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "serverlist.csv" "nochmodx" "norun" "noforcedl" "nomd5" if [ ! -f "${serverlist}" ]; then echo "[ FAIL ] serverlist.csv could not be loaded." exit 1 From cd23d0db05b922c6f8f2f904285854f545557742 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 12:25:48 +0100 Subject: [PATCH 0815/1895] Changed message if servefiles already exists --- linuxgsm.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 1c0eb3664..1c76c2e11 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -243,7 +243,12 @@ fn_install_file(){ sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}" sed -i -e "s/servername=\"core\"/servername=\"${servername}\"/g" "${local_filename}" echo "Installed ${gamename} server as ${local_filename}" - echo "./${local_filename} install" + echo "" + if [ ! -d "${serverfiles}" ]; then + echo "./${local_filename} install" + else + echo "Remember to check server ports" + echo "./${local_filename} details" exit } From b48db02ec2bf122e1d5e405696c2d2e6960c2742 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 21:07:55 +0100 Subject: [PATCH 0816/1895] missing if --- linuxgsm.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/linuxgsm.sh b/linuxgsm.sh index 1c76c2e11..97f1a7621 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -249,6 +249,8 @@ fn_install_file(){ else echo "Remember to check server ports" echo "./${local_filename} details" + fi + echo "" exit } From 115aaf210fb4649a84d6e8146c793a7144df730c Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 21:08:30 +0100 Subject: [PATCH 0817/1895] Updated logging dirs --- lgsm/config-default/config-lgsm/ut2k4server/_default.cfg | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index ab9bc3e48..805cfb6af 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -64,15 +64,16 @@ compressedmapsdir="${rootdir}/Maps-Compressed" backupdir="${rootdir}/backups" ## Logging Directories +logdir="${rootdir}/log" gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming +gamelog="${gamelogdir}/${servicename}-game.log" lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" From 4c184b973b26755ec36bd9df000be45a0a236fac Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 21:26:25 +0100 Subject: [PATCH 0818/1895] update var names local_filedir local_filename --- lgsm/functions/core_dl.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh index 7509b9223..a566c4c98 100644 --- a/lgsm/functions/core_dl.sh +++ b/lgsm/functions/core_dl.sh @@ -61,9 +61,9 @@ fn_dl_extract(){ if [ "${mime}" == "application/gzip" ]||[ "${mime}" == "application/x-gzip" ]; then extractcmd=$(tar -zxf "${local_filedir}/${local_filename}" -C "${extractdir}") elif [ "${mime}" == "application/x-bzip2" ]; then - tarcmd=$(tar -jxf "${filedir}/${filename}" -C "${extractdir}") + tarcmd=$(tar -jxf "${local_filedir}/${local_filename}" -C "${extractdir}") elif [ "${mime}" == "application/x-xz" ]; then - tarcmd=$(tar -xf "${filedir}/${filename}" -C "${extractdir}") + tarcmd=$(tar -xf "${local_filedir}/${local_filename}" -C "${extractdir}") elif [ "${mime}" == "application/zip" ]; then extractcmd=$(unzip -d "${extractdir}" "${local_filedir}/${local_filename}") fi From 6a3f54bf7c5be0bbdfc50e5f86c66a0daced8228 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 21:48:55 +0100 Subject: [PATCH 0819/1895] Now prevents IP check from running on installer this prevents issues with ut2k4server requiring restarts on install --- lgsm/functions/check.sh | 4 +++- lgsm/functions/command_install.sh | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh index c8e17cb05..196b748e0 100644 --- a/lgsm/functions/check.sh +++ b/lgsm/functions/check.sh @@ -65,7 +65,9 @@ local allowed_commands_array=( command_debug.sh command_details.sh command_monit for allowed_command in "${allowed_commands_array[@]}" do if [ "${allowed_command}" == "${function_selfname}" ]; then - check_ip.sh + if [ -z "${installflag}" ]; then + check_ip.sh + fi fi done diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh index f344cc598..0a4f03cee 100644 --- a/lgsm/functions/command_install.sh +++ b/lgsm/functions/command_install.sh @@ -14,6 +14,7 @@ install_header.sh install_server_dir.sh install_logs.sh check_deps.sh +installflag=1 # Download and install if [ "${gamename}" == "Unreal Tournament 2004" ]; then install_server_files.sh From eb921cb64e789144222bb0b805b0df3a190e4e22 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 22:48:32 +0100 Subject: [PATCH 0820/1895] consistancy --- lgsm/functions/command_console.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index dd17de843..f25138add 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -38,7 +38,8 @@ else fn_script_log_error "Failed to access: Server not running" sleep 1 if fn_prompt_yn "Do you want to start the server?" Y; then - exitbypass=1; command_start.sh + exitbypass=1 + command_start.sh fi fi From b8bfebbd49a27b268fe23050d2cd328e78c818f9 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 22:48:53 +0100 Subject: [PATCH 0821/1895] Fixing issues with ut2k4server restart not working --- lgsm/functions/command_start.sh | 6 +++++- lgsm/functions/fix_ut2k4.sh | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 0c8d30395..231947a35 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -29,7 +29,11 @@ fn_start_teamspeak3(){ if [ "${status}" != "0" ]; then fn_print_info_nl "${servername} is already running" fn_script_log_error "${servername} is already running" - core_exit.sh + if [ "${exitbypass}" ]; then + exit + else + core_exit.sh + fi fi if [ -f "${lgsmlog}" ]; then mv "${lgsmlog}" "${lgsmlogdate}" diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index ae0088315..1957ac251 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -21,9 +21,13 @@ echo "applying server name fix." sleep 1 echo "forcing server restart..." sleep 1 +exitbypass=1 command_start.sh sleep 5 +exitbypass=1 command_stop.sh +exitbypass=1 command_start.sh sleep 5 +exitbypass=1 command_stop.sh \ No newline at end of file From 74d22a839d7b10b1a9f6712ff66493eee693766d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 22:58:23 +0100 Subject: [PATCH 0822/1895] Fixing issues with ut2k4server restart not working --- lgsm/functions/command_start.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh index 231947a35..44b705082 100644 --- a/lgsm/functions/command_start.sh +++ b/lgsm/functions/command_start.sh @@ -29,9 +29,7 @@ fn_start_teamspeak3(){ if [ "${status}" != "0" ]; then fn_print_info_nl "${servername} is already running" fn_script_log_error "${servername} is already running" - if [ "${exitbypass}" ]; then - exit - else + if [ -z "${exitbypass}" ]; then core_exit.sh fi fi @@ -92,7 +90,9 @@ fn_start_tmux(){ if [ "${status}" != "0" ]; then fn_print_info_nl "${servername} is already running" fn_script_log_error "${servername} is already running" - core_exit.sh + if [ -z "${exitbypass}" ]; then + core_exit.sh + fi fi # Create lockfile From ebb0e38592cf5d8458317513253c3d27193addf5 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 23:06:34 +0100 Subject: [PATCH 0823/1895] updated message --- lgsm/functions/check_ip.sh | 7 ++++--- lgsm/functions/fix_ut2k4.sh | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index c9b5ce97f..b76616ea2 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -25,12 +25,13 @@ if [ "${gamename}" != "TeamSpeak 3" ]&&[ "${gamename}" != "Mumble" ]&&[ "${travi sleep 1 echo -en "\n" if [ "${ipsetinconfig}" == "1" ]; then - fn_print_information "Specify the IP you want to use within the server config file ${servercfg}.\n" + fn_print_information "Specify the IP you want to use within the game server config file ${servercfg}.\n" echo -en "${servercfgfullpath}\n" echo -en "Set ${ipinconfigvar} to one of the following:\n" else - fn_print_information "Specify the IP you want to use within the LinuxGSM config file." - echo -en "Location: ${configdir}\n" + fn_print_information_nl "Specify the IP you want to use within a LinuxGSM config file." + echo -en "location: ${configdir}\n" + echo "" echo -en "Set ip=\"0.0.0.0\" to one of the following:\n" fi echo -en "${getip}\n" diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh index 1957ac251..e55a3a88b 100644 --- a/lgsm/functions/fix_ut2k4.sh +++ b/lgsm/functions/fix_ut2k4.sh @@ -19,7 +19,7 @@ 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..." +echo "forcing server restart." sleep 1 exitbypass=1 command_start.sh From 6f9e00098e8c78427f435283353dec4154b07afa Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 23:08:47 +0100 Subject: [PATCH 0824/1895] Corrected configdir location --- lgsm/functions/check_ip.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh index b76616ea2..622b617dd 100644 --- a/lgsm/functions/check_ip.sh +++ b/lgsm/functions/check_ip.sh @@ -30,7 +30,7 @@ if [ "${gamename}" != "TeamSpeak 3" ]&&[ "${gamename}" != "Mumble" ]&&[ "${travi echo -en "Set ${ipinconfigvar} to one of the following:\n" else fn_print_information_nl "Specify the IP you want to use within a LinuxGSM config file." - echo -en "location: ${configdir}\n" + echo -en "location: ${configdirserver}\n" echo "" echo -en "Set ip=\"0.0.0.0\" to one of the following:\n" fi From 58e76e523dff8bfb6562ccf964ab81edb7e5d650 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 23:25:14 +0100 Subject: [PATCH 0825/1895] spelling --- lgsm/functions/logs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/functions/logs.sh b/lgsm/functions/logs.sh index 6e877140c..7d7dbcebe 100644 --- a/lgsm/functions/logs.sh +++ b/lgsm/functions/logs.sh @@ -3,7 +3,7 @@ # Author: Daniel Gibbs # Contributor: UltimateByte # Website: https://gameservermanagers.com -# Description: Acts as a log rotater, removing old logs. +# Description: Acts as a log rotator, removing old logs. local commandname="LOGS" local commandaction="Log-Manager" From e3c9b7bfe9b751ddf987db2316b2f19921d7dca3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 23:43:03 +0100 Subject: [PATCH 0826/1895] Added missing queryport for unreal --- lgsm/functions/info_config.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 8ff581e23..54c27cc16 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -573,6 +573,7 @@ fn_info_config_unreal(){ serverpassword="${unavailable}" adminpassword="${unavailable}" port="${zero}" + queryport="${zero}" gsqueryport="${zero}" webadminenabled="${unavailable}" webadminport="${zero}" @@ -583,6 +584,7 @@ fn_info_config_unreal(){ serverpassword=$(grep "GamePassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/GamePassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') adminpassword=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') port=$(grep "Port" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' | grep "^Port" | grep -v "#" | tr -cd '[:digit:]') + queryport=$((port + 1)) gsqueryport=$(grep "OldQueryPortNumber" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') webadminenabled=$(grep "bEnabled" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/bEnabled//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') webadminport=$(grep "ListenPort" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') From 4559cee10cd297ebc75a70b16e0e35c3d993a37f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sat, 27 May 2017 23:43:17 +0100 Subject: [PATCH 0827/1895] removed if [ "${gsquery}" == "yes" ]; then not sure why this is still here --- lgsm/functions/monitor_gsquery.sh | 127 +++++++++++++++--------------- 1 file changed, 62 insertions(+), 65 deletions(-) diff --git a/lgsm/functions/monitor_gsquery.sh b/lgsm/functions/monitor_gsquery.sh index f5bbdb6f6..56fe70a47 100644 --- a/lgsm/functions/monitor_gsquery.sh +++ b/lgsm/functions/monitor_gsquery.sh @@ -9,81 +9,78 @@ local commandname="MONITOR" local commandaction="Monitor" local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -if [ "${gsquery}" == "yes" ]; then +# Downloads gsquery.py if missing +if [ ! -f "${functionsdir}/gsquery.py" ]; then + fn_fetch_file_github "lgsm/functions" "gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" +fi - # Downloads gsquery.py if missing - if [ ! -f "${functionsdir}/gsquery.py" ]; then - fn_fetch_file_github "lgsm/functions" "gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nomd5" - fi +info_config.sh - info_config.sh +if [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then + port=$((port + 1)) +elif [ "${engine}" == "realvirtuality" ]; then + port=$((port + 1)) +elif [ "${engine}" == "spark" ]; then + port=$((port + 1)) +elif [ "${engine}" == "idtech3_ql" ]; then + engine="quakelive" +fi - if [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then - port=$((port + 1)) - elif [ "${engine}" == "realvirtuality" ]; then - port=$((port + 1)) - elif [ "${engine}" == "spark" ]; then - port=$((port + 1)) - elif [ "${engine}" == "idtech3_ql" ]; then - engine="quakelive" - fi +if [ -n "${queryport}" ]; then + port="${queryport}" +fi - if [ -n "${queryport}" ]; then - port="${queryport}" - fi +fn_print_info "Querying port: gsquery.py enabled" +fn_script_log_info "Querying port: gsquery.py enabled" +sleep 1 - fn_print_info "Querying port: gsquery.py enabled" - fn_script_log_info "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_script_log_info "Querying port: ${ip}:${port} : ${queryattempt} : QUERYING" - # 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_script_log_info "Querying port: ${ip}:${port} : ${queryattempt} : QUERYING" + gsquerycmd=$("${functionsdir}"/gsquery.py -a "${ip}" -p "${port}" -e "${engine}" 2>&1) + exitcode=$? - gsquerycmd=$("${functionsdir}"/gsquery.py -a "${ip}" -p "${port}" -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_nl + fn_script_log_pass "Querying port: ${ip}:${port} : ${queryattempt} : OK" + exitcode=0 + break + else + # Server failed query + fn_script_log_info "Querying port: ${ip}:${port} : ${queryattempt} : ${gsquerycmd}" - sleep 1 - if [ "${exitcode}" == "0" ]; then - # Server OK - fn_print_ok "Querying port: ${ip}:${port} : ${queryattempt} : " - fn_print_ok_eol_nl - fn_script_log_pass "Querying port: ${ip}:${port} : ${queryattempt} : OK" - exitcode=0 - break - else - # Server failed query - fn_script_log_info "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_script_log_error "Querying port: ${ip}:${port} : ${queryattempt} : FAIL" + sleep 1 - 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_script_log_error "Querying port: ${ip}:${port} : ${queryattempt} : FAIL" - sleep 1 + # Send alert if enabled + alert="restartquery" + alert.sh + command_restart.sh + break + fi - # Send alert if enabled - alert="restartquery" - alert.sh - command_restart.sh + # Seconds counter + for seconds in {1..15}; do + fn_print_fail "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : ${red}${gsquerycmd}${default}" + totalseconds=$((totalseconds + 1)) + sleep 1 + if [ "${seconds}" == "15" ]; then break fi - - # Seconds counter - for seconds in {1..15}; do - fn_print_fail "Querying port: ${ip}:${port} : ${totalseconds}/${queryattempt} : ${red}${gsquerycmd}${default}" - totalseconds=$((totalseconds + 1)) - sleep 1 - if [ "${seconds}" == "15" ]; then - break - fi - done - fi - done -fi + done + fi +done core_exit.sh \ No newline at end of file From 8eee5a94b5782da179345807c1bdf4646ad25ce3 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 May 2017 00:41:18 +0100 Subject: [PATCH 0828/1895] FIxing logging dirs --- lgsm/config-default/config-lgsm/qlserver/_default.cfg | 7 ++++--- lgsm/config-default/config-lgsm/roserver/_default.cfg | 7 ++++--- lgsm/config-default/config-lgsm/ss3server/_default.cfg | 7 ++++--- .../config-lgsm/terrariaserver/_default.cfg | 1 + lgsm/config-default/config-lgsm/twserver/_default.cfg | 7 ++++--- lgsm/config-default/config-lgsm/ut3server/_default.cfg | 8 +++++--- 6 files changed, 22 insertions(+), 15 deletions(-) diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index a7fc888ee..e73a5ec6d 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -75,11 +75,12 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${rootdir}/backups" ## Logging Directories +logdir="${rootdir}/log" gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" +gamelog="${gamelogdir}/${servicename}-game.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index a076a8243..52fe3273f 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -89,11 +89,12 @@ compressedmapsdir="${rootdir}/Maps-Compressed" backupdir="${rootdir}/backups" ## Logging Directories +logdir="${rootdir}/log" gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" +gamelog="${gamelogdir}/${servicename}-game.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index 399fb82ac..a34ccc4f2 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -74,11 +74,12 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${rootdir}/backups" ## Logging Directories +logdir="${rootdir}/log" gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" +gamelog="${gamelogdir}/${servicename}-game.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg index 60c3500ac..b18d76440 100644 --- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg @@ -77,6 +77,7 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${rootdir}/backups" ## Logging Directories +logdir="${rootdir}/log" #gamelogdir="" # No server logs available lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 8d2b0b3b3..759bb9e6b 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -77,11 +77,12 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${rootdir}/backups" ## Logging Directories +logdir="${rootdir}/log" gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" +gamelog="${gamelogdir}/${servicename}-game.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index bb896fd80..1dbb05849 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -75,15 +75,17 @@ servercfgfullpath="${servercfgdir}/${servercfg}" backupdir="${rootdir}/backups" ## Logging Directories +logdir="${rootdir}/log" gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" -gamelog="${gamelogdir}/${servicename}-game.log" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" +gamelog="${gamelogdir}/${servicename}-game.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming + lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file From 1c4860301952c799cee92894dda12f3fcd68e476 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 May 2017 01:05:07 +0100 Subject: [PATCH 0829/1895] QuakeLive Port stats were missing --- lgsm/functions/info_config.sh | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 54c27cc16..670ae79ff 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -169,6 +169,7 @@ fn_info_config_dontstarve(){ gamemode=$(grep "game_mode" "${clustercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/game_mode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') tickrate=$(grep "tick_rate" "${clustercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') masterport=$(grep "master_port" "${clustercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + ip=$(grep "bind_ip" "${clustercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/bind_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') ipsetinconfig=1 ipinconfigvar="bind_ip" @@ -307,11 +308,12 @@ fn_info_config_quakeworld(){ servername="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" + port="${zero}" else rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - + port= # Not Set rconpassword=${rconpassword:-"NOT SET"} servername=${servername:-"NOT SET"} @@ -363,11 +365,17 @@ fn_info_config_quakelive(){ servername="${unavailable}" serverpassword="${unavailable}" maxplayers="${zero}" + port="${zero}" + rconport="${zero}" + statsport="${zero}" else rconpassword=$(grep "zmq_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set zmq_rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') serverpassword=$(grep "g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') maxplayers=$(grep "sv_maxClients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + port=$(grep "net_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + rconport=$(grep "zmq_rcon_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + statsport=$(grep "zmq_stats_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') ip=$(grep "set net_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set net_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') ipsetinconfig=1 @@ -378,6 +386,9 @@ fn_info_config_quakelive(){ servername=${servername:-"NOT SET"} serverpassword=${serverpassword:-"NOT SET"} maxplayers=${maxplayers:-"0"} + port=${port:-"0"} + rconport=${rconport:-"0"} + statsport=${statsport:-"0"} fi } @@ -601,6 +612,7 @@ fn_info_config_unreal(){ serverpassword=${serverpassword:-"NOT SET"} adminpassword=${adminpassword:-"NOT SET"} port=${port:-"0"} + queryport=${queryport:-"0"} gsqueryport=${gsqueryport:-"0"} webadminenabled=${webadminenabled:-"NOT SET"} webadminport=${webadminport:-"0"} From b3498e421280e01cb6a1a90d718bd3edcab00931 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 May 2017 01:09:08 +0100 Subject: [PATCH 0830/1895] corrected comment filter --- lgsm/functions/info_config.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgsm/functions/info_config.sh b/lgsm/functions/info_config.sh index 670ae79ff..75ef93384 100644 --- a/lgsm/functions/info_config.sh +++ b/lgsm/functions/info_config.sh @@ -372,10 +372,10 @@ fn_info_config_quakelive(){ rconpassword=$(grep "zmq_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set zmq_rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') serverpassword=$(grep "g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') - maxplayers=$(grep "sv_maxClients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - port=$(grep "net_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - rconport=$(grep "zmq_rcon_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') - statsport=$(grep "zmq_stats_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]') + maxplayers=$(grep "sv_maxClients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + port=$(grep "net_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + rconport=$(grep "zmq_rcon_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') + statsport=$(grep "zmq_stats_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]') ip=$(grep "set net_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set net_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//') ipsetinconfig=1 From 518e2d2da03523bcf15bc2254ab7c7213301c372 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Sun, 28 May 2017 10:36:12 +0100 Subject: [PATCH 0831/1895] grep was bringing back multiple results --- linuxgsm.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 97f1a7621..1edcaf1d2 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -210,7 +210,7 @@ fn_install_menu() { # Gets server info from serverlist.csv and puts in to array fn_server_info(){ IFS="," - server_info_array=($(grep -a "${userinput}" "${serverlist}")) + server_info_array=($(grep -w "${userinput}" "${serverlist}")) shortname="${server_info_array[0]}" # csgo servername="${server_info_array[1]}" # csgoserver gamename="${server_info_array[2]}" # Counter Strike: Global Offensive @@ -297,6 +297,8 @@ if [ "${shortname}" == "core" ]; then echo "Install canceled" else echo "[ FAIL ] menu result does not match servername" + echo "result: ${result}" + echo "servername: ${servername}" fi elif [ -n "${userinput}" ]; then fn_server_info From e4dbdb108f364ef03e2ff14824cc9fcbd4fe2afe Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 29 May 2017 09:58:40 +0100 Subject: [PATCH 0832/1895] gamelog --- .../config-lgsm/hwserver/_default.cfg | 13 ++++++++----- .../config-lgsm/ut2k4server/_default.cfg | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 69f0dacc6..148115e07 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -16,7 +16,7 @@ queryport="12881" maxplayers="20" defaultmap="" #Optional creativemode="0" #Free Build: creativemode="1" -logfile="gamelog.txt" +gamelog="gamelog.txt" ## Adding admins using STEAMID64 # Example : addadmin 012345678901234567; addadmin 987654321098765432 @@ -31,7 +31,7 @@ x64mode="0" ## Server Start Command | https://github.com/GameServerManagers/LinuxGSM/wiki/Start-Parameters#additional-parameters # Edit with care | http://hurtworld.wikia.com/wiki/Hosting_A_Server fn_parms(){ -parms="-batchmode -nographics -exec \"host ${port} ${defaultmap} ${loadsave};queryport ${queryport};maxplayers ${maxplayers};servername ${servername};creativemode ${creativemode};${admins}\" -logfile \"${logfile}\" " +parms="-batchmode -nographics -exec \"host ${port} ${defaultmap} ${loadsave};queryport ${queryport};maxplayers ${maxplayers};servername ${servername};creativemode ${creativemode};${admins}\" -logfile \"${gamelog}\" " } #### LinuxGSM Settings #### @@ -101,14 +101,17 @@ fi backupdir="${rootdir}/backups" ## Logging Directories +logdir="${rootdir}/log" gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" +lgsmlogdir="${logdir}/script" +consolelogdir="${logdir}/console" gamelog="${gamelogdir}/${servicename}-game.log" lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming +gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" -consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" \ No newline at end of file +consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" + diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 805cfb6af..01dc64635 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -68,12 +68,12 @@ logdir="${rootdir}/log" gamelogdir="${rootdir}/log/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" +gamelog="${gamelogdir}/${servicename}-game.log" lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" ## Logs Naming -gamelog="${gamelogdir}/${servicename}-game.log" lgsmlogdate="${lgsmlogdir}/${servicename}-script-$(date '+%Y-%m-%d-%H:%M:%S').log" consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%Y-%m-%d-%H:%M:%S').log" gamelogdate="${gamelogdir}/${servicename}-game-$(date '+%Y-%m-%d-%H:%M:%S').log" From 38c960e82ccb948a7de323d904b52ceab0671665 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 29 May 2017 10:07:46 +0100 Subject: [PATCH 0833/1895] Removed remainign work dirs --- lgsm/config-default/config-lgsm/hwserver/_default.cfg | 10 ---------- lgsm/config-default/config-lgsm/mcserver/_default.cfg | 8 -------- lgsm/config-default/config-lgsm/roserver/_default.cfg | 9 --------- .../config-default/config-lgsm/rustserver/_default.cfg | 10 ---------- 4 files changed, 37 deletions(-) diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 148115e07..9e64dfd46 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -78,16 +78,6 @@ engine="unity3d" #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname=$(basename $(readlink -f "${BASH_SOURCE[0]}")) -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg index 03527e7a6..80a36ba01 100644 --- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg @@ -51,14 +51,6 @@ engine="lwjgl2" #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 52fe3273f..157cebcba 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -65,15 +65,6 @@ engine="unreal2" #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" - ## Server Specific Directories serverfiles="${rootdir}/serverfiles" systemdir="${serverfiles}/system" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index 74176bd96..efdea8c57 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -81,16 +81,6 @@ engine="unity3d" #### Directories #### # Edit with care -## Work Directories -rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" -selfname=$(basename $(readlink -f "${BASH_SOURCE[0]}")) -lockselfname=".${servicename}.lock" -lgsmdir="${rootdir}/lgsm" -functionsdir="${lgsmdir}/functions" -libdir="${lgsmdir}/lib" -tmpdir="${lgsmdir}/tmp" -serverfiles="${rootdir}/serverfiles" - ## Server Specific Directories systemdir="${serverfiles}" executabledir="${serverfiles}" From fb0d75d829aef68c71fd7d19e5050743d6623ac6 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 29 May 2017 14:32:48 +0100 Subject: [PATCH 0834/1895] changed servername to gameservername as var already used --- linuxgsm.sh | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/linuxgsm.sh b/linuxgsm.sh index 1edcaf1d2..4fe9e5672 100644 --- a/linuxgsm.sh +++ b/linuxgsm.sh @@ -18,7 +18,7 @@ fi version="170305" shortname="core" -servername="core" +gameservername="core" rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))" selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" servicename="${selfname}" @@ -31,7 +31,7 @@ functionsdir="${lgsmdir}/functions" libdir="${lgsmdir}/lib" tmpdir="${lgsmdir}/tmp" configdir="${lgsmdir}/config-lgsm" -configdirserver="${configdir}/${servername}" +configdirserver="${configdir}/${gameservername}" configdirdefault="${lgsmdir}/config-default" ## GitHub Branch Select @@ -212,7 +212,7 @@ fn_server_info(){ IFS="," server_info_array=($(grep -w "${userinput}" "${serverlist}")) shortname="${server_info_array[0]}" # csgo - servername="${server_info_array[1]}" # csgoserver + gameservername="${server_info_array[1]}" # csgoserver gamename="${server_info_array[2]}" # Counter Strike: Global Offensive } @@ -231,7 +231,7 @@ fn_install_getopt(){ } fn_install_file(){ - local_filename="${servername}" + local_filename="${gameservername}" if [ -e "${local_filename}" ]; then i=2 while [ -e "${local_filename}-${i}" ] ; do @@ -241,7 +241,7 @@ fn_install_file(){ fi cp -R "${selfname}" "${local_filename}" sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}" - sed -i -e "s/servername=\"core\"/servername=\"${servername}\"/g" "${local_filename}" + sed -i -e "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${local_filename}" echo "Installed ${gamename} server as ${local_filename}" echo "" if [ ! -d "${serverfiles}" ]; then @@ -291,18 +291,18 @@ if [ "${shortname}" == "core" ]; then fn_install_menu result "LinuxGSM" "Select game to install" "${serverlist}" userinput="${result}" fn_server_info - if [ "${result}" == "${servername}" ]; then + if [ "${result}" == "${gameservername}" ]; then fn_install_file elif [ "${result}" == "" ]; then echo "Install canceled" else - echo "[ FAIL ] menu result does not match servername" + echo "[ FAIL ] menu result does not match gameservername" echo "result: ${result}" - echo "servername: ${servername}" + echo "gameservername: ${gameservername}" fi elif [ -n "${userinput}" ]; then fn_server_info - if [ "${userinput}" == "${servername}" ]; then + if [ "${userinput}" == "${gameservername}" ]; then fn_install_file fi else @@ -316,14 +316,14 @@ else # Load LinuxGSM configs # These are required to get all the default variables for the specific server. # Load the default config. If missing download it. If changed reload it. - if [ ! -f "${configdirdefault}/config-lgsm/${servername}/_default.cfg" ]; then - mkdir -p "${configdirdefault}/config-lgsm/${servername}" - fn_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "nochmodx" "norun" "noforcedl" "nomd5" + if [ ! -f "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" ]; then + mkdir -p "${configdirdefault}/config-lgsm/${gameservername}" + fn_fetch_config "lgsm/config-default/config-lgsm/${gameservername}" "_default.cfg" "${configdirdefault}/config-lgsm/${gameservername}" "_default.cfg" "nochmodx" "norun" "noforcedl" "nomd5" fi if [ ! -f "${configdirserver}/_default.cfg" ]; then mkdir -p "${configdirserver}" echo -ne " copying _default.cfg...\c" - cp -R "${configdirdefault}/config-lgsm/${servername}/_default.cfg" "${configdirserver}/_default.cfg" + cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? if [ ${exitcode} -ne 0 ]; then echo -e "\e[0;31mFAIL\e[0m\n" @@ -332,11 +332,11 @@ else echo -e "\e[0;32mOK\e[0m" fi else - function_file_diff=$(diff -q ${configdirdefault}/config-lgsm/${servername}/_default.cfg ${configdirserver}/_default.cfg) + function_file_diff=$(diff -q ${configdirdefault}/config-lgsm/${gameservername}/_default.cfg ${configdirserver}/_default.cfg) if [ "${function_file_diff}" != "" ]; then fn_print_warn_nl "_default.cfg has been altered. reloading config." echo -ne " copying _default.cfg...\c" - cp -R "${configdirdefault}/config-lgsm/${servername}/_default.cfg" "${configdirserver}/_default.cfg" + cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg" exitcode=$? if [ ${exitcode} -ne 0 ]; then echo -e "\e[0;31mFAIL\e[0m\n" From 421fcd6972b74294f7d8f665bcab9f2127329f91 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 29 May 2017 14:38:49 +0100 Subject: [PATCH 0835/1895] Added hurtworld --- lgsm/functions/command_console.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh index f25138add..bbf215a96 100644 --- a/lgsm/functions/command_console.sh +++ b/lgsm/functions/command_console.sh @@ -10,10 +10,10 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" check.sh fn_print_header -if [ "${gamename}" == "Rust" ]; then +if [ "${gamename}" == "Rust" ]||[ "${gamename}" == "Hurtworld" ]; then fn_print_information_nl "${gamename} does not produce a verbose output to the console" fi -if [ "${gamename}" == "Rust" ]; then +if [ "${gamename}" == "Rust" ]||[ "${gamename}" == "Hurtworld" ]; then fn_print_information_nl "${gamename} does not allow server commands to be entered in to the console" fi fn_print_information_nl "Press \"CTRL+b\" then \"d\" to exit console." From 921450bab61cf940224ff417877ea054671794cf Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 29 May 2017 15:46:03 +0100 Subject: [PATCH 0836/1895] corrected project cars steam port details --- 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 687033740..4e5eb2eca 100644 --- a/lgsm/functions/command_details.sh +++ b/lgsm/functions/command_details.sh @@ -533,7 +533,7 @@ fn_details_projectcars(){ echo -e "DESCRIPTION\tDIRECTION\tPORT\tPROTOCOL" echo -e "> Game\tINBOUND\t${port}\tudp" echo -e "> Query\tINBOUND\t${queryport}\tudp" - echo -e "> Steam\tINBOUND\t${queryport}\tudp" + echo -e "> Steam\tINBOUND\t${steamport}\tudp" } | column -s $'\t' -t } From bc6eddb6323e18ad181157fde554e578d0d77e4f Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 29 May 2017 15:46:25 +0100 Subject: [PATCH 0837/1895] added madness engine to gsquery --- lgsm/functions/command_monitor.sh | 2 +- lgsm/functions/gsquery.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh index cd12285cf..d940bea70 100644 --- a/lgsm/functions/command_monitor.sh +++ b/lgsm/functions/command_monitor.sh @@ -79,7 +79,7 @@ fn_monitor_tmux(){ fn_print_ok_eol_nl fn_script_log_pass "Checking session: OK" # runs gsquery check on game with specific engines. - local allowed_engines_array=( avalanche goldsource idtech3 idtech3_ql iw2.0 iw3.0 quake refractor realvirtuality source spark unity3d unreal unreal2 ) + local allowed_engines_array=( avalanche goldsource idtech3 idtech3_ql iw2.0 iw3.0 madness quake refractor realvirtuality source spark unity3d unreal unreal2 ) for allowed_engine in "${allowed_engines_array[@]}" do if [ "${allowed_engine}" == "${engine}" ]; then diff --git a/lgsm/functions/gsquery.py b/lgsm/functions/gsquery.py index e1f5c3f77..40e6c2950 100644 --- a/lgsm/functions/gsquery.py +++ b/lgsm/functions/gsquery.py @@ -17,7 +17,7 @@ class PythonGSQ: self.server_response_timeout = 5 self.default_buffer_length = 1024 # - sourcequery=['quakelive','realvirtuality','refractor','source','goldsource','spark','unity3d'] + sourcequery=['madness','quakelive','realvirtuality','refractor','source','goldsource','spark','unity3d'] idtech2query=['idtech3','quake','iw3.0'] idtech3query=['idtech2','iw2.0'] if self.option.engine in sourcequery: From 4a2fef2e67bc6100dac4e66bf29fb54ede5ddcff Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 29 May 2017 15:59:38 +0100 Subject: [PATCH 0838/1895] changed servername to gameservername --- lgsm/functions/command_update_linuxgsm.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh index 92334ffe4..29f48a826 100644 --- a/lgsm/functions/command_update_linuxgsm.sh +++ b/lgsm/functions/command_update_linuxgsm.sh @@ -17,12 +17,12 @@ echo -ne "\n" if [ -z "${legacymode}" ];then # Check and update _default.cfg echo -ne " checking config _default.cfg...\c" - config_file_diff=$(diff "${configdirdefault}/config-lgsm/${servername}/_default.cfg" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${servername}/_default.cfg")) + config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(${curlpath} -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg")) if [ "${config_file_diff}" != "" ]; then fn_print_update_eol_nl fn_script_log_info "checking config _default.cfg: UPDATE" - rm -f "${configdirdefault}/config-lgsm/${servername}/_default.cfg" - fn_fetch_config "lgsm/config-default/config-lgsm/${servername}" "_default.cfg" "${configdirdefault}/config-lgsm/${servername}" "_default.cfg" "nochmodx" "norun" "noforce" "nomd5" + rm -f "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" + fn_fetch_config "lgsm/config-default/config-lgsm/${gameservername}" "_default.cfg" "${configdirdefault}/config-lgsm/${gameservername}" "_default.cfg" "nochmodx" "norun" "noforce" "nomd5" else fn_print_ok_eol_nl fn_script_log_info "checking config _default.cfg: OK" @@ -41,7 +41,7 @@ if [ -z "${legacymode}" ];then fn_print_ok_eol_nl fi echo -ne " checking ${selfname}...\c" - script_diff=$(diff <(sed '/shortname/d;/servername/d;/gamename/d' "${tmpdir}/linuxgsm.sh") <(sed '/shortname/d;/servername/d;/gamename/d' "${rootdir}/${selfname}")) + script_diff=$(diff <(sed '/shortname/d;/gameservername/d;/gamename/d' "${tmpdir}/linuxgsm.sh") <(sed '/shortname/d;/gameservername/d;/gamename/d' "${rootdir}/${selfname}")) if [ "${script_diff}" != "" ]; then fn_print_update_eol_nl echo -ne " backup ${selfname}...\c" @@ -57,7 +57,7 @@ if [ -z "${legacymode}" ];then echo -ne " fetching ${selfname}...\c" cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}" sed -i "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${rootdir}/${selfname}" - sed -i "s/servername=\"core\"/servername=\"${servername}\"/g" "${rootdir}/${selfname}" + sed -i "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${rootdir}/${selfname}" sed -i "s/gamename=\"core\"/gamename=\"${gamename}\"/g" "${rootdir}/${selfname}" if [ $? -ne 0 ]; then fn_print_fail_eol_nl From be4a807219961c7bb3221c26269a29ee95da5f17 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 29 May 2017 16:27:11 +0100 Subject: [PATCH 0839/1895] updated log dir vars --- lgsm/config-default/config-lgsm/doiserver/_default.cfg | 4 ++-- lgsm/config-default/config-lgsm/hwserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/kfserver/_default.cfg | 6 +++--- lgsm/config-default/config-lgsm/qlserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/roserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/rustserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ss3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ts3server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/twserver/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ut2k4server/_default.cfg | 2 +- lgsm/config-default/config-lgsm/ut3server/_default.cfg | 2 +- 11 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg index f32e6137e..c58a526bd 100644 --- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg @@ -82,8 +82,8 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" gamelogdir="${systemdir}/logs" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" +scriptlogdir="${logdir}/script" +consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" emaillog="${lgsmlogdir}/${servicename}-email.log" diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg index 9e64dfd46..d2da42f5f 100644 --- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg @@ -92,7 +92,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${rootdir}/log/server" +gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" gamelog="${gamelogdir}/${servicename}-game.log" diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg index 982e6a6a1..bb0f0643f 100644 --- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg @@ -83,9 +83,9 @@ compressedmapsdir="${rootdir}/Maps-Compressed" backupdir="${rootdir}/backups" ## Logging Directories -gamelogdir="${rootdir}/log/server" -scriptlogdir="${rootdir}/log/script" -consolelogdir="${rootdir}/log/console" +gamelogdir="${logdir}/server" +scriptlogdir="${logdir}/script" +consolelogdir="${logdir}/console" gamelog="${gamelogdir}/${servicename}-game.log" lgsmlog="${lgsmlogdir}/${servicename}-script.log" consolelog="${consolelogdir}/${servicename}-console.log" diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg index e73a5ec6d..6cc27f2c1 100644 --- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg @@ -76,7 +76,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${rootdir}/log/server" +gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg index 157cebcba..c7429cfa0 100644 --- a/lgsm/config-default/config-lgsm/roserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg @@ -81,7 +81,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${rootdir}/log/server" +gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg index efdea8c57..30d8210b3 100644 --- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg @@ -96,7 +96,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${rootdir}/log/server" +gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/ss3server/_default.cfg b/lgsm/config-default/config-lgsm/ss3server/_default.cfg index a34ccc4f2..b83450c19 100644 --- a/lgsm/config-default/config-lgsm/ss3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ss3server/_default.cfg @@ -75,7 +75,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${rootdir}/log/server" +gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg index 192d8be34..04ec3fdb6 100644 --- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg @@ -60,7 +60,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" gamelogdir="${serverfiles}/Logs" -scriptlogdir="${rootdir}/log/script" +scriptlogdir="${logdir}/script" scriptlog="${scriptlogdir}/${servicename}-script.log" emaillog="${scriptlogdir}/${servicename}-email.log" diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg index 759bb9e6b..f3da6804d 100644 --- a/lgsm/config-default/config-lgsm/twserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg @@ -78,7 +78,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${rootdir}/log/server" +gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg index 01dc64635..a939289a3 100644 --- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg @@ -65,7 +65,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${rootdir}/log/server" +gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" gamelog="${gamelogdir}/${servicename}-game.log" diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg index 1dbb05849..31c63b300 100644 --- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg +++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg @@ -76,7 +76,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${rootdir}/log/server" +gamelogdir="${logdir}/server" lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" From e716151277154d8e8c726c98be3ae317b42987c8 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 29 May 2017 16:31:00 +0100 Subject: [PATCH 0840/1895] commented out gamelogdir --- lgsm/config-default/config-lgsm/mumbleserver/_default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg index 40d127f6b..c14dc05b6 100644 --- a/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg +++ b/lgsm/config-default/config-lgsm/mumbleserver/_default.cfg @@ -63,7 +63,7 @@ backupdir="${rootdir}/backups" ## Logging Directories logdir="${rootdir}/log" -gamelogdir="${rootdir}/log" +#gamelogdir="" # No server logs available lgsmlogdir="${logdir}/script" consolelogdir="${logdir}/console" lgsmlog="${lgsmlogdir}/${servicename}-script.log" From 48d602bbc57ee21aade11bf42a3655b78d6b8b6d Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 29 May 2017 23:01:08 +0100 Subject: [PATCH 0841/1895] added updated logo --- images/logo/lgsm_full.png | Bin 0 -> 65713 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/logo/lgsm_full.png diff --git a/images/logo/lgsm_full.png b/images/logo/lgsm_full.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1631ab5c0a0e8ea2c5be453e2caf7f6cc5f6c7 GIT binary patch literal 65713 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 literal 0 HcmV?d00001 From 44efe2b4e9ac71006d58fa95333364abbff79473 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 29 May 2017 23:01:27 +0100 Subject: [PATCH 0842/1895] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 978fdbbff..5918500b2 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/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.org/GameServerManagers/LinuxGSM) [![Under Development](https://badge.waffle.io/GameServerManagers/LinuxGSM.svg?label=Under%20Development&title=Under%20Development)](http://waffle.io/GameServerManagers/LinuxGSM) From 104ce1356133c56d251b138b0324658f40ca1682 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 29 May 2017 23:05:11 +0100 Subject: [PATCH 0843/1895] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5918500b2..d6c9b558c 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/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.org/GameServerManagers/LinuxGSM) [![Under Development](https://badge.waffle.io/GameServerManagers/LinuxGSM.svg?label=Under%20Development&title=Under%20Development)](http://waffle.io/GameServerManagers/LinuxGSM) From 747e5000e13a6549ee247166c1de47c04eb7c979 Mon Sep 17 00:00:00 2001 From: Daniel Gibbs Date: Mon, 29 May 2017 23:06:29 +0100 Subject: [PATCH 0844/1895] Update README.md --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d6c9b558c..9e6c1a291 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,13 @@ -

    Linux Game Server Managers_

    linux Game Server Managers [![Build Status](https://travis-ci.org/GameServerManagers/LinuxGSM.svg?branch=master)](https://travis-ci.org/GameServerManagers/LinuxGSM) [![Under Development](https://badge.waffle.io/GameServerManagers/LinuxGSM.svg?label=Under%20Development&title=Under%20Development)](http://waffle.io/GameServerManagers/LinuxGSM) [![Discord](https://discordapp.com/api/guilds/127498813903601664/widget.png?style=shield)](https://gameservermanagers.com/discord) -The Linux Game Server Managers are command line tools for quick, simple deployment and management of various dedicated game servers and voice alert servers. +LinuxGSM he command line tool for quick, simple deployment and management of dedicated game server.

    Hassle-Free Dedicated Servers

    -Game servers traditionally are not easy to manage yourself. Admins often have to spend hours just messing around trying to get their server working. LGSM is designed to be a simple as possible allowing Admins to spend less time on management and more time on the fun stuff. +Game servers traditionally are not easy to manage yourself. Admins often have to spend hours just messing around trying to get their server working. LinuxGSM is designed to be a simple as possible allowing admins to spend less time on management and more time gaming.

    Main features

    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≤OfQl^s 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